* XplatUIX11.cs: Removed unused hwnd var in SetBorderStyle.
[mono.git] / mcs / class / Managed.Windows.Forms / System.Windows.Forms / PrintDialog.cs
index 6b0c62269f5fe32bb656bd73b2463581511899ef..1a2b19ff72db7f91b2cef1d22a62e123023499c5 100644 (file)
@@ -5,10 +5,10 @@
 // distribute, sublicense, and/or sell copies of the Software, and to
 // permit persons to whom the Software is furnished to do so, subject to
 // the following conditions:
-// 
+//
 // The above copyright notice and this permission notice shall be
 // included in all copies or substantial portions of the Software.
-// 
+//
 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 //
-// Copyright (c) 2005 Novell, Inc.
+// Copyright (c) 2005-2006 Novell, Inc.
 //
 // Authors:
 //     Someone
 //     Jonathan Chambers (jonathan.chambers@ansys.com)
+//     Jordi Mas i Hernandez (jordimash@gmail.com)
 //
 
 using System;
@@ -36,29 +37,68 @@ using System.Reflection;
 
 namespace System.Windows.Forms
 {
+#if NET_2_0
+       [Designer ("System.Windows.Forms.Design.PrintDialogDesigner, " + Consts.AssemblySystem_Design,
+                  "System.ComponentModel.Design.IDesigner")]
+#endif
        [DefaultProperty("Document")]
        public sealed class PrintDialog : CommonDialog {
                PrintDocument document;
-               PrinterSettings printer_settings;
+#if NET_2_0
                bool allow_current_page;
+#endif
                bool allow_print_to_file;
                bool allow_selection;
                bool allow_some_pages;
                bool show_help;
                bool show_network;
                bool print_to_file;
-               
+               PrinterSettings current_settings;
+
+               private Button cancel_button;
+               private Button accept_button;
+               private Button help_button;
+               private ComboBox printer_combo;
+               private RadioButton radio_all;
+               private RadioButton radio_pages;
+               private RadioButton radio_sel;
+               private PrinterSettings.StringCollection installed_printers;
+               private PrinterSettings default_printer_settings;
+               private TextBox txtFrom;
+               private TextBox txtTo;
+               private Label labelTo;
+               private Label labelFrom;
+               private CheckBox chkbox_print;
+               private NumericUpDown updown_copies;
+               private CheckBox chkbox_collate;
+               private Label label_status;
+               private Label label_type;
+               private Label label_where;
+               private Label label_comment;
+
                public PrintDialog ()
                {
-                       allow_print_to_file = true;
-                       show_network = true;
+                       help_button = null;
+                       installed_printers = System.Drawing.Printing.PrinterSettings.InstalledPrinters;
+
+                       form.Text = "Print";
+                       CreateFormControls ();
+                       Reset ();
                }
 
                public override void Reset ()
                {
+                       current_settings = null;
+                       AllowPrintToFile = true;
+                       AllowSelection = false;
+                       AllowSomePages = false;
+                       PrintToFile = false;
+                       ShowHelp = false;
+                       ShowNetwork = true;
                }
 
 #if NET_2_0
+               [DefaultValue (false)]
                public bool AllowCurrentPage {
                        get {
                                return allow_current_page;
@@ -66,6 +106,7 @@ namespace System.Windows.Forms
 
                        set {
                                allow_current_page = value;
+                               radio_pages.Enabled = value;
                        }
                }
 #endif
@@ -78,6 +119,7 @@ namespace System.Windows.Forms
 
                        set {
                                allow_print_to_file = value;
+                               chkbox_print.Enabled = value;
                        }
                }
 
@@ -89,6 +131,7 @@ namespace System.Windows.Forms
 
                        set {
                                allow_selection = value;
+                               radio_sel.Enabled = value;
                        }
                }
 
@@ -100,6 +143,16 @@ namespace System.Windows.Forms
 
                        set {
                                allow_some_pages = value;
+                               radio_pages.Enabled = value;
+                               txtFrom.Enabled = value;
+                               txtTo.Enabled = value;
+                               labelTo.Enabled = value;
+                               labelFrom.Enabled = value;
+
+                               if (current_settings != null) {
+                                       txtFrom.Text = current_settings.FromPage.ToString ();
+                                       txtTo.Text = current_settings.ToPage.ToString ();
+                               }
                        }
                }
 
@@ -111,6 +164,7 @@ namespace System.Windows.Forms
 
                        set {
                                document = value;
+                               current_settings = value == null ? new PrinterSettings () : value.PrinterSettings;
                        }
                }
 
@@ -119,11 +173,15 @@ namespace System.Windows.Forms
                [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
                public PrinterSettings PrinterSettings {
                        get {
-                               return printer_settings;
+                               return current_settings;
                        }
 
                        set {
-                               printer_settings = value;
+                               if (value != null && value == current_settings)
+                                       return;
+
+                               current_settings = value == null ? new PrinterSettings () : value;
+                               document = null;
                        }
                }
 
@@ -157,12 +215,400 @@ namespace System.Windows.Forms
 
                        set {
                                show_help = value;
+                               ShowHelpButton ();
                        }
                }
 
                protected override bool RunDialog (IntPtr hwnd)
                {
+                       if (allow_some_pages && current_settings.FromPage > current_settings.ToPage)
+                               throw new ArgumentException ("FromPage out of range");
+
+                       if (allow_some_pages) {
+                               txtFrom.Text = current_settings.FromPage.ToString ();
+                               txtTo.Text = current_settings.ToPage.ToString ();
+                       }
+
+                       if (current_settings.PrintRange == PrintRange.SomePages && allow_some_pages)
+                               radio_pages.Checked = true;
+                       else if (current_settings.PrintRange == PrintRange.Selection && allow_selection)
+                               radio_sel.Checked = true;
+                       else
+                               radio_all.Checked = true;
+
+                       updown_copies.Value = current_settings.Copies == 0 ? 1 : (int) current_settings.Copies;
+                       chkbox_collate.Checked = current_settings.Collate;
+                       chkbox_collate.Enabled = (updown_copies.Value > 1) ? true : false;
+
+                       if (show_help) {
+                               ShowHelpButton ();
+                       }
+
+                       SetPrinterDetails ();
+
                        return true;
                }
+
+               private void OnClickCancelButton (object sender, EventArgs e)
+               {
+                       form.DialogResult = DialogResult.Cancel;
+               }
+
+               void ShowErrorMessage (string message, Control control_to_focus)
+               {
+                       MessageBox.Show (message, "Print", MessageBoxButtons.OK, MessageBoxIcon.Warning);
+                       if (control_to_focus != null)
+                               control_to_focus.Focus ();
+               }
+
+               private void OnClickOkButton (object sender, EventArgs e)
+               {
+                       if (updown_copies.Text.Length < 1) {
+                               ShowErrorMessage ("The 'Copies' value cannot be empty and must be a positive value.", 
+                                               updown_copies);
+                               return;
+                       }
+
+                       int from = -1, to = -1;
+
+                       if (allow_some_pages && radio_pages.Checked) {
+                               if (txtFrom.Text.Length < 1) {
+                                       ShowErrorMessage ("The 'From' value cannot be empty and must be a positive value.",
+                                                       txtFrom);
+                                       return;
+                               }
+
+                               try {
+                                       from = Int32.Parse (txtFrom.Text);
+                                       to = Int32.Parse (txtTo.Text);
+                               }
+                               catch {
+                                       ShowErrorMessage ("From/To values should be numeric", txtFrom);
+                                       return;
+                               }
+                                       
+                               if (from > to) {
+                                       ShowErrorMessage ("'From' value cannot be greater than 'To' value.", txtFrom);
+                                       return;
+                               }
+                                       
+                               if (to < current_settings.MinimumPage || to > current_settings.MaximumPage) {
+                                       ShowErrorMessage ("'To' value is not within the page range\n" +
+                                                       "Enter a number between " + current_settings.MinimumPage +
+                                                       " and " + current_settings.MaximumPage + ".", txtTo);
+                                       return;
+                               }
+                                       
+                               if (from < current_settings.MinimumPage || from > current_settings.MaximumPage) {
+                                       ShowErrorMessage ("'From' value is not within the page range\n" +
+                                                       "Enter a number between " + current_settings.MinimumPage +
+                                                       " and " + current_settings.MaximumPage + ".", txtFrom);
+                                       return;
+                               }
+                       }
+                       
+                       if (radio_all.Checked == true)
+                               current_settings.PrintRange = PrintRange.AllPages;
+                       else if (radio_pages.Checked == true)
+                               current_settings.PrintRange = PrintRange.SomePages;
+                       else
+                               current_settings.PrintRange = PrintRange.Selection;
+
+                       current_settings.Copies = (short) updown_copies.Value;
+                       if (current_settings.PrintRange == PrintRange.SomePages) {
+                               current_settings.FromPage = from;
+                               current_settings.ToPage = to;
+                       }
+                       current_settings.Collate = chkbox_collate.Checked;
+
+                       if (allow_print_to_file) {
+                               current_settings.PrintToFile = chkbox_print.Checked;
+                       }
+
+                       form.DialogResult = DialogResult.OK;
+
+                       if (printer_combo.SelectedItem != null)
+                               current_settings.PrinterName = (string) printer_combo.SelectedItem;
+
+                       if (document != null) {
+                               document.PrintController = new PrintControllerWithStatusDialog (document.PrintController);
+                               document.PrinterSettings = current_settings;
+                       }
+               }
+
+               private void ShowHelpButton ()
+               {
+                       if (help_button == null) {
+                               help_button = new Button ();
+                               help_button.TabIndex = 60;
+
+                               help_button.Anchor = ((AnchorStyles)((AnchorStyles.Bottom | AnchorStyles.Left)));
+                               help_button.FlatStyle = FlatStyle.System;
+                               help_button.Location = new Point (20, 270);
+                               help_button.Text = "&Help";
+                               help_button.FlatStyle = FlatStyle.System;
+                               form.Controls.Add (help_button);
+                       }
+
+                       help_button.Visible = show_help;
+               }
+
+               private void OnUpDownValueChanged (object sender, System.EventArgs e)
+               {
+                       chkbox_collate.Enabled = (updown_copies.Value > 1) ? true : false;
+               }
+
+               void OnPagesCheckedChanged (object obj, EventArgs args)
+               {
+                       if (radio_pages.Checked && !txtTo.Focused)
+                               txtFrom.Focus ();
+               }
+
+               private void CreateFormControls ()
+               {
+                       form.SuspendLayout ();
+
+                       GroupBox group_box_prn = new GroupBox ();
+                       group_box_prn.Location = new Point (10, 8);
+                       group_box_prn.Text = "Printer";
+                       group_box_prn.Size = new Size (420, 145);
+
+                       GroupBox group_box_range = new GroupBox ();
+                       group_box_range.Location = new Point (10, 155);
+                       group_box_range.Text = "Print range";
+                       group_box_range.Size = new Size (240, 100);
+
+                       GroupBox group_box_copies = new GroupBox ();
+                       group_box_copies.Location = new Point (265, 155);
+                       group_box_copies.Text = "Copies";
+                       group_box_copies.Size = new Size (165, 100);
+
+                       // Accept button
+                       accept_button = new Button ();
+                       form.AcceptButton = accept_button;
+                       accept_button.Anchor = ((AnchorStyles)((AnchorStyles.Bottom | AnchorStyles.Right)));
+                       accept_button.FlatStyle = FlatStyle.System;
+                       accept_button.Location = new Point (265, 270);
+                       accept_button.Text = "OK";
+                       accept_button.FlatStyle = FlatStyle.System;
+                       accept_button.Click += new EventHandler (OnClickOkButton);
+
+                       // Cancel button
+                       cancel_button = new Button ();
+                       form.CancelButton = cancel_button;
+                       cancel_button.Anchor = ((AnchorStyles)((AnchorStyles.Bottom | AnchorStyles.Right)));
+                       cancel_button.FlatStyle = FlatStyle.System;
+                       cancel_button.Location = new Point (350, 270);
+                       cancel_button.Text = "Cancel";
+                       cancel_button.FlatStyle = FlatStyle.System;
+                       cancel_button.Click += new EventHandler (OnClickCancelButton);
+
+                       // Static controls
+                       Label label = new Label ();
+                       label.AutoSize = true;
+                       label.Text = "&Name:";
+                       label.Location = new Point (20, 33);
+                       group_box_prn.Controls.Add (label);
+
+                       label = new Label ();
+                       label.Text = "Status:";
+                       label.AutoSize = true;
+                       label.Location = new Point (20, 60);
+                       group_box_prn.Controls.Add (label);
+
+                       label_status = new Label ();
+                       label_status.AutoSize = true;
+                       label_status.Location = new Point (80, 60);
+                       group_box_prn.Controls.Add (label_status);
+
+                       label = new Label ();
+                       label.Text = "Type:";
+                       label.AutoSize = true;
+                       label.Location = new Point (20, 80);
+                       group_box_prn.Controls.Add (label);
+
+                       label_type = new Label ();
+                       label_type.AutoSize = true;
+                       label_type.Location = new Point (80, 80);
+                       group_box_prn.Controls.Add (label_type);
+
+                       label = new Label ();
+                       label.Text = "Where:";
+                       label.AutoSize = true;
+                       label.Location = new Point (20, 100);
+                       group_box_prn.Controls.Add (label);
+                       
+                       label_where = new Label ();
+                       label_where.AutoSize = true;
+                       label_where.Location = new Point (80, 100);
+                       group_box_prn.Controls.Add (label_where);
+
+                       label = new Label ();
+                       label.Text = "Comment:";
+                       label.AutoSize = true;
+                       label.Location = new Point (20, 120);
+                       group_box_prn.Controls.Add (label);
+
+                       label_comment = new Label ();
+                       label_comment.AutoSize = true;
+                       label_comment.Location = new Point (80, 120);
+                       group_box_prn.Controls.Add (label_comment);
+
+                       radio_all = new RadioButton ();
+                       radio_all.TabIndex = 21;
+                       radio_all.Location = new Point (20, 20);
+                       radio_all.Text = "&All";
+                       radio_all.Checked = true;
+                       group_box_range.Controls.Add (radio_all);
+
+                       radio_pages = new RadioButton ();
+                       radio_pages.TabIndex = 22;
+                       radio_pages.Location = new Point (20, 46);
+                       radio_pages.Text = "Pa&ges";
+                       radio_pages.Width = 60;
+                       radio_pages.CheckedChanged += new EventHandler (OnPagesCheckedChanged);
+                       group_box_range.Controls.Add (radio_pages);
+
+                       radio_sel = new RadioButton ();
+                       radio_sel.TabIndex = 23;
+                       radio_sel.Location = new Point (20, 72);
+                       radio_sel.Text = "&Selection";
+                       group_box_range.Controls.Add (radio_sel);
+
+                       labelFrom = new Label ();
+                       labelFrom.Text = "&from:";
+                       labelFrom.TabIndex = 24;
+                       labelFrom.AutoSize = true;
+                       labelFrom.Location = new Point (80, 50);
+                       group_box_range.Controls.Add (labelFrom);
+
+                       txtFrom = new TextBox ();
+                       txtFrom.TabIndex = 25;
+                       txtFrom.Location = new Point (120, 50);
+                       txtFrom.Width = 40;
+                       txtFrom.TextChanged += new EventHandler (OnPagesTextChanged);
+                       group_box_range.Controls.Add (txtFrom);
+
+                       labelTo = new Label ();
+                       labelTo.Text = "&to:";
+                       labelTo.TabIndex = 26;
+                       labelTo.AutoSize = true;
+                       labelTo.Location = new Point (170, 50);
+                       group_box_range.Controls.Add (labelTo);
+
+                       txtTo = new TextBox ();
+                       txtTo.TabIndex = 27;
+                       txtTo.Location = new Point (190, 50);
+                       txtTo.Width = 40;
+                       txtTo.TextChanged += new EventHandler (OnPagesTextChanged);
+                       group_box_range.Controls.Add (txtTo);
+
+                       chkbox_print = new CheckBox ();
+                       chkbox_print.Location = new Point (305, 115);
+                       chkbox_print.Text = "Print to fil&e";
+
+                       label = new Label ();
+                       label.Text = "Number of &copies:";
+                       label.AutoSize = true;
+                       label.Location = new Point (20, 20);
+                       group_box_copies.Controls.Add (label);
+
+                       updown_copies = new NumericUpDown ();
+                       updown_copies.TabIndex = 31;
+                       updown_copies.Location = new Point (120, 20);
+                       updown_copies.Minimum = 1;
+                       group_box_copies.Controls.Add (updown_copies);
+                       updown_copies.ValueChanged += new System.EventHandler (OnUpDownValueChanged);
+                       updown_copies.Size = new System.Drawing.Size (40, 20);
+
+                       chkbox_collate = new CheckBox ();
+                       chkbox_collate.TabIndex = 32;
+                       chkbox_collate.Location = new Point (20, 40);
+                       chkbox_collate.Text = "C&ollate";
+                       chkbox_collate.Width = 80;
+                       group_box_copies.Controls.Add (chkbox_collate);
+
+
+
+                       // Printer combo
+                       printer_combo = new ComboBox ();
+                       printer_combo.DropDownStyle = ComboBoxStyle.DropDownList;
+                       printer_combo.Location = new Point (80, 32);
+                       printer_combo.Width = 220;
+                       printer_combo.SelectedIndexChanged += new EventHandler (OnPrinterSelectedIndexChanged);
+
+                       default_printer_settings = new PrinterSettings ();
+                       for (int i = 0; i < installed_printers.Count; i++) {
+                               printer_combo.Items.Add (installed_printers[i]);
+                               if (installed_printers[i] == default_printer_settings.PrinterName)
+                                       printer_combo.SelectedItem = installed_printers[i];
+                       }
+                       printer_combo.TabIndex = 11;
+                       chkbox_print.TabIndex = 12;
+                       group_box_prn.Controls.Add (printer_combo);
+                       group_box_prn.Controls.Add (chkbox_print);
+
+                       form.Size =  new Size (450, 327); // 384
+                       form.FormBorderStyle = FormBorderStyle.FixedDialog;
+                       form.MaximizeBox = false;
+                       group_box_prn.TabIndex = 10;
+                       group_box_range.TabIndex = 20;
+                       group_box_copies.TabIndex = 30;
+                       accept_button.TabIndex = 40;
+                       cancel_button.TabIndex = 50;
+                       form.Controls.Add (group_box_prn);
+                       form.Controls.Add (group_box_range);
+                       form.Controls.Add (group_box_copies);
+                       form.Controls.Add (accept_button);
+                       form.Controls.Add (cancel_button);
+                       form.ResumeLayout (false);
+               }
+
+               void OnPagesTextChanged (object sender, EventArgs args)
+               {
+                       radio_pages.Checked = true;
+               }
+
+               private void OnPrinterSelectedIndexChanged (object sender,  System.EventArgs e)
+               {                       
+                       SetPrinterDetails ();
+               }
+
+               private void SetPrinterDetails ()
+               {
+                       try
+                       {
+                               string printer, port = string.Empty, type = string.Empty;
+                               string status = string.Empty, comment = string.Empty;
+                               Type sysprn = Type.GetType ("System.Drawing.Printing.SysPrn, System.Drawing");
+                               MethodInfo dlg_info = sysprn.GetMethod ("GetPrintDialogInfo", BindingFlags.Static | BindingFlags.NonPublic);
+
+                               printer = (string) printer_combo.SelectedItem;
+
+                               if (printer != null) {
+                                       object[] args  = new object [5];
+                                       args[0] = printer;
+                                       args[1] = port;
+                                       args[2] = type;
+                                       args[3] = status;
+                                       args[4] = comment;
+                                       dlg_info.Invoke (null, args);
+                                       port = (string) args[1];
+                                       type = (string) args[2];
+                                       status = (string) args[3];
+                                       comment = (string) args[4];
+                               }
+
+                               label_status.Text = status;
+                               label_type.Text = type;
+                               label_where.Text = port;
+                               label_comment.Text = comment;
+
+                               accept_button.Enabled = true;
+                       }
+                       catch  {
+                               accept_button.Enabled = false;
+                       }
+               }
        }
 }