2 from wxPython
.wx
import *
3 from wxPython
.stc
import *
5 #----------------------------------------------------------------------
12 This editor is provided by a class named wxStyledTextCtrl. As
13 the name suggests, you can define styles that can be applied to
14 sections of text. This will typically be used for things like
15 syntax highlighting code editors, but I'm sure that there are other
16 applications as well. A style is a combination of font, point size,
17 forground and background colours. The editor can handle
18 proportional fonts just as easily as monospaced fonts, and various
19 styles can use different sized fonts.
21 There are a few canned language lexers and colourizers included,
22 (see the next demo) or you can handle the colourization yourself.
23 If you do you can simply register an event handler and the editor
24 will let you know when the visible portion of the text needs
27 wxStyledTextEditor also supports setting markers in the margin...
32 ...and indicators within the text. You can use these for whatever
33 you want in your application. Cut, Copy, Paste, Drag and Drop of
34 text works, as well as virtually unlimited Undo and Redo
35 capabilities, (right click to try it out.)
38 if wxPlatform
== '__WXMSW__':
40 face2
= 'Times New Roman'
50 #----------------------------------------------------------------------
51 # This shows how to catch the Modified event from the wxStyledTextCtrl
53 class MySTC(wxStyledTextCtrl
):
54 def __init__(self
, parent
, ID
, log
):
55 wxStyledTextCtrl
.__init
__(self
, parent
, ID
)
58 EVT_STC_DO_DROP(self
, ID
, self
.OnDoDrop
)
59 EVT_STC_DRAG_OVER(self
, ID
, self
.OnDragOver
)
60 EVT_STC_START_DRAG(self
, ID
, self
.OnStartDrag
)
61 EVT_STC_MODIFIED(self
, ID
, self
.OnModified
)
64 def OnStartDrag(self
, evt
):
65 self
.log
.write("OnStartDrag: %d, %s\n"
66 % (evt
.GetDragAllowMove(), evt
.GetDragText()))
68 if debug
and evt
.GetPosition() < 250:
69 evt
.SetDragAllowMove(false
) # you can prevent moving of text (only copy)
70 evt
.SetDragText("DRAGGED TEXT") # you can change what is dragged
71 #evt.SetDragText("") # or prevent the drag with empty text
74 def OnDragOver(self
, evt
):
75 self
.log
.write("OnDragOver: x,y=(%d, %d) pos: %d DragResult: %d\n"
76 % (evt
.GetX(), evt
.GetY(), evt
.GetPosition(), evt
.GetDragResult()))
78 if debug
and evt
.GetPosition() < 250:
79 evt
.SetDragResult(wxDragNone
) # prevent dropping at the begining of the buffer
82 def OnDoDrop(self
, evt
):
83 self
.log
.write("OnDoDrop: x,y=(%d, %d) pos: %d DragResult: %d\n"
85 % (evt
.GetX(), evt
.GetY(), evt
.GetPosition(), evt
.GetDragResult(),
88 if debug
and evt
.GetPosition() < 500:
89 evt
.SetDragText("DROPPED TEXT") # Can change text if needed
90 ##evt.SetDragResult(wxDragNone) # Can also change the drag operation, but it
91 # is probably better to do it in OnDragOver so
92 # there is visual feedback
94 ##evt.SetPosition(25) # Can also change position, but I'm not sure why
95 # you would want to...
100 def OnModified(self
, evt
):
101 self
.log
.write("""OnModified
106 Text: %s\n""" % ( self
.transModType(evt
.GetModificationType()),
113 def transModType(self
, modType
):
115 table
= [(wxSTC_MOD_INSERTTEXT
, "InsertText"),
116 (wxSTC_MOD_DELETETEXT
, "DeleteText"),
117 (wxSTC_MOD_CHANGESTYLE
, "ChangeStyle"),
118 (wxSTC_MOD_CHANGEFOLD
, "ChangeFold"),
119 (wxSTC_PERFORMED_USER
, "UserFlag"),
120 (wxSTC_PERFORMED_UNDO
, "Undo"),
121 (wxSTC_PERFORMED_REDO
, "Redo"),
122 (wxSTC_LASTSTEPINUNDOREDO
, "Last-Undo/Redo"),
123 (wxSTC_MOD_CHANGEMARKER
, "ChangeMarker"),
124 (wxSTC_MOD_BEFOREINSERT
, "B4-Insert"),
125 (wxSTC_MOD_BEFOREDELETE
, "B4-Delete")
128 for flag
,text
in table
:
140 #----------------------------------------------------------------------
144 def runTest(frame
, nb
, log
):
146 ed
= p
= MySTC(nb
, -1, log
)
150 ed
= MySTC(p
, -1, log
)
151 s
= wxBoxSizer(wxHORIZONTAL
)
152 s
.Add(ed
, 1, wxEXPAND
)
154 p
.SetAutoLayout(true
)
160 ed
.StyleSetSpec(wxSTC_STYLE_DEFAULT
, "size:%d,face:%s" % (pb
, face3
))
161 ed
.StyleSetSpec(1, "size:%d,bold,face:%s,fore:#0000FF" % (pb
+2, face1
))
162 ed
.StyleSetSpec(2, "face:%s,italic,fore:#FF0000,size:%d" % (face2
, pb
))
163 ed
.StyleSetSpec(3, "face:%s,bold,size:%d" % (face2
, pb
+2))
164 ed
.StyleSetSpec(4, "face:%s,size:%d" % (face1
, pb
-1))
167 # now set some text to those styles... Normally this would be
168 # done in an event handler that happens when text needs displayed.
169 ed
.StartStyling(98, 0xff)
170 ed
.SetStyling(6, 1) # set style for 6 characters using style 1
172 ed
.StartStyling(190, 0xff)
175 ed
.StartStyling(310, 0xff)
181 # line numbers in the margin
182 ed
.SetMarginType(0, wxSTC_MARGIN_NUMBER
)
183 ed
.SetMarginWidth(0, 22)
184 ed
.StyleSetSpec(wxSTC_STYLE_LINENUMBER
, "size:%d,face:%s" % (pb
, face1
))
187 ed
.SetMarginType(1, wxSTC_MARGIN_SYMBOL
)
188 ed
.MarkerDefine(0, wxSTC_MARK_ROUNDRECT
, "#CCFF00", "RED")
189 ed
.MarkerDefine(1, wxSTC_MARK_CIRCLE
, "FOREST GREEN", "SIENNA")
190 ed
.MarkerDefine(2, wxSTC_MARK_SHORTARROW
, "blue", "blue")
191 ed
.MarkerDefine(3, wxSTC_MARK_ARROW
, "#00FF00", "#00FF00")
193 # put some markers on some lines
201 # and finally, an indicator or two
202 ed
.IndicatorSetStyle(0, wxSTC_INDIC_SQUIGGLE
)
203 ed
.IndicatorSetForeground(0, wxRED
)
204 ed
.IndicatorSetStyle(1, wxSTC_INDIC_DIAGONAL
)
205 ed
.IndicatorSetForeground(1, wxBLUE
)
206 ed
.IndicatorSetStyle(2, wxSTC_INDIC_STRIKE
)
207 ed
.IndicatorSetForeground(2, wxRED
)
209 ed
.StartStyling(836, wxSTC_INDICS_MASK
)
210 ed
.SetStyling(10, wxSTC_INDIC0_MASK
)
211 ed
.SetStyling(10, wxSTC_INDIC1_MASK
)
212 ed
.SetStyling(10, wxSTC_INDIC2_MASK | wxSTC_INDIC1_MASK
)
216 print "GetTextLength(): ", ed
.GetTextLength(), len(ed
.GetText())
217 print "GetText(): ", repr(ed
.GetText())
219 print "GetStyledText(98, 104): ", repr(ed
.GetStyledText(98, 104)), len(ed
.GetStyledText(98, 104))
221 print "GetCurLine(): ", repr(ed
.GetCurLine())
223 print "GetCurLine(): ", repr(ed
.GetCurLine())
225 print "GetLine(1): ", repr(ed
.GetLine(1))
227 ed
.SetSelection(25, 35)
228 print "GetSelectedText(): ", repr(ed
.GetSelectedText())
229 print "GetTextRange(25, 35): ", repr(ed
.GetTextRange(25, 35))
238 #----------------------------------------------------------------------
243 Once again, no docs yet. <b>Sorry.</b> But <a href="data/stc.h.html">this</a>
244 and <a href="http://www.scintilla.org/ScintillaDoc.html">this</a> should
251 if __name__
== '__main__':
253 app
= wxPySimpleApp()
254 frame
= wxFrame(None, -1, "Tester...", size
=(640, 480))
255 win
= runTest(frame
, frame
, sys
.stdout
)