2 # 11/21/2003 - Jeff Grimmett (grimmtooth@softhome.net) 
   4 # o EVT_STC_DRAG_OVER event GetdragResult() is not an int 
   5 # o wx.TheClipboard.Flush() generates a warning on program exit. 
  13 #---------------------------------------------------------------------- 
  20 This editor is provided by a class named wx.StyledTextCtrl.  As 
  21 the name suggests, you can define styles that can be applied to 
  22 sections of text.  This will typically be used for things like 
  23 syntax highlighting code editors, but I'm sure that there are other 
  24 applications as well.  A style is a combination of font, point size, 
  25 foreground and background colours.  The editor can handle 
  26 proportional fonts just as easily as monospaced fonts, and various 
  27 styles can use different sized fonts. 
  29 There are a few canned language lexers and colourizers included, 
  30 (see the next demo) or you can handle the colourization yourself. 
  31 If you do you can simply register an event handler and the editor 
  32 will let you know when the visible portion of the text needs 
  35 wx.StyledTextEditor also supports setting markers in the margin... 
  40 ...and indicators within the text.  You can use these for whatever 
  41 you want in your application.  Cut, Copy, Paste, Drag and Drop of 
  42 text works, as well as virtually unlimited Undo and Redo 
  43 capabilities, (right click to try it out.) 
  46 if wx
.Platform 
== '__WXMSW__': 
  48     face2 
= 'Times New Roman' 
  58 #---------------------------------------------------------------------- 
  59 # This shows how to catch the Modified event from the wx.StyledTextCtrl 
  61 class MySTC(stc
.StyledTextCtrl
): 
  62     def __init__(self
, parent
, ID
, log
): 
  63         stc
.StyledTextCtrl
.__init
__(self
, parent
, ID
) 
  66         self
.Bind(stc
.EVT_STC_DO_DROP
, self
.OnDoDrop
) 
  67         self
.Bind(stc
.EVT_STC_DRAG_OVER
, self
.OnDragOver
) 
  68         self
.Bind(stc
.EVT_STC_START_DRAG
, self
.OnStartDrag
) 
  69         self
.Bind(stc
.EVT_STC_MODIFIED
, self
.OnModified
) 
  71         self
.Bind(wx
.EVT_WINDOW_DESTROY
, self
.OnDestroy
) 
  73     def OnDestroy(self
, evt
): 
  74         # This is how the clipboard contents can be preserved after 
  76         wx
.TheClipboard
.Flush() 
  80     def OnStartDrag(self
, evt
): 
  81         self
.log
.write("OnStartDrag: %d, %s\n" 
  82                        % (evt
.GetDragAllowMove(), evt
.GetDragText())) 
  84         if debug 
and evt
.GetPosition() < 250: 
  85             evt
.SetDragAllowMove(False)     # you can prevent moving of text (only copy) 
  86             evt
.SetDragText("DRAGGED TEXT") # you can change what is dragged 
  87             #evt.SetDragText("")             # or prevent the drag with empty text 
  90     def OnDragOver(self
, evt
): 
  91         #Todo: evt.GetdragResult() response is not an int 
  94             "OnDragOver: x,y=(%d, %d)  pos: %d  DragResult: %d\n" 
  95             % (evt
.GetX(), evt
.GetY(), evt
.GetPosition(), evt
.GetDragResult()) 
  98         if debug 
and evt
.GetPosition() < 250: 
  99             evt
.SetDragResult(wx
.DragNone
)   # prevent dropping at the beginning of the buffer 
 102     def OnDoDrop(self
, evt
): 
 103         self
.log
.write("OnDoDrop: x,y=(%d, %d)  pos: %d  DragResult: %d\n" 
 105                        % (evt
.GetX(), evt
.GetY(), evt
.GetPosition(), evt
.GetDragResult(), 
 108         if debug 
and evt
.GetPosition() < 500: 
 109             evt
.SetDragText("DROPPED TEXT")  # Can change text if needed 
 110             #evt.SetDragResult(wx.DragNone)  # Can also change the drag operation, but it 
 111                                              # is probably better to do it in OnDragOver so 
 112                                              # there is visual feedback 
 114             #evt.SetPosition(25)             # Can also change position, but I'm not sure why 
 115                                              # you would want to... 
 120     def OnModified(self
, evt
): 
 121         self
.log
.write("""OnModified 
 126         Text:         %s\n""" % ( self
.transModType(evt
.GetModificationType()), 
 130                                   repr(evt
.GetText()) )) 
 133     def transModType(self
, modType
): 
 135         table 
= [(stc
.STC_MOD_INSERTTEXT
, "InsertText"), 
 136                  (stc
.STC_MOD_DELETETEXT
, "DeleteText"), 
 137                  (stc
.STC_MOD_CHANGESTYLE
, "ChangeStyle"), 
 138                  (stc
.STC_MOD_CHANGEFOLD
, "ChangeFold"), 
 139                  (stc
.STC_PERFORMED_USER
, "UserFlag"), 
 140                  (stc
.STC_PERFORMED_UNDO
, "Undo"), 
 141                  (stc
.STC_PERFORMED_REDO
, "Redo"), 
 142                  (stc
.STC_LASTSTEPINUNDOREDO
, "Last-Undo/Redo"), 
 143                  (stc
.STC_MOD_CHANGEMARKER
, "ChangeMarker"), 
 144                  (stc
.STC_MOD_BEFOREINSERT
, "B4-Insert"), 
 145                  (stc
.STC_MOD_BEFOREDELETE
, "B4-Delete") 
 148         for flag
,text 
in table
: 
 160 #---------------------------------------------------------------------- 
 164 def runTest(frame
, nb
, log
): 
 166         ed 
= p 
= MySTC(nb
, -1, log
) 
 169         p 
= wx
.Panel(nb
, -1, style
=wx
.NO_FULL_REPAINT_ON_RESIZE
) 
 170         ed 
= MySTC(p
, -1, log
) 
 171         s 
= wx
.BoxSizer(wx
.HORIZONTAL
) 
 172         s
.Add(ed
, 1, wx
.EXPAND
) 
 174         p
.SetAutoLayout(True) 
 177     #ed.SetBufferedDraw(False) 
 179     #ed.SetScrollWidth(800) 
 180     #ed.SetWrapMode(True) 
 186         decode 
= codecs
.lookup("utf-8")[1] 
 188         ed
.GotoPos(ed
.GetLength()) 
 189         ed
.AddText("\n\nwx.StyledTextCtrl can also do Unicode:\n") 
 190         unitext
, l 
= decode('\xd0\x9f\xd0\xb8\xd1\x82\xd0\xbe\xd0\xbd - ' 
 191                             '\xd0\xbb\xd1\x83\xd1\x87\xd1\x88\xd0\xb8\xd0\xb9 ' 
 192                             '\xd1\x8f\xd0\xb7\xd1\x8b\xd0\xba \xd0\xbf\xd1\x80\xd0\xbe\xd0\xb3\xd1\x80\xd0\xb0\xd0\xbc\xd0\xbc\xd0\xb8\xd1\x80\xd0\xbe\xd0\xb2\xd0\xb0\xd0\xbd\xd0\xb8\xd1\x8f!\n\n') 
 193         ed
.AddText('\tRussian: ') 
 200     ed
.StyleSetSpec(stc
.STC_STYLE_DEFAULT
, "size:%d,face:%s" % (pb
, face3
)) 
 201     ed
.StyleSetSpec(1, "size:%d,bold,face:%s,fore:#0000FF" % (pb
+2, face1
)) 
 202     ed
.StyleSetSpec(2, "face:%s,italic,fore:#FF0000,size:%d" % (face2
, pb
)) 
 203     ed
.StyleSetSpec(3, "face:%s,bold,size:%d" % (face2
, pb
+2)) 
 204     ed
.StyleSetSpec(4, "face:%s,size:%d" % (face1
, pb
-1)) 
 206     # Now set some text to those styles...  Normally this would be 
 207     # done in an event handler that happens when text needs displayed. 
 208     ed
.StartStyling(98, 0xff) 
 209     ed
.SetStyling(6, 1)  # set style for 6 characters using style 1 
 211     ed
.StartStyling(190, 0xff) 
 214     ed
.StartStyling(310, 0xff) 
 220     # line numbers in the margin 
 221     ed
.SetMarginType(0, stc
.STC_MARGIN_NUMBER
) 
 222     ed
.SetMarginWidth(0, 22) 
 223     ed
.StyleSetSpec(stc
.STC_STYLE_LINENUMBER
, "size:%d,face:%s" % (pb
, face1
)) 
 226     ed
.SetMarginType(1, stc
.STC_MARGIN_SYMBOL
) 
 227     ed
.MarkerDefine(0, stc
.STC_MARK_ROUNDRECT
, "#CCFF00", "RED") 
 228     #ed.MarkerDefine(1, stc.STC_MARK_CIRCLE, "FOREST GREEN", "SIENNA") 
 229     ed
.MarkerDefineBitmap(1, images
.getFolder1Bitmap()) 
 230     ed
.MarkerDefine(2, stc
.STC_MARK_SHORTARROW
, "blue", "blue") 
 231     ed
.MarkerDefine(3, stc
.STC_MARK_ARROW
, "#00FF00", "#00FF00") 
 233     # put some markers on some lines 
 241     # and finally, an indicator or two 
 242     ed
.IndicatorSetStyle(0, stc
.STC_INDIC_SQUIGGLE
) 
 243     ed
.IndicatorSetForeground(0, wx
.RED
) 
 244     ed
.IndicatorSetStyle(1, stc
.STC_INDIC_DIAGONAL
) 
 245     ed
.IndicatorSetForeground(1, wx
.BLUE
) 
 246     ed
.IndicatorSetStyle(2, stc
.STC_INDIC_STRIKE
) 
 247     ed
.IndicatorSetForeground(2, wx
.RED
) 
 249     ed
.StartStyling(836, stc
.STC_INDICS_MASK
) 
 250     ed
.SetStyling(10, stc
.STC_INDIC0_MASK
) 
 251     ed
.SetStyling(10, stc
.STC_INDIC1_MASK
) 
 252     ed
.SetStyling(10, stc
.STC_INDIC2_MASK | stc
.STC_INDIC1_MASK
) 
 257         print "GetTextLength(): ", ed
.GetTextLength(), len(ed
.GetText()) 
 258         print "GetText(): ", repr(ed
.GetText()) 
 260         print "GetStyledText(98, 104): ", repr(ed
.GetStyledText(98, 104)), len(ed
.GetStyledText(98, 104)) 
 262         print "GetCurLine(): ", repr(ed
.GetCurLine()) 
 264         print "GetCurLine(): ", repr(ed
.GetCurLine()) 
 266         print "GetLine(1): ", repr(ed
.GetLine(1)) 
 268         ed
.SetSelection(25, 35) 
 269         print "GetSelectedText(): ", repr(ed
.GetSelectedText()) 
 270         print "GetTextRange(25, 35): ", repr(ed
.GetTextRange(25, 35)) 
 271         print "FindText(0, max, 'indicators'): ", 
 272         print ed
.FindText(0, ed
.GetTextLength(), "indicators") 
 281 #---------------------------------------------------------------------- 
 286 Once again, no docs yet.  <b>Sorry.</b>  But <a href="data/stc.h.html">this</a> 
 287 and <a href="http://www.scintilla.org/ScintillaDoc.html">this</a> should 
 293 if __name__ 
== '__main__': 
 296     run
.main(['', os
.path
.basename(sys
.argv
[0])])