summaryrefslogtreecommitdiffstats
path: root/Mac/Tools/IDE/Wtext.py
diff options
context:
space:
mode:
Diffstat (limited to 'Mac/Tools/IDE/Wtext.py')
-rw-r--r--Mac/Tools/IDE/Wtext.py172
1 files changed, 137 insertions, 35 deletions
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):