git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@42925 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
		
			
				
	
	
		
			237 lines
		
	
	
		
			8.4 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			237 lines
		
	
	
		
			8.4 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
import wx
 | 
						|
import os
 | 
						|
 | 
						|
FONTSIZE = 10
 | 
						|
 | 
						|
class TextDocPrintout(wx.Printout):
 | 
						|
    """
 | 
						|
    A printout class that is able to print simple text documents.
 | 
						|
    Does not handle page numbers or titles, and it assumes that no
 | 
						|
    lines are longer than what will fit within the page width.  Those
 | 
						|
    features are left as an exercise for the reader. ;-)
 | 
						|
    """
 | 
						|
    def __init__(self, text, title, margins):
 | 
						|
        wx.Printout.__init__(self, title)
 | 
						|
        self.lines = text.split('\n')
 | 
						|
        self.margins = margins
 | 
						|
 | 
						|
 | 
						|
    def HasPage(self, page):
 | 
						|
        return page <= self.numPages
 | 
						|
 | 
						|
    def GetPageInfo(self):
 | 
						|
        return (1, self.numPages, 1, self.numPages)
 | 
						|
 | 
						|
 | 
						|
    def CalculateScale(self, dc):
 | 
						|
        # Scale the DC such that the printout is roughly the same as
 | 
						|
        # the screen scaling.
 | 
						|
        ppiPrinterX, ppiPrinterY = self.GetPPIPrinter()
 | 
						|
        ppiScreenX, ppiScreenY = self.GetPPIScreen()
 | 
						|
        logScale = float(ppiPrinterX)/float(ppiScreenX)
 | 
						|
 | 
						|
        # Now adjust if the real page size is reduced (such as when
 | 
						|
        # drawing on a scaled wx.MemoryDC in the Print Preview.)  If
 | 
						|
        # page width == DC width then nothing changes, otherwise we
 | 
						|
        # scale down for the DC.
 | 
						|
        pw, ph = self.GetPageSizePixels()
 | 
						|
        dw, dh = dc.GetSize()
 | 
						|
        scale = logScale * float(dw)/float(pw)
 | 
						|
 | 
						|
        # Set the DC's scale.
 | 
						|
        dc.SetUserScale(scale, scale)
 | 
						|
 | 
						|
        # Find the logical units per millimeter (for calculating the
 | 
						|
        # margins)
 | 
						|
        self.logUnitsMM = float(ppiPrinterX)/(logScale*25.4)
 | 
						|
 | 
						|
 | 
						|
    def CalculateLayout(self, dc):
 | 
						|
        # Determine the position of the margins and the
 | 
						|
        # page/line height
 | 
						|
        topLeft, bottomRight = self.margins
 | 
						|
        dw, dh = dc.GetSize()
 | 
						|
        self.x1 = topLeft.x * self.logUnitsMM
 | 
						|
        self.y1 = topLeft.y * self.logUnitsMM
 | 
						|
        self.x2 = dc.DeviceToLogicalXRel(dw) - bottomRight.x * self.logUnitsMM 
 | 
						|
        self.y2 = dc.DeviceToLogicalYRel(dh) - bottomRight.y * self.logUnitsMM 
 | 
						|
 | 
						|
        # use a 1mm buffer around the inside of the box, and a few
 | 
						|
        # pixels between each line
 | 
						|
        self.pageHeight = self.y2 - self.y1 - 2*self.logUnitsMM
 | 
						|
        font = wx.Font(FONTSIZE, wx.TELETYPE, wx.NORMAL, wx.NORMAL)
 | 
						|
        dc.SetFont(font)
 | 
						|
        self.lineHeight = dc.GetCharHeight() 
 | 
						|
        self.linesPerPage = int(self.pageHeight/self.lineHeight)
 | 
						|
 | 
						|
 | 
						|
    def OnPreparePrinting(self):
 | 
						|
        # calculate the number of pages
 | 
						|
        dc = self.GetDC()
 | 
						|
        self.CalculateScale(dc)
 | 
						|
        self.CalculateLayout(dc)
 | 
						|
        self.numPages = len(self.lines) / self.linesPerPage
 | 
						|
        if len(self.lines) % self.linesPerPage != 0:
 | 
						|
            self.numPages += 1
 | 
						|
 | 
						|
 | 
						|
    def OnPrintPage(self, page):
 | 
						|
        dc = self.GetDC()
 | 
						|
        self.CalculateScale(dc)
 | 
						|
        self.CalculateLayout(dc)
 | 
						|
 | 
						|
        # draw a page outline at the margin points
 | 
						|
        dc.SetPen(wx.Pen("black", 0))
 | 
						|
        dc.SetBrush(wx.TRANSPARENT_BRUSH)
 | 
						|
        r = wx.RectPP((self.x1, self.y1),
 | 
						|
                      (self.x2, self.y2))
 | 
						|
        dc.DrawRectangleRect(r)
 | 
						|
        dc.SetClippingRect(r)
 | 
						|
 | 
						|
        # Draw the text lines for this page
 | 
						|
        line = (page-1) * self.linesPerPage
 | 
						|
        x = self.x1 + self.logUnitsMM
 | 
						|
        y = self.y1 + self.logUnitsMM
 | 
						|
        while line < (page * self.linesPerPage):
 | 
						|
            dc.DrawText(self.lines[line], x, y)
 | 
						|
            y += self.lineHeight
 | 
						|
            line += 1
 | 
						|
            if line >= len(self.lines):
 | 
						|
                break
 | 
						|
        return True
 | 
						|
 | 
						|
 | 
						|
class PrintFrameworkSample(wx.Frame):
 | 
						|
    def __init__(self):
 | 
						|
        wx.Frame.__init__(self, None, size=(640, 480),
 | 
						|
                          title="Print Framework Sample")
 | 
						|
        self.CreateStatusBar()
 | 
						|
 | 
						|
        # A text widget to display the doc and let it be edited
 | 
						|
        self.tc = wx.TextCtrl(self, -1, "",
 | 
						|
                              style=wx.TE_MULTILINE|wx.TE_DONTWRAP)
 | 
						|
        self.tc.SetFont(wx.Font(FONTSIZE, wx.TELETYPE, wx.NORMAL, wx.NORMAL))
 | 
						|
        filename = os.path.join(os.path.dirname(__file__), "sample-text.txt")
 | 
						|
        self.tc.SetValue(open(filename).read())
 | 
						|
        self.tc.Bind(wx.EVT_SET_FOCUS, self.OnClearSelection)
 | 
						|
        wx.CallAfter(self.tc.SetInsertionPoint, 0)
 | 
						|
 | 
						|
        # Create the menu and menubar
 | 
						|
        menu = wx.Menu()
 | 
						|
        item = menu.Append(-1, "Page Setup...\tF5",
 | 
						|
                           "Set up page margins and etc.")
 | 
						|
        self.Bind(wx.EVT_MENU, self.OnPageSetup, item)
 | 
						|
        item = menu.Append(-1, "Print Preview...\tF6",
 | 
						|
                           "View the printout on-screen")
 | 
						|
        self.Bind(wx.EVT_MENU, self.OnPrintPreview, item)
 | 
						|
        item = menu.Append(-1, "Print...\tF7", "Print the document")
 | 
						|
        self.Bind(wx.EVT_MENU, self.OnPrint, item)
 | 
						|
        menu.AppendSeparator()
 | 
						|
##         item = menu.Append(-1, "Test other stuff...\tF9", "")
 | 
						|
##         self.Bind(wx.EVT_MENU, self.OnPrintTest, item)
 | 
						|
##         menu.AppendSeparator()
 | 
						|
        item = menu.Append(wx.ID_EXIT, "E&xit\tCtrl-Q", "Close this application")
 | 
						|
        self.Bind(wx.EVT_MENU, self.OnExit, item)
 | 
						|
        
 | 
						|
        menubar = wx.MenuBar()
 | 
						|
        menubar.Append(menu, "&File")
 | 
						|
        self.SetMenuBar(menubar)
 | 
						|
 | 
						|
        # initialize the print data and set some default values
 | 
						|
        self.pdata = wx.PrintData()
 | 
						|
        self.pdata.SetPaperId(wx.PAPER_LETTER)
 | 
						|
        self.pdata.SetOrientation(wx.PORTRAIT)
 | 
						|
        self.margins = (wx.Point(15,15), wx.Point(15,15))
 | 
						|
 | 
						|
 | 
						|
    def OnExit(self, evt):
 | 
						|
        self.Close()
 | 
						|
 | 
						|
 | 
						|
    def OnClearSelection(self, evt):
 | 
						|
        evt.Skip()
 | 
						|
        wx.CallAfter(self.tc.SetInsertionPoint,
 | 
						|
                     self.tc.GetInsertionPoint())
 | 
						|
 | 
						|
 | 
						|
    def OnPageSetup(self, evt):
 | 
						|
        data = wx.PageSetupDialogData()
 | 
						|
        data.SetPrintData(self.pdata)
 | 
						|
 | 
						|
        data.SetDefaultMinMargins(True)
 | 
						|
        data.SetMarginTopLeft(self.margins[0])
 | 
						|
        data.SetMarginBottomRight(self.margins[1])
 | 
						|
 | 
						|
        dlg = wx.PageSetupDialog(self, data)
 | 
						|
        if dlg.ShowModal() == wx.ID_OK:
 | 
						|
            data = dlg.GetPageSetupData()
 | 
						|
            self.pdata = wx.PrintData(data.GetPrintData()) # force a copy
 | 
						|
            self.pdata.SetPaperId(data.GetPaperId())
 | 
						|
            self.margins = (data.GetMarginTopLeft(),
 | 
						|
                            data.GetMarginBottomRight())
 | 
						|
        dlg.Destroy()
 | 
						|
 | 
						|
 | 
						|
    def OnPrintPreview(self, evt):
 | 
						|
        data = wx.PrintDialogData(self.pdata)
 | 
						|
        text = self.tc.GetValue() 
 | 
						|
        printout1 = TextDocPrintout(text, "title", self.margins)
 | 
						|
        printout2 = None #TextDocPrintout(text, "title", self.margins)
 | 
						|
        preview = wx.PrintPreview(printout1, printout2, data)
 | 
						|
        if not preview.Ok():
 | 
						|
            wx.MessageBox("Unable to create PrintPreview!", "Error")
 | 
						|
        else:
 | 
						|
            # create the preview frame such that it overlays the app frame
 | 
						|
            frame = wx.PreviewFrame(preview, self, "Print Preview",
 | 
						|
                                    pos=self.GetPosition(),
 | 
						|
                                    size=self.GetSize())
 | 
						|
            frame.Initialize()
 | 
						|
            frame.Show()
 | 
						|
 | 
						|
 | 
						|
    def OnPrint(self, evt):
 | 
						|
        data = wx.PrintDialogData(self.pdata)
 | 
						|
        printer = wx.Printer(data)
 | 
						|
        text = self.tc.GetValue() 
 | 
						|
        printout = TextDocPrintout(text, "title", self.margins)
 | 
						|
        useSetupDialog = True
 | 
						|
        if not printer.Print(self, printout, useSetupDialog) \
 | 
						|
           and printer.GetLastError() == wx.PRINTER_ERROR:
 | 
						|
            wx.MessageBox(
 | 
						|
                "There was a problem printing.\n"
 | 
						|
                "Perhaps your current printer is not set correctly?",
 | 
						|
                "Printing Error", wx.OK)
 | 
						|
        else:
 | 
						|
            data = printer.GetPrintDialogData()
 | 
						|
            self.pdata = wx.PrintData(data.GetPrintData()) # force a copy
 | 
						|
        printout.Destroy()
 | 
						|
 | 
						|
 | 
						|
    def OnPrintTest(self, evt):
 | 
						|
        data = wx.PrintDialogData(self.pdata)
 | 
						|
        dlg = wx.PrintDialog(self, data)
 | 
						|
        if dlg.ShowModal() == wx.ID_OK:
 | 
						|
            data = dlg.GetPrintDialogData()
 | 
						|
            print
 | 
						|
            print "GetFromPage:", data.GetFromPage()
 | 
						|
            print "GetToPage:", data.GetToPage()
 | 
						|
            print "GetMinPage:", data.GetMinPage()
 | 
						|
            print "GetMaxPage:", data.GetMaxPage()
 | 
						|
            print "GetNoCopies:", data.GetNoCopies()
 | 
						|
            print "GetAllPages:", data.GetAllPages()
 | 
						|
            print "GetSelection:", data.GetSelection()
 | 
						|
            print "GetCollate:", data.GetCollate()
 | 
						|
            print "GetPrintToFile:", data.GetPrintToFile()
 | 
						|
 | 
						|
            self.pdata = wx.PrintData(data.GetPrintData())
 | 
						|
            print
 | 
						|
            print "GetPrinterName:", self.pdata.GetPrinterName()
 | 
						|
 | 
						|
        dlg.Destroy()
 | 
						|
        
 | 
						|
    
 | 
						|
app = wx.PySimpleApp()
 | 
						|
frm = PrintFrameworkSample()
 | 
						|
frm.Show()
 | 
						|
app.MainLoop()
 |