Added wxEditor from Dirc Holtwic
Some tweaks and fixes Some distrib updates git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@5161 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
210
utils/wxPython/lib/editor/py_editor.py
Normal file
210
utils/wxPython/lib/editor/py_editor.py
Normal file
@@ -0,0 +1,210 @@
|
||||
# (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
|
||||
|
Reference in New Issue
Block a user