2
import wx.lib.colourselect as csel
10
dirName = os.path.dirname(os.path.abspath(__file__))
12
dirName = os.path.dirname(os.path.abspath(sys.argv[0]))
14
sys.path.append(os.path.split(dirName)[0])
17
from agw import rulerctrl as RC
18
except ImportError: # if it's not there locally, try the wxPython lib.
19
import wx.lib.agw.rulerctrl as RC
23
if wx.Platform == '__WXMSW__':
24
faces = { 'times': 'Times New Roman',
25
'mono' : 'Courier New',
27
'other': 'Courier New',
31
elif wx.Platform == '__WXMAC__':
32
faces = { 'times': 'Times New Roman',
33
'mono' : 'Courier New',
35
'other': 'Comic Sans MS',
40
faces = { 'times': 'Times',
43
'other': 'new century schoolbook',
48
#----------------------------------------------------------------------
49
class PythonSTC(stc.StyledTextCtrl):
51
def __init__(self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition,
52
size=wx.DefaultSize, style=0):
54
stc.StyledTextCtrl.__init__(self, parent, id, pos, size, style)
56
self.SetReadOnly(True)
57
self.SetLexer(stc.STC_LEX_PYTHON)
58
self.SetKeyWords(0, " ".join(keyword.kwlist))
60
self.SetProperty("fold", "1")
61
self.SetProperty("tab.timmy.whinge.level", "1")
63
self.SetViewWhiteSpace(False)
64
self.SetEdgeColumn(80)
65
self.SetMarginWidth(0, 0)
66
self.SetMarginWidth(1, 5)
67
self.SetMarginWidth(2, 5)
68
self.SetScrollWidth(800)
70
# Make some styles, The lexer defines what each style is used for, we
71
# just have to define what each style looks like. This set is adapted from
72
# Scintilla sample property files.
74
# Global default styles for all languages
75
self.StyleSetSpec(stc.STC_STYLE_DEFAULT, "face:%(helv)s,size:%(size)d" % faces)
76
self.StyleClearAll() # Reset all to be like the default
78
# Global default styles for all languages
79
self.StyleSetSpec(stc.STC_STYLE_DEFAULT, "face:%(helv)s,size:%(size)d" % faces)
80
self.StyleSetSpec(stc.STC_STYLE_CONTROLCHAR, "face:%(other)s" % faces)
81
self.StyleSetSpec(stc.STC_STYLE_BRACELIGHT, "fore:#FFFFFF,back:#0000FF,bold")
82
self.StyleSetSpec(stc.STC_STYLE_BRACEBAD, "fore:#000000,back:#FF0000,bold")
86
self.StyleSetSpec(stc.STC_P_DEFAULT, "fore:#000000,face:%(helv)s,size:%(size)d" % faces)
88
self.StyleSetSpec(stc.STC_P_COMMENTLINE, "fore:#007F00,face:%(other)s,size:%(size)d" % faces)
90
self.StyleSetSpec(stc.STC_P_NUMBER, "fore:#007F7F,size:%(size)d" % faces)
92
self.StyleSetSpec(stc.STC_P_STRING, "fore:#7F007F,face:%(helv)s,size:%(size)d" % faces)
93
# Single quoted string
94
self.StyleSetSpec(stc.STC_P_CHARACTER, "fore:#7F007F,face:%(helv)s,size:%(size)d" % faces)
96
self.StyleSetSpec(stc.STC_P_WORD, "fore:#00007F,bold,size:%(size)d" % faces)
98
self.StyleSetSpec(stc.STC_P_TRIPLE, "fore:#7F0000,size:%(size)d" % faces)
99
# Triple double quotes
100
self.StyleSetSpec(stc.STC_P_TRIPLEDOUBLE, "fore:#7F0000,size:%(size)d" % faces)
101
# Class name definition
102
self.StyleSetSpec(stc.STC_P_CLASSNAME, "fore:#0000FF,bold,underline,size:%(size)d" % faces)
103
# Function or method name definition
104
self.StyleSetSpec(stc.STC_P_DEFNAME, "fore:#007F7F,bold,size:%(size)d" % faces)
106
self.StyleSetSpec(stc.STC_P_OPERATOR, "bold,size:%(size)d" % faces)
108
self.StyleSetSpec(stc.STC_P_IDENTIFIER, "fore:#000000,face:%(helv)s,size:%(size)d" % faces)
110
self.StyleSetSpec(stc.STC_P_COMMENTBLOCK, "fore:#7F7F7F,size:%(size)d" % faces)
111
# End of line where string is not closed
112
self.StyleSetSpec(stc.STC_P_STRINGEOL, "fore:#000000,face:%(mono)s,back:#E0C0E0,eol,size:%(size)d" % faces)
114
self.SetCaretForeground("BLUE")
117
# Some methods to make it compatible with how the wxTextCtrl is used
118
def SetValue(self, value):
120
value = value.decode('iso8859_1')
122
self.SetReadOnly(False)
124
self.SetReadOnly(True)
127
class RulerCtrlDemo(wx.Frame):
129
def __init__(self, parent, log):
131
wx.Frame.__init__(self, parent)
132
self.panel = wx.Panel(self, -1)
134
statusbar = self.CreateStatusBar(2, wx.ST_SIZEGRIP)
135
statusbar.SetStatusWidths([-2, -1])
137
statusbar_fields = [("RulerCtrl wxPython Demo, Andrea Gavana @ 03 Nov 2006"),
138
("Welcome To wxPython!")]
140
for i in range(len(statusbar_fields)):
141
statusbar.SetStatusText(statusbar_fields[i], i)
146
self.SetIcon(images.Mondrian.GetIcon())
147
sizex = wx.SystemSettings_GetMetric(wx.SYS_SCREEN_X)
148
sizey = wx.SystemSettings_GetMetric(wx.SYS_SCREEN_Y)
150
self.SetSize((3*sizex/4, 3*sizey/4))
152
self.CenterOnScreen()
155
def LayoutItems(self):
157
self.stc = PythonSTC(self.panel, -1)
159
fid = open("RulerCtrl.py", "rt")
161
fid = open("agw/RulerCtrl.py", "rt")
165
self.stc.SetValue(text)
167
self.ruler1 = RC.RulerCtrl(self.panel, -1, orient=wx.HORIZONTAL, style=wx.SUNKEN_BORDER)
168
self.ruler2 = RC.RulerCtrl(self.panel, -1, orient=wx.VERTICAL, style=wx.SUNKEN_BORDER)
169
self.ruler3 = RC.RulerCtrl(self.panel, -1, orient=wx.HORIZONTAL)
171
self.rightbottomsizer_staticbox1 = wx.StaticBox(self.panel, -1, "Options")
172
self.rightbottomsizer_staticbox2 = wx.StaticBox(self.panel, -1, "Messages")
174
self.rulerformat = wx.ComboBox(self.panel, -1, choices=["Integer", "Real", "Time", "LinearDB"],
175
style=wx.CB_DROPDOWN|wx.CB_READONLY)
176
self.flip = wx.CheckBox(self.panel, -1, "Flip")
177
self.logscale = wx.CheckBox(self.panel, -1, "Log Scale")
178
self.labelminor = wx.CheckBox(self.panel, -1, "Label")
179
self.alwayslabel = wx.CheckBox(self.panel, -1, "Always Label")
180
self.csel1 = csel.ColourSelect(self.panel, -1, "Choose...", wx.WHITE)
181
self.csel2 = csel.ColourSelect(self.panel, -1, "Choose...", wx.BLACK)
182
self.csel3 = csel.ColourSelect(self.panel, -1, "Choose...", wx.BLACK)
183
self.messages = wx.TextCtrl(self.panel, -1, "Here You'll See GUI Messages\n",
184
style=wx.TE_READONLY|wx.TE_MULTILINE)
189
self.Bind(wx.EVT_COMBOBOX, self.OnComboFormat, self.rulerformat)
190
self.Bind(wx.EVT_CHECKBOX, self.OnFlip, self.flip)
191
self.Bind(wx.EVT_CHECKBOX, self.OnLogScale, self.logscale)
192
self.Bind(wx.EVT_CHECKBOX, self.OnLabelMinor, self.labelminor)
193
self.Bind(wx.EVT_CHECKBOX, self.OnAlwaysLabel, self.alwayslabel)
194
self.Bind(csel.EVT_COLOURSELECT, self.OnBackgroundColour, self.csel1)
195
self.Bind(csel.EVT_COLOURSELECT, self.OnTickColour, self.csel2)
196
self.Bind(csel.EVT_COLOURSELECT, self.OnLabelColour, self.csel3)
197
self.Bind(wx.EVT_SIZE, self.OnSize)
199
self.Bind(RC.EVT_INDICATOR_CHANGING, self.OnIndicatorChanging, id=103)
200
self.Bind(RC.EVT_INDICATOR_CHANGED, self.OnIndicatorChanged, id=101, id2=104)
203
def SetProperties(self):
205
self.SetTitle("RulerCtrl wxPython Demo ;-)")
206
self.rulerformat.SetSelection(0)
207
self.alwayslabel.SetValue(1)
209
self.ruler1.SetFormat(RC.IntFormat)
210
self.ruler2.SetFormat(RC.IntFormat)
211
self.ruler3.SetFormat(RC.IntFormat)
213
self.ruler3.SetRange(1, 70)
214
self.ruler3.SetLabelEdges(True)
216
self.ruler1.LabelMinor(True)
217
self.ruler2.LabelMinor(True)
218
self.ruler3.LabelMinor(False)
220
self.ruler1.AddIndicator(101, 2)
221
self.ruler2.AddIndicator(102, 2)
222
self.ruler2.AddIndicator(103, 4)
223
self.ruler3.AddIndicator(104, 50)
225
self.ruler1.SetDrawingParent(self.stc)
226
self.ruler2.SetDrawingParent(self.stc)
231
bottomsizer1 = wx.StaticBoxSizer(self.rightbottomsizer_staticbox1, wx.VERTICAL)
232
bottomsizer2 = wx.StaticBoxSizer(self.rightbottomsizer_staticbox2, wx.VERTICAL)
234
mainsizer = wx.BoxSizer(wx.HORIZONTAL)
235
bottomrightsizer = wx.BoxSizer(wx.VERTICAL)
236
gridsizer = wx.FlexGridSizer(8, 2, 10, 10)
237
leftsizer = wx.BoxSizer(wx.VERTICAL)
238
bottomleftsizer = wx.BoxSizer(wx.HORIZONTAL)
239
topsizer = wx.BoxSizer(wx.HORIZONTAL)
241
leftsizer.Add((20, 20), 0, wx.ADJUST_MINSIZE, 0)
242
topsizer.Add((39, 0), 0, wx.ADJUST_MINSIZE, 0)
243
topsizer.Add(self.ruler1, 1, wx.EXPAND, 0)
244
leftsizer.Add(topsizer, 0, wx.EXPAND, 0)
246
bottomleftsizer.Add((10, 0))
247
bottomleftsizer.Add(self.ruler2, 0, wx.EXPAND, 0)
248
bottomleftsizer.Add(self.stc, 1, wx.EXPAND, 0)
249
leftsizer.Add(bottomleftsizer, 1, wx.EXPAND, 0)
250
mainsizer.Add(leftsizer, 3, wx.EXPAND, 0)
252
mainsizer.Add((10, 0))
253
bottomrightsizer.Add(self.ruler3, 0, wx.EXPAND | wx.ALL, 20)
255
label_1 = wx.StaticText(self.panel, -1, "RulerCtrl Format: ")
256
gridsizer.Add(label_1, 0, wx.ALIGN_CENTER_VERTICAL)
257
gridsizer.Add(self.rulerformat, 0, wx.ALL)
258
label_2 = wx.StaticText(self.panel, -1, "Set Flipping: ")
259
gridsizer.Add(label_2, 0, wx.ALIGN_CENTER_VERTICAL)
260
gridsizer.Add(self.flip, 0, wx.ALIGN_CENTER_VERTICAL)
261
label_3 = wx.StaticText(self.panel, -1, "Set Logarithmic Scale: ")
262
gridsizer.Add(label_3, 0, wx.ALIGN_CENTER_VERTICAL)
263
gridsizer.Add(self.logscale, 0, wx.ADJUST_MINSIZE, 5)
264
label_5 = wx.StaticText(self.panel, -1, "Label Minor Labels: ")
265
gridsizer.Add(label_5, 0, wx.ALIGN_CENTER_VERTICAL)
266
gridsizer.Add(self.labelminor, 0, wx.ALIGN_CENTER_VERTICAL)
267
label_6 = wx.StaticText(self.panel, -1, "Always Label End Edges: ")
268
gridsizer.Add(label_6, 0, wx.ADJUST_MINSIZE, 5)
269
gridsizer.Add(self.alwayslabel, 0, wx.ALIGN_CENTER_VERTICAL|wx.ADJUST_MINSIZE, 6)
270
label_7 = wx.StaticText(self.panel, -1, "Change Background Colour: ")
271
gridsizer.Add(label_7, 0, wx.ALIGN_CENTER_VERTICAL)
272
gridsizer.Add(self.csel1, 0, wx.ALIGN_CENTER_VERTICAL, 0)
273
label_8 = wx.StaticText(self.panel, -1, "Change Tick Colour: ")
274
gridsizer.Add(label_8, 0, wx.ALIGN_CENTER_VERTICAL)
275
gridsizer.Add(self.csel2, 0, wx.ALIGN_CENTER_VERTICAL, 0)
276
label_9 = wx.StaticText(self.panel, -1, "Change Label Colour: ")
277
gridsizer.Add(label_9, 0, wx.ALIGN_CENTER_VERTICAL)
278
gridsizer.Add(self.csel3, 0, wx.ALIGN_CENTER_VERTICAL, 0)
280
bottomsizer1.Add(gridsizer, 1, wx.EXPAND)
281
bottomrightsizer.Add(bottomsizer1, 1, wx.EXPAND|wx.LEFT|wx.RIGHT, 20)
282
bottomrightsizer.Add((0, 10))
283
bottomsizer2.Add(self.messages, 1, wx.EXPAND | wx.ALL, 5)
284
bottomrightsizer.Add(bottomsizer2, 1, wx.EXPAND|wx.LEFT|wx.RIGHT, 20)
285
bottomrightsizer.Add((0, 10))
287
mainsizer.Add(bottomrightsizer, 2, wx.EXPAND, 0)
288
self.panel.SetSizer(mainsizer)
289
mainsizer.Fit(self.panel)
290
mainsizer.SetSizeHints(self.panel)
292
framesizer = wx.BoxSizer(wx.VERTICAL)
293
framesizer.Add(self.panel, 1, wx.EXPAND)
294
self.SetSizer(framesizer)
298
def OnIndicatorChanging(self, event):
300
# Show how to block a changing indicator
301
self.Write("NoNoNoNoNo! You Can't Change My Value!")
305
def OnIndicatorChanged(self, event):
307
self.Write("New Indicator Value Is: %0.2f"%event.GetValue())
311
def OnSize(self, event):
315
# Try to emulate the rulers inside a text editor
316
wx.CallAfter(self.SizeRulers)
319
def Write(self, text):
321
self.messages.AppendText(text + "\n")
324
def SizeRulers(self):
327
width, height = self.stc.GetSize()
328
dc.SelectObject(wx.EmptyBitmap(width, height))
329
widthMM, heightMM = dc.GetSizeMM()
330
dc.SelectObject(wx.NullBitmap)
332
self.ruler1.SetRange(0, widthMM/10)
333
self.ruler2.SetRange(0, heightMM/10)
336
def OnComboFormat(self, event):
338
self.ruler3.SetFormat(event.GetSelection()+1)
342
def OnFlip(self, event):
344
self.ruler3.SetFlip(event.IsChecked())
348
def OnLogScale(self, event):
350
self.ruler3.SetLog(event.IsChecked())
354
def OnLabelMinor(self, event):
356
self.ruler3.LabelMinor(event.IsChecked())
360
def OnAlwaysLabel(self, event):
362
self.ruler3.SetLabelEdges(event.IsChecked())
366
def OnBackgroundColour(self, event):
368
self.ruler3.SetBackgroundColour(event.GetValue())
371
def OnTickColour(self, event):
373
self.ruler3.SetTickPenColour(event.GetValue())
376
def OnLabelColour(self, event):
378
self.ruler3.SetLabelColour(event.GetValue())
381
def CreateMenu(self):
383
menuBar = wx.MenuBar(wx.MB_DOCKABLE)
387
item = wx.MenuItem(fileMenu, wx.ID_ANY, "E&xit")
388
self.Bind(wx.EVT_MENU, self.OnQuit, item)
389
fileMenu.AppendItem(item)
391
item = wx.MenuItem(helpMenu, wx.ID_ANY, "About")
392
self.Bind(wx.EVT_MENU, self.OnAbout, item)
393
helpMenu.AppendItem(item)
395
menuBar.Append(fileMenu, "&File")
396
menuBar.Append(helpMenu, "&Help")
398
self.SetMenuBar(menuBar)
401
def OnQuit(self, event):
406
def OnAbout(self, event):
408
msg = "This Is The About Dialog Of The RulerCtrl Demo.\n\n" + \
409
"Author: Andrea Gavana @ 03 Nov 2006\n\n" + \
410
"Please Report Any Bug/Requests Of Improvements\n" + \
411
"To Me At The Following Adresses:\n\n" + \
412
"andrea.gavana@gmail.com\n" + "andrea.gavana@maerskoil.com\n\n" + \
413
"Welcome To wxPython " + wx.VERSION_STRING + "!!"
415
dlg = wx.MessageDialog(self, msg, "RulerCtrl wxPython Demo",
416
wx.OK | wx.ICON_INFORMATION)
421
#---------------------------------------------------------------------------
424
class TestPanel(wx.Panel):
425
def __init__(self, parent, log):
427
wx.Panel.__init__(self, parent, -1)
429
b = wx.Button(self, -1, " Test RulerCtrl ", (50,50))
430
self.Bind(wx.EVT_BUTTON, self.OnButton, b)
433
def OnButton(self, evt):
434
self.win = RulerCtrlDemo(self, self.log)
437
#----------------------------------------------------------------------
439
def runTest(frame, nb, log):
440
win = TestPanel(nb, log)
443
#----------------------------------------------------------------------
446
overview = RC.__doc__
449
if __name__ == '__main__':
452
run.main(['', os.path.basename(sys.argv[0])] + sys.argv[1:])