]> git.saurik.com Git - wxWidgets.git/blame_incremental - wxPython/demo/wxStyledTextCtrl_1.py
suppress an assert when a combobox receives WM_KILLFOCUS while it is being destroyed
[wxWidgets.git] / wxPython / demo / wxStyledTextCtrl_1.py
... / ...
CommitLineData
1
2from wxPython.wx import *
3from wxPython.stc import *
4
5#----------------------------------------------------------------------
6
7debug = 1
8
9
10demoText = """\
11
12This editor is provided by a class named wxStyledTextCtrl. As
13the name suggests, you can define styles that can be applied to
14sections of text. This will typically be used for things like
15syntax highlighting code editors, but I'm sure that there are other
16applications as well. A style is a combination of font, point size,
17forground and background colours. The editor can handle
18proportional fonts just as easily as monospaced fonts, and various
19styles can use different sized fonts.
20
21There are a few canned language lexers and colourizers included,
22(see the next demo) or you can handle the colourization yourself.
23If you do you can simply register an event handler and the editor
24will let you know when the visible portion of the text needs
25styling.
26
27wxStyledTextEditor also supports setting markers in the margin...
28
29
30
31
32...and indicators within the text. You can use these for whatever
33you want in your application. Cut, Copy, Paste, Drag and Drop of
34text works, as well as virtually unlimited Undo and Redo
35capabilities, (right click to try it out.)
36"""
37
38if wxPlatform == '__WXMSW__':
39 face1 = 'Arial'
40 face2 = 'Times New Roman'
41 face3 = 'Courier New'
42 pb = 10
43else:
44 face1 = 'Helvetica'
45 face2 = 'Times'
46 face3 = 'Courier'
47 pb = 10
48
49
50#----------------------------------------------------------------------
51# This shows how to catch the Modified event from the wxStyledTextCtrl
52
53class MySTC(wxStyledTextCtrl):
54 def __init__(self, parent, ID, log):
55 wxStyledTextCtrl.__init__(self, parent, ID)
56 self.log = log
57
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)
62
63## EVT_WINDOW_DESTROY(self, self.OnDestroy)
64## def OnDestroy(self, evt):
65## wxTheClipboard.Flush()
66## evt.Skip()
67
68
69 def OnStartDrag(self, evt):
70 self.log.write("OnStartDrag: %d, %s\n"
71 % (evt.GetDragAllowMove(), evt.GetDragText()))
72
73 if debug and evt.GetPosition() < 250:
74 evt.SetDragAllowMove(false) # you can prevent moving of text (only copy)
75 evt.SetDragText("DRAGGED TEXT") # you can change what is dragged
76 #evt.SetDragText("") # or prevent the drag with empty text
77
78
79 def OnDragOver(self, evt):
80 self.log.write("OnDragOver: x,y=(%d, %d) pos: %d DragResult: %d\n"
81 % (evt.GetX(), evt.GetY(), evt.GetPosition(), evt.GetDragResult()))
82
83 if debug and evt.GetPosition() < 250:
84 evt.SetDragResult(wxDragNone) # prevent dropping at the begining of the buffer
85
86
87 def OnDoDrop(self, evt):
88 self.log.write("OnDoDrop: x,y=(%d, %d) pos: %d DragResult: %d\n"
89 "\ttext: %s\n"
90 % (evt.GetX(), evt.GetY(), evt.GetPosition(), evt.GetDragResult(),
91 evt.GetDragText()))
92
93 if debug and evt.GetPosition() < 500:
94 evt.SetDragText("DROPPED TEXT") # Can change text if needed
95 ##evt.SetDragResult(wxDragNone) # Can also change the drag operation, but it
96 # is probably better to do it in OnDragOver so
97 # there is visual feedback
98
99 ##evt.SetPosition(25) # Can also change position, but I'm not sure why
100 # you would want to...
101
102
103
104
105 def OnModified(self, evt):
106 self.log.write("""OnModified
107 Mod type: %s
108 At position: %d
109 Lines added: %d
110 Text Length: %d
111 Text: %s\n""" % ( self.transModType(evt.GetModificationType()),
112 evt.GetPosition(),
113 evt.GetLinesAdded(),
114 evt.GetLength(),
115 repr(evt.GetText()) ))
116
117
118 def transModType(self, modType):
119 st = ""
120 table = [(wxSTC_MOD_INSERTTEXT, "InsertText"),
121 (wxSTC_MOD_DELETETEXT, "DeleteText"),
122 (wxSTC_MOD_CHANGESTYLE, "ChangeStyle"),
123 (wxSTC_MOD_CHANGEFOLD, "ChangeFold"),
124 (wxSTC_PERFORMED_USER, "UserFlag"),
125 (wxSTC_PERFORMED_UNDO, "Undo"),
126 (wxSTC_PERFORMED_REDO, "Redo"),
127 (wxSTC_LASTSTEPINUNDOREDO, "Last-Undo/Redo"),
128 (wxSTC_MOD_CHANGEMARKER, "ChangeMarker"),
129 (wxSTC_MOD_BEFOREINSERT, "B4-Insert"),
130 (wxSTC_MOD_BEFOREDELETE, "B4-Delete")
131 ]
132
133 for flag,text in table:
134 if flag & modType:
135 st = st + text + " "
136
137 if not st:
138 st = 'UNKNOWN'
139
140 return st
141
142
143
144
145#----------------------------------------------------------------------
146
147_USE_PANEL = 1
148
149def runTest(frame, nb, log):
150 if not _USE_PANEL:
151 ed = p = MySTC(nb, -1, log)
152
153 else:
154 p = wxPanel(nb, -1)
155 ed = MySTC(p, -1, log)
156 s = wxBoxSizer(wxHORIZONTAL)
157 s.Add(ed, 1, wxEXPAND)
158 p.SetSizer(s)
159 p.SetAutoLayout(true)
160
161
162## ed.SetBufferedDraw(false)
163## ed.StyleClearAll()
164 ed.SetText(demoText)
165 if wxUSE_UNICODE:
166 import codecs
167 decode = codecs.lookup("utf-8")[1]
168
169 ed.GotoPos(ed.GetLength())
170 ed.AddText("\n\nwxStyledTextCtrl can also do Unicode:\n")
171 unitext, l = decode('\xd0\x9f\xd0\xb8\xd1\x82\xd0\xbe\xd0\xbd - '
172 '\xd0\xbb\xd1\x83\xd1\x87\xd1\x88\xd0\xb8\xd0\xb9 '
173 '\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')
174 ed.AddText('\tRussian: ')
175 ed.AddText(unitext)
176 ed.GotoPos(0)
177
178 ed.EmptyUndoBuffer()
179
180 # make some styles
181 ed.StyleSetSpec(wxSTC_STYLE_DEFAULT, "size:%d,face:%s" % (pb, face3))
182 ed.StyleSetSpec(1, "size:%d,bold,face:%s,fore:#0000FF" % (pb+2, face1))
183 ed.StyleSetSpec(2, "face:%s,italic,fore:#FF0000,size:%d" % (face2, pb))
184 ed.StyleSetSpec(3, "face:%s,bold,size:%d" % (face2, pb+2))
185 ed.StyleSetSpec(4, "face:%s,size:%d" % (face1, pb-1))
186
187 # Now set some text to those styles... Normally this would be
188 # done in an event handler that happens when text needs displayed.
189 ed.StartStyling(98, 0xff)
190 ed.SetStyling(6, 1) # set style for 6 characters using style 1
191
192 ed.StartStyling(190, 0xff)
193 ed.SetStyling(20, 2)
194
195 ed.StartStyling(310, 0xff)
196 ed.SetStyling(4, 3)
197 ed.SetStyling(2, 0)
198 ed.SetStyling(10, 4)
199
200
201 # line numbers in the margin
202 ed.SetMarginType(0, wxSTC_MARGIN_NUMBER)
203 ed.SetMarginWidth(0, 22)
204 ed.StyleSetSpec(wxSTC_STYLE_LINENUMBER, "size:%d,face:%s" % (pb, face1))
205
206 # setup some markers
207 ed.SetMarginType(1, wxSTC_MARGIN_SYMBOL)
208 ed.MarkerDefine(0, wxSTC_MARK_ROUNDRECT, "#CCFF00", "RED")
209 ed.MarkerDefine(1, wxSTC_MARK_CIRCLE, "FOREST GREEN", "SIENNA")
210 ed.MarkerDefine(2, wxSTC_MARK_SHORTARROW, "blue", "blue")
211 ed.MarkerDefine(3, wxSTC_MARK_ARROW, "#00FF00", "#00FF00")
212
213 # put some markers on some lines
214 ed.MarkerAdd(17, 0)
215 ed.MarkerAdd(18, 1)
216 ed.MarkerAdd(19, 2)
217 ed.MarkerAdd(20, 3)
218 ed.MarkerAdd(20, 0)
219
220
221 # and finally, an indicator or two
222 ed.IndicatorSetStyle(0, wxSTC_INDIC_SQUIGGLE)
223 ed.IndicatorSetForeground(0, wxRED)
224 ed.IndicatorSetStyle(1, wxSTC_INDIC_DIAGONAL)
225 ed.IndicatorSetForeground(1, wxBLUE)
226 ed.IndicatorSetStyle(2, wxSTC_INDIC_STRIKE)
227 ed.IndicatorSetForeground(2, wxRED)
228
229 ed.StartStyling(836, wxSTC_INDICS_MASK)
230 ed.SetStyling(10, wxSTC_INDIC0_MASK)
231 ed.SetStyling(10, wxSTC_INDIC1_MASK)
232 ed.SetStyling(10, wxSTC_INDIC2_MASK | wxSTC_INDIC1_MASK)
233
234
235 # some test stuff...
236 if debug:
237 print "GetTextLength(): ", ed.GetTextLength(), len(ed.GetText())
238 print "GetText(): ", repr(ed.GetText())
239 print
240 print "GetStyledText(98, 104): ", repr(ed.GetStyledText(98, 104)), len(ed.GetStyledText(98, 104))
241 print
242 print "GetCurLine(): ", repr(ed.GetCurLine())
243 ed.GotoPos(5)
244 print "GetCurLine(): ", repr(ed.GetCurLine())
245 print
246 print "GetLine(1): ", repr(ed.GetLine(1))
247 print
248 ed.SetSelection(25, 35)
249 print "GetSelectedText(): ", repr(ed.GetSelectedText())
250 print "GetTextRange(25, 35): ", repr(ed.GetTextRange(25, 35))
251
252
253 ed.GotoPos(0)
254
255 return p
256
257
258
259#----------------------------------------------------------------------
260
261
262overview = """\
263<html><body>
264Once again, no docs yet. <b>Sorry.</b> But <a href="data/stc.h.html">this</a>
265and <a href="http://www.scintilla.org/ScintillaDoc.html">this</a> should
266be helpful.
267</body><html>
268"""
269
270
271if __name__ == '__main__':
272 import sys,os
273 import run
274 run.main(['', os.path.basename(sys.argv[0])])
275