| 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 | |