2 from wxPython
.wx
import *
3 from wxPython
.stc
import *
7 #----------------------------------------------------------------------
14 This editor is provided by a class named wxStyledTextCtrl. As
15 the name suggests, you can define styles that can be applied to
16 sections of text. This will typically be used for things like
17 syntax highlighting code editors, but I'm sure that there are other
18 applications as well. A style is a combination of font, point size,
19 foreground and background colours. The editor can handle
20 proportional fonts just as easily as monospaced fonts, and various
21 styles can use different sized fonts.
23 There are a few canned language lexers and colourizers included,
24 (see the next demo) or you can handle the colourization yourself.
25 If you do you can simply register an event handler and the editor
26 will let you know when the visible portion of the text needs
29 wxStyledTextEditor also supports setting markers in the margin...
34 ...and indicators within the text. You can use these for whatever
35 you want in your application. Cut, Copy, Paste, Drag and Drop of
36 text works, as well as virtually unlimited Undo and Redo
37 capabilities, (right click to try it out.)
40 if wxPlatform
== '__WXMSW__':
42 face2
= 'Times New Roman'
52 #----------------------------------------------------------------------
53 # This shows how to catch the Modified event from the wxStyledTextCtrl
55 class MySTC(wxStyledTextCtrl
):
56 def __init__(self
, parent
, ID
, log
):
57 wxStyledTextCtrl
.__init
__(self
, parent
, ID
)
60 EVT_STC_DO_DROP(self
, ID
, self
.OnDoDrop
)
61 EVT_STC_DRAG_OVER(self
, ID
, self
.OnDragOver
)
62 EVT_STC_START_DRAG(self
, ID
, self
.OnStartDrag
)
63 EVT_STC_MODIFIED(self
, ID
, self
.OnModified
)
65 EVT_WINDOW_DESTROY(self
, self
.OnDestroy
)
67 def OnDestroy(self
, evt
):
68 # This is how the clipboard contents can be preserved after
70 wxTheClipboard
.Flush()
74 def OnStartDrag(self
, evt
):
75 self
.log
.write("OnStartDrag: %d, %s\n"
76 % (evt
.GetDragAllowMove(), evt
.GetDragText()))
78 if debug
and evt
.GetPosition() < 250:
79 evt
.SetDragAllowMove(False) # you can prevent moving of text (only copy)
80 evt
.SetDragText("DRAGGED TEXT") # you can change what is dragged
81 #evt.SetDragText("") # or prevent the drag with empty text
84 def OnDragOver(self
, evt
):
85 self
.log
.write("OnDragOver: x,y=(%d, %d) pos: %d DragResult: %d\n"
86 % (evt
.GetX(), evt
.GetY(), evt
.GetPosition(), evt
.GetDragResult()))
88 if debug
and evt
.GetPosition() < 250:
89 evt
.SetDragResult(wxDragNone
) # prevent dropping at the beginning of the buffer
92 def OnDoDrop(self
, evt
):
93 self
.log
.write("OnDoDrop: x,y=(%d, %d) pos: %d DragResult: %d\n"
95 % (evt
.GetX(), evt
.GetY(), evt
.GetPosition(), evt
.GetDragResult(),
98 if debug
and evt
.GetPosition() < 500:
99 evt
.SetDragText("DROPPED TEXT") # Can change text if needed
100 ##evt.SetDragResult(wxDragNone) # Can also change the drag operation, but it
101 # is probably better to do it in OnDragOver so
102 # there is visual feedback
104 ##evt.SetPosition(25) # Can also change position, but I'm not sure why
105 # you would want to...
110 def OnModified(self
, evt
):
111 self
.log
.write("""OnModified
116 Text: %s\n""" % ( self
.transModType(evt
.GetModificationType()),
120 repr(evt
.GetText()) ))
123 def transModType(self
, modType
):
125 table
= [(wxSTC_MOD_INSERTTEXT
, "InsertText"),
126 (wxSTC_MOD_DELETETEXT
, "DeleteText"),
127 (wxSTC_MOD_CHANGESTYLE
, "ChangeStyle"),
128 (wxSTC_MOD_CHANGEFOLD
, "ChangeFold"),
129 (wxSTC_PERFORMED_USER
, "UserFlag"),
130 (wxSTC_PERFORMED_UNDO
, "Undo"),
131 (wxSTC_PERFORMED_REDO
, "Redo"),
132 (wxSTC_LASTSTEPINUNDOREDO
, "Last-Undo/Redo"),
133 (wxSTC_MOD_CHANGEMARKER
, "ChangeMarker"),
134 (wxSTC_MOD_BEFOREINSERT
, "B4-Insert"),
135 (wxSTC_MOD_BEFOREDELETE
, "B4-Delete")
138 for flag
,text
in table
:
150 #----------------------------------------------------------------------
154 def runTest(frame
, nb
, log
):
156 ed
= p
= MySTC(nb
, -1, log
)
159 p
= wxPanel(nb
, -1, style
=wxNO_FULL_REPAINT_ON_RESIZE
)
160 ed
= MySTC(p
, -1, log
)
161 s
= wxBoxSizer(wxHORIZONTAL
)
162 s
.Add(ed
, 1, wxEXPAND
)
164 p
.SetAutoLayout(True)
167 #ed.SetBufferedDraw(False)
169 #ed.SetScrollWidth(800)
170 #ed.SetWrapMode(True)
175 decode
= codecs
.lookup("utf-8")[1]
177 ed
.GotoPos(ed
.GetLength())
178 ed
.AddText("\n\nwxStyledTextCtrl can also do Unicode:\n")
179 unitext
, l
= decode('\xd0\x9f\xd0\xb8\xd1\x82\xd0\xbe\xd0\xbd - '
180 '\xd0\xbb\xd1\x83\xd1\x87\xd1\x88\xd0\xb8\xd0\xb9 '
181 '\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')
182 ed
.AddText('\tRussian: ')
189 ed
.StyleSetSpec(wxSTC_STYLE_DEFAULT
, "size:%d,face:%s" % (pb
, face3
))
190 ed
.StyleSetSpec(1, "size:%d,bold,face:%s,fore:#0000FF" % (pb
+2, face1
))
191 ed
.StyleSetSpec(2, "face:%s,italic,fore:#FF0000,size:%d" % (face2
, pb
))
192 ed
.StyleSetSpec(3, "face:%s,bold,size:%d" % (face2
, pb
+2))
193 ed
.StyleSetSpec(4, "face:%s,size:%d" % (face1
, pb
-1))
195 # Now set some text to those styles... Normally this would be
196 # done in an event handler that happens when text needs displayed.
197 ed
.StartStyling(98, 0xff)
198 ed
.SetStyling(6, 1) # set style for 6 characters using style 1
200 ed
.StartStyling(190, 0xff)
203 ed
.StartStyling(310, 0xff)
209 # line numbers in the margin
210 ed
.SetMarginType(0, wxSTC_MARGIN_NUMBER
)
211 ed
.SetMarginWidth(0, 22)
212 ed
.StyleSetSpec(wxSTC_STYLE_LINENUMBER
, "size:%d,face:%s" % (pb
, face1
))
215 ed
.SetMarginType(1, wxSTC_MARGIN_SYMBOL
)
216 ed
.MarkerDefine(0, wxSTC_MARK_ROUNDRECT
, "#CCFF00", "RED")
217 #ed.MarkerDefine(1, wxSTC_MARK_CIRCLE, "FOREST GREEN", "SIENNA")
218 ed
.MarkerDefineBitmap(1, images
.getFolder1Bitmap())
219 ed
.MarkerDefine(2, wxSTC_MARK_SHORTARROW
, "blue", "blue")
220 ed
.MarkerDefine(3, wxSTC_MARK_ARROW
, "#00FF00", "#00FF00")
222 # put some markers on some lines
230 # and finally, an indicator or two
231 ed
.IndicatorSetStyle(0, wxSTC_INDIC_SQUIGGLE
)
232 ed
.IndicatorSetForeground(0, wxRED
)
233 ed
.IndicatorSetStyle(1, wxSTC_INDIC_DIAGONAL
)
234 ed
.IndicatorSetForeground(1, wxBLUE
)
235 ed
.IndicatorSetStyle(2, wxSTC_INDIC_STRIKE
)
236 ed
.IndicatorSetForeground(2, wxRED
)
238 ed
.StartStyling(836, wxSTC_INDICS_MASK
)
239 ed
.SetStyling(10, wxSTC_INDIC0_MASK
)
240 ed
.SetStyling(10, wxSTC_INDIC1_MASK
)
241 ed
.SetStyling(10, wxSTC_INDIC2_MASK | wxSTC_INDIC1_MASK
)
246 print "GetTextLength(): ", ed
.GetTextLength(), len(ed
.GetText())
247 print "GetText(): ", repr(ed
.GetText())
249 print "GetStyledText(98, 104): ", repr(ed
.GetStyledText(98, 104)), len(ed
.GetStyledText(98, 104))
251 print "GetCurLine(): ", repr(ed
.GetCurLine())
253 print "GetCurLine(): ", repr(ed
.GetCurLine())
255 print "GetLine(1): ", repr(ed
.GetLine(1))
257 ed
.SetSelection(25, 35)
258 print "GetSelectedText(): ", repr(ed
.GetSelectedText())
259 print "GetTextRange(25, 35): ", repr(ed
.GetTextRange(25, 35))
260 print "FindText(0, max, 'indicators'): ",
261 print ed
.FindText(0, ed
.GetTextLength(), "indicators")
270 #----------------------------------------------------------------------
275 Once again, no docs yet. <b>Sorry.</b> But <a href="data/stc.h.html">this</a>
276 and <a href="http://www.scintilla.org/ScintillaDoc.html">this</a> should
282 if __name__
== '__main__':
285 run
.main(['', os
.path
.basename(sys
.argv
[0])])