diff options
Diffstat (limited to 'Mac/Tools/IDE/PyEdit.py')
-rw-r--r-- | Mac/Tools/IDE/PyEdit.py | 2558 |
1 files changed, 1279 insertions, 1279 deletions
diff --git a/Mac/Tools/IDE/PyEdit.py b/Mac/Tools/IDE/PyEdit.py index ce228ff6cb..88c72aca49 100644 --- a/Mac/Tools/IDE/PyEdit.py +++ b/Mac/Tools/IDE/PyEdit.py @@ -21,9 +21,9 @@ import re smAllScripts = -3 if hasattr(Win, "FrontNonFloatingWindow"): - MyFrontWindow = Win.FrontNonFloatingWindow + MyFrontWindow = Win.FrontNonFloatingWindow else: - MyFrontWindow = Win.FrontWindow + MyFrontWindow = Win.FrontWindow _scriptuntitledcounter = 1 @@ -35,1328 +35,1328 @@ runSelButtonLabels = ["Run selection", "Pause!", "Resume"] class Editor(W.Window): - - def __init__(self, path = "", title = ""): - defaultfontsettings, defaulttabsettings, defaultwindowsize = geteditorprefs() - global _scriptuntitledcounter - if not path: - if title: - self.title = title - else: - self.title = "Untitled Script %r" % (_scriptuntitledcounter,) - _scriptuntitledcounter = _scriptuntitledcounter + 1 - text = "" - self._creator = W._signature - self._eoln = os.linesep - elif os.path.exists(path): - path = resolvealiases(path) - dir, name = os.path.split(path) - self.title = name - f = open(path, "rb") - text = f.read() - f.close() - self._creator, filetype = MacOS.GetCreatorAndType(path) - self.addrecentfile(path) - if '\n' in text: - if string.find(text, '\r\n') >= 0: - self._eoln = '\r\n' - else: - self._eoln = '\n' - text = string.replace(text, self._eoln, '\r') - else: - self._eoln = '\r' - else: - raise IOError, "file '%s' does not exist" % path - self.path = path - - self.settings = {} - if self.path: - self.readwindowsettings() - if self.settings.has_key("windowbounds"): - bounds = self.settings["windowbounds"] - else: - bounds = defaultwindowsize - if self.settings.has_key("fontsettings"): - self.fontsettings = self.settings["fontsettings"] - else: - self.fontsettings = defaultfontsettings - if self.settings.has_key("tabsize"): - try: - self.tabsettings = (tabsize, tabmode) = self.settings["tabsize"] - except: - self.tabsettings = defaulttabsettings - else: - self.tabsettings = defaulttabsettings - - W.Window.__init__(self, bounds, self.title, minsize = (330, 120), tabbable = 0) - self.setupwidgets(text) - - if self.settings.has_key("selection"): - selstart, selend = self.settings["selection"] - self.setselection(selstart, selend) - self.open() - self.setinfotext() - self.globals = {} - self._buf = "" # for write method - self.debugging = 0 - self.profiling = 0 - self.run_as_main = self.settings.get("run_as_main", 0) - self.run_with_interpreter = self.settings.get("run_with_interpreter", 0) - self.run_with_cl_interpreter = self.settings.get("run_with_cl_interpreter", 0) - - def readwindowsettings(self): - try: - resref = Res.FSpOpenResFile(self.path, 1) - except Res.Error: - return - try: - Res.UseResFile(resref) - data = Res.Get1Resource('PyWS', 128) - self.settings = marshal.loads(data.data) - except: - pass - Res.CloseResFile(resref) - - def writewindowsettings(self): - try: - resref = Res.FSpOpenResFile(self.path, 3) - except Res.Error: - Res.FSpCreateResFile(self.path, self._creator, 'TEXT', smAllScripts) - resref = Res.FSpOpenResFile(self.path, 3) - try: - data = Res.Resource(marshal.dumps(self.settings)) - Res.UseResFile(resref) - try: - temp = Res.Get1Resource('PyWS', 128) - temp.RemoveResource() - except Res.Error: - pass - data.AddResource('PyWS', 128, "window settings") - finally: - Res.UpdateResFile(resref) - Res.CloseResFile(resref) - - def getsettings(self): - self.settings = {} - self.settings["windowbounds"] = self.getbounds() - self.settings["selection"] = self.getselection() - self.settings["fontsettings"] = self.editgroup.editor.getfontsettings() - self.settings["tabsize"] = self.editgroup.editor.gettabsettings() - self.settings["run_as_main"] = self.run_as_main - self.settings["run_with_interpreter"] = self.run_with_interpreter - self.settings["run_with_cl_interpreter"] = self.run_with_cl_interpreter - - def get(self): - return self.editgroup.editor.get() - - def getselection(self): - return self.editgroup.editor.ted.WEGetSelection() - - def setselection(self, selstart, selend): - self.editgroup.editor.setselection(selstart, selend) - - def getselectedtext(self): - return self.editgroup.editor.getselectedtext() - - def getfilename(self): - if self.path: - return self.path - return '<%s>' % self.title - - def setupwidgets(self, text): - topbarheight = 24 - popfieldwidth = 80 - self.lastlineno = None - - # make an editor - self.editgroup = W.Group((0, topbarheight + 1, 0, 0)) - editor = W.PyEditor((0, 0, -15,-15), text, - fontsettings = self.fontsettings, - tabsettings = self.tabsettings, - file = self.getfilename()) - - # make the widgets - self.popfield = ClassFinder((popfieldwidth - 17, -15, 16, 16), [], self.popselectline) - self.linefield = W.EditText((-1, -15, popfieldwidth - 15, 16), inset = (6, 1)) - self.editgroup._barx = W.Scrollbar((popfieldwidth - 2, -15, -14, 16), editor.hscroll, max = 32767) - self.editgroup._bary = W.Scrollbar((-15, 14, 16, -14), editor.vscroll, max = 32767) - self.editgroup.editor = editor # add editor *after* scrollbars - - self.editgroup.optionsmenu = W.PopupMenu((-15, -1, 16, 16), []) - self.editgroup.optionsmenu.bind('<click>', self.makeoptionsmenu) - - self.bevelbox = W.BevelBox((0, 0, 0, topbarheight)) - self.hline = W.HorizontalLine((0, topbarheight, 0, 0)) - self.infotext = W.TextBox((175, 6, -4, 14), backgroundcolor = (0xe000, 0xe000, 0xe000)) - self.runbutton = W.BevelButton((6, 4, 80, 16), runButtonLabels[0], self.run) - self.runselbutton = W.BevelButton((90, 4, 80, 16), runSelButtonLabels[0], self.runselection) - - # bind some keys - editor.bind("cmdr", self.runbutton.push) - editor.bind("enter", self.runselbutton.push) - editor.bind("cmdj", self.domenu_gotoline) - editor.bind("cmdd", self.domenu_toggledebugger) - editor.bind("<idle>", self.updateselection) - - editor.bind("cmde", searchengine.setfindstring) - editor.bind("cmdf", searchengine.show) - editor.bind("cmdg", searchengine.findnext) - editor.bind("cmdshiftr", searchengine.replace) - editor.bind("cmdt", searchengine.replacefind) - - self.linefield.bind("return", self.dolinefield) - self.linefield.bind("enter", self.dolinefield) - self.linefield.bind("tab", self.dolinefield) - - # intercept clicks - editor.bind("<click>", self.clickeditor) - self.linefield.bind("<click>", self.clicklinefield) - - def makeoptionsmenu(self): - menuitems = [('Font settings\xc9', self.domenu_fontsettings), - ("Save options\xc9", self.domenu_options), - '-', - ('\0' + chr(self.run_as_main) + 'Run as __main__', self.domenu_toggle_run_as_main), - #('\0' + chr(self.run_with_interpreter) + 'Run with Interpreter', self.domenu_dtoggle_run_with_interpreter), - ('\0' + chr(self.run_with_cl_interpreter) + 'Run with commandline Python', self.domenu_toggle_run_with_cl_interpreter), - '-', - ('Modularize', self.domenu_modularize), - ('Browse namespace\xc9', self.domenu_browsenamespace), - '-'] - if self.profiling: - menuitems = menuitems + [('Disable profiler', self.domenu_toggleprofiler)] - else: - menuitems = menuitems + [('Enable profiler', self.domenu_toggleprofiler)] - if self.editgroup.editor._debugger: - menuitems = menuitems + [('Disable debugger', self.domenu_toggledebugger), - ('Clear breakpoints', self.domenu_clearbreakpoints), - ('Edit breakpoints\xc9', self.domenu_editbreakpoints)] - else: - menuitems = menuitems + [('Enable debugger', self.domenu_toggledebugger)] - self.editgroup.optionsmenu.set(menuitems) - - def domenu_toggle_run_as_main(self): - self.run_as_main = not self.run_as_main - self.run_with_interpreter = 0 - self.run_with_cl_interpreter = 0 - self.editgroup.editor.selectionchanged() - - def XXdomenu_toggle_run_with_interpreter(self): - self.run_with_interpreter = not self.run_with_interpreter - self.run_as_main = 0 - self.run_with_cl_interpreter = 0 - self.editgroup.editor.selectionchanged() - - def domenu_toggle_run_with_cl_interpreter(self): - self.run_with_cl_interpreter = not self.run_with_cl_interpreter - self.run_as_main = 0 - self.run_with_interpreter = 0 - self.editgroup.editor.selectionchanged() - - def showbreakpoints(self, onoff): - self.editgroup.editor.showbreakpoints(onoff) - self.debugging = onoff - - def domenu_clearbreakpoints(self, *args): - self.editgroup.editor.clearbreakpoints() - - def domenu_editbreakpoints(self, *args): - self.editgroup.editor.editbreakpoints() - - def domenu_toggledebugger(self, *args): - if not self.debugging: - W.SetCursor('watch') - self.debugging = not self.debugging - self.editgroup.editor.togglebreakpoints() - - def domenu_toggleprofiler(self, *args): - self.profiling = not self.profiling - - def domenu_browsenamespace(self, *args): - import PyBrowser, W - W.SetCursor('watch') - globals, file, modname = self.getenvironment() - if not modname: - modname = self.title - PyBrowser.Browser(globals, "Object browser: " + modname) - - def domenu_modularize(self, *args): - modname = _filename_as_modname(self.title) - if not modname: - raise W.AlertError, "Can't modularize \"%s\"" % self.title - run_as_main = self.run_as_main - self.run_as_main = 0 - self.run() - self.run_as_main = run_as_main - if self.path: - file = self.path - else: - file = self.title - - if self.globals and not sys.modules.has_key(modname): - module = imp.new_module(modname) - for attr in self.globals.keys(): - setattr(module,attr,self.globals[attr]) - sys.modules[modname] = module - self.globals = {} - - def domenu_fontsettings(self, *args): - import FontSettings - fontsettings = self.editgroup.editor.getfontsettings() - tabsettings = self.editgroup.editor.gettabsettings() - settings = FontSettings.FontDialog(fontsettings, tabsettings) - if settings: - fontsettings, tabsettings = settings - self.editgroup.editor.setfontsettings(fontsettings) - self.editgroup.editor.settabsettings(tabsettings) - - def domenu_options(self, *args): - rv = SaveOptions(self._creator, self._eoln) - if rv: - self.editgroup.editor.selectionchanged() # ouch... - self._creator, self._eoln = rv - - def clicklinefield(self): - if self._currentwidget <> self.linefield: - self.linefield.select(1) - self.linefield.selectall() - return 1 - - def clickeditor(self): - if self._currentwidget <> self.editgroup.editor: - self.dolinefield() - return 1 - - def updateselection(self, force = 0): - sel = min(self.editgroup.editor.getselection()) - lineno = self.editgroup.editor.offsettoline(sel) - if lineno <> self.lastlineno or force: - self.lastlineno = lineno - self.linefield.set(str(lineno + 1)) - self.linefield.selview() - - def dolinefield(self): - try: - lineno = string.atoi(self.linefield.get()) - 1 - if lineno <> self.lastlineno: - self.editgroup.editor.selectline(lineno) - self.updateselection(1) - except: - self.updateselection(1) - self.editgroup.editor.select(1) - - def setinfotext(self): - if not hasattr(self, 'infotext'): - return - if self.path: - self.infotext.set(self.path) - else: - self.infotext.set("") - - def close(self): - if self.editgroup.editor.changed: - Qd.InitCursor() - save = EasyDialogs.AskYesNoCancel('Save window "%s" before closing?' % self.title, - default=1, no="Don\xd5t save") - if save > 0: - if self.domenu_save(): - return 1 - elif save < 0: - return 1 - self.globals = None - W.Window.close(self) - - def domenu_close(self, *args): - return self.close() - - def domenu_save(self, *args): - if not self.path: - # Will call us recursively - return self.domenu_save_as() - data = self.editgroup.editor.get() - if self._eoln != '\r': - data = string.replace(data, '\r', self._eoln) - fp = open(self.path, 'wb') # open file in binary mode, data has '\r' line-endings - fp.write(data) - fp.close() - MacOS.SetCreatorAndType(self.path, self._creator, 'TEXT') - self.getsettings() - self.writewindowsettings() - self.editgroup.editor.changed = 0 - self.editgroup.editor.selchanged = 0 - import linecache - if linecache.cache.has_key(self.path): - del linecache.cache[self.path] - import macostools - macostools.touched(self.path) - self.addrecentfile(self.path) - - def can_save(self, menuitem): - return self.editgroup.editor.changed or self.editgroup.editor.selchanged - - def domenu_save_as(self, *args): - path = EasyDialogs.AskFileForSave(message='Save as:', savedFileName=self.title) - if not path: - return 1 - self.showbreakpoints(0) - self.path = path - self.setinfotext() - self.title = os.path.split(self.path)[-1] - self.wid.SetWTitle(self.title) - self.domenu_save() - self.editgroup.editor.setfile(self.getfilename()) - app = W.getapplication() - app.makeopenwindowsmenu() - if hasattr(app, 'makescriptsmenu'): - app = W.getapplication() - fsr, changed = app.scriptsfolder.FSResolveAlias(None) - path = fsr.as_pathname() - if path == self.path[:len(path)]: - W.getapplication().makescriptsmenu() - - def domenu_save_as_applet(self, *args): - import buildtools - - buildtools.DEBUG = 0 # ouch. - - if self.title[-3:] == ".py": - destname = self.title[:-3] - else: - destname = self.title + ".applet" - destname = EasyDialogs.AskFileForSave(message='Save as Applet:', - savedFileName=destname) - if not destname: - return 1 - W.SetCursor("watch") - if self.path: - filename = self.path - if filename[-3:] == ".py": - rsrcname = filename[:-3] + '.rsrc' - else: - rsrcname = filename + '.rsrc' - else: - filename = self.title - rsrcname = "" - - pytext = self.editgroup.editor.get() - pytext = string.split(pytext, '\r') - pytext = string.join(pytext, '\n') + '\n' - try: - code = compile(pytext, filename, "exec") - except (SyntaxError, EOFError): - raise buildtools.BuildError, "Syntax error in script %r" % (filename,) - - import tempfile - tmpdir = tempfile.mkdtemp() - - if filename[-3:] != ".py": - filename = filename + ".py" - filename = os.path.join(tmpdir, os.path.split(filename)[1]) - fp = open(filename, "w") - fp.write(pytext) - fp.close() - - # Try removing the output file - try: - os.remove(destname) - except os.error: - pass - template = buildtools.findtemplate() - buildtools.process(template, filename, destname, 1, rsrcname=rsrcname, progress=None) - try: - os.remove(filename) - os.rmdir(tmpdir) - except os.error: - pass - - def domenu_gotoline(self, *args): - self.linefield.selectall() - self.linefield.select(1) - self.linefield.selectall() - - def domenu_selectline(self, *args): - self.editgroup.editor.expandselection() - - def domenu_find(self, *args): - searchengine.show() - - def domenu_entersearchstring(self, *args): - searchengine.setfindstring() - - def domenu_replace(self, *args): - searchengine.replace() - - def domenu_findnext(self, *args): - searchengine.findnext() - - def domenu_replacefind(self, *args): - searchengine.replacefind() - - def domenu_run(self, *args): - self.runbutton.push() - - def domenu_runselection(self, *args): - self.runselbutton.push() - - def run(self): - self._run() - - def _run(self): - if self.run_with_interpreter: - if self.editgroup.editor.changed: - Qd.InitCursor() - save = EasyDialogs.AskYesNoCancel('Save "%s" before running?' % self.title, 1) - if save > 0: - if self.domenu_save(): - return - elif save < 0: - return - if not self.path: - raise W.AlertError, "Can't run unsaved file" - self._run_with_interpreter() - elif self.run_with_cl_interpreter: - if self.editgroup.editor.changed: - Qd.InitCursor() - save = EasyDialogs.AskYesNoCancel('Save "%s" before running?' % self.title, 1) - if save > 0: - if self.domenu_save(): - return - elif save < 0: - return - if not self.path: - raise W.AlertError, "Can't run unsaved file" - self._run_with_cl_interpreter() - else: - pytext = self.editgroup.editor.get() - globals, file, modname = self.getenvironment() - self.execstring(pytext, globals, globals, file, modname) - - def _run_with_interpreter(self): - interp_path = os.path.join(sys.exec_prefix, "PythonInterpreter") - if not os.path.exists(interp_path): - raise W.AlertError, "Can't find interpreter" - import findertools - XXX - - def _run_with_cl_interpreter(self): - import Terminal - interp_path = os.path.join(sys.exec_prefix, - "Resources", "Python.app", "Contents", "MacOS", "Python") - if not os.path.exists(interp_path): - interp_path = os.path.join(sys.exec_prefix, "bin", "python") - file_path = self.path - if not os.path.exists(interp_path): - # This "can happen" if we are running IDE under MacPython-OS9. - raise W.AlertError, "Can't find command-line Python" - cmd = '"%s" "%s" ; exit' % (interp_path, file_path) - t = Terminal.Terminal() - t.do_script(cmd) - - def runselection(self): - self._runselection() - - def _runselection(self): - if self.run_with_interpreter or self.run_with_cl_interpreter: - raise W.AlertError, "Can't run selection with Interpreter" - globals, file, modname = self.getenvironment() - locals = globals - # select whole lines - self.editgroup.editor.expandselection() - - # get lineno of first selected line - selstart, selend = self.editgroup.editor.getselection() - selstart, selend = min(selstart, selend), max(selstart, selend) - selfirstline = self.editgroup.editor.offsettoline(selstart) - alltext = self.editgroup.editor.get() - pytext = alltext[selstart:selend] - lines = string.split(pytext, '\r') - indent = getminindent(lines) - if indent == 1: - classname = '' - alllines = string.split(alltext, '\r') - for i in range(selfirstline - 1, -1, -1): - line = alllines[i] - if line[:6] == 'class ': - classname = string.split(string.strip(line[6:]))[0] - classend = identifieRE_match(classname) - if classend < 1: - raise W.AlertError, "Can't find a class." - classname = classname[:classend] - break - elif line and line[0] not in '\t#': - raise W.AlertError, "Can't find a class." - else: - raise W.AlertError, "Can't find a class." - if globals.has_key(classname): - klass = globals[classname] - else: - raise W.AlertError, "Can't find class \"%s\"." % classname - # add class def - pytext = ("class %s:\n" % classname) + pytext - selfirstline = selfirstline - 1 - elif indent > 0: - raise W.AlertError, "Can't run indented code." - - # add "newlines" to fool compile/exec: - # now a traceback will give the right line number - pytext = selfirstline * '\r' + pytext - self.execstring(pytext, globals, locals, file, modname) - if indent == 1 and globals[classname] is not klass: - # update the class in place - klass.__dict__.update(globals[classname].__dict__) - globals[classname] = klass - - def execstring(self, pytext, globals, locals, file, modname): - tracebackwindow.hide() - # update windows - W.getapplication().refreshwindows() - if self.run_as_main: - modname = "__main__" - if self.path: - dir = os.path.dirname(self.path) - savedir = os.getcwd() - os.chdir(dir) - sys.path.insert(0, dir) - self._scriptDone = False - if sys.platform == "darwin": - # On MacOSX, MacPython doesn't poll for command-period - # (cancel), so to enable the user to cancel a running - # script, we have to spawn a thread which does the - # polling. It will send a SIGINT to the main thread - # (in which the script is running) when the user types - # command-period. - from threading import Thread - t = Thread(target=self._userCancelledMonitor, - name="UserCancelledMonitor") - t.start() - try: - execstring(pytext, globals, locals, file, self.debugging, - modname, self.profiling) - finally: - self._scriptDone = True - if self.path: - os.chdir(savedir) - del sys.path[0] - - def _userCancelledMonitor(self): - import time - from signal import SIGINT - while not self._scriptDone: - if Evt.CheckEventQueueForUserCancel(): - # Send a SIGINT signal to ourselves. - # This gets delivered to the main thread, - # cancelling the running script. - os.kill(os.getpid(), SIGINT) - break - time.sleep(0.25) - - def getenvironment(self): - if self.path: - file = self.path - dir = os.path.dirname(file) - # check if we're part of a package - modname = "" - while os.path.exists(os.path.join(dir, "__init__.py")): - dir, dirname = os.path.split(dir) - modname = dirname + '.' + modname - subname = _filename_as_modname(self.title) - if subname is None: - return self.globals, file, None - if modname: - if subname == "__init__": - # strip trailing period - modname = modname[:-1] - else: - modname = modname + subname - else: - modname = subname - if sys.modules.has_key(modname): - globals = sys.modules[modname].__dict__ - self.globals = {} - else: - globals = self.globals - modname = subname - else: - file = '<%s>' % self.title - globals = self.globals - modname = file - return globals, file, modname - - def write(self, stuff): - """for use as stdout""" - self._buf = self._buf + stuff - if '\n' in self._buf: - self.flush() - - def flush(self): - stuff = string.split(self._buf, '\n') - stuff = string.join(stuff, '\r') - end = self.editgroup.editor.ted.WEGetTextLength() - self.editgroup.editor.ted.WESetSelection(end, end) - self.editgroup.editor.ted.WEInsert(stuff, None, None) - self.editgroup.editor.updatescrollbars() - self._buf = "" - # ? optional: - #self.wid.SelectWindow() - - def getclasslist(self): - from string import find, strip - methodRE = re.compile(r"\r[ \t]+def ") - findMethod = methodRE.search - editor = self.editgroup.editor - text = editor.get() - list = [] - append = list.append - functag = "func" - classtag = "class" - methodtag = "method" - pos = -1 - if text[:4] == 'def ': - append((pos + 4, functag)) - pos = 4 - while 1: - pos = find(text, '\rdef ', pos + 1) - if pos < 0: - break - append((pos + 5, functag)) - pos = -1 - if text[:6] == 'class ': - append((pos + 6, classtag)) - pos = 6 - while 1: - pos = find(text, '\rclass ', pos + 1) - if pos < 0: - break - append((pos + 7, classtag)) - pos = 0 - while 1: - m = findMethod(text, pos + 1) - if m is None: - break - pos = m.regs[0][0] - #pos = find(text, '\r\tdef ', pos + 1) - append((m.regs[0][1], methodtag)) - list.sort() - classlist = [] - methodlistappend = None - offsetToLine = editor.ted.WEOffsetToLine - getLineRange = editor.ted.WEGetLineRange - append = classlist.append - for pos, tag in list: - lineno = offsetToLine(pos) - lineStart, lineEnd = getLineRange(lineno) - line = strip(text[pos:lineEnd]) - line = line[:identifieRE_match(line)] - if tag is functag: - append(("def " + line, lineno + 1)) - methodlistappend = None - elif tag is classtag: - append(["class " + line]) - methodlistappend = classlist[-1].append - elif methodlistappend and tag is methodtag: - methodlistappend(("def " + line, lineno + 1)) - return classlist - - def popselectline(self, lineno): - self.editgroup.editor.selectline(lineno - 1) - - def selectline(self, lineno, charoffset = 0): - self.editgroup.editor.selectline(lineno - 1, charoffset) - - def addrecentfile(self, filename): - app = W.getapplication() - app.addrecentfile(filename) + + def __init__(self, path = "", title = ""): + defaultfontsettings, defaulttabsettings, defaultwindowsize = geteditorprefs() + global _scriptuntitledcounter + if not path: + if title: + self.title = title + else: + self.title = "Untitled Script %r" % (_scriptuntitledcounter,) + _scriptuntitledcounter = _scriptuntitledcounter + 1 + text = "" + self._creator = W._signature + self._eoln = os.linesep + elif os.path.exists(path): + path = resolvealiases(path) + dir, name = os.path.split(path) + self.title = name + f = open(path, "rb") + text = f.read() + f.close() + self._creator, filetype = MacOS.GetCreatorAndType(path) + self.addrecentfile(path) + if '\n' in text: + if string.find(text, '\r\n') >= 0: + self._eoln = '\r\n' + else: + self._eoln = '\n' + text = string.replace(text, self._eoln, '\r') + else: + self._eoln = '\r' + else: + raise IOError, "file '%s' does not exist" % path + self.path = path + + self.settings = {} + if self.path: + self.readwindowsettings() + if self.settings.has_key("windowbounds"): + bounds = self.settings["windowbounds"] + else: + bounds = defaultwindowsize + if self.settings.has_key("fontsettings"): + self.fontsettings = self.settings["fontsettings"] + else: + self.fontsettings = defaultfontsettings + if self.settings.has_key("tabsize"): + try: + self.tabsettings = (tabsize, tabmode) = self.settings["tabsize"] + except: + self.tabsettings = defaulttabsettings + else: + self.tabsettings = defaulttabsettings + + W.Window.__init__(self, bounds, self.title, minsize = (330, 120), tabbable = 0) + self.setupwidgets(text) + + if self.settings.has_key("selection"): + selstart, selend = self.settings["selection"] + self.setselection(selstart, selend) + self.open() + self.setinfotext() + self.globals = {} + self._buf = "" # for write method + self.debugging = 0 + self.profiling = 0 + self.run_as_main = self.settings.get("run_as_main", 0) + self.run_with_interpreter = self.settings.get("run_with_interpreter", 0) + self.run_with_cl_interpreter = self.settings.get("run_with_cl_interpreter", 0) + + def readwindowsettings(self): + try: + resref = Res.FSpOpenResFile(self.path, 1) + except Res.Error: + return + try: + Res.UseResFile(resref) + data = Res.Get1Resource('PyWS', 128) + self.settings = marshal.loads(data.data) + except: + pass + Res.CloseResFile(resref) + + def writewindowsettings(self): + try: + resref = Res.FSpOpenResFile(self.path, 3) + except Res.Error: + Res.FSpCreateResFile(self.path, self._creator, 'TEXT', smAllScripts) + resref = Res.FSpOpenResFile(self.path, 3) + try: + data = Res.Resource(marshal.dumps(self.settings)) + Res.UseResFile(resref) + try: + temp = Res.Get1Resource('PyWS', 128) + temp.RemoveResource() + except Res.Error: + pass + data.AddResource('PyWS', 128, "window settings") + finally: + Res.UpdateResFile(resref) + Res.CloseResFile(resref) + + def getsettings(self): + self.settings = {} + self.settings["windowbounds"] = self.getbounds() + self.settings["selection"] = self.getselection() + self.settings["fontsettings"] = self.editgroup.editor.getfontsettings() + self.settings["tabsize"] = self.editgroup.editor.gettabsettings() + self.settings["run_as_main"] = self.run_as_main + self.settings["run_with_interpreter"] = self.run_with_interpreter + self.settings["run_with_cl_interpreter"] = self.run_with_cl_interpreter + + def get(self): + return self.editgroup.editor.get() + + def getselection(self): + return self.editgroup.editor.ted.WEGetSelection() + + def setselection(self, selstart, selend): + self.editgroup.editor.setselection(selstart, selend) + + def getselectedtext(self): + return self.editgroup.editor.getselectedtext() + + def getfilename(self): + if self.path: + return self.path + return '<%s>' % self.title + + def setupwidgets(self, text): + topbarheight = 24 + popfieldwidth = 80 + self.lastlineno = None + + # make an editor + self.editgroup = W.Group((0, topbarheight + 1, 0, 0)) + editor = W.PyEditor((0, 0, -15,-15), text, + fontsettings = self.fontsettings, + tabsettings = self.tabsettings, + file = self.getfilename()) + + # make the widgets + self.popfield = ClassFinder((popfieldwidth - 17, -15, 16, 16), [], self.popselectline) + self.linefield = W.EditText((-1, -15, popfieldwidth - 15, 16), inset = (6, 1)) + self.editgroup._barx = W.Scrollbar((popfieldwidth - 2, -15, -14, 16), editor.hscroll, max = 32767) + self.editgroup._bary = W.Scrollbar((-15, 14, 16, -14), editor.vscroll, max = 32767) + self.editgroup.editor = editor # add editor *after* scrollbars + + self.editgroup.optionsmenu = W.PopupMenu((-15, -1, 16, 16), []) + self.editgroup.optionsmenu.bind('<click>', self.makeoptionsmenu) + + self.bevelbox = W.BevelBox((0, 0, 0, topbarheight)) + self.hline = W.HorizontalLine((0, topbarheight, 0, 0)) + self.infotext = W.TextBox((175, 6, -4, 14), backgroundcolor = (0xe000, 0xe000, 0xe000)) + self.runbutton = W.BevelButton((6, 4, 80, 16), runButtonLabels[0], self.run) + self.runselbutton = W.BevelButton((90, 4, 80, 16), runSelButtonLabels[0], self.runselection) + + # bind some keys + editor.bind("cmdr", self.runbutton.push) + editor.bind("enter", self.runselbutton.push) + editor.bind("cmdj", self.domenu_gotoline) + editor.bind("cmdd", self.domenu_toggledebugger) + editor.bind("<idle>", self.updateselection) + + editor.bind("cmde", searchengine.setfindstring) + editor.bind("cmdf", searchengine.show) + editor.bind("cmdg", searchengine.findnext) + editor.bind("cmdshiftr", searchengine.replace) + editor.bind("cmdt", searchengine.replacefind) + + self.linefield.bind("return", self.dolinefield) + self.linefield.bind("enter", self.dolinefield) + self.linefield.bind("tab", self.dolinefield) + + # intercept clicks + editor.bind("<click>", self.clickeditor) + self.linefield.bind("<click>", self.clicklinefield) + + def makeoptionsmenu(self): + menuitems = [('Font settings\xc9', self.domenu_fontsettings), + ("Save options\xc9", self.domenu_options), + '-', + ('\0' + chr(self.run_as_main) + 'Run as __main__', self.domenu_toggle_run_as_main), + #('\0' + chr(self.run_with_interpreter) + 'Run with Interpreter', self.domenu_dtoggle_run_with_interpreter), + ('\0' + chr(self.run_with_cl_interpreter) + 'Run with commandline Python', self.domenu_toggle_run_with_cl_interpreter), + '-', + ('Modularize', self.domenu_modularize), + ('Browse namespace\xc9', self.domenu_browsenamespace), + '-'] + if self.profiling: + menuitems = menuitems + [('Disable profiler', self.domenu_toggleprofiler)] + else: + menuitems = menuitems + [('Enable profiler', self.domenu_toggleprofiler)] + if self.editgroup.editor._debugger: + menuitems = menuitems + [('Disable debugger', self.domenu_toggledebugger), + ('Clear breakpoints', self.domenu_clearbreakpoints), + ('Edit breakpoints\xc9', self.domenu_editbreakpoints)] + else: + menuitems = menuitems + [('Enable debugger', self.domenu_toggledebugger)] + self.editgroup.optionsmenu.set(menuitems) + + def domenu_toggle_run_as_main(self): + self.run_as_main = not self.run_as_main + self.run_with_interpreter = 0 + self.run_with_cl_interpreter = 0 + self.editgroup.editor.selectionchanged() + + def XXdomenu_toggle_run_with_interpreter(self): + self.run_with_interpreter = not self.run_with_interpreter + self.run_as_main = 0 + self.run_with_cl_interpreter = 0 + self.editgroup.editor.selectionchanged() + + def domenu_toggle_run_with_cl_interpreter(self): + self.run_with_cl_interpreter = not self.run_with_cl_interpreter + self.run_as_main = 0 + self.run_with_interpreter = 0 + self.editgroup.editor.selectionchanged() + + def showbreakpoints(self, onoff): + self.editgroup.editor.showbreakpoints(onoff) + self.debugging = onoff + + def domenu_clearbreakpoints(self, *args): + self.editgroup.editor.clearbreakpoints() + + def domenu_editbreakpoints(self, *args): + self.editgroup.editor.editbreakpoints() + + def domenu_toggledebugger(self, *args): + if not self.debugging: + W.SetCursor('watch') + self.debugging = not self.debugging + self.editgroup.editor.togglebreakpoints() + + def domenu_toggleprofiler(self, *args): + self.profiling = not self.profiling + + def domenu_browsenamespace(self, *args): + import PyBrowser, W + W.SetCursor('watch') + globals, file, modname = self.getenvironment() + if not modname: + modname = self.title + PyBrowser.Browser(globals, "Object browser: " + modname) + + def domenu_modularize(self, *args): + modname = _filename_as_modname(self.title) + if not modname: + raise W.AlertError, "Can't modularize \"%s\"" % self.title + run_as_main = self.run_as_main + self.run_as_main = 0 + self.run() + self.run_as_main = run_as_main + if self.path: + file = self.path + else: + file = self.title + + if self.globals and not sys.modules.has_key(modname): + module = imp.new_module(modname) + for attr in self.globals.keys(): + setattr(module,attr,self.globals[attr]) + sys.modules[modname] = module + self.globals = {} + + def domenu_fontsettings(self, *args): + import FontSettings + fontsettings = self.editgroup.editor.getfontsettings() + tabsettings = self.editgroup.editor.gettabsettings() + settings = FontSettings.FontDialog(fontsettings, tabsettings) + if settings: + fontsettings, tabsettings = settings + self.editgroup.editor.setfontsettings(fontsettings) + self.editgroup.editor.settabsettings(tabsettings) + + def domenu_options(self, *args): + rv = SaveOptions(self._creator, self._eoln) + if rv: + self.editgroup.editor.selectionchanged() # ouch... + self._creator, self._eoln = rv + + def clicklinefield(self): + if self._currentwidget <> self.linefield: + self.linefield.select(1) + self.linefield.selectall() + return 1 + + def clickeditor(self): + if self._currentwidget <> self.editgroup.editor: + self.dolinefield() + return 1 + + def updateselection(self, force = 0): + sel = min(self.editgroup.editor.getselection()) + lineno = self.editgroup.editor.offsettoline(sel) + if lineno <> self.lastlineno or force: + self.lastlineno = lineno + self.linefield.set(str(lineno + 1)) + self.linefield.selview() + + def dolinefield(self): + try: + lineno = string.atoi(self.linefield.get()) - 1 + if lineno <> self.lastlineno: + self.editgroup.editor.selectline(lineno) + self.updateselection(1) + except: + self.updateselection(1) + self.editgroup.editor.select(1) + + def setinfotext(self): + if not hasattr(self, 'infotext'): + return + if self.path: + self.infotext.set(self.path) + else: + self.infotext.set("") + + def close(self): + if self.editgroup.editor.changed: + Qd.InitCursor() + save = EasyDialogs.AskYesNoCancel('Save window "%s" before closing?' % self.title, + default=1, no="Don\xd5t save") + if save > 0: + if self.domenu_save(): + return 1 + elif save < 0: + return 1 + self.globals = None + W.Window.close(self) + + def domenu_close(self, *args): + return self.close() + + def domenu_save(self, *args): + if not self.path: + # Will call us recursively + return self.domenu_save_as() + data = self.editgroup.editor.get() + if self._eoln != '\r': + data = string.replace(data, '\r', self._eoln) + fp = open(self.path, 'wb') # open file in binary mode, data has '\r' line-endings + fp.write(data) + fp.close() + MacOS.SetCreatorAndType(self.path, self._creator, 'TEXT') + self.getsettings() + self.writewindowsettings() + self.editgroup.editor.changed = 0 + self.editgroup.editor.selchanged = 0 + import linecache + if linecache.cache.has_key(self.path): + del linecache.cache[self.path] + import macostools + macostools.touched(self.path) + self.addrecentfile(self.path) + + def can_save(self, menuitem): + return self.editgroup.editor.changed or self.editgroup.editor.selchanged + + def domenu_save_as(self, *args): + path = EasyDialogs.AskFileForSave(message='Save as:', savedFileName=self.title) + if not path: + return 1 + self.showbreakpoints(0) + self.path = path + self.setinfotext() + self.title = os.path.split(self.path)[-1] + self.wid.SetWTitle(self.title) + self.domenu_save() + self.editgroup.editor.setfile(self.getfilename()) + app = W.getapplication() + app.makeopenwindowsmenu() + if hasattr(app, 'makescriptsmenu'): + app = W.getapplication() + fsr, changed = app.scriptsfolder.FSResolveAlias(None) + path = fsr.as_pathname() + if path == self.path[:len(path)]: + W.getapplication().makescriptsmenu() + + def domenu_save_as_applet(self, *args): + import buildtools + + buildtools.DEBUG = 0 # ouch. + + if self.title[-3:] == ".py": + destname = self.title[:-3] + else: + destname = self.title + ".applet" + destname = EasyDialogs.AskFileForSave(message='Save as Applet:', + savedFileName=destname) + if not destname: + return 1 + W.SetCursor("watch") + if self.path: + filename = self.path + if filename[-3:] == ".py": + rsrcname = filename[:-3] + '.rsrc' + else: + rsrcname = filename + '.rsrc' + else: + filename = self.title + rsrcname = "" + + pytext = self.editgroup.editor.get() + pytext = string.split(pytext, '\r') + pytext = string.join(pytext, '\n') + '\n' + try: + code = compile(pytext, filename, "exec") + except (SyntaxError, EOFError): + raise buildtools.BuildError, "Syntax error in script %r" % (filename,) + + import tempfile + tmpdir = tempfile.mkdtemp() + + if filename[-3:] != ".py": + filename = filename + ".py" + filename = os.path.join(tmpdir, os.path.split(filename)[1]) + fp = open(filename, "w") + fp.write(pytext) + fp.close() + + # Try removing the output file + try: + os.remove(destname) + except os.error: + pass + template = buildtools.findtemplate() + buildtools.process(template, filename, destname, 1, rsrcname=rsrcname, progress=None) + try: + os.remove(filename) + os.rmdir(tmpdir) + except os.error: + pass + + def domenu_gotoline(self, *args): + self.linefield.selectall() + self.linefield.select(1) + self.linefield.selectall() + + def domenu_selectline(self, *args): + self.editgroup.editor.expandselection() + + def domenu_find(self, *args): + searchengine.show() + + def domenu_entersearchstring(self, *args): + searchengine.setfindstring() + + def domenu_replace(self, *args): + searchengine.replace() + + def domenu_findnext(self, *args): + searchengine.findnext() + + def domenu_replacefind(self, *args): + searchengine.replacefind() + + def domenu_run(self, *args): + self.runbutton.push() + + def domenu_runselection(self, *args): + self.runselbutton.push() + + def run(self): + self._run() + + def _run(self): + if self.run_with_interpreter: + if self.editgroup.editor.changed: + Qd.InitCursor() + save = EasyDialogs.AskYesNoCancel('Save "%s" before running?' % self.title, 1) + if save > 0: + if self.domenu_save(): + return + elif save < 0: + return + if not self.path: + raise W.AlertError, "Can't run unsaved file" + self._run_with_interpreter() + elif self.run_with_cl_interpreter: + if self.editgroup.editor.changed: + Qd.InitCursor() + save = EasyDialogs.AskYesNoCancel('Save "%s" before running?' % self.title, 1) + if save > 0: + if self.domenu_save(): + return + elif save < 0: + return + if not self.path: + raise W.AlertError, "Can't run unsaved file" + self._run_with_cl_interpreter() + else: + pytext = self.editgroup.editor.get() + globals, file, modname = self.getenvironment() + self.execstring(pytext, globals, globals, file, modname) + + def _run_with_interpreter(self): + interp_path = os.path.join(sys.exec_prefix, "PythonInterpreter") + if not os.path.exists(interp_path): + raise W.AlertError, "Can't find interpreter" + import findertools + XXX + + def _run_with_cl_interpreter(self): + import Terminal + interp_path = os.path.join(sys.exec_prefix, + "Resources", "Python.app", "Contents", "MacOS", "Python") + if not os.path.exists(interp_path): + interp_path = os.path.join(sys.exec_prefix, "bin", "python") + file_path = self.path + if not os.path.exists(interp_path): + # This "can happen" if we are running IDE under MacPython-OS9. + raise W.AlertError, "Can't find command-line Python" + cmd = '"%s" "%s" ; exit' % (interp_path, file_path) + t = Terminal.Terminal() + t.do_script(cmd) + + def runselection(self): + self._runselection() + + def _runselection(self): + if self.run_with_interpreter or self.run_with_cl_interpreter: + raise W.AlertError, "Can't run selection with Interpreter" + globals, file, modname = self.getenvironment() + locals = globals + # select whole lines + self.editgroup.editor.expandselection() + + # get lineno of first selected line + selstart, selend = self.editgroup.editor.getselection() + selstart, selend = min(selstart, selend), max(selstart, selend) + selfirstline = self.editgroup.editor.offsettoline(selstart) + alltext = self.editgroup.editor.get() + pytext = alltext[selstart:selend] + lines = string.split(pytext, '\r') + indent = getminindent(lines) + if indent == 1: + classname = '' + alllines = string.split(alltext, '\r') + for i in range(selfirstline - 1, -1, -1): + line = alllines[i] + if line[:6] == 'class ': + classname = string.split(string.strip(line[6:]))[0] + classend = identifieRE_match(classname) + if classend < 1: + raise W.AlertError, "Can't find a class." + classname = classname[:classend] + break + elif line and line[0] not in '\t#': + raise W.AlertError, "Can't find a class." + else: + raise W.AlertError, "Can't find a class." + if globals.has_key(classname): + klass = globals[classname] + else: + raise W.AlertError, "Can't find class \"%s\"." % classname + # add class def + pytext = ("class %s:\n" % classname) + pytext + selfirstline = selfirstline - 1 + elif indent > 0: + raise W.AlertError, "Can't run indented code." + + # add "newlines" to fool compile/exec: + # now a traceback will give the right line number + pytext = selfirstline * '\r' + pytext + self.execstring(pytext, globals, locals, file, modname) + if indent == 1 and globals[classname] is not klass: + # update the class in place + klass.__dict__.update(globals[classname].__dict__) + globals[classname] = klass + + def execstring(self, pytext, globals, locals, file, modname): + tracebackwindow.hide() + # update windows + W.getapplication().refreshwindows() + if self.run_as_main: + modname = "__main__" + if self.path: + dir = os.path.dirname(self.path) + savedir = os.getcwd() + os.chdir(dir) + sys.path.insert(0, dir) + self._scriptDone = False + if sys.platform == "darwin": + # On MacOSX, MacPython doesn't poll for command-period + # (cancel), so to enable the user to cancel a running + # script, we have to spawn a thread which does the + # polling. It will send a SIGINT to the main thread + # (in which the script is running) when the user types + # command-period. + from threading import Thread + t = Thread(target=self._userCancelledMonitor, + name="UserCancelledMonitor") + t.start() + try: + execstring(pytext, globals, locals, file, self.debugging, + modname, self.profiling) + finally: + self._scriptDone = True + if self.path: + os.chdir(savedir) + del sys.path[0] + + def _userCancelledMonitor(self): + import time + from signal import SIGINT + while not self._scriptDone: + if Evt.CheckEventQueueForUserCancel(): + # Send a SIGINT signal to ourselves. + # This gets delivered to the main thread, + # cancelling the running script. + os.kill(os.getpid(), SIGINT) + break + time.sleep(0.25) + + def getenvironment(self): + if self.path: + file = self.path + dir = os.path.dirname(file) + # check if we're part of a package + modname = "" + while os.path.exists(os.path.join(dir, "__init__.py")): + dir, dirname = os.path.split(dir) + modname = dirname + '.' + modname + subname = _filename_as_modname(self.title) + if subname is None: + return self.globals, file, None + if modname: + if subname == "__init__": + # strip trailing period + modname = modname[:-1] + else: + modname = modname + subname + else: + modname = subname + if sys.modules.has_key(modname): + globals = sys.modules[modname].__dict__ + self.globals = {} + else: + globals = self.globals + modname = subname + else: + file = '<%s>' % self.title + globals = self.globals + modname = file + return globals, file, modname + + def write(self, stuff): + """for use as stdout""" + self._buf = self._buf + stuff + if '\n' in self._buf: + self.flush() + + def flush(self): + stuff = string.split(self._buf, '\n') + stuff = string.join(stuff, '\r') + end = self.editgroup.editor.ted.WEGetTextLength() + self.editgroup.editor.ted.WESetSelection(end, end) + self.editgroup.editor.ted.WEInsert(stuff, None, None) + self.editgroup.editor.updatescrollbars() + self._buf = "" + # ? optional: + #self.wid.SelectWindow() + + def getclasslist(self): + from string import find, strip + methodRE = re.compile(r"\r[ \t]+def ") + findMethod = methodRE.search + editor = self.editgroup.editor + text = editor.get() + list = [] + append = list.append + functag = "func" + classtag = "class" + methodtag = "method" + pos = -1 + if text[:4] == 'def ': + append((pos + 4, functag)) + pos = 4 + while 1: + pos = find(text, '\rdef ', pos + 1) + if pos < 0: + break + append((pos + 5, functag)) + pos = -1 + if text[:6] == 'class ': + append((pos + 6, classtag)) + pos = 6 + while 1: + pos = find(text, '\rclass ', pos + 1) + if pos < 0: + break + append((pos + 7, classtag)) + pos = 0 + while 1: + m = findMethod(text, pos + 1) + if m is None: + break + pos = m.regs[0][0] + #pos = find(text, '\r\tdef ', pos + 1) + append((m.regs[0][1], methodtag)) + list.sort() + classlist = [] + methodlistappend = None + offsetToLine = editor.ted.WEOffsetToLine + getLineRange = editor.ted.WEGetLineRange + append = classlist.append + for pos, tag in list: + lineno = offsetToLine(pos) + lineStart, lineEnd = getLineRange(lineno) + line = strip(text[pos:lineEnd]) + line = line[:identifieRE_match(line)] + if tag is functag: + append(("def " + line, lineno + 1)) + methodlistappend = None + elif tag is classtag: + append(["class " + line]) + methodlistappend = classlist[-1].append + elif methodlistappend and tag is methodtag: + methodlistappend(("def " + line, lineno + 1)) + return classlist + + def popselectline(self, lineno): + self.editgroup.editor.selectline(lineno - 1) + + def selectline(self, lineno, charoffset = 0): + self.editgroup.editor.selectline(lineno - 1, charoffset) + + def addrecentfile(self, filename): + app = W.getapplication() + app.addrecentfile(filename) class _saveoptions: - - def __init__(self, creator, eoln): - self.rv = None - self.eoln = eoln - self.w = w = W.ModalDialog((260, 160), 'Save options') - radiobuttons = [] - w.label = W.TextBox((8, 8, 80, 18), "File creator:") - w.ide_radio = W.RadioButton((8, 22, 160, 18), "PythonIDE", radiobuttons, self.ide_hit) - w.interp_radio = W.RadioButton((8, 42, 160, 18), "MacPython-OS9 Interpreter", radiobuttons, self.interp_hit) - w.interpx_radio = W.RadioButton((8, 62, 160, 18), "PythonLauncher", radiobuttons, self.interpx_hit) - w.other_radio = W.RadioButton((8, 82, 50, 18), "Other:", radiobuttons) - w.other_creator = W.EditText((62, 82, 40, 20), creator, self.otherselect) - w.none_radio = W.RadioButton((8, 102, 160, 18), "None", radiobuttons, self.none_hit) - w.cancelbutton = W.Button((-180, -30, 80, 16), "Cancel", self.cancelbuttonhit) - w.okbutton = W.Button((-90, -30, 80, 16), "Done", self.okbuttonhit) - w.setdefaultbutton(w.okbutton) - if creator == 'Pyth': - w.interp_radio.set(1) - elif creator == W._signature: - w.ide_radio.set(1) - elif creator == 'PytX': - w.interpx_radio.set(1) - elif creator == '\0\0\0\0': - w.none_radio.set(1) - else: - w.other_radio.set(1) - - w.eolnlabel = W.TextBox((168, 8, 80, 18), "Newline style:") - radiobuttons = [] - w.unix_radio = W.RadioButton((168, 22, 80, 18), "Unix", radiobuttons, self.unix_hit) - w.mac_radio = W.RadioButton((168, 42, 80, 18), "Macintosh", radiobuttons, self.mac_hit) - w.win_radio = W.RadioButton((168, 62, 80, 18), "Windows", radiobuttons, self.win_hit) - if self.eoln == '\n': - w.unix_radio.set(1) - elif self.eoln == '\r\n': - w.win_radio.set(1) - else: - w.mac_radio.set(1) - - w.bind("cmd.", w.cancelbutton.push) - w.open() - - def ide_hit(self): - self.w.other_creator.set(W._signature) - - def interp_hit(self): - self.w.other_creator.set("Pyth") - - def interpx_hit(self): - self.w.other_creator.set("PytX") - - def none_hit(self): - self.w.other_creator.set("\0\0\0\0") - - def otherselect(self, *args): - sel_from, sel_to = self.w.other_creator.getselection() - creator = self.w.other_creator.get()[:4] - creator = creator + " " * (4 - len(creator)) - self.w.other_creator.set(creator) - self.w.other_creator.setselection(sel_from, sel_to) - self.w.other_radio.set(1) - - def mac_hit(self): - self.eoln = '\r' - - def unix_hit(self): - self.eoln = '\n' - - def win_hit(self): - self.eoln = '\r\n' - - def cancelbuttonhit(self): - self.w.close() - - def okbuttonhit(self): - self.rv = (self.w.other_creator.get()[:4], self.eoln) - self.w.close() + + def __init__(self, creator, eoln): + self.rv = None + self.eoln = eoln + self.w = w = W.ModalDialog((260, 160), 'Save options') + radiobuttons = [] + w.label = W.TextBox((8, 8, 80, 18), "File creator:") + w.ide_radio = W.RadioButton((8, 22, 160, 18), "PythonIDE", radiobuttons, self.ide_hit) + w.interp_radio = W.RadioButton((8, 42, 160, 18), "MacPython-OS9 Interpreter", radiobuttons, self.interp_hit) + w.interpx_radio = W.RadioButton((8, 62, 160, 18), "PythonLauncher", radiobuttons, self.interpx_hit) + w.other_radio = W.RadioButton((8, 82, 50, 18), "Other:", radiobuttons) + w.other_creator = W.EditText((62, 82, 40, 20), creator, self.otherselect) + w.none_radio = W.RadioButton((8, 102, 160, 18), "None", radiobuttons, self.none_hit) + w.cancelbutton = W.Button((-180, -30, 80, 16), "Cancel", self.cancelbuttonhit) + w.okbutton = W.Button((-90, -30, 80, 16), "Done", self.okbuttonhit) + w.setdefaultbutton(w.okbutton) + if creator == 'Pyth': + w.interp_radio.set(1) + elif creator == W._signature: + w.ide_radio.set(1) + elif creator == 'PytX': + w.interpx_radio.set(1) + elif creator == '\0\0\0\0': + w.none_radio.set(1) + else: + w.other_radio.set(1) + + w.eolnlabel = W.TextBox((168, 8, 80, 18), "Newline style:") + radiobuttons = [] + w.unix_radio = W.RadioButton((168, 22, 80, 18), "Unix", radiobuttons, self.unix_hit) + w.mac_radio = W.RadioButton((168, 42, 80, 18), "Macintosh", radiobuttons, self.mac_hit) + w.win_radio = W.RadioButton((168, 62, 80, 18), "Windows", radiobuttons, self.win_hit) + if self.eoln == '\n': + w.unix_radio.set(1) + elif self.eoln == '\r\n': + w.win_radio.set(1) + else: + w.mac_radio.set(1) + + w.bind("cmd.", w.cancelbutton.push) + w.open() + + def ide_hit(self): + self.w.other_creator.set(W._signature) + + def interp_hit(self): + self.w.other_creator.set("Pyth") + + def interpx_hit(self): + self.w.other_creator.set("PytX") + + def none_hit(self): + self.w.other_creator.set("\0\0\0\0") + + def otherselect(self, *args): + sel_from, sel_to = self.w.other_creator.getselection() + creator = self.w.other_creator.get()[:4] + creator = creator + " " * (4 - len(creator)) + self.w.other_creator.set(creator) + self.w.other_creator.setselection(sel_from, sel_to) + self.w.other_radio.set(1) + + def mac_hit(self): + self.eoln = '\r' + + def unix_hit(self): + self.eoln = '\n' + + def win_hit(self): + self.eoln = '\r\n' + + def cancelbuttonhit(self): + self.w.close() + + def okbuttonhit(self): + self.rv = (self.w.other_creator.get()[:4], self.eoln) + self.w.close() def SaveOptions(creator, eoln): - s = _saveoptions(creator, eoln) - return s.rv + s = _saveoptions(creator, eoln) + return s.rv -def _escape(where, what) : - return string.join(string.split(where, what), '\\' + what) +def _escape(where, what) : + return string.join(string.split(where, what), '\\' + what) def _makewholewordpattern(word): - # first, escape special regex chars - for esc in "\\[]()|.*^+$?": - word = _escape(word, esc) - notwordcharspat = '[^' + _wordchars + ']' - pattern = '(' + word + ')' - if word[0] in _wordchars: - pattern = notwordcharspat + pattern - if word[-1] in _wordchars: - pattern = pattern + notwordcharspat - return re.compile(pattern) + # first, escape special regex chars + for esc in "\\[]()|.*^+$?": + word = _escape(word, esc) + notwordcharspat = '[^' + _wordchars + ']' + pattern = '(' + word + ')' + if word[0] in _wordchars: + pattern = notwordcharspat + pattern + if word[-1] in _wordchars: + pattern = pattern + notwordcharspat + return re.compile(pattern) class SearchEngine: - - def __init__(self): - self.visible = 0 - self.w = None - self.parms = { "find": "", - "replace": "", - "wrap": 1, - "casesens": 1, - "wholeword": 1 - } - import MacPrefs - prefs = MacPrefs.GetPrefs(W.getapplication().preffilepath) - if prefs.searchengine: - self.parms["casesens"] = prefs.searchengine.casesens - self.parms["wrap"] = prefs.searchengine.wrap - self.parms["wholeword"] = prefs.searchengine.wholeword - - def show(self): - self.visible = 1 - if self.w: - self.w.wid.ShowWindow() - self.w.wid.SelectWindow() - self.w.find.edit.select(1) - self.w.find.edit.selectall() - return - self.w = W.Dialog((420, 150), "Find") - - self.w.find = TitledEditText((10, 4, 300, 36), "Search for:") - self.w.replace = TitledEditText((10, 100, 300, 36), "Replace with:") - - self.w.boxes = W.Group((10, 50, 300, 40)) - self.w.boxes.casesens = W.CheckBox((0, 0, 100, 16), "Case sensitive") - self.w.boxes.wholeword = W.CheckBox((0, 20, 100, 16), "Whole word") - self.w.boxes.wrap = W.CheckBox((110, 0, 100, 16), "Wrap around") - - self.buttons = [ ("Find", "cmdf", self.find), - ("Replace", "cmdr", self.replace), - ("Replace all", None, self.replaceall), - ("Don't find", "cmdd", self.dont), - ("Cancel", "cmd.", self.cancel) - ] - for i in range(len(self.buttons)): - bounds = -90, 22 + i * 24, 80, 16 - title, shortcut, callback = self.buttons[i] - self.w[title] = W.Button(bounds, title, callback) - if shortcut: - self.w.bind(shortcut, self.w[title].push) - self.w.setdefaultbutton(self.w["Don't find"]) - self.w.find.edit.bind("<key>", self.key) - self.w.bind("<activate>", self.activate) - self.w.bind("<close>", self.close) - self.w.open() - self.setparms() - self.w.find.edit.select(1) - self.w.find.edit.selectall() - self.checkbuttons() - - def close(self): - self.hide() - return -1 - - def key(self, char, modifiers): - self.w.find.edit.key(char, modifiers) - self.checkbuttons() - return 1 - - def activate(self, onoff): - if onoff: - self.checkbuttons() - - def checkbuttons(self): - editor = findeditor(self) - if editor: - if self.w.find.get(): - for title, cmd, call in self.buttons[:-2]: - self.w[title].enable(1) - self.w.setdefaultbutton(self.w["Find"]) - else: - for title, cmd, call in self.buttons[:-2]: - self.w[title].enable(0) - self.w.setdefaultbutton(self.w["Don't find"]) - else: - for title, cmd, call in self.buttons[:-2]: - self.w[title].enable(0) - self.w.setdefaultbutton(self.w["Don't find"]) - - def find(self): - self.getparmsfromwindow() - if self.findnext(): - self.hide() - - def replace(self): - editor = findeditor(self) - if not editor: - return - if self.visible: - self.getparmsfromwindow() - text = editor.getselectedtext() - find = self.parms["find"] - if not self.parms["casesens"]: - find = string.lower(find) - text = string.lower(text) - if text == find: - self.hide() - editor.insert(self.parms["replace"]) - - def replaceall(self): - editor = findeditor(self) - if not editor: - return - if self.visible: - self.getparmsfromwindow() - W.SetCursor("watch") - find = self.parms["find"] - if not find: - return - findlen = len(find) - replace = self.parms["replace"] - replacelen = len(replace) - Text = editor.get() - if not self.parms["casesens"]: - find = string.lower(find) - text = string.lower(Text) - else: - text = Text - newtext = "" - pos = 0 - counter = 0 - while 1: - if self.parms["wholeword"]: - wholewordRE = _makewholewordpattern(find) - match = wholewordRE.search(text, pos) - if match: - pos = match.start(1) - else: - pos = -1 - else: - pos = string.find(text, find, pos) - if pos < 0: - break - counter = counter + 1 - text = text[:pos] + replace + text[pos + findlen:] - Text = Text[:pos] + replace + Text[pos + findlen:] - pos = pos + replacelen - W.SetCursor("arrow") - if counter: - self.hide() - from Carbon import Res - editor.textchanged() - editor.selectionchanged() - editor.set(Text) - EasyDialogs.Message("Replaced %d occurrences" % counter) - - def dont(self): - self.getparmsfromwindow() - self.hide() - - def replacefind(self): - self.replace() - self.findnext() - - def setfindstring(self): - editor = findeditor(self) - if not editor: - return - find = editor.getselectedtext() - if not find: - return - self.parms["find"] = find - if self.w: - self.w.find.edit.set(self.parms["find"]) - self.w.find.edit.selectall() - - def findnext(self): - editor = findeditor(self) - if not editor: - return - find = self.parms["find"] - if not find: - return - text = editor.get() - if not self.parms["casesens"]: - find = string.lower(find) - text = string.lower(text) - selstart, selend = editor.getselection() - selstart, selend = min(selstart, selend), max(selstart, selend) - if self.parms["wholeword"]: - wholewordRE = _makewholewordpattern(find) - match = wholewordRE.search(text, selend) - if match: - pos = match.start(1) - else: - pos = -1 - else: - pos = string.find(text, find, selend) - if pos >= 0: - editor.setselection(pos, pos + len(find)) - return 1 - elif self.parms["wrap"]: - if self.parms["wholeword"]: - match = wholewordRE.search(text, 0) - if match: - pos = match.start(1) - else: - pos = -1 - else: - pos = string.find(text, find) - if selstart > pos >= 0: - editor.setselection(pos, pos + len(find)) - return 1 - - def setparms(self): - for key, value in self.parms.items(): - try: - self.w[key].set(value) - except KeyError: - self.w.boxes[key].set(value) - - def getparmsfromwindow(self): - if not self.w: - return - for key, value in self.parms.items(): - try: - value = self.w[key].get() - except KeyError: - value = self.w.boxes[key].get() - self.parms[key] = value - - def cancel(self): - self.hide() - self.setparms() - - def hide(self): - if self.w: - self.w.wid.HideWindow() - self.visible = 0 - - def writeprefs(self): - import MacPrefs - self.getparmsfromwindow() - prefs = MacPrefs.GetPrefs(W.getapplication().preffilepath) - prefs.searchengine.casesens = self.parms["casesens"] - prefs.searchengine.wrap = self.parms["wrap"] - prefs.searchengine.wholeword = self.parms["wholeword"] - prefs.save() - + + def __init__(self): + self.visible = 0 + self.w = None + self.parms = { "find": "", + "replace": "", + "wrap": 1, + "casesens": 1, + "wholeword": 1 + } + import MacPrefs + prefs = MacPrefs.GetPrefs(W.getapplication().preffilepath) + if prefs.searchengine: + self.parms["casesens"] = prefs.searchengine.casesens + self.parms["wrap"] = prefs.searchengine.wrap + self.parms["wholeword"] = prefs.searchengine.wholeword + + def show(self): + self.visible = 1 + if self.w: + self.w.wid.ShowWindow() + self.w.wid.SelectWindow() + self.w.find.edit.select(1) + self.w.find.edit.selectall() + return + self.w = W.Dialog((420, 150), "Find") + + self.w.find = TitledEditText((10, 4, 300, 36), "Search for:") + self.w.replace = TitledEditText((10, 100, 300, 36), "Replace with:") + + self.w.boxes = W.Group((10, 50, 300, 40)) + self.w.boxes.casesens = W.CheckBox((0, 0, 100, 16), "Case sensitive") + self.w.boxes.wholeword = W.CheckBox((0, 20, 100, 16), "Whole word") + self.w.boxes.wrap = W.CheckBox((110, 0, 100, 16), "Wrap around") + + self.buttons = [ ("Find", "cmdf", self.find), + ("Replace", "cmdr", self.replace), + ("Replace all", None, self.replaceall), + ("Don't find", "cmdd", self.dont), + ("Cancel", "cmd.", self.cancel) + ] + for i in range(len(self.buttons)): + bounds = -90, 22 + i * 24, 80, 16 + title, shortcut, callback = self.buttons[i] + self.w[title] = W.Button(bounds, title, callback) + if shortcut: + self.w.bind(shortcut, self.w[title].push) + self.w.setdefaultbutton(self.w["Don't find"]) + self.w.find.edit.bind("<key>", self.key) + self.w.bind("<activate>", self.activate) + self.w.bind("<close>", self.close) + self.w.open() + self.setparms() + self.w.find.edit.select(1) + self.w.find.edit.selectall() + self.checkbuttons() + + def close(self): + self.hide() + return -1 + + def key(self, char, modifiers): + self.w.find.edit.key(char, modifiers) + self.checkbuttons() + return 1 + + def activate(self, onoff): + if onoff: + self.checkbuttons() + + def checkbuttons(self): + editor = findeditor(self) + if editor: + if self.w.find.get(): + for title, cmd, call in self.buttons[:-2]: + self.w[title].enable(1) + self.w.setdefaultbutton(self.w["Find"]) + else: + for title, cmd, call in self.buttons[:-2]: + self.w[title].enable(0) + self.w.setdefaultbutton(self.w["Don't find"]) + else: + for title, cmd, call in self.buttons[:-2]: + self.w[title].enable(0) + self.w.setdefaultbutton(self.w["Don't find"]) + + def find(self): + self.getparmsfromwindow() + if self.findnext(): + self.hide() + + def replace(self): + editor = findeditor(self) + if not editor: + return + if self.visible: + self.getparmsfromwindow() + text = editor.getselectedtext() + find = self.parms["find"] + if not self.parms["casesens"]: + find = string.lower(find) + text = string.lower(text) + if text == find: + self.hide() + editor.insert(self.parms["replace"]) + + def replaceall(self): + editor = findeditor(self) + if not editor: + return + if self.visible: + self.getparmsfromwindow() + W.SetCursor("watch") + find = self.parms["find"] + if not find: + return + findlen = len(find) + replace = self.parms["replace"] + replacelen = len(replace) + Text = editor.get() + if not self.parms["casesens"]: + find = string.lower(find) + text = string.lower(Text) + else: + text = Text + newtext = "" + pos = 0 + counter = 0 + while 1: + if self.parms["wholeword"]: + wholewordRE = _makewholewordpattern(find) + match = wholewordRE.search(text, pos) + if match: + pos = match.start(1) + else: + pos = -1 + else: + pos = string.find(text, find, pos) + if pos < 0: + break + counter = counter + 1 + text = text[:pos] + replace + text[pos + findlen:] + Text = Text[:pos] + replace + Text[pos + findlen:] + pos = pos + replacelen + W.SetCursor("arrow") + if counter: + self.hide() + from Carbon import Res + editor.textchanged() + editor.selectionchanged() + editor.set(Text) + EasyDialogs.Message("Replaced %d occurrences" % counter) + + def dont(self): + self.getparmsfromwindow() + self.hide() + + def replacefind(self): + self.replace() + self.findnext() + + def setfindstring(self): + editor = findeditor(self) + if not editor: + return + find = editor.getselectedtext() + if not find: + return + self.parms["find"] = find + if self.w: + self.w.find.edit.set(self.parms["find"]) + self.w.find.edit.selectall() + + def findnext(self): + editor = findeditor(self) + if not editor: + return + find = self.parms["find"] + if not find: + return + text = editor.get() + if not self.parms["casesens"]: + find = string.lower(find) + text = string.lower(text) + selstart, selend = editor.getselection() + selstart, selend = min(selstart, selend), max(selstart, selend) + if self.parms["wholeword"]: + wholewordRE = _makewholewordpattern(find) + match = wholewordRE.search(text, selend) + if match: + pos = match.start(1) + else: + pos = -1 + else: + pos = string.find(text, find, selend) + if pos >= 0: + editor.setselection(pos, pos + len(find)) + return 1 + elif self.parms["wrap"]: + if self.parms["wholeword"]: + match = wholewordRE.search(text, 0) + if match: + pos = match.start(1) + else: + pos = -1 + else: + pos = string.find(text, find) + if selstart > pos >= 0: + editor.setselection(pos, pos + len(find)) + return 1 + + def setparms(self): + for key, value in self.parms.items(): + try: + self.w[key].set(value) + except KeyError: + self.w.boxes[key].set(value) + + def getparmsfromwindow(self): + if not self.w: + return + for key, value in self.parms.items(): + try: + value = self.w[key].get() + except KeyError: + value = self.w.boxes[key].get() + self.parms[key] = value + + def cancel(self): + self.hide() + self.setparms() + + def hide(self): + if self.w: + self.w.wid.HideWindow() + self.visible = 0 + + def writeprefs(self): + import MacPrefs + self.getparmsfromwindow() + prefs = MacPrefs.GetPrefs(W.getapplication().preffilepath) + prefs.searchengine.casesens = self.parms["casesens"] + prefs.searchengine.wrap = self.parms["wrap"] + prefs.searchengine.wholeword = self.parms["wholeword"] + prefs.save() + class TitledEditText(W.Group): - - def __init__(self, possize, title, text = ""): - W.Group.__init__(self, possize) - self.title = W.TextBox((0, 0, 0, 16), title) - self.edit = W.EditText((0, 16, 0, 0), text) - - def set(self, value): - self.edit.set(value) - - def get(self): - return self.edit.get() + + def __init__(self, possize, title, text = ""): + W.Group.__init__(self, possize) + self.title = W.TextBox((0, 0, 0, 16), title) + self.edit = W.EditText((0, 16, 0, 0), text) + + def set(self, value): + self.edit.set(value) + + def get(self): + return self.edit.get() class ClassFinder(W.PopupWidget): - - def click(self, point, modifiers): - W.SetCursor("watch") - self.set(self._parentwindow.getclasslist()) - W.PopupWidget.click(self, point, modifiers) + + def click(self, point, modifiers): + W.SetCursor("watch") + self.set(self._parentwindow.getclasslist()) + W.PopupWidget.click(self, point, modifiers) def getminindent(lines): - indent = -1 - for line in lines: - stripped = string.strip(line) - if not stripped or stripped[0] == '#': - continue - if indent < 0 or line[:indent] <> indent * '\t': - indent = 0 - for c in line: - if c <> '\t': - break - indent = indent + 1 - return indent + indent = -1 + for line in lines: + stripped = string.strip(line) + if not stripped or stripped[0] == '#': + continue + if indent < 0 or line[:indent] <> indent * '\t': + indent = 0 + for c in line: + if c <> '\t': + break + indent = indent + 1 + return indent def getoptionkey(): - return not not ord(Evt.GetKeys()[7]) & 0x04 - - -def execstring(pytext, globals, locals, filename="<string>", debugging=0, - modname="__main__", profiling=0): - if debugging: - import PyDebugger, bdb - BdbQuit = bdb.BdbQuit - else: - BdbQuit = 'BdbQuitDummyException' - pytext = string.split(pytext, '\r') - pytext = string.join(pytext, '\n') + '\n' - W.SetCursor("watch") - globals['__name__'] = modname - globals['__file__'] = filename - sys.argv = [filename] - try: - code = compile(pytext, filename, "exec") - except: - # XXXX BAAAADDD.... We let tracebackwindow decide to treat SyntaxError - # special. That's wrong because THIS case is special (could be literal - # overflow!) and SyntaxError could mean we need a traceback (syntax error - # in imported module!!! - tracebackwindow.traceback(1, filename) - return - try: - if debugging: - PyDebugger.startfromhere() - else: - if hasattr(MacOS, 'EnableAppswitch'): - MacOS.EnableAppswitch(0) - try: - if profiling: - import profile, ProfileBrowser - p = profile.Profile() - p.set_cmd(filename) - try: - p.runctx(code, globals, locals) - finally: - import pstats - - stats = pstats.Stats(p) - ProfileBrowser.ProfileBrowser(stats) - else: - exec code in globals, locals - finally: - if hasattr(MacOS, 'EnableAppswitch'): - MacOS.EnableAppswitch(-1) - except W.AlertError, detail: - raise W.AlertError, detail - except (KeyboardInterrupt, BdbQuit): - pass - except SystemExit, arg: - if arg.code: - sys.stderr.write("Script exited with status code: %s\n" % repr(arg.code)) - except: - if debugging: - sys.settrace(None) - PyDebugger.postmortem(sys.exc_type, sys.exc_value, sys.exc_traceback) - return - else: - tracebackwindow.traceback(1, filename) - if debugging: - sys.settrace(None) - PyDebugger.stop() + return not not ord(Evt.GetKeys()[7]) & 0x04 + + +def execstring(pytext, globals, locals, filename="<string>", debugging=0, + modname="__main__", profiling=0): + if debugging: + import PyDebugger, bdb + BdbQuit = bdb.BdbQuit + else: + BdbQuit = 'BdbQuitDummyException' + pytext = string.split(pytext, '\r') + pytext = string.join(pytext, '\n') + '\n' + W.SetCursor("watch") + globals['__name__'] = modname + globals['__file__'] = filename + sys.argv = [filename] + try: + code = compile(pytext, filename, "exec") + except: + # XXXX BAAAADDD.... We let tracebackwindow decide to treat SyntaxError + # special. That's wrong because THIS case is special (could be literal + # overflow!) and SyntaxError could mean we need a traceback (syntax error + # in imported module!!! + tracebackwindow.traceback(1, filename) + return + try: + if debugging: + PyDebugger.startfromhere() + else: + if hasattr(MacOS, 'EnableAppswitch'): + MacOS.EnableAppswitch(0) + try: + if profiling: + import profile, ProfileBrowser + p = profile.Profile() + p.set_cmd(filename) + try: + p.runctx(code, globals, locals) + finally: + import pstats + + stats = pstats.Stats(p) + ProfileBrowser.ProfileBrowser(stats) + else: + exec code in globals, locals + finally: + if hasattr(MacOS, 'EnableAppswitch'): + MacOS.EnableAppswitch(-1) + except W.AlertError, detail: + raise W.AlertError, detail + except (KeyboardInterrupt, BdbQuit): + pass + except SystemExit, arg: + if arg.code: + sys.stderr.write("Script exited with status code: %s\n" % repr(arg.code)) + except: + if debugging: + sys.settrace(None) + PyDebugger.postmortem(sys.exc_type, sys.exc_value, sys.exc_traceback) + return + else: + tracebackwindow.traceback(1, filename) + if debugging: + sys.settrace(None) + PyDebugger.stop() _identifieRE = re.compile(r"[A-Za-z_][A-Za-z_0-9]*") def identifieRE_match(str): - match = _identifieRE.match(str) - if not match: - return -1 - return match.end() + match = _identifieRE.match(str) + if not match: + return -1 + return match.end() def _filename_as_modname(fname): - if fname[-3:] == '.py': - modname = fname[:-3] - match = _identifieRE.match(modname) - if match and match.start() == 0 and match.end() == len(modname): - return string.join(string.split(modname, '.'), '_') + if fname[-3:] == '.py': + modname = fname[:-3] + match = _identifieRE.match(modname) + if match and match.start() == 0 and match.end() == len(modname): + return string.join(string.split(modname, '.'), '_') def findeditor(topwindow, fromtop = 0): - wid = MyFrontWindow() - if not fromtop: - if topwindow.w and wid == topwindow.w.wid: - wid = topwindow.w.wid.GetNextWindow() - if not wid: - return - app = W.getapplication() - if app._windows.has_key(wid): # KeyError otherwise can happen in RoboFog :-( - window = W.getapplication()._windows[wid] - else: - return - if not isinstance(window, Editor): - return - return window.editgroup.editor + wid = MyFrontWindow() + if not fromtop: + if topwindow.w and wid == topwindow.w.wid: + wid = topwindow.w.wid.GetNextWindow() + if not wid: + return + app = W.getapplication() + if app._windows.has_key(wid): # KeyError otherwise can happen in RoboFog :-( + window = W.getapplication()._windows[wid] + else: + return + if not isinstance(window, Editor): + return + return window.editgroup.editor class _EditorDefaultSettings: - - def __init__(self): - self.template = "%s, %d point" - self.fontsettings, self.tabsettings, self.windowsize = geteditorprefs() - self.w = W.Dialog((328, 120), "Editor default settings") - self.w.setfontbutton = W.Button((8, 8, 80, 16), "Set font\xc9", self.dofont) - self.w.fonttext = W.TextBox((98, 10, -8, 14), self.template % (self.fontsettings[0], self.fontsettings[2])) - - self.w.picksizebutton = W.Button((8, 50, 80, 16), "Front window", self.picksize) - self.w.xsizelabel = W.TextBox((98, 32, 40, 14), "Width:") - self.w.ysizelabel = W.TextBox((148, 32, 40, 14), "Height:") - self.w.xsize = W.EditText((98, 48, 40, 20), repr(self.windowsize[0])) - self.w.ysize = W.EditText((148, 48, 40, 20), repr(self.windowsize[1])) - - self.w.cancelbutton = W.Button((-180, -26, 80, 16), "Cancel", self.cancel) - self.w.okbutton = W.Button((-90, -26, 80, 16), "Done", self.ok) - self.w.setdefaultbutton(self.w.okbutton) - self.w.bind('cmd.', self.w.cancelbutton.push) - self.w.open() - - def picksize(self): - app = W.getapplication() - editor = findeditor(self) - if editor is not None: - width, height = editor._parentwindow._bounds[2:] - self.w.xsize.set(repr(width)) - self.w.ysize.set(repr(height)) - else: - raise W.AlertError, "No edit window found" - - def dofont(self): - import FontSettings - settings = FontSettings.FontDialog(self.fontsettings, self.tabsettings) - if settings: - self.fontsettings, self.tabsettings = settings - sys.exc_traceback = None - self.w.fonttext.set(self.template % (self.fontsettings[0], self.fontsettings[2])) - - def close(self): - self.w.close() - del self.w - - def cancel(self): - self.close() - - def ok(self): - try: - width = string.atoi(self.w.xsize.get()) - except: - self.w.xsize.select(1) - self.w.xsize.selectall() - raise W.AlertError, "Bad number for window width" - try: - height = string.atoi(self.w.ysize.get()) - except: - self.w.ysize.select(1) - self.w.ysize.selectall() - raise W.AlertError, "Bad number for window height" - self.windowsize = width, height - seteditorprefs(self.fontsettings, self.tabsettings, self.windowsize) - self.close() + + def __init__(self): + self.template = "%s, %d point" + self.fontsettings, self.tabsettings, self.windowsize = geteditorprefs() + self.w = W.Dialog((328, 120), "Editor default settings") + self.w.setfontbutton = W.Button((8, 8, 80, 16), "Set font\xc9", self.dofont) + self.w.fonttext = W.TextBox((98, 10, -8, 14), self.template % (self.fontsettings[0], self.fontsettings[2])) + + self.w.picksizebutton = W.Button((8, 50, 80, 16), "Front window", self.picksize) + self.w.xsizelabel = W.TextBox((98, 32, 40, 14), "Width:") + self.w.ysizelabel = W.TextBox((148, 32, 40, 14), "Height:") + self.w.xsize = W.EditText((98, 48, 40, 20), repr(self.windowsize[0])) + self.w.ysize = W.EditText((148, 48, 40, 20), repr(self.windowsize[1])) + + self.w.cancelbutton = W.Button((-180, -26, 80, 16), "Cancel", self.cancel) + self.w.okbutton = W.Button((-90, -26, 80, 16), "Done", self.ok) + self.w.setdefaultbutton(self.w.okbutton) + self.w.bind('cmd.', self.w.cancelbutton.push) + self.w.open() + + def picksize(self): + app = W.getapplication() + editor = findeditor(self) + if editor is not None: + width, height = editor._parentwindow._bounds[2:] + self.w.xsize.set(repr(width)) + self.w.ysize.set(repr(height)) + else: + raise W.AlertError, "No edit window found" + + def dofont(self): + import FontSettings + settings = FontSettings.FontDialog(self.fontsettings, self.tabsettings) + if settings: + self.fontsettings, self.tabsettings = settings + sys.exc_traceback = None + self.w.fonttext.set(self.template % (self.fontsettings[0], self.fontsettings[2])) + + def close(self): + self.w.close() + del self.w + + def cancel(self): + self.close() + + def ok(self): + try: + width = string.atoi(self.w.xsize.get()) + except: + self.w.xsize.select(1) + self.w.xsize.selectall() + raise W.AlertError, "Bad number for window width" + try: + height = string.atoi(self.w.ysize.get()) + except: + self.w.ysize.select(1) + self.w.ysize.selectall() + raise W.AlertError, "Bad number for window height" + self.windowsize = width, height + seteditorprefs(self.fontsettings, self.tabsettings, self.windowsize) + self.close() def geteditorprefs(): - import MacPrefs - prefs = MacPrefs.GetPrefs(W.getapplication().preffilepath) - try: - fontsettings = prefs.pyedit.fontsettings - tabsettings = prefs.pyedit.tabsettings - windowsize = prefs.pyedit.windowsize - except: - fontsettings = prefs.pyedit.fontsettings = ("Geneva", 0, 10, (0, 0, 0)) - tabsettings = prefs.pyedit.tabsettings = (8, 1) - windowsize = prefs.pyedit.windowsize = (500, 250) - sys.exc_traceback = None - return fontsettings, tabsettings, windowsize + import MacPrefs + prefs = MacPrefs.GetPrefs(W.getapplication().preffilepath) + try: + fontsettings = prefs.pyedit.fontsettings + tabsettings = prefs.pyedit.tabsettings + windowsize = prefs.pyedit.windowsize + except: + fontsettings = prefs.pyedit.fontsettings = ("Geneva", 0, 10, (0, 0, 0)) + tabsettings = prefs.pyedit.tabsettings = (8, 1) + windowsize = prefs.pyedit.windowsize = (500, 250) + sys.exc_traceback = None + return fontsettings, tabsettings, windowsize def seteditorprefs(fontsettings, tabsettings, windowsize): - import MacPrefs - prefs = MacPrefs.GetPrefs(W.getapplication().preffilepath) - prefs.pyedit.fontsettings = fontsettings - prefs.pyedit.tabsettings = tabsettings - prefs.pyedit.windowsize = windowsize - prefs.save() + import MacPrefs + prefs = MacPrefs.GetPrefs(W.getapplication().preffilepath) + prefs.pyedit.fontsettings = fontsettings + prefs.pyedit.tabsettings = tabsettings + prefs.pyedit.windowsize = windowsize + prefs.save() _defaultSettingsEditor = None def EditorDefaultSettings(): - global _defaultSettingsEditor - if _defaultSettingsEditor is None or not hasattr(_defaultSettingsEditor, "w"): - _defaultSettingsEditor = _EditorDefaultSettings() - else: - _defaultSettingsEditor.w.select() + global _defaultSettingsEditor + if _defaultSettingsEditor is None or not hasattr(_defaultSettingsEditor, "w"): + _defaultSettingsEditor = _EditorDefaultSettings() + else: + _defaultSettingsEditor.w.select() def resolvealiases(path): - try: - fsr, d1, d2 = File.FSResolveAliasFile(path, 1) - path = fsr.as_pathname() - return path - except (File.Error, ValueError), (error, str): - if error <> -120: - raise - dir, file = os.path.split(path) - return os.path.join(resolvealiases(dir), file) + try: + fsr, d1, d2 = File.FSResolveAliasFile(path, 1) + path = fsr.as_pathname() + return path + except (File.Error, ValueError), (error, str): + if error <> -120: + raise + dir, file = os.path.split(path) + return os.path.join(resolvealiases(dir), file) searchengine = SearchEngine() tracebackwindow = Wtraceback.TraceBack() |