]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
some support for syntax coloring, disabled for now
authorJust van Rossum <just@letterror.com>
Fri, 2 Nov 2001 19:24:41 +0000 (19:24 +0000)
committerJust van Rossum <just@letterror.com>
Fri, 2 Nov 2001 19:24:41 +0000 (19:24 +0000)
Mac/Tools/IDE/PyEdit.py
Mac/Tools/IDE/Wtext.py

index 7740dfec296190632fd02ddf2027266cb7717bb1..8d163ed14d380b66f8cf5a10008974ff7328d5fc 100644 (file)
@@ -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
index 68ba592ba31c16c272ccdc3333458d909c85e2c5..0d9203da3d28e8017097a7b7d2f617b270f2468b 100644 (file)
@@ -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):