2008-03-05 Jonathan Pobst <monkey@jpobst.com>
[mono.git] / mcs / class / Managed.Windows.Forms / System.Windows.Forms / PrintDialog.cs
index 3c9007d7bba8eb96dfacf6c5b47f67d55180c60c..2c48f8f35b33a3194a6c429cbb7949f936af4dc1 100644 (file)
@@ -37,10 +37,16 @@ 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;
+#if NET_2_0
                bool allow_current_page;
+#endif
                bool allow_print_to_file;
                bool allow_selection;
                bool allow_some_pages;
@@ -69,9 +75,14 @@ namespace System.Windows.Forms
                private Label label_type;
                private Label label_where;
                private Label label_comment;
+               private CollatePreview collate;
+#if NET_2_0
+               private bool use_ex_dialog;
+#endif
 
                public PrintDialog ()
                {
+                       form = new DialogForm (this);
                        help_button = null;
                        installed_printers = System.Drawing.Printing.PrinterSettings.InstalledPrinters;
 
@@ -82,7 +93,7 @@ namespace System.Windows.Forms
 
                public override void Reset ()
                {
-                       current_settings = new PrinterSettings ();
+                       current_settings = null;
                        AllowPrintToFile = true;
                        AllowSelection = false;
                        AllowSomePages = false;
@@ -92,6 +103,7 @@ namespace System.Windows.Forms
                }
 
 #if NET_2_0
+               [DefaultValue (false)]
                public bool AllowCurrentPage {
                        get {
                                return allow_current_page;
@@ -142,9 +154,9 @@ namespace System.Windows.Forms
                                labelTo.Enabled = value;
                                labelFrom.Enabled = value;
 
-                               if (current_settings != null) {
-                                       txtFrom.Text = current_settings.FromPage.ToString ();
-                                       txtTo.Text = current_settings.ToPage.ToString ();
+                               if (PrinterSettings != null) {
+                                       txtFrom.Text = PrinterSettings.FromPage.ToString ();
+                                       txtTo.Text = PrinterSettings.ToPage.ToString ();
                                }
                        }
                }
@@ -157,7 +169,7 @@ namespace System.Windows.Forms
 
                        set {
                                document = value;
-                               current_settings = value == null ? new PrinterSettings () : value.PrinterSettings;
+                               current_settings = (value == null) ? new PrinterSettings () : value.PrinterSettings;
                        }
                }
 
@@ -166,6 +178,10 @@ namespace System.Windows.Forms
                [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
                public PrinterSettings PrinterSettings {
                        get {
+#if NET_2_0
+                               if (current_settings == null)
+                                       current_settings = new PrinterSettings ();
+#endif
                                return current_settings;
                        }
 
@@ -173,7 +189,7 @@ namespace System.Windows.Forms
                                if (value != null && value == current_settings)
                                        return;
 
-                               current_settings = value == null ? new PrinterSettings () : value;
+                               current_settings = (value == null) ? new PrinterSettings () : value;
                                document = null;
                        }
                }
@@ -212,25 +228,39 @@ namespace System.Windows.Forms
                        }
                }
 
-               protected override bool RunDialog (IntPtr hwnd)
+#if NET_2_0
+               [MonoTODO ("Stub, not implemented")]
+               [DefaultValue (false)]
+               public bool UseEXDialog {
+                       get { return use_ex_dialog; }
+                       set { use_ex_dialog = value; }
+               }
+#endif
+
+               protected override bool RunDialog (IntPtr hwndOwner)
                {
-                       if (allow_some_pages && current_settings.FromPage > current_settings.ToPage)
+#if ONLY_1_1
+                       if (PrinterSettings == null)
+                               throw new ArgumentException ("PrintDialog needs a PrinterSettings object to display.");
+#endif
+
+                       if (allow_some_pages && PrinterSettings.FromPage > PrinterSettings.ToPage)
                                throw new ArgumentException ("FromPage out of range");
 
                        if (allow_some_pages) {
-                               txtFrom.Text = current_settings.FromPage.ToString ();
-                               txtTo.Text = current_settings.ToPage.ToString ();
+                               txtFrom.Text = PrinterSettings.FromPage.ToString ();
+                               txtTo.Text = PrinterSettings.ToPage.ToString ();
                        }
 
-                       if (current_settings.PrintRange == PrintRange.SomePages && allow_some_pages)
+                       if (PrinterSettings.PrintRange == PrintRange.SomePages && allow_some_pages)
                                radio_pages.Checked = true;
-                       else if (current_settings.PrintRange == PrintRange.Selection && allow_selection)
+                       else if (PrinterSettings.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;
+                       updown_copies.Value = PrinterSettings.Copies == 0 ? 1 : (int) PrinterSettings.Copies;
+                       chkbox_collate.Checked = PrinterSettings.Collate;
                        chkbox_collate.Enabled = (updown_copies.Value > 1) ? true : false;
 
                        if (show_help) {
@@ -284,48 +314,48 @@ namespace System.Windows.Forms
                                        ShowErrorMessage ("'From' value cannot be greater than 'To' value.", txtFrom);
                                        return;
                                }
-                                       
-                               if (to < current_settings.MinimumPage || to > current_settings.MaximumPage) {
+
+                               if (to < PrinterSettings.MinimumPage || to > PrinterSettings.MaximumPage) {
                                        ShowErrorMessage ("'To' value is not within the page range\n" +
-                                                       "Enter a number between " + current_settings.MinimumPage +
-                                                       " and " + current_settings.MaximumPage + ".", txtTo);
+                                                       "Enter a number between " + PrinterSettings.MinimumPage +
+                                                       " and " + PrinterSettings.MaximumPage + ".", txtTo);
                                        return;
                                }
-                                       
-                               if (from < current_settings.MinimumPage || from > current_settings.MaximumPage) {
+
+                               if (from < PrinterSettings.MinimumPage || from > PrinterSettings.MaximumPage) {
                                        ShowErrorMessage ("'From' value is not within the page range\n" +
-                                                       "Enter a number between " + current_settings.MinimumPage +
-                                                       " and " + current_settings.MaximumPage + ".", txtFrom);
+                                                       "Enter a number between " + PrinterSettings.MinimumPage +
+                                                       " and " + PrinterSettings.MaximumPage + ".", txtFrom);
                                        return;
                                }
                        }
                        
                        if (radio_all.Checked == true)
-                               current_settings.PrintRange = PrintRange.AllPages;
+                               PrinterSettings.PrintRange = PrintRange.AllPages;
                        else if (radio_pages.Checked == true)
-                               current_settings.PrintRange = PrintRange.SomePages;
+                               PrinterSettings.PrintRange = PrintRange.SomePages;
                        else
-                               current_settings.PrintRange = PrintRange.Selection;
+                               PrinterSettings.PrintRange = PrintRange.Selection;
 
-                       current_settings.Copies = (short) updown_copies.Value;
-                       if (current_settings.PrintRange == PrintRange.SomePages) {
-                               current_settings.FromPage = from;
-                               current_settings.ToPage = to;
+                       PrinterSettings.Copies = (short) updown_copies.Value;
+                       if (PrinterSettings.PrintRange == PrintRange.SomePages) {
+                               PrinterSettings.FromPage = from;
+                               PrinterSettings.ToPage = to;
                        }
-                       current_settings.Collate = chkbox_collate.Checked;
+                       PrinterSettings.Collate = chkbox_collate.Checked;
 
                        if (allow_print_to_file) {
-                               current_settings.PrintToFile = chkbox_print.Checked;
+                               PrinterSettings.PrintToFile = chkbox_print.Checked;
                        }
 
                        form.DialogResult = DialogResult.OK;
 
                        if (printer_combo.SelectedItem != null)
-                               current_settings.PrinterName = (string) printer_combo.SelectedItem;
+                               PrinterSettings.PrinterName = (string) printer_combo.SelectedItem;
 
                        if (document != null) {
                                document.PrintController = new PrintControllerWithStatusDialog (document.PrintController);
-                               document.PrinterSettings = current_settings;
+                               document.PrinterSettings = PrinterSettings;
                        }
                }
 
@@ -430,6 +460,11 @@ namespace System.Windows.Forms
                        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:";
@@ -440,6 +475,7 @@ namespace System.Windows.Forms
                        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;
@@ -494,27 +530,35 @@ namespace System.Windows.Forms
                        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.Location = new Point (105, 18);
                        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);
 
+                       label = new Label ();
+                       label.Text = "Number of &copies:";
+                       label.AutoSize = true;
+                       label.Location = new Point (10, 20);
+                       group_box_copies.Controls.Add (label);
+
                        chkbox_collate = new CheckBox ();
                        chkbox_collate.TabIndex = 32;
-                       chkbox_collate.Location = new Point (20, 40);
+                       chkbox_collate.Location = new Point (105, 55);
                        chkbox_collate.Text = "C&ollate";
-                       chkbox_collate.Width = 80;
+                       chkbox_collate.Width = 58;
+                       chkbox_collate.CheckedChanged += new EventHandler(chkbox_collate_CheckedChanged);
+               
                        group_box_copies.Controls.Add (chkbox_collate);
 
+                       collate = new CollatePreview ();
+                       collate.Location = new Point (6, 50);
+                       collate.Size = new Size (100, 45);
+                       group_box_copies.Controls.Add (collate);
+                       
 
 
                        // Printer combo
@@ -556,10 +600,10 @@ namespace System.Windows.Forms
                        radio_pages.Checked = true;
                }
 
-               private void OnPrinterSelectedIndexChanged (object sender,  System.EventArgs e)
-               {                       
-                       SetPrinterDetails ();
-               }
+               private void OnPrinterSelectedIndexChanged (object sender,  System.EventArgs e) 
+               {
+                       SetPrinterDetails ();
+               }
 
                private void SetPrinterDetails ()
                {
@@ -591,8 +635,99 @@ namespace System.Windows.Forms
                                label_where.Text = port;
                                label_comment.Text = comment;
 
+                               accept_button.Enabled = true;
                        }
                        catch  {
+                               accept_button.Enabled = false;
+                       }
+               }
+
+               private void chkbox_collate_CheckedChanged(object sender, EventArgs e) {
+                       collate.Collate = chkbox_collate.Checked;
+               }
+
+               class CollatePreview : UserControl 
+               {       
+                       private bool collate;
+                       public bool Collate {
+                               get { return collate;}
+                               set { if (collate != value) {
+                                                 collate = value;
+                                                 Invalidate();
+                                         }
+                               }
+                       }
+
+                       new Font font;
+
+                       public CollatePreview () 
+                       {
+                               font = new Font(FontFamily.GenericSansSerif, 10);
+                       }
+                       
+                       protected override void OnPaint(PaintEventArgs e) 
+                       {
+                               if (collate)
+                                       DrawCollate (e.Graphics);
+                               else
+                                       DrawNoCollate (e.Graphics);
+
+                               base.OnPaint (e);
+                       }
+
+                       void DrawCollate (Graphics g)
+                       {
+                               int x1 = 0;
+                               int y1 = 12;
+
+                               int x2 = 14;
+                               int y2 = 6;
+
+                               int x3 = 26;
+                               int y3 = 0;
+
+                               for (int i = 0; i < 2; i++) {
+                                       
+                                       g.FillRectangle (Brushes.White, x3 + (i*18), y3, 18, 24);
+                                       ControlPaint.DrawBorder (g, new Rectangle (x3 + (i*18), y3, 18, 24), SystemColors.ControlDark, ButtonBorderStyle.Solid);
+                                       g.DrawString ((i+1).ToString(), font, SystemBrushes.ControlDarkDark, x3 + (i*18) + 5, y3 + 5, StringFormat.GenericTypographic);
+
+                                       g.FillRectangle (Brushes.White, x2 + (i*18), y2, 18, 24);
+                                       ControlPaint.DrawBorder (g, new Rectangle (x2 + (i*18), y2, 18, 24), SystemColors.ControlDark, ButtonBorderStyle.Solid);
+                                       g.DrawString ((i+1).ToString(), font, SystemBrushes.ControlDarkDark, x2 + (i*18) + 5, y2 + 5, StringFormat.GenericTypographic);
+                               
+                                       g.FillRectangle (Brushes.White, x1 + (i*18), y1, 18, 24);
+                                       ControlPaint.DrawBorder (g, new Rectangle (x1 + (i*18), y1, 18, 24), SystemColors.ControlDark, ButtonBorderStyle.Solid);
+                                       g.DrawString ((i+1).ToString(), font, SystemBrushes.ControlDarkDark, x1 + (i*18) + 5, y1 + 5, StringFormat.GenericTypographic);
+
+
+                                       x1 += 28;
+                                       x2 += 28;
+                                       x3 += 28;
+                               }
+                       }
+
+                       void DrawNoCollate (Graphics g) 
+                       {
+                               int x1 = 0;
+                               int y1 = 12;
+
+                               int x2 = 13;
+                               int y2 = 4;
+
+                               for (int i = 0; i < 3; i++) {
+                                       
+                                       g.FillRectangle (Brushes.White, x2 + (i*18), y2, 18, 24);
+                                       ControlPaint.DrawBorder (g, new Rectangle (x2 + (i*18), y2, 18, 24), SystemColors.ControlDark, ButtonBorderStyle.Solid);
+                                       g.DrawString ((i+1).ToString(), font, SystemBrushes.ControlDarkDark, x2 + (i*18) + 5, y2 + 5, StringFormat.GenericTypographic);
+                               
+                                       g.FillRectangle (Brushes.White, x1 + (i*18), y1, 18, 24);
+                                       ControlPaint.DrawBorder (g, new Rectangle (x1 + (i*18), y1, 18, 24), SystemColors.ControlDark, ButtonBorderStyle.Solid);
+                                       g.DrawString ((i+1).ToString(), font, SystemBrushes.ControlDarkDark, x1 + (i*18) + 5, y1 + 5, StringFormat.GenericTypographic);
+
+                                       x1 += 15;
+                                       x2 += 15;
+                               }
                        }
                }
        }