]> git.saurik.com Git - wxWidgets.git/blob - wxPython/demo/PrintFramework.py
Fix "warning: operation on 'y' may be undefined".
[wxWidgets.git] / wxPython / demo / PrintFramework.py
1
2 import wx
3 import ScrolledWindow
4
5 #----------------------------------------------------------------------
6
7 ID_Setup = wx.NewId()
8 ID_Preview = wx.NewId()
9 ID_Print = wx.NewId()
10
11 class MyPrintout(wx.Printout):
12 def __init__(self, canvas, log):
13 wx.Printout.__init__(self)
14 self.canvas = canvas
15 self.log = log
16
17 def OnBeginDocument(self, start, end):
18 self.log.WriteText("wx.Printout.OnBeginDocument\n")
19 return self.base_OnBeginDocument(start, end)
20
21 def OnEndDocument(self):
22 self.log.WriteText("wx.Printout.OnEndDocument\n")
23 self.base_OnEndDocument()
24
25 def OnBeginPrinting(self):
26 self.log.WriteText("wx.Printout.OnBeginPrinting\n")
27 self.base_OnBeginPrinting()
28
29 def OnEndPrinting(self):
30 self.log.WriteText("wx.Printout.OnEndPrinting\n")
31 self.base_OnEndPrinting()
32
33 def OnPreparePrinting(self):
34 self.log.WriteText("wx.Printout.OnPreparePrinting\n")
35 self.base_OnPreparePrinting()
36
37 def HasPage(self, page):
38 self.log.WriteText("wx.Printout.HasPage: %d\n" % page)
39 if page <= 2:
40 return True
41 else:
42 return False
43
44 def GetPageInfo(self):
45 self.log.WriteText("wx.Printout.GetPageInfo\n")
46 return (1, 2, 1, 2)
47
48 def OnPrintPage(self, page):
49 self.log.WriteText("wx.Printout.OnPrintPage: %d\n" % page)
50 dc = self.GetDC()
51
52 #-------------------------------------------
53 # One possible method of setting scaling factors...
54
55 maxX = self.canvas.getWidth()
56 maxY = self.canvas.getHeight()
57
58 # Let's have at least 50 device units margin
59 marginX = 50
60 marginY = 50
61
62 # Add the margin to the graphic size
63 maxX = maxX + (2 * marginX)
64 maxY = maxY + (2 * marginY)
65
66 # Get the size of the DC in pixels
67 (w, h) = dc.GetSizeTuple()
68
69 # Calculate a suitable scaling factor
70 scaleX = float(w) / maxX
71 scaleY = float(h) / maxY
72
73 # Use x or y scaling factor, whichever fits on the DC
74 actualScale = min(scaleX, scaleY)
75
76 # Calculate the position on the DC for centering the graphic
77 posX = (w - (self.canvas.getWidth() * actualScale)) / 2.0
78 posY = (h - (self.canvas.getHeight() * actualScale)) / 2.0
79
80 # Set the scale and origin
81 dc.SetUserScale(actualScale, actualScale)
82 dc.SetDeviceOrigin(int(posX), int(posY))
83
84 #-------------------------------------------
85
86 self.canvas.DoDrawing(dc, True)
87 dc.DrawText("Page: %d" % page, marginX/2, maxY-marginY)
88
89 return True
90
91
92 #----------------------------------------------------------------------
93
94
95 class TestPrintPanel(wx.Panel):
96 def __init__(self, parent, frame, log):
97 wx.Panel.__init__(self, parent, -1)
98 self.log = log
99 self.frame = frame
100
101 self.printData = wx.PrintData()
102 self.printData.SetPaperId(wx.PAPER_LETTER)
103 self.printData.SetPrintMode(wx.PRINT_MODE_PRINTER)
104
105 self.box = wx.BoxSizer(wx.VERTICAL)
106 self.canvas = ScrolledWindow.MyCanvas(self)
107 self.box.Add(self.canvas, 1, wx.GROW)
108
109 subbox = wx.BoxSizer(wx.HORIZONTAL)
110 btn = wx.Button(self, ID_Setup, "Print Setup")
111 self.Bind(wx.EVT_BUTTON, self.OnPrintSetup, btn)
112 subbox.Add(btn, 1, wx.GROW | wx.ALL, 2)
113
114 btn = wx.Button(self, ID_Preview, "Print Preview")
115 self.Bind(wx.EVT_BUTTON, self.OnPrintPreview, btn)
116 subbox.Add(btn, 1, wx.GROW | wx.ALL, 2)
117
118 btn = wx.Button(self, ID_Print, "Print")
119 self.Bind(wx.EVT_BUTTON, self.OnDoPrint, btn)
120 subbox.Add(btn, 1, wx.GROW | wx.ALL, 2)
121
122 self.box.Add(subbox, 0, wx.GROW)
123
124 self.SetAutoLayout(True)
125 self.SetSizer(self.box)
126
127
128 def OnPrintSetup(self, event):
129 data = wx.PrintDialogData(self.printData)
130 printerDialog = wx.PrintDialog(self, data)
131 printerDialog.GetPrintDialogData().SetSetupDialog(True)
132 printerDialog.ShowModal();
133
134 # this makes a copy of the wx.PrintData instead of just saving
135 # a reference to the one inside the PrintDialogData that will
136 # be destroyed when the dialog is destroyed
137 self.printData = wx.PrintData( printerDialog.GetPrintDialogData().GetPrintData() )
138
139 printerDialog.Destroy()
140
141
142 def OnPrintPreview(self, event):
143 self.log.WriteText("OnPrintPreview\n")
144 data = wx.PrintDialogData(self.printData)
145 printout = MyPrintout(self.canvas, self.log)
146 printout2 = MyPrintout(self.canvas, self.log)
147 self.preview = wx.PrintPreview(printout, printout2, data)
148
149 if not self.preview.Ok():
150 self.log.WriteText("Houston, we have a problem...\n")
151 return
152
153 frame = wx.PreviewFrame(self.preview, self.frame, "This is a print preview")
154
155 frame.Initialize()
156 frame.SetPosition(self.frame.GetPosition())
157 frame.SetSize(self.frame.GetSize())
158 frame.Show(True)
159
160
161
162 def OnDoPrint(self, event):
163 pdd = wx.PrintDialogData(self.printData)
164 pdd.SetToPage(2)
165 printer = wx.Printer(pdd)
166 printout = MyPrintout(self.canvas, self.log)
167
168 if not printer.Print(self.frame, printout, True):
169 wx.MessageBox("There was a problem printing.\nPerhaps your current printer is not set correctly?", "Printing", wx.OK)
170 else:
171 self.printData = wx.PrintData( printer.GetPrintDialogData().GetPrintData() )
172 printout.Destroy()
173
174
175 #----------------------------------------------------------------------
176
177 def runTest(frame, nb, log):
178 win = TestPrintPanel(nb, frame, log)
179 return win
180
181
182 #----------------------------------------------------------------------
183
184
185
186
187
188 overview = """\
189 <html>
190 <body>
191 <h1>PrintFramework</h1>
192
193 This is an overview of the classes and methods used to print documents.
194 It also demonstrates how to do print previews and invoke the printer
195 setup dialog.
196
197 <p>Classes demonstrated here:<P>
198 <ul>
199 <li><b>wx.Printout()</b> - This class encapsulates the functionality of printing out
200 an application document. A new class must be derived and members overridden
201 to respond to calls such as OnPrintPage and HasPage. Instances of this class
202 are passed to wx.Printer.Print() or a wx.PrintPreview object to initiate
203 printing or previewing.<P><p>
204
205 <li><b>wx.PrintData()</b> - This class holds a variety of information related to
206 printers and printer device contexts. This class is used to create a
207 wx.PrinterDC and a wx.PostScriptDC. It is also used as a data member of
208 wx.PrintDialogData and wx.PageSetupDialogData, as part of the mechanism for
209 transferring data between the print dialogs and the application.<p><p>
210
211 <li><b>wx.PrintDialog()</b> - This class represents the print and print setup
212 common dialogs. You may obtain a wx.PrinterDC device context from a
213 successfully dismissed print dialog.<p><p>
214
215 <li><b>wx.PrintPreview()</b> - Objects of this class manage the print preview
216 process. The object is passed a wx.Printout object, and the wx.PrintPreview
217 object itself is passed to a wx.PreviewFrame object. Previewing is started by
218 initializing and showing the preview frame. Unlike wxPrinter.Print, flow of
219 control returns to the application immediately after the frame is shown.<p><p>
220 </ul>
221
222 <p>Other classes are also demonstrated, but this is the gist of the printer interface
223 framework in wxPython.
224
225 </body>
226 </html>
227
228 """
229
230
231 if __name__ == '__main__':
232 import sys,os
233 import run
234 run.main(['', os.path.basename(sys.argv[0])] + sys.argv[1:])
235