git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@39236 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
		
			
				
	
	
		
			232 lines
		
	
	
		
			7.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			232 lines
		
	
	
		
			7.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| 
 | |
| import  wx
 | |
| import  ScrolledWindow
 | |
| 
 | |
| #----------------------------------------------------------------------
 | |
| 
 | |
| 
 | |
| class MyPrintout(wx.Printout):
 | |
|     def __init__(self, canvas, log):
 | |
|         wx.Printout.__init__(self)
 | |
|         self.canvas = canvas
 | |
|         self.log = log
 | |
| 
 | |
|     def OnBeginDocument(self, start, end):
 | |
|         self.log.WriteText("MyPrintout.OnBeginDocument\n")
 | |
|         return super(MyPrintout, self).OnBeginDocument(start, end)
 | |
| 
 | |
|     def OnEndDocument(self):
 | |
|         self.log.WriteText("MyPrintout.OnEndDocument\n")
 | |
|         super(MyPrintout, self).OnEndDocument()
 | |
| 
 | |
|     def OnBeginPrinting(self):
 | |
|         self.log.WriteText("MyPrintout.OnBeginPrinting\n")
 | |
|         super(MyPrintout, self).OnBeginPrinting()
 | |
| 
 | |
|     def OnEndPrinting(self):
 | |
|         self.log.WriteText("MyPrintout.OnEndPrinting\n")
 | |
|         super(MyPrintout, self).OnEndPrinting()
 | |
| 
 | |
|     def OnPreparePrinting(self):
 | |
|         self.log.WriteText("MyPrintout.OnPreparePrinting\n")
 | |
|         super(MyPrintout, self).OnPreparePrinting()
 | |
| 
 | |
|     def HasPage(self, page):
 | |
|         self.log.WriteText("MyPrintout.HasPage: %d\n" % page)
 | |
|         if page <= 2:
 | |
|             return True
 | |
|         else:
 | |
|             return False
 | |
| 
 | |
|     def GetPageInfo(self):
 | |
|         self.log.WriteText("MyPrintout.GetPageInfo\n")
 | |
|         return (1, 2, 1, 2)
 | |
| 
 | |
|     def OnPrintPage(self, page):
 | |
|         self.log.WriteText("MyPrintout.OnPrintPage: %d\n" % page)
 | |
|         dc = self.GetDC()
 | |
| 
 | |
|         #-------------------------------------------
 | |
|         # One possible method of setting scaling factors...
 | |
| 
 | |
|         maxX = self.canvas.getWidth()
 | |
|         maxY = self.canvas.getHeight()
 | |
| 
 | |
|         # Let's have at least 50 device units margin
 | |
|         marginX = 50
 | |
|         marginY = 50
 | |
| 
 | |
|         # Add the margin to the graphic size
 | |
|         maxX = maxX + (2 * marginX)
 | |
|         maxY = maxY + (2 * marginY)
 | |
| 
 | |
|         # Get the size of the DC in pixels
 | |
|         (w, h) = dc.GetSizeTuple()
 | |
| 
 | |
|         # Calculate a suitable scaling factor
 | |
|         scaleX = float(w) / maxX
 | |
|         scaleY = float(h) / maxY
 | |
| 
 | |
|         # Use x or y scaling factor, whichever fits on the DC
 | |
|         actualScale = min(scaleX, scaleY)
 | |
| 
 | |
|         # Calculate the position on the DC for centering the graphic
 | |
|         posX = (w - (self.canvas.getWidth() * actualScale)) / 2.0
 | |
|         posY = (h - (self.canvas.getHeight() * actualScale)) / 2.0
 | |
| 
 | |
|         # Set the scale and origin
 | |
|         dc.SetUserScale(actualScale, actualScale)
 | |
|         dc.SetDeviceOrigin(int(posX), int(posY))
 | |
| 
 | |
|         #-------------------------------------------
 | |
| 
 | |
|         self.canvas.DoDrawing(dc, True)
 | |
|         dc.DrawText("Page: %d" % page, marginX/2, maxY-marginY)
 | |
| 
 | |
|         return True
 | |
| 
 | |
| 
 | |
| #----------------------------------------------------------------------
 | |
| 
 | |
| 
 | |
| class TestPrintPanel(wx.Panel):
 | |
|     def __init__(self, parent, frame, log):
 | |
|         wx.Panel.__init__(self, parent, -1)
 | |
|         self.log = log
 | |
|         self.frame = frame
 | |
| 
 | |
|         self.printData = wx.PrintData()
 | |
|         self.printData.SetPaperId(wx.PAPER_LETTER)
 | |
|         self.printData.SetPrintMode(wx.PRINT_MODE_PRINTER)
 | |
|         
 | |
|         self.box = wx.BoxSizer(wx.VERTICAL)
 | |
|         self.canvas = ScrolledWindow.MyCanvas(self)
 | |
|         self.box.Add(self.canvas, 1, wx.GROW)
 | |
| 
 | |
|         subbox = wx.BoxSizer(wx.HORIZONTAL)
 | |
|         btn = wx.Button(self, -1, "Page Setup")
 | |
|         self.Bind(wx.EVT_BUTTON, self.OnPageSetup, btn)
 | |
|         subbox.Add(btn, 1, wx.GROW | wx.ALL, 2)
 | |
| 
 | |
|         btn = wx.Button(self, -1, "Print Preview")
 | |
|         self.Bind(wx.EVT_BUTTON, self.OnPrintPreview, btn)
 | |
|         subbox.Add(btn, 1, wx.GROW | wx.ALL, 2)
 | |
| 
 | |
|         btn = wx.Button(self, -1, "Print")
 | |
|         self.Bind(wx.EVT_BUTTON, self.OnDoPrint, btn)
 | |
|         subbox.Add(btn, 1, wx.GROW | wx.ALL, 2)
 | |
| 
 | |
|         self.box.Add(subbox, 0, wx.GROW)
 | |
| 
 | |
|         self.SetAutoLayout(True)
 | |
|         self.SetSizer(self.box)
 | |
| 
 | |
| 
 | |
| 
 | |
|     def OnPageSetup(self, evt):
 | |
|         psdd = wx.PageSetupDialogData(self.printData)
 | |
|         psdd.CalculatePaperSizeFromId()
 | |
|         dlg = wx.PageSetupDialog(self, psdd)
 | |
|         dlg.ShowModal()
 | |
| 
 | |
|         # this makes a copy of the wx.PrintData instead of just saving
 | |
|         # a reference to the one inside the PrintDialogData that will
 | |
|         # be destroyed when the dialog is destroyed
 | |
|         self.printData = wx.PrintData( dlg.GetPageSetupData().GetPrintData() )
 | |
| 
 | |
|         dlg.Destroy()
 | |
| 
 | |
|     def OnPrintPreview(self, event):
 | |
|         data = wx.PrintDialogData(self.printData)
 | |
|         printout = MyPrintout(self.canvas, self.log)
 | |
|         printout2 = MyPrintout(self.canvas, self.log)
 | |
|         self.preview = wx.PrintPreview(printout, printout2, data)
 | |
| 
 | |
|         if not self.preview.Ok():
 | |
|             self.log.WriteText("Houston, we have a problem...\n")
 | |
|             return
 | |
| 
 | |
|         pfrm = wx.PreviewFrame(self.preview, self.frame, "This is a print preview")
 | |
| 
 | |
|         pfrm.Initialize()
 | |
|         pfrm.SetPosition(self.frame.GetPosition())
 | |
|         pfrm.SetSize(self.frame.GetSize())
 | |
|         pfrm.Show(True)
 | |
| 
 | |
| 
 | |
| 
 | |
|     def OnDoPrint(self, event):
 | |
|         pdd = wx.PrintDialogData(self.printData)
 | |
|         pdd.SetToPage(2)
 | |
|         printer = wx.Printer(pdd)
 | |
|         printout = MyPrintout(self.canvas, self.log)
 | |
| 
 | |
|         if not printer.Print(self.frame, printout, True):
 | |
|             wx.MessageBox("There was a problem printing.\nPerhaps your current printer is not set correctly?", "Printing", wx.OK)
 | |
|         else:
 | |
|             self.printData = wx.PrintData( printer.GetPrintDialogData().GetPrintData() )
 | |
|         printout.Destroy()
 | |
| 
 | |
| 
 | |
| #----------------------------------------------------------------------
 | |
| 
 | |
| def runTest(frame, nb, log):
 | |
|     win = TestPrintPanel(nb, frame, log)
 | |
|     return win
 | |
| 
 | |
| 
 | |
| #----------------------------------------------------------------------
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| overview = """\
 | |
| <html>
 | |
| <body>
 | |
| <h1>PrintFramework</h1>
 | |
| 
 | |
| This is an overview of the classes and methods used to print documents.
 | |
| It also demonstrates how to do print previews and invoke the printer
 | |
| setup dialog.
 | |
| 
 | |
| <p>Classes demonstrated here:<P>
 | |
| <ul>
 | |
|     <li><b>wx.Printout()</b> - This class encapsulates the functionality of printing out 
 | |
|         an application document. A new class must be derived and members overridden 
 | |
|         to respond to calls such as OnPrintPage and HasPage. Instances of this class 
 | |
|         are passed to wx.Printer.Print() or a wx.PrintPreview object to initiate 
 | |
|         printing or previewing.<P><p>
 | |
|         
 | |
|     <li><b>wx.PrintData()</b> - This class holds a variety of information related to 
 | |
|         printers and printer device contexts. This class is used to create a 
 | |
|         wx.PrinterDC and a wx.PostScriptDC. It is also used as a data member of 
 | |
|         wx.PrintDialogData and wx.PageSetupDialogData, as part of the mechanism for 
 | |
|         transferring data between the print dialogs and the application.<p><p>
 | |
| 
 | |
|     <li><b>wx.PrintDialog()</b> - This class represents the print and print setup 
 | |
|         common dialogs. You may obtain a wx.PrinterDC device context from a 
 | |
|         successfully dismissed print dialog.<p><p>
 | |
|         
 | |
|     <li><b>wx.PrintPreview()</b> - Objects of this class manage the print preview 
 | |
|         process. The object is passed a wx.Printout object, and the wx.PrintPreview 
 | |
|         object itself is passed to a wx.PreviewFrame object. Previewing is started by 
 | |
|         initializing and showing the preview frame. Unlike wxPrinter.Print, flow of 
 | |
|         control returns to the application immediately after the frame is shown.<p><p>
 | |
| </ul>
 | |
| 
 | |
| <p>Other classes are also demonstrated, but this is the gist of the printer interface
 | |
| framework in wxPython.
 | |
| 
 | |
| </body>
 | |
| </html>
 | |
| 
 | |
| """
 | |
| 
 | |
| 
 | |
| if __name__ == '__main__':
 | |
|     import sys,os
 | |
|     import run
 | |
|     run.main(['', os.path.basename(sys.argv[0])] + sys.argv[1:])
 | |
| 
 |