]> git.saurik.com Git - wxWidgets.git/blob - wxPython/demo/StyledTextCtrl_1.py
More demo conversion and cleanup from Jeff
[wxWidgets.git] / wxPython / demo / StyledTextCtrl_1.py
1 #
2 # 11/21/2003 - Jeff Grimmett (grimmtooth@softhome.net)
3 #
4 # o EVT_STC_DRAG_OVER event GetdragResult() is not an int
5 # o wx.TheClipboard.Flush() generates a warning on program exit.
6 #
7
8 import wx
9 import wx.stc as stc
10
11 import images
12
13 #----------------------------------------------------------------------
14
15 debug = 1
16
17
18 demoText = """\
19
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.
28
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
33 styling.
34
35 wx.StyledTextEditor also supports setting markers in the margin...
36
37
38
39
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.)
44 """
45
46 if wx.Platform == '__WXMSW__':
47 face1 = 'Arial'
48 face2 = 'Times New Roman'
49 face3 = 'Courier New'
50 pb = 10
51 else:
52 face1 = 'Helvetica'
53 face2 = 'Times'
54 face3 = 'Courier'
55 pb = 10
56
57
58 #----------------------------------------------------------------------
59 # This shows how to catch the Modified event from the wx.StyledTextCtrl
60
61 class MySTC(stc.StyledTextCtrl):
62 def __init__(self, parent, ID, log):
63 stc.StyledTextCtrl.__init__(self, parent, ID)
64 self.log = log
65
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)
70
71 self.Bind(wx.EVT_WINDOW_DESTROY, self.OnDestroy)
72
73 def OnDestroy(self, evt):
74 # This is how the clipboard contents can be preserved after
75 # the app has exited.
76 wx.TheClipboard.Flush()
77 evt.Skip()
78
79
80 def OnStartDrag(self, evt):
81 self.log.write("OnStartDrag: %d, %s\n"
82 % (evt.GetDragAllowMove(), evt.GetDragText()))
83
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
88
89
90 def OnDragOver(self, evt):
91 #Todo: evt.GetdragResult() response is not an int
92
93 self.log.write(
94 "OnDragOver: x,y=(%d, %d) pos: %d DragResult: %d\n"
95 % (evt.GetX(), evt.GetY(), evt.GetPosition(), evt.GetDragResult())
96 )
97
98 if debug and evt.GetPosition() < 250:
99 evt.SetDragResult(wx.DragNone) # prevent dropping at the beginning of the buffer
100
101
102 def OnDoDrop(self, evt):
103 self.log.write("OnDoDrop: x,y=(%d, %d) pos: %d DragResult: %d\n"
104 "\ttext: %s\n"
105 % (evt.GetX(), evt.GetY(), evt.GetPosition(), evt.GetDragResult(),
106 evt.GetDragText()))
107
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
113
114 #evt.SetPosition(25) # Can also change position, but I'm not sure why
115 # you would want to...
116
117
118
119
120 def OnModified(self, evt):
121 self.log.write("""OnModified
122 Mod type: %s
123 At position: %d
124 Lines added: %d
125 Text Length: %d
126 Text: %s\n""" % ( self.transModType(evt.GetModificationType()),
127 evt.GetPosition(),
128 evt.GetLinesAdded(),
129 evt.GetLength(),
130 repr(evt.GetText()) ))
131
132
133 def transModType(self, modType):
134 st = ""
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")
146 ]
147
148 for flag,text in table:
149 if flag & modType:
150 st = st + text + " "
151
152 if not st:
153 st = 'UNKNOWN'
154
155 return st
156
157
158
159
160 #----------------------------------------------------------------------
161
162 _USE_PANEL = 1
163
164 def runTest(frame, nb, log):
165 if not _USE_PANEL:
166 ed = p = MySTC(nb, -1, log)
167
168 else:
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)
173 p.SetSizer(s)
174 p.SetAutoLayout(True)
175
176
177 #ed.SetBufferedDraw(False)
178 #ed.StyleClearAll()
179 #ed.SetScrollWidth(800)
180 #ed.SetWrapMode(True)
181
182 ed.SetText(demoText)
183
184 if wx.USE_UNICODE:
185 import codecs
186 decode = codecs.lookup("utf-8")[1]
187
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: ')
194 ed.AddText(unitext)
195 ed.GotoPos(0)
196
197 ed.EmptyUndoBuffer()
198
199 # make some styles
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))
205
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
210
211 ed.StartStyling(190, 0xff)
212 ed.SetStyling(20, 2)
213
214 ed.StartStyling(310, 0xff)
215 ed.SetStyling(4, 3)
216 ed.SetStyling(2, 0)
217 ed.SetStyling(10, 4)
218
219
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))
224
225 # setup some markers
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")
232
233 # put some markers on some lines
234 ed.MarkerAdd(17, 0)
235 ed.MarkerAdd(18, 1)
236 ed.MarkerAdd(19, 2)
237 ed.MarkerAdd(20, 3)
238 ed.MarkerAdd(20, 0)
239
240
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)
248
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)
253
254
255 # some test stuff...
256 if debug:
257 print "GetTextLength(): ", ed.GetTextLength(), len(ed.GetText())
258 print "GetText(): ", repr(ed.GetText())
259 print
260 print "GetStyledText(98, 104): ", repr(ed.GetStyledText(98, 104)), len(ed.GetStyledText(98, 104))
261 print
262 print "GetCurLine(): ", repr(ed.GetCurLine())
263 ed.GotoPos(5)
264 print "GetCurLine(): ", repr(ed.GetCurLine())
265 print
266 print "GetLine(1): ", repr(ed.GetLine(1))
267 print
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")
273
274 ed.GotoPos(0)
275
276
277 return p
278
279
280
281 #----------------------------------------------------------------------
282
283
284 overview = """\
285 <html><body>
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
288 be helpful.
289 </body><html>
290 """
291
292
293 if __name__ == '__main__':
294 import sys,os
295 import run
296 run.main(['', os.path.basename(sys.argv[0])])
297