Fixes #79835, implements PrinterSettings.IsValid, throws proper
[mono.git] / mcs / class / System.Drawing / System.Drawing.Printing / PrintDocument.cs
1 //
2 // System.Drawing.PrintDocument.cs
3 //
4 // Authors:
5 //   Dennis Hayes (dennish@Raytek.com)
6 //   Herve Poussineau (hpoussineau@fr.st)
7 //   Andreas Nahr (ClassDevelopment@A-SoftTech.com)
8 //
9 // (C) 2002 Ximian, Inc
10 //
11
12 //
13 // Copyright (C) 2004 Novell, Inc (http://www.novell.com)
14 //
15 // Permission is hereby granted, free of charge, to any person obtaining
16 // a copy of this software and associated documentation files (the
17 // "Software"), to deal in the Software without restriction, including
18 // without limitation the rights to use, copy, modify, merge, publish,
19 // distribute, sublicense, and/or sell copies of the Software, and to
20 // permit persons to whom the Software is furnished to do so, subject to
21 // the following conditions:
22 // 
23 // The above copyright notice and this permission notice shall be
24 // included in all copies or substantial portions of the Software.
25 // 
26 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
27 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
28 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
29 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
30 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
31 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
32 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
33 //
34
35 using System;
36 using System.ComponentModel;
37
38 namespace System.Drawing.Printing
39 {
40         [DefaultEvent ("PrintPage"), DefaultProperty ("DocumentName")]
41         [ToolboxItemFilter ("System.Drawing.Printing", ToolboxItemFilterType.Allow)]
42         public class PrintDocument : System.ComponentModel.Component
43         {
44                 private PageSettings defaultpagesettings;
45                 private PrinterSettings printersettings;
46                 private PrintController printcontroller;
47                 private string documentname;
48 #if !(NET_1_0)
49                 private bool originAtMargins = false; // .NET V1.1 Beta
50 #endif
51
52                 public PrintDocument() {
53                         documentname = "document"; //offical default.
54                         defaultpagesettings = new PageSettings(); // use default values of default printer
55                         printersettings = new PrinterSettings(); // use default values
56                         printcontroller = new StandardPrintController();
57                 }
58                 
59                 // properties
60                 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
61                 [Browsable (false)]
62                 [SRDescription ("The settings for the current page.")]
63                 public PageSettings DefaultPageSettings{
64                         get{
65                                 return defaultpagesettings;
66                         }
67                         set{
68                                 defaultpagesettings = value;
69                         }
70                 }
71
72                 // Name of the document, not the file!
73                 [DefaultValue ("document")]
74                 [SRDescription ("The name of the document.")]
75                 public string DocumentName{
76                         get{
77                                 return documentname;
78                         }
79                         set{
80                                 documentname = value;
81                         }
82                 }
83
84                 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
85                 [Browsable (false)]
86                 [SRDescription ("The print controller object.")]
87                 public PrintController PrintController{
88                         get{
89                                 return printcontroller;
90                         }
91                         set{
92                                 printcontroller = value;
93                         }
94                 }
95
96                 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
97                 [Browsable (false)]
98                 [SRDescription ("The current settings for the active printer.")]
99                 public PrinterSettings PrinterSettings{
100                         get{
101                                 return printersettings;
102                         }
103                         set{
104                                 printersettings = value == null ? new PrinterSettings () : value;
105                         }
106                 }
107
108 #if !(NET_1_0)
109                 [DefaultValue (false)]
110                 [SRDescription ("Determines if the origin is set at the specified margins.")]
111                 public bool OriginAtMargins{
112                         get{
113                                 return originAtMargins;
114                         }
115                         set{
116                                 originAtMargins = value;
117                         }
118                 }
119 #endif
120
121                 // methods
122                 public void Print(){
123                         PrintEventArgs printArgs = new PrintEventArgs();
124                         this.OnBeginPrint(printArgs);
125                         if (printArgs.Cancel)
126                                 return;
127                         PrintController.OnStartPrint(this, printArgs);
128                         if (printArgs.Cancel)
129                                 return;                 
130                                 
131                         Graphics g = null;
132                         
133                         if (printArgs.GraphicsContext != null) {
134                                 g = Graphics.FromHdc (printArgs.GraphicsContext.Hdc);
135                                 printArgs.GraphicsContext.Graphics = g;
136                         }
137
138                         // while there are more pages
139                         PrintPageEventArgs printPageArgs;
140                         do
141                         {
142                                 PageSettings pageSettings = DefaultPageSettings.Clone() as PageSettings;
143                                 this.OnQueryPageSettings(new QueryPageSettingsEventArgs(pageSettings));
144                                 
145                                 printPageArgs = new PrintPageEventArgs(
146                                                 g,
147                                                 pageSettings.Bounds,
148                                                 new Rectangle(0, 0, pageSettings.PaperSize.Width, pageSettings.PaperSize.Height),
149                                                 pageSettings);
150                                                         
151                                 // TODO: We should create a graphics context for each page since they can have diferent paper
152                                 // size, orientation, etc. We use a single graphic for now to keep Cairo using a single PDF file.
153                                 
154                                 printPageArgs.GraphicsContext = printArgs.GraphicsContext;
155                                 Graphics pg = PrintController.OnStartPage(this, printPageArgs);
156
157                                 // assign Graphics in printPageArgs
158                                 printPageArgs.SetGraphics(pg);
159                                 
160                                 if (!printPageArgs.Cancel)
161                                         this.OnPrintPage(printPageArgs);                                
162                                 
163                                 PrintController.OnEndPage(this, printPageArgs);                         
164                                 if (printPageArgs.Cancel)
165                                         break;                          
166                         } while (printPageArgs.HasMorePages);                   
167
168                         this.OnEndPrint(printArgs);
169                         PrintController.OnEndPrint(this, printArgs);                    
170                 }
171
172                 public override string ToString(){
173                         return "[PrintDocument " + this.DocumentName + "]";
174                 }
175                 
176                 // events
177                 protected virtual void OnBeginPrint(PrintEventArgs e){
178                         //fire the event
179                         if (BeginPrint != null)
180                                 BeginPrint(this, e);
181                 }
182                 
183                 protected virtual void OnEndPrint(PrintEventArgs e){
184                         //fire the event
185                         if (EndPrint != null)
186                                 EndPrint(this, e);
187                 }
188                 
189                 protected virtual void OnPrintPage(PrintPageEventArgs e){
190                         //fire the event
191                         if (PrintPage != null)
192                                 PrintPage(this, e);
193                 }
194                 
195                 protected virtual void OnQueryPageSettings(QueryPageSettingsEventArgs e){
196                         //fire the event
197                         if (QueryPageSettings != null)
198                                 QueryPageSettings(this, e);
199                 }
200
201                 [SRDescription ("Raised when printing begins")]
202                 public event PrintEventHandler BeginPrint;
203
204                 [SRDescription ("Raised when printing ends")]
205                 public event PrintEventHandler EndPrint;
206
207                 [SRDescription ("Raised when printing of a new page begins")]
208                 public event PrintPageEventHandler PrintPage;
209
210                 [SRDescription ("Raised before printing of a new page begins")]
211                 public event QueryPageSettingsEventHandler QueryPageSettings;
212         }
213 }