# (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, pos=wxDefaultPosition, size=wxDefaultSize, style=0): wxEditor.__init__(self, parent, id, pos, size, style) 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 =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