colouriser is almost working...

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/branches/WX_2_2_BRANCH@7741 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Robin Dunn
2000-07-14 05:16:40 +00:00
parent 2e07b29dd9
commit c18da485ed

View File

@@ -17,8 +17,8 @@ inside a wxStyledTextCtrl, similar to the Python shell windows found in
IDLE and PythonWin. IDLE and PythonWin.
There is still much to be done to improve this class, such as line There is still much to be done to improve this class, such as line
buffering/recall, colourizing the python code, autoindent, etc. but it's buffering/recall, autoindent, calltips, autocomplete, etc... But
a good start. it's a good start.
""" """
@@ -32,6 +32,12 @@ from code import InteractiveInterpreter
#---------------------------------------------------------------------- #----------------------------------------------------------------------
# default styles, etc. to use for the STC # default styles, etc. to use for the STC
if wxPlatform == '__WXMSW__':
_defaultSize = 8
else:
_defaultSize = 10
_default_properties = { _default_properties = {
'selMargin' : 0, 'selMargin' : 0,
'marginWidth' : 1, 'marginWidth' : 1,
@@ -40,12 +46,26 @@ _default_properties = {
'stderr' : 'fore:#007f00', 'stderr' : 'fore:#007f00',
'trace' : 'fore:#FF0000', 'trace' : 'fore:#FF0000',
# TODO: Add properties for the various Python lexer styles 'default' : 'size:%d' % _defaultSize,
'bracegood' : 'fore:#FFFFFF,back:#0000FF,bold',
'bracebad' : 'fore:#000000,back:#FF0000,bold',
# properties for the various Python lexer styles
'comment' : 'fore:#007F00',
'number' : 'fore:#007F7F',
'string' : 'fore:#7F007F,italic',
'char' : 'fore:#7F007F,italic',
'keyword' : 'fore:#00007F,bold',
'triple' : 'fore:#7F0000',
'tripledouble': 'fore:#7F0000',
'class' : 'fore:#0000FF,bold,underline',
'def' : 'fore:#007F7F,bold',
'operator' : 'bold',
} }
# style numbers # new style numbers
_stdout_style = 15 _stdout_style = 15
_stderr_style = 16 _stderr_style = 16
_trace_style = 17 _trace_style = 17
@@ -60,6 +80,8 @@ class PyShellWindow(wxStyledTextCtrl, InteractiveInterpreter):
wxStyledTextCtrl.__init__(self, parent, ID, pos, size, style) wxStyledTextCtrl.__init__(self, parent, ID, pos, size, style)
InteractiveInterpreter.__init__(self, locals) InteractiveInterpreter.__init__(self, locals)
self.lastPromptPos = 0
# the line cache is used to cycle through previous commands # the line cache is used to cycle through previous commands
self.lines = [] self.lines = []
self.lastUsedLine = self.curLine = 0 self.lastUsedLine = self.curLine = 0
@@ -84,7 +106,8 @@ class PyShellWindow(wxStyledTextCtrl, InteractiveInterpreter):
# Event handlers # Event handlers
EVT_KEY_DOWN(self, self.OnKey) EVT_KEY_DOWN(self, self.OnKey)
EVT_STC_UPDATEUI(self, ID, self.OnUpdateUI)
EVT_STC_STYLENEEDED(self, ID, self.OnStyle)
def GetLocals(self): return self.locals def GetLocals(self): return self.locals
@@ -103,22 +126,39 @@ class PyShellWindow(wxStyledTextCtrl, InteractiveInterpreter):
""" """
p = self.props p = self.props
#self.SetLexer(wxSTC_LEX_PYTHON) self.SetEdgeMode(wxSTC_EDGE_LINE)
#self.SetKeywords(0, string.join(keyword.kwlist)) self.SetEdgeColumn(80)
# set the selection margin and window margin # set the selection margin and window margin
self.SetMarginWidth(1, p['selMargin']) self.SetMarginWidth(1, p['selMargin'])
self.SetMargins(p['marginWidth'], p['marginWidth']) self.SetMargins(p['marginWidth'], p['marginWidth'])
# styles # styles
self.StyleSetSpec(wxSTC_STYLE_DEFAULT, p['default'])
self.StyleClearAll()
self.StyleSetSpec(_stdout_style, p['stdout']) self.StyleSetSpec(_stdout_style, p['stdout'])
self.StyleSetSpec(_stderr_style, p['stderr']) self.StyleSetSpec(_stderr_style, p['stderr'])
self.StyleSetSpec(_trace_style, p['trace']) self.StyleSetSpec(_trace_style, p['trace'])
self.StyleSetSpec(wxSTC_STYLE_BRACELIGHT, p['bracegood'])
self.StyleSetSpec(wxSTC_STYLE_BRACEBAD, p['bracebad'])
self.StyleSetSpec(SCE_P_COMMENTLINE, p['comment'])
self.StyleSetSpec(SCE_P_NUMBER, p['number'])
self.StyleSetSpec(SCE_P_STRING, p['string'])
self.StyleSetSpec(SCE_P_CHARACTER, p['char'])
self.StyleSetSpec(SCE_P_WORD, p['keyword'])
self.StyleSetSpec(SCE_P_TRIPLE, p['triple'])
self.StyleSetSpec(SCE_P_TRIPLEDOUBLE, p['tripledouble'])
self.StyleSetSpec(SCE_P_CLASSNAME, p['class'])
self.StyleSetSpec(SCE_P_DEFNAME, p['def'])
self.StyleSetSpec(SCE_P_OPERATOR, p['operator'])
self.StyleSetSpec(SCE_P_COMMENTBLOCK, p['comment'])
# used for writing to stdout, etc. # used for writing to stdout, etc.
def _write(self, text, style=_stdout_style): def _write(self, text, style=_stdout_style):
self.lastPromptPos = 0
pos = self.GetCurrentPos() pos = self.GetCurrentPos()
self.AddText(text) self.AddText(text)
self.StartStyling(pos, 0xFF) self.StartStyling(pos, 0xFF)
@@ -188,6 +228,50 @@ class PyShellWindow(wxStyledTextCtrl, InteractiveInterpreter):
evt.Skip() evt.Skip()
def OnStyle(self, evt):
# Only style from the prompt pos to the end
lastPos = self.GetTextLength()
if self.lastPromptPos and self.lastPromptPos != lastPos:
self.SetLexer(wxSTC_LEX_PYTHON)
self.SetKeywords(0, string.join(keyword.kwlist))
self.Colourise(self.lastPromptPos, lastPos)
self.SetLexer(0)
def OnUpdateUI(self, evt):
# check for matching braces
braceAtCaret = -1
braceOpposite = -1
charBefore = None
caretPos = self.GetCurrentPos()
if caretPos > 0:
charBefore = self.GetCharAt(caretPos - 1)
styleBefore = self.GetStyleAt(caretPos - 1)
# check before
if charBefore and charBefore in "[]{}()" and ord(styleBefore) == SCE_P_OPERATOR:
braceAtCaret = caretPos - 1
# check after
if braceAtCaret < 0:
charAfter = self.GetCharAt(caretPos)
styleAfter = self.GetStyleAt(caretPos)
if charAfter and charAfter in "[]{}()" and ord(styleAfter) == SCE_P_OPERATOR:
braceAtCaret = caretPos
if braceAtCaret >= 0:
braceOpposite = self.BraceMatch(braceAtCaret)
if braceAtCaret != -1 and braceOpposite == -1:
self.BraceBadlight(braceAtCaret)
else:
self.BraceHighlight(braceAtCaret, braceOpposite)
#----------------------------------------------
# overloaded methods from InteractiveInterpreter # overloaded methods from InteractiveInterpreter
def runsource(self, source): def runsource(self, source):
stdout, stderr = sys.stdout, sys.stderr stdout, stderr = sys.stdout, sys.stderr