diff options
-rw-r--r-- | Mac/Tools/IDE/PyEdit.py | 19 | ||||
-rw-r--r-- | Mac/Tools/IDE/Wtext.py | 172 |
2 files changed, 149 insertions, 42 deletions
diff --git a/Mac/Tools/IDE/PyEdit.py b/Mac/Tools/IDE/PyEdit.py index 7740dfe..8d163ed 100644 --- a/Mac/Tools/IDE/PyEdit.py +++ b/Mac/Tools/IDE/PyEdit.py @@ -96,7 +96,7 @@ class Editor(W.Window): W.Window.__init__(self, bounds, self.title, minsize = (330, 120), tabbable = 0) self.setupwidgets(text) if change > 0: - self.editgroup.editor.changed = 1 + self.editgroup.editor.textchanged() if self.settings.has_key("selection"): selstart, selend = self.settings["selection"] @@ -247,12 +247,12 @@ class Editor(W.Window): def domenu_toggle_run_as_main(self): self.run_as_main = not self.run_as_main self.run_with_interpreter = 0 - self.editgroup.editor.selchanged = 1 + self.editgroup.editor.selectionchanged() def domenu_toggle_run_with_interpreter(self): self.run_with_interpreter = not self.run_with_interpreter self.run_as_main = 0 - self.editgroup.editor.selchanged = 1 + self.editgroup.editor.selectionchanged() def showbreakpoints(self, onoff): self.editgroup.editor.showbreakpoints(onoff) @@ -314,7 +314,7 @@ class Editor(W.Window): def domenu_options(self, *args): rv = SaveOptions(self._creator) if rv: - self.editgroup.editor.selchanged = 1 # ouch... + self.editgroup.editor.selectionchanged() # ouch... self._creator = rv def clicklinefield(self): @@ -633,6 +633,8 @@ class Editor(W.Window): 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 @@ -949,8 +951,8 @@ class SearchEngine: self.hide() import EasyDialogs from Carbon import Res - editor.changed = 1 - editor.selchanged = 1 + editor.textchanged() + editor.selectionchanged() editor.ted.WEUseText(Res.Resource(Text)) editor.ted.WECalText() editor.SetPort() @@ -1147,6 +1149,9 @@ def execstring(pytext, globals, locals, filename="<string>", debugging=0, 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 haveThreading: import continuation @@ -1268,7 +1273,7 @@ def geteditorprefs(): tabsettings = prefs.pyedit.tabsettings windowsize = prefs.pyedit.windowsize except: - fontsettings = prefs.pyedit.fontsettings = ("Python-Sans", 0, 9, (0, 0, 0)) + 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 diff --git a/Mac/Tools/IDE/Wtext.py b/Mac/Tools/IDE/Wtext.py index 68ba592..0d9203d 100644 --- a/Mac/Tools/IDE/Wtext.py +++ b/Mac/Tools/IDE/Wtext.py @@ -1,23 +1,14 @@ -from Carbon import Qd -from Carbon import TE -from Carbon import Fm +from Carbon import Evt, Events, Fm, Fonts +from Carbon import Qd, Res, Scrap +from Carbon import TE, TextEdit, Win import waste import WASTEconst -from Carbon import Res -from Carbon import Evt -from Carbon import Events -from Carbon import Scrap -import string - -from Carbon import Win import Wbase import Wkeys import Wcontrols import PyFontify -from types import * -from Carbon import Fonts -from Carbon import TextEdit - +import string +from types import TupleType, StringType class TextBox(Wbase.Widget): @@ -105,6 +96,7 @@ class EditText(Wbase.SelectableWidget, _ScrollWidget): self.temptext = text self.ted = None self.selection = None + self.oldselection = None self._callback = callback self.changed = 0 self.selchanged = 0 @@ -155,6 +147,13 @@ class EditText(Wbase.SelectableWidget, _ScrollWidget): self.temptext = None Wbase.SelectableWidget.close(self) + def textchanged(self, all=0): + self.changed = 1 + + def selectionchanged(self): + self.selchanged = 1 + self.oldselection = self.getselection() + def gettabsettings(self): return self.tabsettings @@ -208,7 +207,7 @@ class EditText(Wbase.SelectableWidget, _ScrollWidget): viewrect = self.ted.WEGetViewRect() Qd.EraseRect(viewrect) self.ted.WEUpdate(self._parentwindow.wid.GetWindowPort().visRgn) - self.selchanged = 1 + self.selectionchanged() self.updatescrollbars() def adjust(self, oldbounds): @@ -235,7 +234,7 @@ class EditText(Wbase.SelectableWidget, _ScrollWidget): def selectall(self): self.ted.WESetSelection(0, self.ted.WEGetTextLength()) - self.selchanged = 1 + self.selectionchanged() self.updatescrollbars() def selectline(self, lineno, charoffset = 0): @@ -246,7 +245,7 @@ class EditText(Wbase.SelectableWidget, _ScrollWidget): # Let's fool Waste by initially selecting one char less: self.ted.WESetSelection(newselstart + charoffset, newselend-1) self.ted.WESetSelection(newselstart + charoffset, newselend) - self.selchanged = 1 + self.selectionchanged() self.updatescrollbars() def getselection(self): @@ -256,7 +255,7 @@ class EditText(Wbase.SelectableWidget, _ScrollWidget): return self.selection def setselection(self, selstart, selend): - self.selchanged = 1 + self.selectionchanged() if self.ted: self.ted.WESetSelection(selstart, selend) self.ted.WESelView() @@ -284,12 +283,12 @@ class EditText(Wbase.SelectableWidget, _ScrollWidget): if oldselstart <> newselstart or oldselend <> newselend: self.ted.WESetSelection(newselstart, newselend) self.updatescrollbars() - self.selchanged = 1 + self.selectionchanged() def insert(self, text): self.ted.WEInsert(text, None, None) - self.changed = 1 - self.selchanged = 1 + self.textchanged() + self.selectionchanged() # text def set(self, text): @@ -306,8 +305,8 @@ class EditText(Wbase.SelectableWidget, _ScrollWidget): Qd.RectRgn(rgn, viewrect) Qd.EraseRect(viewrect) self.draw(rgn) - #self.GetWindow().InvalWindowRect(self.ted.WEGetViewRect()) self.updatescrollbars() + self.textchanged(1) def get(self): if not self._parent: @@ -321,9 +320,9 @@ class EditText(Wbase.SelectableWidget, _ScrollWidget): if self._enabled and not modifiers & Events.cmdKey or char in Wkeys.arrowkeys: self.ted.WEKey(ord(char), modifiers) if char not in Wkeys.navigationkeys: - self.changed = 1 + self.textchanged() if char not in Wkeys.scrollkeys: - self.selchanged = 1 + self.selectionchanged() self.updatescrollbars() if self._callback: Wbase.CallbackCall(self._callback, 0, char, modifiers) @@ -332,7 +331,7 @@ class EditText(Wbase.SelectableWidget, _ScrollWidget): if not self._enabled: return self.ted.WEClick(point, modifiers, Evt.TickCount()) - self.selchanged = 1 + self.selectionchanged() self.updatescrollbars() return 1 @@ -411,8 +410,8 @@ class EditText(Wbase.SelectableWidget, _ScrollWidget): self.ted.WECut() self.updatescrollbars() self.selview() - self.changed = 1 - self.selchanged = 1 + self.textchanged() + self.selectionchanged() if self._callback: Wbase.CallbackCall(self._callback, 0, "", None) @@ -422,8 +421,8 @@ class EditText(Wbase.SelectableWidget, _ScrollWidget): self.selview() self.ted.WEPaste() self.updatescrollbars() - self.changed = 1 - self.selchanged = 1 + self.textchanged() + self.selectionchanged() if self._callback: Wbase.CallbackCall(self._callback, 0, "", None) @@ -431,8 +430,8 @@ class EditText(Wbase.SelectableWidget, _ScrollWidget): self.ted.WEDelete() self.selview() self.updatescrollbars() - self.changed = 1 - self.selchanged = 1 + self.textchanged() + self.selectionchanged() if self._callback: Wbase.CallbackCall(self._callback, 0, "", None) @@ -442,8 +441,8 @@ class EditText(Wbase.SelectableWidget, _ScrollWidget): return self.ted.WEUndo() self.updatescrollbars() - self.changed = 1 - self.selchanged = 1 + self.textchanged() + self.selectionchanged() if self._callback: Wbase.CallbackCall(self._callback, 0, "", None) @@ -610,6 +609,8 @@ class TextEditor(EditText): import re commentPat = re.compile("[ \t]*(#)") indentPat = re.compile("[ \t]*") +kStringColor = (0, 0x7fff, 0) +kCommentColor = (0, 0, 0xb000) class PyEditor(TextEditor): @@ -627,10 +628,111 @@ class PyEditor(TextEditor): self.bind("cmd]", self.domenu_shiftright) self.bind("cmdshift[", self.domenu_uncomment) self.bind("cmdshift]", self.domenu_comment) + self.bind("cmdshiftd", self.alldirty) self.file = file # only for debugger reference self._debugger = debugger if debugger: debugger.register_editor(self, self.file) + self._dirty = (0, None) + self.do_fontify = 0 + + #def open(self): + # TextEditor.open(self) + # if self.do_fontify: + # self.fontify() + # self._dirty = (None, None) + + def _getflags(self): + flags = (WASTEconst.weDoDrawOffscreen | WASTEconst.weDoUseTempMem | + WASTEconst.weDoAutoScroll | WASTEconst.weDoOutlineHilite) + if self.readonly: + flags = flags | WASTEconst.weDoReadOnly + else: + flags = flags | WASTEconst.weDoUndo + return flags + + def textchanged(self, all=0): + self.changed = 1 + if all: + self._dirty = (0, None) + return + oldsel = self.oldselection + sel = self.getselection() + if not sel: + # XXX what to do? + return + selstart, selend = sel + selstart, selend = min(selstart, selend), max(selstart, selend) + if oldsel: + oldselstart, oldselend = min(oldsel), max(oldsel) + selstart, selend = min(selstart, oldselstart), max(selend, oldselend) + startline = self.offsettoline(selstart) + endline = self.offsettoline(selend) + selstart, _ = self.ted.WEGetLineRange(startline) + _, selend = self.ted.WEGetLineRange(endline) + if selstart > 0: + selstart = selstart - 1 + self._dirty = (selstart, selend) + + def idle(self): + self.SetPort() + self.ted.WEIdle() + if not self.do_fontify: + return + start, end = self._dirty + if start is None: + return + textLength = self.ted.WEGetTextLength() + if end is None: + end = textLength + if start >= end: + self._dirty = (None, None) + else: + self.fontify(start, end) + self._dirty = (None, None) + + def alldirty(self, *args): + self._dirty = (0, None) + + def fontify(self, start=0, end=None): + #W.SetCursor('watch') + if self.readonly: + self.ted.WEFeatureFlag(WASTEconst.weFReadOnly, 0) + self.ted.WEFeatureFlag(WASTEconst.weFOutlineHilite, 0) + self.ted.WEDeactivate() + self.ted.WEFeatureFlag(WASTEconst.weFAutoScroll, 0) + self.ted.WEFeatureFlag(WASTEconst.weFUndo, 0) + pytext = self.get().replace("\r", "\n") + if end is None: + end = len(pytext) + else: + end = min(end, len(pytext)) + selstart, selend = self.ted.WEGetSelection() + self.ted.WESetSelection(start, end) + self.ted.WESetStyle(WASTEconst.weDoFace | WASTEconst.weDoColor, + (0, 0, 12, (0, 0, 0))) + + tags = PyFontify.fontify(pytext, start, end) + styles = { + 'string': (WASTEconst.weDoColor, (0, 0, 0, kStringColor)), + 'keyword': (WASTEconst.weDoFace, (0, 1, 0, (0, 0, 0))), + 'comment': (WASTEconst.weDoFace | WASTEconst.weDoColor, (0, 0, 0, kCommentColor)), + 'identifier': (WASTEconst.weDoColor, (0, 0, 0, (0xbfff, 0, 0))) + } + setselection = self.ted.WESetSelection + setstyle = self.ted.WESetStyle + for tag, start, end, sublist in tags: + setselection(start, end) + mode, style = styles[tag] + setstyle(mode, style) + self.ted.WESetSelection(selstart, selend) + self.SetPort() + self.ted.WEFeatureFlag(WASTEconst.weFAutoScroll, 1) + self.ted.WEFeatureFlag(WASTEconst.weFUndo, 1) + self.ted.WEActivate() + self.ted.WEFeatureFlag(WASTEconst.weFOutlineHilite, 1) + if self.readonly: + self.ted.WEFeatureFlag(WASTEconst.weFReadOnly, 1) def domenu_shiftleft(self): self.expandselection() @@ -786,8 +888,8 @@ class PyEditor(TextEditor): else: self.ted.WEKey(ord(char), modifiers) if char not in Wkeys.navigationkeys: - self.changed = 1 - self.selchanged = 1 + self.textchanged() + self.selectionchanged() self.updatescrollbars() def balanceparens(self, char): |