Some tweaks and fixes Some distrib updates git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@5161 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
211 lines
6.7 KiB
Python
211 lines
6.7 KiB
Python
# (C)opyright by Dirk Holtwick, 1999
|
|
# ----------------------------------
|
|
# holtwick@spirito.de
|
|
# http://www.spirito.de/pyde
|
|
|
|
from editor import *
|
|
from string import *
|
|
from keyword import *
|
|
from tokenizer import *
|
|
|
|
"""
|
|
This module will be loaded by the main
|
|
window. It implements some methods that
|
|
are typical for Python sources.
|
|
"""
|
|
|
|
class wxPyEditor(wxEditor):
|
|
|
|
# ------------------------------------------------------------------
|
|
|
|
def __init__(self, parent, id=-1):
|
|
wxEditor.__init__(self, parent, id)
|
|
self.SetFontTab([
|
|
wxNamedColour('black'),
|
|
wxNamedColour('blue'),
|
|
wxNamedColour('red'),
|
|
wxNamedColour('darkgreen'),
|
|
wxNamedColour('brown')
|
|
])
|
|
|
|
# ------------------------------------------------------------------
|
|
|
|
def OnUpdateHighlight(self, line = -1):
|
|
if line>=0:
|
|
t = self.text[line].text
|
|
syn = []
|
|
|
|
toks = Tokenizer(t).tokens()
|
|
for type, string, begin, end in toks:
|
|
if type == "KEY":
|
|
syn.append((begin, 1))
|
|
syn.append((end, 0))
|
|
elif type == "COMMENT":
|
|
syn.append((begin, 2))
|
|
elif type == "STRING":
|
|
syn.append((begin, 3))
|
|
syn.append((end, 0))
|
|
elif type == "NUMBER":
|
|
syn.append((begin, 4))
|
|
syn.append((end, 0))
|
|
elif type == "NAME":
|
|
if string=="self":
|
|
syn.append((begin, 4))
|
|
syn.append((end, 0))
|
|
else:
|
|
pass
|
|
self.text[line].syntax = syn
|
|
|
|
# ------------------------------------------------------------------
|
|
|
|
def OnUpdateSyntax(self, line = -1):
|
|
if line>=0:
|
|
"""
|
|
tx, syn, m = self.text[line]
|
|
pre = 0
|
|
for i in range(0,len(tx)):
|
|
if tx[i] != " ":
|
|
pre = i
|
|
break
|
|
t = tx[pre:]
|
|
|
|
t = Tokenizer(t).line()
|
|
|
|
t = tx[:pre] + t
|
|
self.text[line] = t, syn, m
|
|
"""
|
|
self.OnUpdateHighlight(line)
|
|
|
|
# ------------------------------------------------------------------
|
|
|
|
def OnTabulator(self, event):
|
|
add = +1
|
|
if event.ShiftDown():
|
|
add = -1
|
|
t = self.GetTextLine(self.cy)
|
|
if strip(t):
|
|
indent = self.GetIndent(t)
|
|
# print indent
|
|
t = t[indent:]
|
|
tabs = indent / self.tabsize
|
|
# for i in range(0,tabs+add):
|
|
t = (" " * 4 * (tabs+add)) + t
|
|
self.SetTextLine(self.cy, t)
|
|
elif add>0:
|
|
self.InsertText(" ")
|
|
|
|
# ------------------------------------------------------------------
|
|
|
|
def FindQuote(self, lineno, quote_type='"""', direction=1):
|
|
"""find line containing the matching quote"""
|
|
l =lineno +direction
|
|
while (l < len(self.text)-1) and (l >= 0):
|
|
if find(self.text[l].text, quote_type) >=0: return l
|
|
l =l +direction
|
|
return None
|
|
|
|
def FindNextLine(self, lineno, direction=1):
|
|
"""get the next line of code (skipping comment lines and empty lines)"""
|
|
l =lineno +direction
|
|
while (l < len(self.text)-1) and (l >= 0):
|
|
str =lstrip(self.text[l].text)
|
|
if (len(str) >0) and (str[0] !="#"): return l
|
|
l =l +direction
|
|
return None
|
|
|
|
def Fold(self):
|
|
l = self.GetLine(self.cy)
|
|
line = self.text[l]
|
|
t = line.text
|
|
|
|
# fold ...
|
|
if line.editable:
|
|
|
|
# 3*quotes
|
|
qpos =find(t, '"""')
|
|
if qpos >=0: qtype ='"""'
|
|
else:
|
|
qpos =find(t, "'''")
|
|
if qpos >=0: qtype ="'''"
|
|
|
|
if (qpos >=0) and (find(t[qpos+3:], qtype) <0):
|
|
closing_quote =self.FindQuote(l, qtype)
|
|
if closing_quote !=None:
|
|
line.editable = not line.editable
|
|
l =l +1
|
|
while l <= closing_quote:
|
|
self.text[l].visible =self.text[l].visible +1
|
|
l =l +1
|
|
|
|
else: # try normal fold on leading whitespace
|
|
lim = self.GetIndent(t)
|
|
lnext =self.FindNextLine(l)
|
|
if (lnext !=None) \
|
|
and (self.GetIndent(self.text[lnext].text) >lim):
|
|
line.editable =FALSE
|
|
lstart =l +1
|
|
l =self.FindNextLine(l)
|
|
while (l !=None) \
|
|
and (self.GetIndent(self.text[l].text) >lim):
|
|
l =self.FindNextLine(l)
|
|
if l ==None:
|
|
# fold till the end
|
|
l =len(self.text)
|
|
for line in self.text[lstart:l]:
|
|
line.visible =line.visible +1
|
|
|
|
# ... or unfold
|
|
else:
|
|
lim = line.visible + 1
|
|
line.editable = not line.editable
|
|
|
|
l = l + 1
|
|
line = self.text[l]
|
|
while (l < (len(self.text) -1)) and (line.visible>=lim):
|
|
line.visible = line.visible - 1
|
|
l = l + 1
|
|
line = self.text[l]
|
|
|
|
def FoldAll(self):
|
|
self.CalcLines()
|
|
self.cx = 0
|
|
self.cy = len(self.lines) - 1
|
|
prev_indent =0
|
|
# following loop is exited in two cases:
|
|
# when self.cy becomes 0 (topmost level is not folded by FoldAll)
|
|
# or when FindNextLine() returns None (all remaining lines till
|
|
# the beginning of the text are empty or comments)
|
|
while self.cy:
|
|
t = self.GetTextLine(self.cy)
|
|
# indent-based folding
|
|
indent =self.GetIndent(t)
|
|
if indent <prev_indent:
|
|
self.Fold()
|
|
prev_indent =indent
|
|
# triple-quote folding
|
|
qpos =find(t, '"""')
|
|
if qpos >=0: qtype ='"""'
|
|
else:
|
|
qpos =find(t, "'''")
|
|
if qpos >=0: qtype ="'''"
|
|
if (qpos >=0) and (find(t[qpos+3:], qtype) <0):
|
|
closing_quote =self.FindQuote(self.cy, qtype, -1)
|
|
if closing_quote !=None:
|
|
# XXX potential bug: unmatched triple quotes
|
|
self.cy =closing_quote
|
|
self.Fold()
|
|
self.cy =self.FindNextLine(self.cy, -1)
|
|
if self.cy ==None: self.cy =0
|
|
|
|
# ------------------------------------------------------------------
|
|
|
|
def OnFold(self):
|
|
self.Fold()
|
|
|
|
# ------------------------------------------------------------------
|
|
|
|
def OnInit(self):
|
|
#self.FoldAll()
|
|
pass
|
|
|