1 # 11/21/2003 - Jeff Grimmett (grimmtooth@softhome.net)
3 # o Updated for wx namespace
5 # 11/21/2003 - Jeff Grimmett (grimmtooth@softhome.net)
7 # o EVT_STC_DRAG_OVER event GetdragResult() is not an int
8 # o wx.TheClipboard.Flush() generates an error on program exit.
16 #----------------------------------------------------------------------
23 This editor is provided by a class named wxStyledTextCtrl. As
24 the name suggests, you can define styles that can be applied to
25 sections of text. This will typically be used for things like
26 syntax highlighting code editors, but I'm sure that there are other
27 applications as well. A style is a combination of font, point size,
28 foreground and background colours. The editor can handle
29 proportional fonts just as easily as monospaced fonts, and various
30 styles can use different sized fonts.
32 There are a few canned language lexers and colourizers included,
33 (see the next demo) or you can handle the colourization yourself.
34 If you do you can simply register an event handler and the editor
35 will let you know when the visible portion of the text needs
38 wxStyledTextEditor also supports setting markers in the margin...
43 ...and indicators within the text. You can use these for whatever
44 you want in your application. Cut, Copy, Paste, Drag and Drop of
45 text works, as well as virtually unlimited Undo and Redo
46 capabilities, (right click to try it out.)
49 if wx
.Platform
== '__WXMSW__':
51 face2
= 'Times New Roman'
61 #----------------------------------------------------------------------
62 # This shows how to catch the Modified event from the wxStyledTextCtrl
64 class MySTC(stc
.StyledTextCtrl
):
65 def __init__(self
, parent
, ID
, log
):
66 stc
.StyledTextCtrl
.__init
__(self
, parent
, ID
)
69 self
.Bind(stc
.EVT_STC_DO_DROP
, self
.OnDoDrop
)
70 self
.Bind(stc
.EVT_STC_DRAG_OVER
, self
.OnDragOver
)
71 self
.Bind(stc
.EVT_STC_START_DRAG
, self
.OnStartDrag
)
72 self
.Bind(stc
.EVT_STC_MODIFIED
, self
.OnModified
)
74 self
.Bind(wx
.EVT_WINDOW_DESTROY
, self
.OnDestroy
)
76 def OnDestroy(self
, evt
):
77 # This is how the clipboard contents can be preserved after
79 wx
.TheClipboard
.Flush()
83 def OnStartDrag(self
, evt
):
84 self
.log
.write("OnStartDrag: %d, %s\n"
85 % (evt
.GetDragAllowMove(), evt
.GetDragText()))
87 if debug
and evt
.GetPosition() < 250:
88 evt
.SetDragAllowMove(False) # you can prevent moving of text (only copy)
89 evt
.SetDragText("DRAGGED TEXT") # you can change what is dragged
90 #evt.SetDragText("") # or prevent the drag with empty text
93 def OnDragOver(self
, evt
):
94 #Todo: evt.GetdragResult() response is not an int
97 "OnDragOver: x,y=(%d, %d) pos: %d DragResult: %d\n"
98 % (evt
.GetX(), evt
.GetY(), evt
.GetPosition(), evt
.GetDragResult())
101 if debug
and evt
.GetPosition() < 250:
102 evt
.SetDragResult(wx
.DragNone
) # prevent dropping at the beginning of the buffer
105 def OnDoDrop(self
, evt
):
106 self
.log
.write("OnDoDrop: x,y=(%d, %d) pos: %d DragResult: %d\n"
108 % (evt
.GetX(), evt
.GetY(), evt
.GetPosition(), evt
.GetDragResult(),
111 if debug
and evt
.GetPosition() < 500:
112 evt
.SetDragText("DROPPED TEXT") # Can change text if needed
113 #evt.SetDragResult(wx.DragNone) # Can also change the drag operation, but it
114 # is probably better to do it in OnDragOver so
115 # there is visual feedback
117 #evt.SetPosition(25) # Can also change position, but I'm not sure why
118 # you would want to...
123 def OnModified(self
, evt
):
124 self
.log
.write("""OnModified
129 Text: %s\n""" % ( self
.transModType(evt
.GetModificationType()),
133 repr(evt
.GetText()) ))
136 def transModType(self
, modType
):
138 table
= [(stc
.STC_MOD_INSERTTEXT
, "InsertText"),
139 (stc
.STC_MOD_DELETETEXT
, "DeleteText"),
140 (stc
.STC_MOD_CHANGESTYLE
, "ChangeStyle"),
141 (stc
.STC_MOD_CHANGEFOLD
, "ChangeFold"),
142 (stc
.STC_PERFORMED_USER
, "UserFlag"),
143 (stc
.STC_PERFORMED_UNDO
, "Undo"),
144 (stc
.STC_PERFORMED_REDO
, "Redo"),
145 (stc
.STC_LASTSTEPINUNDOREDO
, "Last-Undo/Redo"),
146 (stc
.STC_MOD_CHANGEMARKER
, "ChangeMarker"),
147 (stc
.STC_MOD_BEFOREINSERT
, "B4-Insert"),
148 (stc
.STC_MOD_BEFOREDELETE
, "B4-Delete")
151 for flag
,text
in table
:
163 #----------------------------------------------------------------------
167 def runTest(frame
, nb
, log
):
169 ed
= p
= MySTC(nb
, -1, log
)
172 p
= wx
.Panel(nb
, -1, style
=wx
.NO_FULL_REPAINT_ON_RESIZE
)
173 ed
= MySTC(p
, -1, log
)
174 s
= wx
.BoxSizer(wx
.HORIZONTAL
)
175 s
.Add(ed
, 1, wx
.EXPAND
)
177 p
.SetAutoLayout(True)
180 #ed.SetBufferedDraw(False)
182 #ed.SetScrollWidth(800)
183 #ed.SetWrapMode(True)
189 decode
= codecs
.lookup("utf-8")[1]
191 ed
.GotoPos(ed
.GetLength())
192 ed
.AddText("\n\nwxStyledTextCtrl can also do Unicode:\n")
193 unitext
, l
= decode('\xd0\x9f\xd0\xb8\xd1\x82\xd0\xbe\xd0\xbd - '
194 '\xd0\xbb\xd1\x83\xd1\x87\xd1\x88\xd0\xb8\xd0\xb9 '
195 '\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')
196 ed
.AddText('\tRussian: ')
203 ed
.StyleSetSpec(stc
.STC_STYLE_DEFAULT
, "size:%d,face:%s" % (pb
, face3
))
204 ed
.StyleSetSpec(1, "size:%d,bold,face:%s,fore:#0000FF" % (pb
+2, face1
))
205 ed
.StyleSetSpec(2, "face:%s,italic,fore:#FF0000,size:%d" % (face2
, pb
))
206 ed
.StyleSetSpec(3, "face:%s,bold,size:%d" % (face2
, pb
+2))
207 ed
.StyleSetSpec(4, "face:%s,size:%d" % (face1
, pb
-1))
209 # Now set some text to those styles... Normally this would be
210 # done in an event handler that happens when text needs displayed.
211 ed
.StartStyling(98, 0xff)
212 ed
.SetStyling(6, 1) # set style for 6 characters using style 1
214 ed
.StartStyling(190, 0xff)
217 ed
.StartStyling(310, 0xff)
223 # line numbers in the margin
224 ed
.SetMarginType(0, stc
.STC_MARGIN_NUMBER
)
225 ed
.SetMarginWidth(0, 22)
226 ed
.StyleSetSpec(stc
.STC_STYLE_LINENUMBER
, "size:%d,face:%s" % (pb
, face1
))
229 ed
.SetMarginType(1, stc
.STC_MARGIN_SYMBOL
)
230 ed
.MarkerDefine(0, stc
.STC_MARK_ROUNDRECT
, "#CCFF00", "RED")
231 #ed.MarkerDefine(1, stc.STC_MARK_CIRCLE, "FOREST GREEN", "SIENNA")
232 ed
.MarkerDefineBitmap(1, images
.getFolder1Bitmap())
233 ed
.MarkerDefine(2, stc
.STC_MARK_SHORTARROW
, "blue", "blue")
234 ed
.MarkerDefine(3, stc
.STC_MARK_ARROW
, "#00FF00", "#00FF00")
236 # put some markers on some lines
244 # and finally, an indicator or two
245 ed
.IndicatorSetStyle(0, stc
.STC_INDIC_SQUIGGLE
)
246 ed
.IndicatorSetForeground(0, wx
.RED
)
247 ed
.IndicatorSetStyle(1, stc
.STC_INDIC_DIAGONAL
)
248 ed
.IndicatorSetForeground(1, wx
.BLUE
)
249 ed
.IndicatorSetStyle(2, stc
.STC_INDIC_STRIKE
)
250 ed
.IndicatorSetForeground(2, wx
.RED
)
252 ed
.StartStyling(836, stc
.STC_INDICS_MASK
)
253 ed
.SetStyling(10, stc
.STC_INDIC0_MASK
)
254 ed
.SetStyling(10, stc
.STC_INDIC1_MASK
)
255 ed
.SetStyling(10, stc
.STC_INDIC2_MASK | stc
.STC_INDIC1_MASK
)
260 print "GetTextLength(): ", ed
.GetTextLength(), len(ed
.GetText())
261 print "GetText(): ", repr(ed
.GetText())
263 print "GetStyledText(98, 104): ", repr(ed
.GetStyledText(98, 104)), len(ed
.GetStyledText(98, 104))
265 print "GetCurLine(): ", repr(ed
.GetCurLine())
267 print "GetCurLine(): ", repr(ed
.GetCurLine())
269 print "GetLine(1): ", repr(ed
.GetLine(1))
271 ed
.SetSelection(25, 35)
272 print "GetSelectedText(): ", repr(ed
.GetSelectedText())
273 print "GetTextRange(25, 35): ", repr(ed
.GetTextRange(25, 35))
274 print "FindText(0, max, 'indicators'): ",
275 print ed
.FindText(0, ed
.GetTextLength(), "indicators")
284 #----------------------------------------------------------------------
289 Once again, no docs yet. <b>Sorry.</b> But <a href="data/stc.h.html">this</a>
290 and <a href="http://www.scintilla.org/ScintillaDoc.html">this</a> should
296 if __name__
== '__main__':
299 run
.main(['', os
.path
.basename(sys
.argv
[0])])