9 #----------------------------------------------------------------------
12 ## This version of the editor has been set up to edit Python source
13 ## code. Here is a copy of wxPython/demo/Main.py to play with.
18 #----------------------------------------------------------------------
21 if wx
.Platform
== '__WXMSW__':
22 faces
= { 'times': 'Times New Roman',
23 'mono' : 'Courier New',
25 'other': 'Comic Sans MS',
30 faces
= { 'times': 'Times',
33 'other': 'new century schoolbook',
39 #----------------------------------------------------------------------
41 class PythonSTC(stc
.StyledTextCtrl
):
45 def __init__(self
, parent
, ID
,
46 pos
=wx
.DefaultPosition
, size
=wx
.DefaultSize
,
48 stc
.StyledTextCtrl
.__init
__(self
, parent
, ID
, pos
, size
, style
)
50 self
.CmdKeyAssign(ord('B'), stc
.STC_SCMOD_CTRL
, stc
.STC_CMD_ZOOMIN
)
51 self
.CmdKeyAssign(ord('N'), stc
.STC_SCMOD_CTRL
, stc
.STC_CMD_ZOOMOUT
)
53 self
.SetLexer(stc
.STC_LEX_PYTHON
)
54 self
.SetKeyWords(0, " ".join(keyword
.kwlist
))
56 self
.SetProperty("fold", "1")
57 self
.SetProperty("tab.timmy.whinge.level", "1")
60 self
.SetViewWhiteSpace(False)
61 #self.SetBufferedDraw(False)
62 #self.SetViewEOL(True)
63 #self.SetEOLMode(stc.STC_EOL_CRLF)
64 #self.SetUseAntiAliasing(True)
66 self
.SetEdgeMode(stc
.STC_EDGE_BACKGROUND
)
67 self
.SetEdgeColumn(78)
69 # Setup a margin to hold fold markers
70 #self.SetFoldFlags(16) ### WHAT IS THIS VALUE? WHAT ARE THE OTHER FLAGS? DOES IT MATTER?
71 self
.SetMarginType(2, stc
.STC_MARGIN_SYMBOL
)
72 self
.SetMarginMask(2, stc
.STC_MASK_FOLDERS
)
73 self
.SetMarginSensitive(2, True)
74 self
.SetMarginWidth(2, 12)
76 if self
.fold_symbols
== 0:
77 # Arrow pointing right for contracted folders, arrow pointing down for expanded
78 self
.MarkerDefine(stc
.STC_MARKNUM_FOLDEROPEN
, stc
.STC_MARK_ARROWDOWN
, "black", "black");
79 self
.MarkerDefine(stc
.STC_MARKNUM_FOLDER
, stc
.STC_MARK_ARROW
, "black", "black");
80 self
.MarkerDefine(stc
.STC_MARKNUM_FOLDERSUB
, stc
.STC_MARK_EMPTY
, "black", "black");
81 self
.MarkerDefine(stc
.STC_MARKNUM_FOLDERTAIL
, stc
.STC_MARK_EMPTY
, "black", "black");
82 self
.MarkerDefine(stc
.STC_MARKNUM_FOLDEREND
, stc
.STC_MARK_EMPTY
, "white", "black");
83 self
.MarkerDefine(stc
.STC_MARKNUM_FOLDEROPENMID
, stc
.STC_MARK_EMPTY
, "white", "black");
84 self
.MarkerDefine(stc
.STC_MARKNUM_FOLDERMIDTAIL
, stc
.STC_MARK_EMPTY
, "white", "black");
86 elif self
.fold_symbols
== 1:
87 # Plus for contracted folders, minus for expanded
88 self
.MarkerDefine(stc
.STC_MARKNUM_FOLDEROPEN
, stc
.STC_MARK_MINUS
, "white", "black");
89 self
.MarkerDefine(stc
.STC_MARKNUM_FOLDER
, stc
.STC_MARK_PLUS
, "white", "black");
90 self
.MarkerDefine(stc
.STC_MARKNUM_FOLDERSUB
, stc
.STC_MARK_EMPTY
, "white", "black");
91 self
.MarkerDefine(stc
.STC_MARKNUM_FOLDERTAIL
, stc
.STC_MARK_EMPTY
, "white", "black");
92 self
.MarkerDefine(stc
.STC_MARKNUM_FOLDEREND
, stc
.STC_MARK_EMPTY
, "white", "black");
93 self
.MarkerDefine(stc
.STC_MARKNUM_FOLDEROPENMID
, stc
.STC_MARK_EMPTY
, "white", "black");
94 self
.MarkerDefine(stc
.STC_MARKNUM_FOLDERMIDTAIL
, stc
.STC_MARK_EMPTY
, "white", "black");
96 elif self
.fold_symbols
== 2:
97 # Like a flattened tree control using circular headers and curved joins
98 self
.MarkerDefine(stc
.STC_MARKNUM_FOLDEROPEN
, stc
.STC_MARK_CIRCLEMINUS
, "white", "#404040");
99 self
.MarkerDefine(stc
.STC_MARKNUM_FOLDER
, stc
.STC_MARK_CIRCLEPLUS
, "white", "#404040");
100 self
.MarkerDefine(stc
.STC_MARKNUM_FOLDERSUB
, stc
.STC_MARK_VLINE
, "white", "#404040");
101 self
.MarkerDefine(stc
.STC_MARKNUM_FOLDERTAIL
, stc
.STC_MARK_LCORNERCURVE
, "white", "#404040");
102 self
.MarkerDefine(stc
.STC_MARKNUM_FOLDEREND
, stc
.STC_MARK_CIRCLEPLUSCONNECTED
, "white", "#404040");
103 self
.MarkerDefine(stc
.STC_MARKNUM_FOLDEROPENMID
, stc
.STC_MARK_CIRCLEMINUSCONNECTED
, "white", "#404040");
104 self
.MarkerDefine(stc
.STC_MARKNUM_FOLDERMIDTAIL
, stc
.STC_MARK_TCORNERCURVE
, "white", "#404040");
106 elif self
.fold_symbols
== 3:
107 # Like a flattened tree control using square headers
108 self
.MarkerDefine(stc
.STC_MARKNUM_FOLDEROPEN
, stc
.STC_MARK_BOXMINUS
, "white", "#808080")
109 self
.MarkerDefine(stc
.STC_MARKNUM_FOLDER
, stc
.STC_MARK_BOXPLUS
, "white", "#808080")
110 self
.MarkerDefine(stc
.STC_MARKNUM_FOLDERSUB
, stc
.STC_MARK_VLINE
, "white", "#808080")
111 self
.MarkerDefine(stc
.STC_MARKNUM_FOLDERTAIL
, stc
.STC_MARK_LCORNER
, "white", "#808080")
112 self
.MarkerDefine(stc
.STC_MARKNUM_FOLDEREND
, stc
.STC_MARK_BOXPLUSCONNECTED
, "white", "#808080")
113 self
.MarkerDefine(stc
.STC_MARKNUM_FOLDEROPENMID
, stc
.STC_MARK_BOXMINUSCONNECTED
, "white", "#808080")
114 self
.MarkerDefine(stc
.STC_MARKNUM_FOLDERMIDTAIL
, stc
.STC_MARK_TCORNER
, "white", "#808080")
117 self
.Bind(stc
.EVT_STC_UPDATEUI
, self
.OnUpdateUI
)
118 self
.Bind(stc
.EVT_STC_MARGINCLICK
, self
.OnMarginClick
)
119 self
.Bind(wx
.EVT_KEY_DOWN
, self
.OnKeyPressed
)
121 # Make some styles, The lexer defines what each style is used for, we
122 # just have to define what each style looks like. This set is adapted from
123 # Scintilla sample property files.
125 # Global default styles for all languages
126 self
.StyleSetSpec(stc
.STC_STYLE_DEFAULT
, "face:%(helv)s,size:%(size)d" % faces
)
127 self
.StyleClearAll() # Reset all to be like the default
129 # Global default styles for all languages
130 self
.StyleSetSpec(stc
.STC_STYLE_DEFAULT
, "face:%(helv)s,size:%(size)d" % faces
)
131 self
.StyleSetSpec(stc
.STC_STYLE_LINENUMBER
, "back:#C0C0C0,face:%(helv)s,size:%(size2)d" % faces
)
132 self
.StyleSetSpec(stc
.STC_STYLE_CONTROLCHAR
, "face:%(other)s" % faces
)
133 self
.StyleSetSpec(stc
.STC_STYLE_BRACELIGHT
, "fore:#FFFFFF,back:#0000FF,bold")
134 self
.StyleSetSpec(stc
.STC_STYLE_BRACEBAD
, "fore:#000000,back:#FF0000,bold")
138 self
.StyleSetSpec(stc
.STC_P_DEFAULT
, "fore:#000000,face:%(helv)s,size:%(size)d" % faces
)
140 self
.StyleSetSpec(stc
.STC_P_COMMENTLINE
, "fore:#007F00,face:%(other)s,size:%(size)d" % faces
)
142 self
.StyleSetSpec(stc
.STC_P_NUMBER
, "fore:#007F7F,size:%(size)d" % faces
)
144 self
.StyleSetSpec(stc
.STC_P_STRING
, "fore:#7F007F,face:%(helv)s,size:%(size)d" % faces
)
145 # Single quoted string
146 self
.StyleSetSpec(stc
.STC_P_CHARACTER
, "fore:#7F007F,face:%(helv)s,size:%(size)d" % faces
)
148 self
.StyleSetSpec(stc
.STC_P_WORD
, "fore:#00007F,bold,size:%(size)d" % faces
)
150 self
.StyleSetSpec(stc
.STC_P_TRIPLE
, "fore:#7F0000,size:%(size)d" % faces
)
151 # Triple double quotes
152 self
.StyleSetSpec(stc
.STC_P_TRIPLEDOUBLE
, "fore:#7F0000,size:%(size)d" % faces
)
153 # Class name definition
154 self
.StyleSetSpec(stc
.STC_P_CLASSNAME
, "fore:#0000FF,bold,underline,size:%(size)d" % faces
)
155 # Function or method name definition
156 self
.StyleSetSpec(stc
.STC_P_DEFNAME
, "fore:#007F7F,bold,size:%(size)d" % faces
)
158 self
.StyleSetSpec(stc
.STC_P_OPERATOR
, "bold,size:%(size)d" % faces
)
160 self
.StyleSetSpec(stc
.STC_P_IDENTIFIER
, "fore:#000000,face:%(helv)s,size:%(size)d" % faces
)
162 self
.StyleSetSpec(stc
.STC_P_COMMENTBLOCK
, "fore:#7F7F7F,size:%(size)d" % faces
)
163 # End of line where string is not closed
164 self
.StyleSetSpec(stc
.STC_P_STRINGEOL
, "fore:#000000,face:%(mono)s,back:#E0C0E0,eol,size:%(size)d" % faces
)
166 self
.SetCaretForeground("BLUE")
169 # register some images for use in the AutoComplete box.
170 self
.RegisterImage(1, images
.getSmilesBitmap())
171 self
.RegisterImage(2, self
._fix
_image
(
172 wx
.ArtProvider
.GetBitmap(wx
.ART_NORMAL_FILE
, wx
.ART_TOOLBAR
, (16,16))))
173 self
.RegisterImage(3, self
._fix
_image
(
174 wx
.ArtProvider
.GetBitmap(wx
.ART_COPY
, wx
.ART_TOOLBAR
, (16,16))))
176 def _fix_image(self
, bmp
):
177 img
= bmp
.ConvertToImage()
179 img
.ConvertAlphaToMask()
180 bmp
= wx
.BitmapFromImage(img
)
183 def OnKeyPressed(self
, event
):
184 if self
.CallTipActive():
186 key
= event
.KeyCode()
188 if key
== 32 and event
.ControlDown():
189 pos
= self
.GetCurrentPos()
192 if event
.ShiftDown():
193 self
.CallTipSetBackground("yellow")
194 self
.CallTipShow(pos
, 'lots of of text: blah, blah, blah\n\n'
195 'show some suff, maybe parameters..\n\n'
196 'fubar(param1, param2)')
200 #for x in range(50000):
201 # lst.append('%05d' % x)
204 #self.AutoCompShow(0, st)
206 kw
= keyword
.kwlist
[:]
207 kw
.append("zzzzzz?2")
209 kw
.append("__init__?3")
210 kw
.append("zzaaaaa?2")
211 kw
.append("zzbaaaa?2")
212 kw
.append("this_is_a_longer_value")
213 #kw.append("this_is_a_much_much_much_much_much_much_much_longer_value")
215 kw
.sort() # Python sorts are case sensitive
216 self
.AutoCompSetIgnoreCase(False) # so this needs to match
218 # Images are specified with a appended "?type"
219 for i
in range(len(kw
)):
220 if kw
[i
] in keyword
.kwlist
:
223 self
.AutoCompShow(0, " ".join(kw
))
228 def OnUpdateUI(self
, evt
):
229 # check for matching braces
233 caretPos
= self
.GetCurrentPos()
236 charBefore
= self
.GetCharAt(caretPos
- 1)
237 styleBefore
= self
.GetStyleAt(caretPos
- 1)
240 if charBefore
and chr(charBefore
) in "[]{}()" and styleBefore
== stc
.STC_P_OPERATOR
:
241 braceAtCaret
= caretPos
- 1
245 charAfter
= self
.GetCharAt(caretPos
)
246 styleAfter
= self
.GetStyleAt(caretPos
)
248 if charAfter
and chr(charAfter
) in "[]{}()" and styleAfter
== stc
.STC_P_OPERATOR
:
249 braceAtCaret
= caretPos
251 if braceAtCaret
>= 0:
252 braceOpposite
= self
.BraceMatch(braceAtCaret
)
254 if braceAtCaret
!= -1 and braceOpposite
== -1:
255 self
.BraceBadLight(braceAtCaret
)
257 self
.BraceHighlight(braceAtCaret
, braceOpposite
)
258 #pt = self.PointFromPosition(braceOpposite)
259 #self.Refresh(True, wxRect(pt.x, pt.y, 5,5))
264 def OnMarginClick(self
, evt
):
265 # fold and unfold as needed
266 if evt
.GetMargin() == 2:
267 if evt
.GetShift() and evt
.GetControl():
270 lineClicked
= self
.LineFromPosition(evt
.GetPosition())
272 if self
.GetFoldLevel(lineClicked
) & stc
.STC_FOLDLEVELHEADERFLAG
:
274 self
.SetFoldExpanded(lineClicked
, True)
275 self
.Expand(lineClicked
, True, True, 1)
276 elif evt
.GetControl():
277 if self
.GetFoldExpanded(lineClicked
):
278 self
.SetFoldExpanded(lineClicked
, False)
279 self
.Expand(lineClicked
, False, True, 0)
281 self
.SetFoldExpanded(lineClicked
, True)
282 self
.Expand(lineClicked
, True, True, 100)
284 self
.ToggleFold(lineClicked
)
288 lineCount
= self
.GetLineCount()
291 # find out if we are folding or unfolding
292 for lineNum
in range(lineCount
):
293 if self
.GetFoldLevel(lineNum
) & stc
.STC_FOLDLEVELHEADERFLAG
:
294 expanding
= not self
.GetFoldExpanded(lineNum
)
299 while lineNum
< lineCount
:
300 level
= self
.GetFoldLevel(lineNum
)
301 if level
& stc
.STC_FOLDLEVELHEADERFLAG
and \
302 (level
& stc
.STC_FOLDLEVELNUMBERMASK
) == stc
.STC_FOLDLEVELBASE
:
305 self
.SetFoldExpanded(lineNum
, True)
306 lineNum
= self
.Expand(lineNum
, True)
307 lineNum
= lineNum
- 1
309 lastChild
= self
.GetLastChild(lineNum
, -1)
310 self
.SetFoldExpanded(lineNum
, False)
312 if lastChild
> lineNum
:
313 self
.HideLines(lineNum
+1, lastChild
)
315 lineNum
= lineNum
+ 1
319 def Expand(self
, line
, doExpand
, force
=False, visLevels
=0, level
=-1):
320 lastChild
= self
.GetLastChild(line
, level
)
323 while line
<= lastChild
:
326 self
.ShowLines(line
, line
)
328 self
.HideLines(line
, line
)
331 self
.ShowLines(line
, line
)
334 level
= self
.GetFoldLevel(line
)
336 if level
& stc
.STC_FOLDLEVELHEADERFLAG
:
339 self
.SetFoldExpanded(line
, True)
341 self
.SetFoldExpanded(line
, False)
343 line
= self
.Expand(line
, doExpand
, force
, visLevels
-1)
346 if doExpand
and self
.GetFoldExpanded(line
):
347 line
= self
.Expand(line
, True, force
, visLevels
-1)
349 line
= self
.Expand(line
, False, force
, visLevels
-1)
356 #----------------------------------------------------------------------
360 def runTest(frame
, nb
, log
):
362 ed
= p
= PythonSTC(nb
, -1)
364 p
= wx
.Panel(nb
, -1, style
= wx
.NO_FULL_REPAINT_ON_RESIZE
)
365 ed
= PythonSTC(p
, -1)
366 s
= wx
.BoxSizer(wx
.HORIZONTAL
)
367 s
.Add(ed
, 1, wx
.EXPAND
)
369 p
.SetAutoLayout(True)
372 ed
.SetText(demoText
+ open('Main.py').read())
376 # line numbers in the margin
377 ed
.SetMarginType(1, stc
.STC_MARGIN_NUMBER
)
378 ed
.SetMarginWidth(1, 25)
384 #----------------------------------------------------------------------
389 Once again, no docs yet. <b>Sorry.</b> But <a href="data/stc.h.html">this</a>
390 and <a href="http://www.scintilla.org/ScintillaDoc.html">this</a> should
396 if __name__
== '__main__':
399 run
.main(['', os
.path
.basename(sys
.argv
[0])] + sys
.argv
[1:])
405 #----------------------------------------------------------------------
406 #----------------------------------------------------------------------