Commit 12d71392 authored by Just van Rossum's avatar Just van Rossum

some support for syntax coloring, disabled for now

parent 311533d1
...@@ -96,7 +96,7 @@ class Editor(W.Window): ...@@ -96,7 +96,7 @@ class Editor(W.Window):
W.Window.__init__(self, bounds, self.title, minsize = (330, 120), tabbable = 0) W.Window.__init__(self, bounds, self.title, minsize = (330, 120), tabbable = 0)
self.setupwidgets(text) self.setupwidgets(text)
if change > 0: if change > 0:
self.editgroup.editor.changed = 1 self.editgroup.editor.textchanged()
if self.settings.has_key("selection"): if self.settings.has_key("selection"):
selstart, selend = self.settings["selection"] selstart, selend = self.settings["selection"]
...@@ -247,12 +247,12 @@ class Editor(W.Window): ...@@ -247,12 +247,12 @@ class Editor(W.Window):
def domenu_toggle_run_as_main(self): def domenu_toggle_run_as_main(self):
self.run_as_main = not self.run_as_main self.run_as_main = not self.run_as_main
self.run_with_interpreter = 0 self.run_with_interpreter = 0
self.editgroup.editor.selchanged = 1 self.editgroup.editor.selectionchanged()
def domenu_toggle_run_with_interpreter(self): def domenu_toggle_run_with_interpreter(self):
self.run_with_interpreter = not self.run_with_interpreter self.run_with_interpreter = not self.run_with_interpreter
self.run_as_main = 0 self.run_as_main = 0
self.editgroup.editor.selchanged = 1 self.editgroup.editor.selectionchanged()
def showbreakpoints(self, onoff): def showbreakpoints(self, onoff):
self.editgroup.editor.showbreakpoints(onoff) self.editgroup.editor.showbreakpoints(onoff)
...@@ -314,7 +314,7 @@ class Editor(W.Window): ...@@ -314,7 +314,7 @@ class Editor(W.Window):
def domenu_options(self, *args): def domenu_options(self, *args):
rv = SaveOptions(self._creator) rv = SaveOptions(self._creator)
if rv: if rv:
self.editgroup.editor.selchanged = 1 # ouch... self.editgroup.editor.selectionchanged() # ouch...
self._creator = rv self._creator = rv
def clicklinefield(self): def clicklinefield(self):
...@@ -633,6 +633,8 @@ class Editor(W.Window): ...@@ -633,6 +633,8 @@ class Editor(W.Window):
dir, dirname = os.path.split(dir) dir, dirname = os.path.split(dir)
modname = dirname + '.' + modname modname = dirname + '.' + modname
subname = _filename_as_modname(self.title) subname = _filename_as_modname(self.title)
if subname is None:
return self.globals, file, None
if modname: if modname:
if subname == "__init__": if subname == "__init__":
# strip trailing period # strip trailing period
...@@ -949,8 +951,8 @@ class SearchEngine: ...@@ -949,8 +951,8 @@ class SearchEngine:
self.hide() self.hide()
import EasyDialogs import EasyDialogs
from Carbon import Res from Carbon import Res
editor.changed = 1 editor.textchanged()
editor.selchanged = 1 editor.selectionchanged()
editor.ted.WEUseText(Res.Resource(Text)) editor.ted.WEUseText(Res.Resource(Text))
editor.ted.WECalText() editor.ted.WECalText()
editor.SetPort() editor.SetPort()
...@@ -1147,6 +1149,9 @@ def execstring(pytext, globals, locals, filename="<string>", debugging=0, ...@@ -1147,6 +1149,9 @@ def execstring(pytext, globals, locals, filename="<string>", debugging=0,
raise W.AlertError, detail raise W.AlertError, detail
except (KeyboardInterrupt, BdbQuit): except (KeyboardInterrupt, BdbQuit):
pass pass
except SystemExit, arg:
if arg.code:
sys.stderr.write("Script exited with status code: %s\n" % repr(arg.code))
except: except:
if haveThreading: if haveThreading:
import continuation import continuation
...@@ -1268,7 +1273,7 @@ def geteditorprefs(): ...@@ -1268,7 +1273,7 @@ def geteditorprefs():
tabsettings = prefs.pyedit.tabsettings tabsettings = prefs.pyedit.tabsettings
windowsize = prefs.pyedit.windowsize windowsize = prefs.pyedit.windowsize
except: 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) tabsettings = prefs.pyedit.tabsettings = (8, 1)
windowsize = prefs.pyedit.windowsize = (500, 250) windowsize = prefs.pyedit.windowsize = (500, 250)
sys.exc_traceback = None sys.exc_traceback = None
......
from Carbon import Qd from Carbon import Evt, Events, Fm, Fonts
from Carbon import TE from Carbon import Qd, Res, Scrap
from Carbon import Fm from Carbon import TE, TextEdit, Win
import waste import waste
import WASTEconst 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 Wbase
import Wkeys import Wkeys
import Wcontrols import Wcontrols
import PyFontify import PyFontify
from types import * import string
from Carbon import Fonts from types import TupleType, StringType
from Carbon import TextEdit
class TextBox(Wbase.Widget): class TextBox(Wbase.Widget):
...@@ -105,6 +96,7 @@ class EditText(Wbase.SelectableWidget, _ScrollWidget): ...@@ -105,6 +96,7 @@ class EditText(Wbase.SelectableWidget, _ScrollWidget):
self.temptext = text self.temptext = text
self.ted = None self.ted = None
self.selection = None self.selection = None
self.oldselection = None
self._callback = callback self._callback = callback
self.changed = 0 self.changed = 0
self.selchanged = 0 self.selchanged = 0
...@@ -155,6 +147,13 @@ class EditText(Wbase.SelectableWidget, _ScrollWidget): ...@@ -155,6 +147,13 @@ class EditText(Wbase.SelectableWidget, _ScrollWidget):
self.temptext = None self.temptext = None
Wbase.SelectableWidget.close(self) 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): def gettabsettings(self):
return self.tabsettings return self.tabsettings
...@@ -208,7 +207,7 @@ class EditText(Wbase.SelectableWidget, _ScrollWidget): ...@@ -208,7 +207,7 @@ class EditText(Wbase.SelectableWidget, _ScrollWidget):
viewrect = self.ted.WEGetViewRect() viewrect = self.ted.WEGetViewRect()
Qd.EraseRect(viewrect) Qd.EraseRect(viewrect)
self.ted.WEUpdate(self._parentwindow.wid.GetWindowPort().visRgn) self.ted.WEUpdate(self._parentwindow.wid.GetWindowPort().visRgn)
self.selchanged = 1 self.selectionchanged()
self.updatescrollbars() self.updatescrollbars()
def adjust(self, oldbounds): def adjust(self, oldbounds):
...@@ -235,7 +234,7 @@ class EditText(Wbase.SelectableWidget, _ScrollWidget): ...@@ -235,7 +234,7 @@ class EditText(Wbase.SelectableWidget, _ScrollWidget):
def selectall(self): def selectall(self):
self.ted.WESetSelection(0, self.ted.WEGetTextLength()) self.ted.WESetSelection(0, self.ted.WEGetTextLength())
self.selchanged = 1 self.selectionchanged()
self.updatescrollbars() self.updatescrollbars()
def selectline(self, lineno, charoffset = 0): def selectline(self, lineno, charoffset = 0):
...@@ -246,7 +245,7 @@ class EditText(Wbase.SelectableWidget, _ScrollWidget): ...@@ -246,7 +245,7 @@ class EditText(Wbase.SelectableWidget, _ScrollWidget):
# Let's fool Waste by initially selecting one char less: # Let's fool Waste by initially selecting one char less:
self.ted.WESetSelection(newselstart + charoffset, newselend-1) self.ted.WESetSelection(newselstart + charoffset, newselend-1)
self.ted.WESetSelection(newselstart + charoffset, newselend) self.ted.WESetSelection(newselstart + charoffset, newselend)
self.selchanged = 1 self.selectionchanged()
self.updatescrollbars() self.updatescrollbars()
def getselection(self): def getselection(self):
...@@ -256,7 +255,7 @@ class EditText(Wbase.SelectableWidget, _ScrollWidget): ...@@ -256,7 +255,7 @@ class EditText(Wbase.SelectableWidget, _ScrollWidget):
return self.selection return self.selection
def setselection(self, selstart, selend): def setselection(self, selstart, selend):
self.selchanged = 1 self.selectionchanged()
if self.ted: if self.ted:
self.ted.WESetSelection(selstart, selend) self.ted.WESetSelection(selstart, selend)
self.ted.WESelView() self.ted.WESelView()
...@@ -284,12 +283,12 @@ class EditText(Wbase.SelectableWidget, _ScrollWidget): ...@@ -284,12 +283,12 @@ class EditText(Wbase.SelectableWidget, _ScrollWidget):
if oldselstart <> newselstart or oldselend <> newselend: if oldselstart <> newselstart or oldselend <> newselend:
self.ted.WESetSelection(newselstart, newselend) self.ted.WESetSelection(newselstart, newselend)
self.updatescrollbars() self.updatescrollbars()
self.selchanged = 1 self.selectionchanged()
def insert(self, text): def insert(self, text):
self.ted.WEInsert(text, None, None) self.ted.WEInsert(text, None, None)
self.changed = 1 self.textchanged()
self.selchanged = 1 self.selectionchanged()
# text # text
def set(self, text): def set(self, text):
...@@ -306,8 +305,8 @@ class EditText(Wbase.SelectableWidget, _ScrollWidget): ...@@ -306,8 +305,8 @@ class EditText(Wbase.SelectableWidget, _ScrollWidget):
Qd.RectRgn(rgn, viewrect) Qd.RectRgn(rgn, viewrect)
Qd.EraseRect(viewrect) Qd.EraseRect(viewrect)
self.draw(rgn) self.draw(rgn)
#self.GetWindow().InvalWindowRect(self.ted.WEGetViewRect())
self.updatescrollbars() self.updatescrollbars()
self.textchanged(1)
def get(self): def get(self):
if not self._parent: if not self._parent:
...@@ -321,9 +320,9 @@ class EditText(Wbase.SelectableWidget, _ScrollWidget): ...@@ -321,9 +320,9 @@ class EditText(Wbase.SelectableWidget, _ScrollWidget):
if self._enabled and not modifiers & Events.cmdKey or char in Wkeys.arrowkeys: if self._enabled and not modifiers & Events.cmdKey or char in Wkeys.arrowkeys:
self.ted.WEKey(ord(char), modifiers) self.ted.WEKey(ord(char), modifiers)
if char not in Wkeys.navigationkeys: if char not in Wkeys.navigationkeys:
self.changed = 1 self.textchanged()
if char not in Wkeys.scrollkeys: if char not in Wkeys.scrollkeys:
self.selchanged = 1 self.selectionchanged()
self.updatescrollbars() self.updatescrollbars()
if self._callback: if self._callback:
Wbase.CallbackCall(self._callback, 0, char, modifiers) Wbase.CallbackCall(self._callback, 0, char, modifiers)
...@@ -332,7 +331,7 @@ class EditText(Wbase.SelectableWidget, _ScrollWidget): ...@@ -332,7 +331,7 @@ class EditText(Wbase.SelectableWidget, _ScrollWidget):
if not self._enabled: if not self._enabled:
return return
self.ted.WEClick(point, modifiers, Evt.TickCount()) self.ted.WEClick(point, modifiers, Evt.TickCount())
self.selchanged = 1 self.selectionchanged()
self.updatescrollbars() self.updatescrollbars()
return 1 return 1
...@@ -411,8 +410,8 @@ class EditText(Wbase.SelectableWidget, _ScrollWidget): ...@@ -411,8 +410,8 @@ class EditText(Wbase.SelectableWidget, _ScrollWidget):
self.ted.WECut() self.ted.WECut()
self.updatescrollbars() self.updatescrollbars()
self.selview() self.selview()
self.changed = 1 self.textchanged()
self.selchanged = 1 self.selectionchanged()
if self._callback: if self._callback:
Wbase.CallbackCall(self._callback, 0, "", None) Wbase.CallbackCall(self._callback, 0, "", None)
...@@ -422,8 +421,8 @@ class EditText(Wbase.SelectableWidget, _ScrollWidget): ...@@ -422,8 +421,8 @@ class EditText(Wbase.SelectableWidget, _ScrollWidget):
self.selview() self.selview()
self.ted.WEPaste() self.ted.WEPaste()
self.updatescrollbars() self.updatescrollbars()
self.changed = 1 self.textchanged()
self.selchanged = 1 self.selectionchanged()
if self._callback: if self._callback:
Wbase.CallbackCall(self._callback, 0, "", None) Wbase.CallbackCall(self._callback, 0, "", None)
...@@ -431,8 +430,8 @@ class EditText(Wbase.SelectableWidget, _ScrollWidget): ...@@ -431,8 +430,8 @@ class EditText(Wbase.SelectableWidget, _ScrollWidget):
self.ted.WEDelete() self.ted.WEDelete()
self.selview() self.selview()
self.updatescrollbars() self.updatescrollbars()
self.changed = 1 self.textchanged()
self.selchanged = 1 self.selectionchanged()
if self._callback: if self._callback:
Wbase.CallbackCall(self._callback, 0, "", None) Wbase.CallbackCall(self._callback, 0, "", None)
...@@ -442,8 +441,8 @@ class EditText(Wbase.SelectableWidget, _ScrollWidget): ...@@ -442,8 +441,8 @@ class EditText(Wbase.SelectableWidget, _ScrollWidget):
return return
self.ted.WEUndo() self.ted.WEUndo()
self.updatescrollbars() self.updatescrollbars()
self.changed = 1 self.textchanged()
self.selchanged = 1 self.selectionchanged()
if self._callback: if self._callback:
Wbase.CallbackCall(self._callback, 0, "", None) Wbase.CallbackCall(self._callback, 0, "", None)
...@@ -610,6 +609,8 @@ class TextEditor(EditText): ...@@ -610,6 +609,8 @@ class TextEditor(EditText):
import re import re
commentPat = re.compile("[ \t]*(#)") commentPat = re.compile("[ \t]*(#)")
indentPat = re.compile("[ \t]*") indentPat = re.compile("[ \t]*")
kStringColor = (0, 0x7fff, 0)
kCommentColor = (0, 0, 0xb000)
class PyEditor(TextEditor): class PyEditor(TextEditor):
...@@ -627,10 +628,111 @@ class PyEditor(TextEditor): ...@@ -627,10 +628,111 @@ class PyEditor(TextEditor):
self.bind("cmd]", self.domenu_shiftright) self.bind("cmd]", self.domenu_shiftright)
self.bind("cmdshift[", self.domenu_uncomment) self.bind("cmdshift[", self.domenu_uncomment)
self.bind("cmdshift]", self.domenu_comment) self.bind("cmdshift]", self.domenu_comment)
self.bind("cmdshiftd", self.alldirty)
self.file = file # only for debugger reference self.file = file # only for debugger reference
self._debugger = debugger self._debugger = debugger
if debugger: if debugger:
debugger.register_editor(self, self.file) 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): def domenu_shiftleft(self):
self.expandselection() self.expandselection()
...@@ -786,8 +888,8 @@ class PyEditor(TextEditor): ...@@ -786,8 +888,8 @@ class PyEditor(TextEditor):
else: else:
self.ted.WEKey(ord(char), modifiers) self.ted.WEKey(ord(char), modifiers)
if char not in Wkeys.navigationkeys: if char not in Wkeys.navigationkeys:
self.changed = 1 self.textchanged()
self.selchanged = 1 self.selectionchanged()
self.updatescrollbars() self.updatescrollbars()
def balanceparens(self, char): def balanceparens(self, char):
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment