Jo Shields a575963da9 Imported Upstream version 3.6.0
Former-commit-id: da6be194a6b1221998fc28233f2503bd61dd9d14
2014-08-13 10:39:27 +01:00

718 lines
20 KiB
C#

// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// 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
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
// 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-2006 Novell, Inc.
//
// Authors:
// Someone
// Jonathan Chambers (jonathan.chambers@ansys.com)
// Jordi Mas i Hernandez (jordimash@gmail.com)
//
using System;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.ComponentModel.Design.Serialization;
using System.Collections;
using System.Diagnostics;
using System.Drawing;
using System.Drawing.Printing;
using System.Reflection;
namespace System.Windows.Forms
{
[Designer ("System.Windows.Forms.Design.PrintDialogDesigner, " + Consts.AssemblySystem_Design,
"System.ComponentModel.Design.IDesigner")]
[DefaultProperty("Document")]
public sealed class PrintDialog : CommonDialog {
PrintDocument document;
bool allow_current_page;
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;
private CollatePreview collate;
private bool use_ex_dialog;
public PrintDialog ()
{
form = new DialogForm (this);
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;
}
[DefaultValue (false)]
public bool AllowCurrentPage {
get {
return allow_current_page;
}
set {
allow_current_page = value;
radio_pages.Enabled = value;
}
}
[DefaultValue(true)]
public bool AllowPrintToFile {
get {
return allow_print_to_file;
}
set {
allow_print_to_file = value;
chkbox_print.Enabled = value;
}
}
[DefaultValue(false)]
public bool AllowSelection {
get {
return allow_selection;
}
set {
allow_selection = value;
radio_sel.Enabled = value;
}
}
[DefaultValue(false)]
public bool AllowSomePages {
get {
return allow_some_pages;
}
set {
allow_some_pages = value;
radio_pages.Enabled = value;
txtFrom.Enabled = value;
txtTo.Enabled = value;
labelTo.Enabled = value;
labelFrom.Enabled = value;
if (PrinterSettings != null) {
txtFrom.Text = PrinterSettings.FromPage.ToString ();
txtTo.Text = PrinterSettings.ToPage.ToString ();
}
}
}
[DefaultValue(null)]
public PrintDocument Document {
get {
return document;
}
set {
document = value;
current_settings = (value == null) ? new PrinterSettings () : value.PrinterSettings;
}
}
[Browsable(false)]
[DefaultValue(null)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public PrinterSettings PrinterSettings {
get {
if (current_settings == null)
current_settings = new PrinterSettings ();
return current_settings;
}
set {
if (value != null && value == current_settings)
return;
current_settings = (value == null) ? new PrinterSettings () : value;
document = null;
}
}
[DefaultValue(false)]
public bool PrintToFile {
get {
return print_to_file;
}
set {
print_to_file = value;
}
}
[DefaultValue(true)]
public bool ShowNetwork {
get {
return show_network;
}
set {
show_network = value;
}
}
[DefaultValue(false)]
public bool ShowHelp {
get {
return show_help;
}
set {
show_help = value;
ShowHelpButton ();
}
}
[MonoTODO ("Stub, not implemented, will always use default dialog")]
[DefaultValue (false)]
public bool UseEXDialog {
get { return use_ex_dialog; }
set { use_ex_dialog = value; }
}
protected override bool RunDialog (IntPtr hwndOwner)
{
if (allow_some_pages && PrinterSettings.FromPage > PrinterSettings.ToPage)
throw new ArgumentException ("FromPage out of range");
if (allow_some_pages) {
txtFrom.Text = PrinterSettings.FromPage.ToString ();
txtTo.Text = PrinterSettings.ToPage.ToString ();
}
if (PrinterSettings.PrintRange == PrintRange.SomePages && allow_some_pages)
radio_pages.Checked = true;
else if (PrinterSettings.PrintRange == PrintRange.Selection && allow_selection)
radio_sel.Checked = true;
else
radio_all.Checked = true;
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) {
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 < PrinterSettings.MinimumPage || to > PrinterSettings.MaximumPage) {
ShowErrorMessage ("'To' value is not within the page range\n" +
"Enter a number between " + PrinterSettings.MinimumPage +
" and " + PrinterSettings.MaximumPage + ".", txtTo);
return;
}
if (from < PrinterSettings.MinimumPage || from > PrinterSettings.MaximumPage) {
ShowErrorMessage ("'From' value is not within the page range\n" +
"Enter a number between " + PrinterSettings.MinimumPage +
" and " + PrinterSettings.MaximumPage + ".", txtFrom);
return;
}
}
if (radio_all.Checked == true)
PrinterSettings.PrintRange = PrintRange.AllPages;
else if (radio_pages.Checked == true)
PrinterSettings.PrintRange = PrintRange.SomePages;
else
PrinterSettings.PrintRange = PrintRange.Selection;
PrinterSettings.Copies = (short) updown_copies.Value;
if (PrinterSettings.PrintRange == PrintRange.SomePages) {
PrinterSettings.FromPage = from;
PrinterSettings.ToPage = to;
}
PrinterSettings.Collate = chkbox_collate.Checked;
if (allow_print_to_file) {
PrinterSettings.PrintToFile = chkbox_print.Checked;
}
form.DialogResult = DialogResult.OK;
if (printer_combo.SelectedItem != null)
PrinterSettings.PrinterName = (string) printer_combo.SelectedItem;
if (document != null) {
document.PrintController = new PrintControllerWithStatusDialog (document.PrintController);
document.PrinterSettings = PrinterSettings;
}
}
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";
updown_copies = new NumericUpDown ();
updown_copies.TabIndex = 31;
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 (105, 55);
chkbox_collate.Text = "C&ollate";
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
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;
}
}
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;
}
}
}
}
}