# This file patches various PythonIDE files to add printing support. import os import sys import string from PatchUtils import * basePath = sys.exec_prefix + 'Mac:Tools:IDE:' ###################################################################### PythonIDEMain = Patch(basePath, "PythonIDEMain.py", "Printing") PythonIDEMain.InsertAfter("import macfs", "import Printing") PythonIDEMain.InsertAfter("PyConsole.installconsole()", """ # initialize print record with default values # LATER: read from preferences instead Printing.PrOpen() self.pageSetup = Printing.NewTPrintRecord() Printing.PrintDefault(self.pageSetup) """) PythonIDEMain.InsertBefore("""FrameWork.MenuItem(m, "Quit", "Q", 'quit')""", r""" pagesetupitem = FrameWork.MenuItem(m, "Page Setup"+chr(201), None, 'pagesetup') printitem = FrameWork.MenuItem(m, "Print"+chr(201), 'P', 'print') FrameWork.Separator(m)""") PythonIDEMain.InsertAfter("self._menustocheck = [closeitem, saveitem,", " printitem,") PythonIDEMain.InsertBefore("def domenu_quit(self)", r""" def domenu_pagesetup(self): # page setup, ok is 0 when user cancelled ok = Printing.PrStlDialog(self.pageSetup) # at this point, we should probably save self.pageSetup to preferences # or append it to the resources on the document (?) """) PythonIDEMain.InsertBefore("self.quitting = 1", " Printing.PrClose()") ###################################################################### PyEdit = Patch(basePath, "PyEdit.py", "Printing") PyEdit.InsertBefore("def domenu_save(self", r""" def domenu_print(self, *args): import Fm import Qd import Printing # get the application's .pageSetup record pageSetup = W.getapplication().pageSetup # (if we need to create a default one, here's how to do it:) # pageSetup = Printing.NewTPrintRecord() # Printing.PrintDefault(pageSetup) # present the print dialog, ok is 0 if user cancels ok = Printing.PrJobDialog(pageSetup) if not ok: return # get font settings (must be set for every page) face,style,size,color = self.editgroup.editor.getfontsettings() face = Fm.GetFNum(face) # set up printing port port = Printing.PrOpenDoc(pageSetup) try: # now, format the document one page at a time pytext = self.editgroup.editor.get() lines = string.split(pytext, '\r') qtylines = len(lines) line = 0 while line < qtylines: Printing.PrOpenPage(port, None) try: # where to position the upper-left corner of text x = 72/8 # 1/8 inch from left y = 72/4 # 1/4 inch from top # set up font Qd.TextFont(face) Qd.TextSize(size) Qd.TextFace(style) fontinfo = Qd.GetFontInfo() dy = int(fontinfo[0] + fontinfo[1] + fontinfo[3]) linesPerPage = 72*10 / dy # <-- HACK! Assumes 10-inch page. # draw the lines for i in range(min(linesPerPage,qtylines-line)): Qd.MoveTo(x,y) Qd.RGBForeColor((40000,40000,40000)) Qd.DrawString("%05d: " % (line+1)) # draw line number in light gray Qd.RGBForeColor((0,0,0)) # draw rest of line in black # HACK: replace tabs with spaces Qd.DrawString( string.replace(lines[line], '\t', " ") ) line = line + 1 y = y + dy finally: # close the page Printing.PrClosePage(port) finally: # close the printing port Printing.PrCloseDoc(port) """) ###################################################################### # All files have been patched in memory, so write to disk. print PythonIDEMain.Write() PyEdit.Write() print "\nNow you should quit the IDE, and double-click BuildIDE.py."