# Created by Leo from: C:\Python23\Tom\leo\clipboard.leo # <> from wx.stc import * import wx import sys,string,time,os if wx.Platform == '__WXMSW__': face1 = 'Arial' face2 = 'Times New Roman' face3 = 'Courier New' pb = 10 else: face1 = 'Helvetica' face2 = 'Times' face3 = 'Courier' pb = 10 if wx.Platform == '__WXMSW__': faces = { 'times': 'Times New Roman','mono' : 'Courier New','helv' : 'Arial','other': 'Comic Sans MS','size' : 10,'size2': 8,} # -- end -- <> # << STCTest methods >> (1 of 7) class XMLImage: # << class XMLImage methods >> (1 of 2) def __init__(self, title='', width=400, height=300, link='', url=''): self.title = title self.width = width self.height = height self.link = link self.url = url # << class XMLImage methods >> (2 of 2) def ToXML(self): returnstring = """ """ + self.title + """ """ + str(self.width) + """ """ + str(self.height) + """ """ + self.link + """ """ + self.url + """ """ return returnstring # -- end -- << class XMLImage methods >> # << STCTest methods >> (2 of 7) class XMLItem: # << class XMLItem methods >> (1 of 5) def __init__(self, title='', guid='', pubDate=time.strftime('%a, %d %b %Y %H:%M:%S %Z',time.localtime()), link='', description=''): self.linelist = [] self.title = title self.guid = guid self.pubDate = pubDate self.link = link self.description = description # << class XMLItem methods >> (2 of 5) def ToXML(self): returnstring = """ """ + self.title + """ """ + self.link + """ """ + self.guid + """ """ + str(self.pubDate) + """ """ + self.description + """ """ return returnstring # << class XMLItem methods >> (3 of 5) def AddLine(self,line): self.linelist.append(str(line)) self.description = '' for i in self.linelist: self.description = self.description + str(i) + ' ' # << class XMLItem methods >> (4 of 5) def DeleteLine(self, linenum): del self.linelist[linenum] self.description = '' for i in self.linelist: self.description = self.description + str(i) + ' ' # << class XMLItem methods >> (5 of 5) def ChangeLine(self, line, linenum): self.linelist[linenum] = line self.description = '' for i in self.linelist: self.description = self.description + str(i) + ' ' # -- end -- << class XMLItem methods >> # << STCTest methods >> (3 of 7) class XMLRSS: # << class XMLRSS methods >> (1 of 2) def __init__(self, title='',link='', description='',language='en-us',lastBuildDate = time.strftime('%a, %d %b %Y %H:%M:%S %Z',time.localtime()),ttl = 5,XMLIm=XMLImage(),XMLItemlist=[]): self.title = title self.link = link self.description = description self.language = language self.lastBuildDate = lastBuildDate self.ttl = ttl self.XMLImage = XMLIm self.XMLItemlist = XMLItemlist # << class XMLRSS methods >> (2 of 2) def ToXML(self): returnstring = """ """+self.title+""" """+self.link+""" """+self.description+""" """+self.language+""" """+str(self.lastBuildDate)+""" """+str(self.ttl)+""" """ + self.XMLImage.ToXML() for i in self.XMLItemlist: returnstring = returnstring + i.ToXML() returnstring = returnstring + """ """ return returnstring # -- end -- << class XMLRSS methods >> # << STCTest methods >> (4 of 7) class HTMLSTC(StyledTextCtrl): # << class PythonSTC methods >> (1 of 7) def __init__(self, parent, ID): StyledTextCtrl.__init__(self, parent, ID, style = wx.NO_FULL_REPAINT_ON_RESIZE) self.CmdKeyAssign(ord('B'), STC_SCMOD_CTRL, STC_CMD_ZOOMIN) self.CmdKeyAssign(ord('N'), STC_SCMOD_CTRL, STC_CMD_ZOOMOUT) self.SetLexer(STC_LEX_HTML) self.SetMarginWidth(1,0) self.SetMarginWidth(2,0) self.SetMarginWidth(3,0) self.parent = parent #self.SetKeyWords(0, string.join(keyword.kwlist)) #self.SetProperty("fold", "1") #self.SetProperty("tab.timmy.whinge.level", "1") #self.SetMargins(0,0) #self.SetViewWhiteSpace(False) #self.SetBufferedDraw(False) #self.SetEdgeMode(STC_EDGE_BACKGROUND) #self.SetEdgeColumn(78) # Setup a margin to hold fold markers #self.SetFoldFlags(16) ### WHAT IS THIS VALUE? WHAT ARE THE OTHER FLAGS? DOES IT MATTER? #self.SetMarginType(2, STC_MARGIN_SYMBOL) #self.SetMarginMask(2, STC_MASK_FOLDERS) #self.SetMarginSensitive(2, True) #self.SetMarginWidth(2, 12) #if 0: # simple folder marks, like the old version #self.MarkerDefine(STC_MARKNUM_FOLDER, STC_MARK_ARROW, "navy", "navy") #self.MarkerDefine(STC_MARKNUM_FOLDEROPEN, STC_MARK_ARROWDOWN, "navy", "navy") # Set these to an invisible mark #self.MarkerDefine(STC_MARKNUM_FOLDEROPENMID, STC_MARK_BACKGROUND, "white", "black") #self.MarkerDefine(STC_MARKNUM_FOLDERMIDTAIL, STC_MARK_BACKGROUND, "white", "black") #self.MarkerDefine(STC_MARKNUM_FOLDERSUB, STC_MARK_BACKGROUND, "white", "black") #self.MarkerDefine(STC_MARKNUM_FOLDERTAIL, STC_MARK_BACKGROUND, "white", "black") #else: # more involved "outlining" folder marks #self.MarkerDefine(STC_MARKNUM_FOLDEREND, STC_MARK_BOXPLUSCONNECTED, "white", "black") #self.MarkerDefine(STC_MARKNUM_FOLDEROPENMID, STC_MARK_BOXMINUSCONNECTED, "white", "black") #self.MarkerDefine(STC_MARKNUM_FOLDERMIDTAIL, STC_MARK_TCORNER, "white", "black") #self.MarkerDefine(STC_MARKNUM_FOLDERTAIL, STC_MARK_LCORNER, "white", "black") #self.MarkerDefine(STC_MARKNUM_FOLDERSUB, STC_MARK_VLINE, "white", "black") #self.MarkerDefine(STC_MARKNUM_FOLDER, STC_MARK_BOXPLUS, "white", "black") #self.MarkerDefine(STC_MARKNUM_FOLDEROPEN, STC_MARK_BOXMINUS, "white", "black") EVT_STC_UPDATEUI(self, ID, self.OnUpdateUI) #EVT_STC_MARGINCLICK(self, ID, self.OnMarginClick) # Make some styles, The lexer defines what each style is used for, we # just have to define what each style looks like. This set is adapted from # Scintilla sample property files. self.StyleClearAll() # Global default styles for all languages self.StyleSetSpec(STC_STYLE_DEFAULT, "face:%(helv)s,size:%(size)d" % faces) self.StyleSetSpec(STC_STYLE_LINENUMBER, "back:#C0C0C0,face:%(helv)s,size:%(size2)d" % faces) self.StyleSetSpec(STC_STYLE_CONTROLCHAR, "face:%(other)s" % faces) self.StyleSetSpec(STC_STYLE_BRACELIGHT, "fore:#C0C0C0,back:#FFFFFF,bold") self.StyleSetSpec(STC_STYLE_BRACEBAD, "fore:#000000,back:#FF0000,bold") # Python styles # White space self.StyleSetSpec(STC_H_DEFAULT, "fore:#0000FF,face:%(helv)s,size:%(size)d" % faces) self.StyleSetSpec(STC_H_TAGUNKNOWN, "fore:#C0C0C0,face:%(helv)s,size:%(size)d" % faces) self.StyleSetSpec(STC_H_ATTRIBUTE, "fore:#C0C0C0,face:%(helv)s,size:%(size)d" % faces) self.StyleSetSpec(STC_H_ATTRIBUTEUNKNOWN, "fore:#C0C0C0,face:%(helv)s,size:%(size)d" % faces) self.StyleSetSpec(STC_H_OTHER, "fore:#C0C0C0,face:%(helv)s,size:%(size)d" % faces) self.StyleSetSpec(STC_H_COMMENT, "fore:#C0C0C0,face:%(helv)s,size:%(size)d" % faces) self.StyleSetSpec(STC_H_ENTITY, "fore:#C0C0C0,face:%(helv)s,size:%(size)d" % faces) # Comment self.StyleSetSpec(STC_H_COMMENT, "fore:#C0C0C0,face:%(other)s,size:%(size)d" % faces) # Number self.StyleSetSpec(STC_H_NUMBER, "fore:#C0C0C0,size:%(size)d" % faces) # String self.StyleSetSpec(STC_H_SINGLESTRING, "fore:#C0C0C0,italic,face:%(times)s,size:%(size)d" % faces) self.StyleSetSpec(STC_H_DOUBLESTRING, "fore:#C0C0C0,italic,face:%(times)s,size:%(size)d" % faces) # Single quoted string #self.StyleSetSpec(STC_P_CHARACTER, "fore:#7F007F,italic,face:%(times)s,size:%(size)d" % faces) # Keyword #self.StyleSetSpec(STC_P_WORD, "fore:#00007F,bold,size:%(size)d" % faces) # Triple quotes self.StyleSetSpec(STC_H_ENTITY, "fore:#C0C0C0,size:%(size)d" % faces) # Triple double quotes #self.StyleSetSpec(STC_P_TRIPLEDOUBLE, "fore:#7F0000,size:%(size)d" % faces) # Class name definition self.StyleSetSpec(STC_H_TAG, "fore:#C0C0C0,bold,size:%(size)d" % faces) # Function or method name definition #self.StyleSetSpec(STC_P_DEFNAME, "fore:#007F7F,bold,size:%(size)d" % faces) # Operators #self.StyleSetSpec(STC_P_OPERATOR, "bold,size:%(size)d" % faces) # Identifiers #self.StyleSetSpec(STC_P_IDENTIFIER, "fore:#808080,face:%(helv)s,size:%(size)d" % faces) # Comment-blocks #self.StyleSetSpec(STC_P_COMMENTBLOCK, "fore:#7F7F7F,size:%(size)d" % faces) # End of line where string is not closed #self.StyleSetSpec(STC_P_STRINGEOL, "fore:#000000,face:%(mono)s,back:#E0C0E0,eol,size:%(size)d" % faces) self.SetCaretForeground("BLUE") self.SetWrapMode(1) wx.EVT_KEY_DOWN(self, self.OnKeyPressed) # << class PythonSTC methods >> (2 of 7) def OnKeyPressed(self, event): if self.CallTipActive(): self.CallTipCancel() key = event.KeyCode() if key == 32 and event.ControlDown(): pos = self.GetCurrentPos() # Tips if event.ShiftDown(): self.CallTipSetBackground("yellow") self.CallTipShow(pos, 'param1, param2') # Code completion else: #lst = [] #for x in range(50000): # lst.append('%05d' % x) #st = string.join(lst) #print len(st) #self.AutoCompShow(0, st) kw = keyword.kwlist[:] #kw.append("zzzzzz") #kw.append("aaaaa") kw.append("__init__") #kw.append("zzaaaaa") #kw.append("zzbaaaa") #kw.append("this_is_a_longer_value") #kw.append("this_is_a_much_much_much_much_much_much_much_longer_value") kw.sort() # Python sorts are case sensitive self.AutoCompSetIgnoreCase(False) # so this needs to match self.AutoCompShow(0, string.join(kw)) else: event.Skip() # << class PythonSTC methods >> (3 of 7) 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 chr(charBefore) in "<>" and styleBefore == STC_H_TAG: braceAtCaret = caretPos - 1 # check after if braceAtCaret < 0: charAfter = self.GetCharAt(caretPos) styleAfter = self.GetStyleAt(caretPos) if charAfter and chr(charAfter) in "<>" and styleAfter == STC_H_TAG: braceAtCaret = caretPos if braceAtCaret >= 0: braceOpposite = self.BraceMatch(braceAtCaret) if braceAtCaret != -1 and braceOpposite == -1: self.BraceBadLight(braceAtCaret) else: self.BraceHighlight(braceAtCaret, braceOpposite) #pt = self.PointFromPosition(braceOpposite) #self.Refresh(True, wx.Rect(pt.x, pt.y, 5,5)) #print pt #self.Refresh(False) # << class PythonSTC methods >> (4 of 7) def OnMarginClick(self, evt): # fold and unfold as needed if evt.GetMargin() == 2: if evt.GetShift() and evt.GetControl(): self.FoldAll() else: lineClicked = self.LineFromPosition(evt.GetPosition()) if self.GetFoldLevel(lineClicked) & STC_FOLDLEVELHEADERFLAG: if evt.GetShift(): self.SetFoldExpanded(lineClicked, True) self.Expand(lineClicked, True, True, 1) elif evt.GetControl(): if self.GetFoldExpanded(lineClicked): self.SetFoldExpanded(lineClicked, False) self.Expand(lineClicked, False, True, 0) else: self.SetFoldExpanded(lineClicked, True) self.Expand(lineClicked, True, True, 100) else: self.ToggleFold(lineClicked) # << class PythonSTC methods >> (5 of 7) def FoldAll(self): lineCount = self.GetLineCount() expanding = True # find out if we are folding or unfolding for lineNum in range(lineCount): if self.GetFoldLevel(lineNum) & STC_FOLDLEVELHEADERFLAG: expanding = not self.GetFoldExpanded(lineNum) break; lineNum = 0 while lineNum < lineCount: level = self.GetFoldLevel(lineNum) if level & STC_FOLDLEVELHEADERFLAG and \ (level & STC_FOLDLEVELNUMBERMASK) == STC_FOLDLEVELBASE: if expanding: self.SetFoldExpanded(lineNum, True) lineNum = self.Expand(lineNum, True) lineNum = lineNum - 1 else: lastChild = self.GetLastChild(lineNum, -1) self.SetFoldExpanded(lineNum, False) if lastChild > lineNum: self.HideLines(lineNum+1, lastChild) lineNum = lineNum + 1 # << class PythonSTC methods >> (6 of 7) def Expand(self, line, doExpand, force=False, visLevels=0, level=-1): lastChild = self.GetLastChild(line, level) line = line + 1 while line <= lastChild: if force: if visLevels > 0: self.ShowLines(line, line) else: self.HideLines(line, line) else: if doExpand: self.ShowLines(line, line) if level == -1: level = self.GetFoldLevel(line) if level & STC_FOLDLEVELHEADERFLAG: if force: if visLevels > 1: self.SetFoldExpanded(line, True) else: self.SetFoldExpanded(line, False) line = self.Expand(line, doExpand, force, visLevels-1) else: if doExpand and self.GetFoldExpanded(line): line = self.Expand(line, True, force, visLevels-1) else: line = self.Expand(line, False, force, visLevels-1) else: line = line + 1; return line # << class PythonSTC methods >> (7 of 7) def SetValue(self, text): self.SetText(text) # -- end -- << class PythonSTC methods >> # << STCTest methods >> (5 of 7) class LogEditor(StyledTextCtrl): # << class LogEditor methods >> (1 of 14) def __init__(self, parent, ID,rootparent): StyledTextCtrl.__init__(self, parent, ID) self.RSS = XMLRSS() self.RSS.title = "Rockin' B News" self.RSS.link = 'http://users.commspeed.net/tbabbitt/' self.RSS.description = "News from the Rockn' B" self.RSS.XMLImage.title = "RBRanch" self.RSS.XMLImage.url = '/rb_image/rbicon.jpg' self.parent = rootparent self.entrys = {} self.linezerroflag = 0 self.indentnum = [0,0] self.backspaceflag = 0 self.insertlinemiddleflag = 0 self.pastingflag = 0 self.line = 0 self.txtl = '' EVT_STC_DO_DROP(self, ID, self.OnDoDrop) EVT_STC_DRAG_OVER(self, ID, self.OnDragOver) EVT_STC_START_DRAG(self, ID, self.OnStartDrag) EVT_STC_MODIFIED(self, ID, self.OnModified) EVT_STC_UPDATEUI(self, ID, self.UpdateUI) wx.EVT_WINDOW_DESTROY(self, self.OnDestroy) self.CmdKeyAssign(ord('B'), STC_SCMOD_CTRL, STC_CMD_ZOOMIN) self.CmdKeyAssign(ord('N'), STC_SCMOD_CTRL, STC_CMD_ZOOMOUT) self.SetMarginType(0, STC_MARGIN_SYMBOL) self.SetMarginWidth(0,16) self.SetMarginMask(0, 7936) # 000-000-000-000 to 111-111-111-111 bin 1-111-100-000-000 self.SetMarginType(1, STC_MARGIN_SYMBOL) self.SetMarginWidth(1,16) self.SetMarginMask(1, 8447) #8432)# bin 10-000-011-110-000 new 100000-11-111-111 self.SetMarginType(2, STC_MARGIN_SYMBOL) self.SetMarginWidth(2,16) self.SetMarginMask(2, STC_MASK_FOLDERS ) self.SetMarginSensitive(0, 1) self.SetMarginSensitive(1, 1) self.SetMarginSensitive(2, 1) self.SetLexer(STC_LEX_PYTHON) self.StyleClearAll() self.SetProperty("fold", "1") #self.SetProperty("tab.timmy.whinge.level", "1") EXPANDED_LINE_ABOVE = 2 EXPANDED_LINE_BELOW = 8 COLLAPSED_LINE_ABOVE = 4 COLLAPSED_LINE_BELOW = 16 LINE_DEBUGGING = 64 self.SetFoldFlags(COLLAPSED_LINE_BELOW) foldIconsFG = '#0000FF' foldIconsBG = '#FFFFFF' # Top Level Folders... self.MarkerDefine(STC_MARKNUM_FOLDER, STC_MARK_CIRCLEPLUS, foldIconsBG , foldIconsFG) # Collapsed self.MarkerDefine(STC_MARKNUM_FOLDEROPEN, STC_MARK_CIRCLEMINUS, foldIconsBG, foldIconsFG) # Expanded self.MarkerDefine(STC_MARKNUM_FOLDERTAIL, STC_MARK_LCORNERCURVE, foldIconsBG, foldIconsFG) # End of Top Level Folder # Nested Folders.... self.MarkerDefine(STC_MARKNUM_FOLDEREND, STC_MARK_CIRCLEPLUSCONNECTED, foldIconsBG, foldIconsFG) # Collapsed self.MarkerDefine(STC_MARKNUM_FOLDEROPENMID, STC_MARK_CIRCLEMINUSCONNECTED, foldIconsBG, foldIconsFG) # Expanded self.MarkerDefine(STC_MARKNUM_FOLDERMIDTAIL, STC_MARK_TCORNERCURVE, foldIconsBG, foldIconsFG) # End of Nested Folder # Inside of Folder Marker self.MarkerDefine(STC_MARKNUM_FOLDERSUB, STC_MARK_VLINE, foldIconsBG, foldIconsFG) EVT_STC_MARGINCLICK(self, ID, self.OnMarginClick) fore = "#A4ABCC" back = "#D0A7C9" new_color = "#D537D0" self.MarkerDefine(0, STC_MARK_ROUNDRECT, fore,new_color) self.MarkerDefine(1, STC_MARK_CIRCLE, fore,new_color) self.MarkerDefine(2, STC_MARK_SHORTARROW, fore,new_color) self.MarkerDefine(3, STC_MARK_ARROW, fore,new_color) self.MarkerDefine(4, STC_MARK_SMALLRECT, fore,new_color) self.MarkerDefine(5, STC_MARK_EMPTY, fore,new_color) self.MarkerDefine(6, STC_MARK_ARROWDOWN,fore,new_color) self.MarkerDefine(8, STC_MARK_MINUS,fore,new_color) self.MarkerDefine(7, STC_MARK_PLUS, new_color,fore) self.MarkerDefine(9, STC_MARK_ARROWS, back,fore) self.MarkerDefine(10, STC_MARK_DOTDOTDOT, back,fore) self.MarkerDefine(11, STC_MARK_BACKGROUND, fore, back) self.MarkerDefine(13, STC_MARK_CIRCLE, back, fore) self.MarkerDefine(12, STC_MARK_CIRCLE, fore, back) self.MarkerDefine(14, STC_MARK_CIRCLE, fore, back) #self.MarkerDefine(STC_MARKNUM_FOLDEREND, STC_MARK_BOXPLUSCONNECTED, "white", "black") #self.MarkerDefine(STC_MARKNUM_FOLDEROPENMID, STC_MARK_BOXMINUSCONNECTED, "white", "black") #self.MarkerDefine(STC_MARKNUM_FOLDERMIDTAIL, STC_MARK_TCORNER, "white", "black") #self.MarkerDefine(STC_MARKNUM_FOLDERTAIL, STC_MARK_LCORNER, "white", "black") #self.MarkerDefine(STC_MARKNUM_FOLDERSUB, STC_MARK_VLINE, "white", "black") #self.MarkerDefine(STC_MARKNUM_FOLDER, STC_MARK_BOXPLUS, "white", "black") #self.MarkerDefine(STC_MARKNUM_FOLDEROPEN, STC_MARK_BOXMINUS, "white", "black") self.SetWrapMode(1) # << class LogEditor methods >> (2 of 14) def OnDestroy(self, evt): #self.parent.deactivate() # This is how the clipboard contents can be preserved after # the app has exited. wx.TheClipboard.Flush() evt.Skip() # << class LogEditor methods >> (3 of 14) def UpdateUI(self, evt): line = self.LineFromPosition(self.GetCurrentPos()) #print 'self.GetCurrentPos ',self.GetCurrentPos() #print self.line,' self.line ',line,' line' if self.line != line: self.line = line #pass if self.linezerroflag: self.SetLineIndentation(0, 0) self.linezerroflag = 0 if self.indentnum[0]: if self.indentnum[1] < self.GetLineCount(): self.SetLineIndentation(self.indentnum[1], 8) self.indentnum = [0,0] if not(self.insertlinemiddleflag): self.GotoPos(self.GetCurrentPos() + 8) else: self.GotoPos(self.GetCurrentPos() + 1) self.insertlinemiddleflag = 0 # << class LogEditor methods >> (4 of 14) def OnStartDrag(self, evt): if evt.GetPosition() < 250: evt.SetDragAllowMove(False) # you can prevent moving of text (only copy) evt.SetDragText("DRAGGED TEXT") # you can change what is dragged #evt.SetDragText("") # or prevent the drag with empty text # << class LogEditor methods >> (5 of 14) def OnDragOver(self, evt): if evt.GetPosition() < 250: evt.SetDragResult(wx.DragNone) # prevent dropping at the begining of the buffer # << class LogEditor methods >> (6 of 14) def OnDoDrop(self, evt): if evt.GetPosition() < 500: evt.SetDragText("DROPPED TEXT") # Can change text if needed ##evt.SetDragResult(wx.DragNone) # Can also change the drag operation, but it # is probably better to do it in OnDragOver so # there is visual feedback ##evt.SetPosition(25) # Can also change position, but I'm not sure why # you would want to... # << class LogEditor methods >> (7 of 14) def OnModified(self, evt): lines_added = evt.GetLinesAdded() line = self.LineFromPosition(evt.GetPosition()) self.line = line new_key = [] tmp_text = '' temp_num = 0 ##print 'Line is ',line if STC_MOD_INSERTTEXT & evt.GetModificationType():#&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& Insert Tesxt ##print 'insert text ', if len(evt.GetText()) > 1: if evt.GetText() == '\r\n': if self.GetLineIndentation(line) != 0: self.indentnum = [1, line + 1] # if in middle move lines forward else pass if line < self.GetLineCount() - 2 and self.GetLineIndentation(line) != 0: self.insertlinemiddleflag = 1 if self.entrys.has_key(self.GetFoldParent(line)): self.entrys[self.GetFoldParent(line)].AddLine('') for j in range(len(self.entrys[self.GetFoldParent(line)].linelist) - 1,line - self.GetFoldParent(line),-1): #print 'sublist range ', j self.entrys[self.GetFoldParent(line)].ChangeLine(self.entrys[self.GetFoldParent(line)].linelist[j-1],j) self.MoveLines(line ,1) line = line + 1 self.RefreshCode() #elif line < self.GetLineCount() - 2: #self.MoveLines(line ,1) #line = line + 1 #self.RefreshCode() ##print ' a speaceal case, return pressed' ##print line,' line '#, self.GetColumn(evt.GetPosition()), ' column ',evt.GetPosition(),' position' else: # feed the text into feed me line < self.GetLineCount() - 2: new_key = string.split(evt.GetText(),'\r\n') #print new_key, " the key" #for i in range(len(new_key)): # if len(new_key[i]): # if new_key[i][0] == '\t': # self.SetLineIndentation(line + i + 1, 8) temp_num = 0 for i in new_key: self.pastingflag = 1 for j in i: self.FeedMe(evt , line + temp_num,j) #print repr(j),line,line + temp_num #### self.MoveLines(line + temp_num,1) wx.SafeYield() temp_num = temp_num + 1 new_key = [] temp_num = 0 self.pastingflag = 0 else: self.FeedMe(evt , line ,evt.GetText()) elif STC_MOD_DELETETEXT & evt.GetModificationType():# ****************************************** Delete Text #print 'delete text ', evt.GetText() , ' at line', line if len(evt.GetText()) > 1: if evt.GetText() == '\r\n': if self.entrys.has_key(line + 1): del self.entrys[line + 1] self.MoveLinesIn(line ,-1) self.RefreshCode() elif self.entrys.has_key(self.GetFoldParent(line)): #print 'deleteing before tab' self.entrys[self.GetFoldParent(line)].DeleteLine(line - self.GetFoldParent(line) -1) else: for i in range(line -1 - lines_added,line-1, -1): if self.entrys.has_key(i + 1): del self.entrys[i + 1] #print 'deleteing',i + 1 self.MoveLinesIn(i ,-1) self.RefreshCode() elif self.entrys.has_key(self.GetFoldParent(i)): self.entrys[self.GetFoldParent(i)].DeleteLine(i - self.GetFoldParent(i) -1) else: #1 if self.GetFoldParent(line) == -1: #print 'lone line ',line, if self.entrys.has_key(line): #print ' I have a key, I was ', self.entrys[line].headding,' I am ',self.GetLine(line) self.entrys[line].title = self.GetLine(line) self.RefreshCode() else:#2 pass #print ' new line' elif self.GetFoldLevel(line) & STC_FOLDLEVELNUMBERMASK == 1024: #print ' main level', line, if self.entrys.has_key(line): #print ' I am a key, at ',line,' I am ',self.GetLine(line) self.entrys[line].title = self.GetLine(line) self.RefreshCode() else: # before sub #print 'sub level ', if self.entrys.has_key(self.GetFoldParent(line)): #print 'I have an key at line ',self.GetFoldParent(line), if evt.GetText() == '\t' and self.GetColumn(evt.GetPosition()) == 0: #print ' a speaceal case, tab deleted at beginning of line' self.backspaceflag = 1 new_key.append(self.entrys[self.GetFoldParent(line)]) temp_num = self.GetFoldParent(line) if self.MarkerGet(line) & 4096: self.entrys[line] = XMLItem(title=self.GetLine(line)) self.entrys[line].linenumber = line else: self.entrys[line] = XMLItem(title=self.GetLine(line)) self.entrys[line].linenumber = line for j in range(line - temp_num ,len(new_key[0].linelist)): #print 'sublist range ', j self.entrys[line].AddLine(new_key[0].linelist[j]) for j in range(len(new_key[0].linelist)-1, line - temp_num - 2, -1): #print 'delete list range ',line - temp_num - 2,'to', len(new_key[0].linelist)-1,j new_key[0].DeleteLine(j) self.RefreshCode() new_key = [] elif int(line - self.GetFoldParent(line) - 1) in range(len(self.entrys[self.GetFoldParent(line)].linelist)): #print 'I am line Number ', line - self.GetFoldParent(line) -1,'I am ',self.GetLine(line)[1:] self.entrys[self.GetFoldParent(line)].ChangeLine(self.GetLine(line)[1:],line - self.GetFoldParent(line) -1) self.RefreshCode() else: # end pass #print ' new sub line' # << class LogEditor methods >> (8 of 14) def OnMarginClick(self, evt): line = self.LineFromPosition(evt.GetPosition()) Iconflag = 5 if evt.GetMargin() == 0: if self.MarkerGet(line) & 4096: self.MarkerDelete(line, 12) if self.GetFoldParent(line) == -1 or (self.GetFoldLevel(line) & STC_FOLDLEVELHEADERFLAG): try: self.entrys[line].guid = '' except KeyError: pass #print "key error" self.RefreshCode() else: self.MarkerAdd(line, 12) if self.GetFoldParent(line) == -1 and line < len(self.entrys): dlg = wx.TextEntryDialog(self, 'What is GuID URL?','GuID Setup', '') try: dlg.SetValue(self.entrys[line].guid) except: dlg.SetValue('http://') if dlg.ShowModal() == wx.ID_OK: try: self.entrys[line].guid = dlg.GetValue() except KeyError: #pass print "key error" dlg.Destroy() self.RefreshCode() elif evt.GetMargin() == 1: if self.MarkerGet(line) & 2**7: Iconflag = 7 else: Iconflag = 5 #print Iconflag,' it should be ', self.MarkerGet(line) & 2**Iconflag self.MarkerDelete(line , Iconflag) if Iconflag == 7: Iconflag = 5 try: self.entrys[line].link = '' except KeyError: pass else: Iconflag = 7 dlg = wx.TextEntryDialog(self, 'What is link URL?','Link Setup', '') try: dlg.SetValue(self.entrys[line].link) except: dlg.SetValue('http://') if dlg.ShowModal() == wx.ID_OK: try: self.entrys[line].link = dlg.GetValue() except KeyError: #pass print "key error" dlg.Destroy() self.MarkerAdd(line, Iconflag) self.RefreshCode() elif evt.GetMargin() == 2: if evt.GetShift() and evt.GetControl(): self.FoldAll() else: lineClicked = self.LineFromPosition(evt.GetPosition()) if self.GetFoldLevel(lineClicked) & STC_FOLDLEVELHEADERFLAG: if evt.GetShift(): self.SetFoldExpanded(lineClicked, True) self.Expand(lineClicked, True, True, 1) elif evt.GetControl(): if self.GetFoldExpanded(lineClicked): self.SetFoldExpanded(lineClicked, False) self.Expand(lineClicked, False, True, 0) else: self.SetFoldExpanded(lineClicked, True) self.Expand(lineClicked, True, True, 100) else: self.ToggleFold(lineClicked) else: event.Skip() # << class LogEditor methods >> (9 of 14) def FeedMe(self, evt,line ,char): #print ' My fold parent ',self.GetFoldParent(line) #print 'Get Fold Level ',self.GetFoldLevel(line) & STC_FOLDLEVELNUMBERMASK #print 'Char ',char, char,self.GetColumn(evt.GetPosition()) #print 'self.entrys.has_key(line)',self.entrys.has_key(line) if self.pastingflag: columnpos = 0 else: columnpos = self.GetColumn(evt.GetPosition()) #print ' ***************************************** ',self.GetFoldLevel(line) & STC_FOLDLEVELNUMBERMASK,(self.GetFoldLevel(line)| 1032) & STC_FOLDLEVELNUMBERMASK if self.GetFoldParent(line) == -1: #print 'lone line ',line, if self.entrys.has_key(line): if char == '\t' and columnpos == 0: #print ' A tab at begining ', if line == 0: #print 'backup a space' self.linezerroflag = 1 else: #print ' a speaceal case, tab added to beginning of main line' if self.GetFoldParent(line - 1) == -1: try: self.entrys[line-1].AddLine(self.entrys[line].title) except: pass else: self.entrys[self.GetFoldParent(line - 1)].AddLine(self.entrys[line].title) for j in self.entrys[line].linelist: if self.GetFoldParent(line - 1) == -1: self.entrys[line - 1].AddLine(j) else: self.entrys[self.GetFoldParent(line - 1)].AddLine(j) del self.entrys[line] if self.MarkerGet(line) & 4096: self.MarkerDelete(line, 12) self.RefreshCode() else: #print ' I have a key, I was ', self.entrys[line].headding,' I am ',self.GetLine(line) self.entrys[line].title = self.GetLine(line) self.RefreshCode() elif char != '\t': #print ' new line',repr(char) self.entrys[line] = XMLItem(title=self.GetLine(line)) self.entrys[line].linenumber = line else: #print ' count back to first line with key and add line 0' for i in range(line,0,-1): if self.entrys.has_key(i): self.entrys[i].AddLine('') #print ' added to line ', i if self.MarkerGet(line) & 4096: self.MarkerDelete(line, 12) break #SCI_SETFOLDLEVEL(int line, int level) self.SetFoldLevel(line,self.GetFoldLevel(line)| 1032) self.RefreshCode() elif self.GetFoldLevel(line) & STC_FOLDLEVELNUMBERMASK == 1024: #print ' main level', line, if self.entrys.has_key(line): if char == '\t' and columnpos == 0: if line == 0: #print 'backup a space' self.linezerroflag = 1 else: #print ' a speaceal case, tab added to beginning of main line' if self.GetFoldParent(line - 1) == -1: self.entrys[line-1].AddLine(self.entrys[line].title) else: self.entrys[self.GetFoldParent(line - 1)].AddLine(self.entrys[line].title) for j in self.entrys[line].linelist: if self.GetFoldParent(line - 1) == -1: self.entrys[line - 1].AddLine(j) else: self.entrys[self.GetFoldParent(line - 1)].AddLine(j) if self.MarkerGet(line) & 4096: self.MarkerDelete(line, 12) del self.entrys[line] self.RefreshCode() else: #print ' I am a key, at ',line,' I am ',self.GetLine(line) self.entrys[line].title = self.GetLine(line) self.RefreshCode() elif char != '\t': #print ' new line',repr(char) self.entrys[line] = XMLItem(title=self.GetLine(line)) self.entrys[line].linenumber = line self.RefreshCode() elif char == '\t': #print ' count back to first line with key and add line 1' if self.GetFoldParent(line - 1) == -1: self.entrys[line-1].AddLine(char) else: self.entrys[self.GetFoldParent(line - 1)].AddLine(char) if self.MarkerGet(line) & 4096: self.MarkerDelete(line, 12) self.RefreshCode() else: #print 'sub level ', if self.entrys.has_key(self.GetFoldParent(line)): #print 'I have an key at line ',self.GetFoldParent(line), if int(line - self.GetFoldParent(line) - 1) in range(len(self.entrys[self.GetFoldParent(line)].linelist)): #print 'I am line Number ', line - self.GetFoldParent(line) -1,'I am ',self.GetLine(line)[1:] self.entrys[self.GetFoldParent(line)].ChangeLine(self.GetLine(line)[1:],line - self.GetFoldParent(line) -1) elif not(self.backspaceflag): #print ' new sub line' #print ' My key is ',self.GetFoldParent(line),' the line is ', line #print 'done',self.GetFoldParent(line),line self.entrys[self.GetFoldParent(line)].AddLine(self.GetLine(line)[1:]) if self.MarkerGet(line) & 4096: self.MarkerDelete(line, 12) self.RefreshCode() else: self.backspaceflag = 0 #print 'backspace flag ', self.entrys[line] = XMLItem(title=self.GetLine(line)) self.entrys[line].linenumber = line #print 'new line at',line self.SetFoldLevel(line,STC_FOLDLEVELBASE) self.RefreshCode() else: #print ' count back to first line with key and add line 2' if self.GetFoldParent(line - 1) == -1: self.entrys[line-1].AddLine(char) else: self.entrys[self.GetFoldParent(line - 1)].AddLine(char) if self.MarkerGet(line) & 4096: self.MarkerDelete(line, 12) self.RefreshCode() self.RefreshCode() # << class LogEditor methods >> (10 of 14) def MoveLines(self, line ,lines_added): new_key = [] for i in range(self.GetLineCount(),line - lines_added + 1, -1): if self.entrys.has_key(i): #print ' moving key ', i new_key.append(self.entrys[i]) del self.entrys[i] self.entrys[i + lines_added] = new_key[0] new_key = [] self.RefreshCode() # << class LogEditor methods >> (11 of 14) def MoveLinesIn(self, line ,lines_added): new_key = [] for i in range(line + 2, self.GetLineCount()): if self.entrys.has_key(i): #print ' moving key ', i new_key.append(self.entrys[i]) if i + lines_added < line +1: del self.entrys[i] self.RefreshCode() else: self.entrys[i + lines_added]= self.entrys[i] del self.entrys[i] self.RefreshCode() # << class LogEditor methods >> (12 of 14) def RefreshCode(self): self.RSS.XMLItemlist = self.entrys.values() self.parent.CodeWindow.SetValue(self.RSS.ToXML()) # << class LogEditor methods >> (13 of 14) def FoldAll(self): lineCount = self.GetLineCount() expanding = True # find out if we are folding or unfolding for lineNum in range(lineCount): if self.GetFoldLevel(lineNum) & STC_FOLDLEVELHEADERFLAG: expanding = not self.GetFoldExpanded(lineNum) break; lineNum = 0 while lineNum < lineCount: level = self.GetFoldLevel(lineNum) if level & STC_FOLDLEVELHEADERFLAG and \ (level & STC_FOLDLEVELNUMBERMASK) == STC_FOLDLEVELBASE: if expanding: self.SetFoldExpanded(lineNum, True) lineNum = self.Expand(lineNum, True) lineNum = lineNum - 1 else: lastChild = self.GetLastChild(lineNum, -1) self.SetFoldExpanded(lineNum, False) if lastChild > lineNum: self.HideLines(lineNum+1, lastChild) lineNum = lineNum + 1 # << class LogEditor methods >> (14 of 14) def Expand(self, line, doExpand, force=False, visLevels=0, level=-1): lastChild = self.GetLastChild(line, level) line = line + 1 while line <= lastChild: if force: if visLevels > 0: self.ShowLines(line, line) else: self.HideLines(line, line) else: if doExpand: self.ShowLines(line, line) if level == -1: level = self.GetFoldLevel(line) if level & STC_FOLDLEVELHEADERFLAG: if force: if visLevels > 1: self.SetFoldExpanded(line, True) else: self.SetFoldExpanded(line, False) line = self.Expand(line, doExpand, force, visLevels-1) else: if doExpand and self.GetFoldExpanded(line): line = self.Expand(line, True, force, visLevels-1) else: line = self.Expand(line, False, force, visLevels-1) else: line = line + 1; return line # -- end -- << class LogEditor methods >> # << STCTest methods >> (6 of 7) class MyFrame(wx.Frame): # << class MyFrame methods >> (1 of 2) def __init__(self, parent, id, title): wx.Frame.__init__(self, parent, -1, title, size = (500, 500),style = wx.DEFAULT_FRAME_STYLE | wx.NO_FULL_REPAINT_ON_RESIZE ) self.SetAutoLayout(True) inSizer = wx.BoxSizer(wx.HORIZONTAL) buttonsizer = wx.BoxSizer(wx.VERTICAL) id = wx.NewId() self.slider = wx.SplitterWindow(self, id, style = wx.SP_3D) self.CodeWindow = HTMLSTC(self.slider, id) self.MainLog = LogEditor(self.slider, id,self) self.slider.SetMinimumPaneSize(20) self.slider.SplitVertically(self.MainLog, self.CodeWindow, -100) wx.EVT_WINDOW_DESTROY(self, self.OnDestroy) inSizer.Add(self.slider, 1, wx.GROW) #buttonsizer.Add(self.CodeWindow, 1, wx.GROW) #inSizer.Add(buttonsizer, 1, wx.GROW) self.SetSizer(inSizer) self.Show(1) # << class MyFrame methods >> (2 of 2) def OnDestroy(self,evt): evt.Skip() # -- end -- << class MyFrame methods >> # << STCTest methods >> (7 of 7) class LogApp(wx.App): # << class App methods >> def OnInit(self): frame = MyFrame(None, -1, "Captain's Log") self.SetTopWindow(frame) return True # -- end -- << class App methods >> # -- end -- << STCTest methods >> app = LogApp(0) # Create an instance of the application class app.MainLoop() # Tell it to start processing event