~brian-sidebotham/wxwidgets-cmake/wxpython-2.9.4

« back to all changes in this revision

Viewing changes to wxPython/demo/agw/RulerCtrl.py

  • Committer: Brian Sidebotham
  • Date: 2013-08-03 14:30:08 UTC
  • Revision ID: brian.sidebotham@gmail.com-20130803143008-c7806tkych1tp6fc
Initial import into Bazaar

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
import wx
 
2
import wx.lib.colourselect as csel
 
3
import wx.stc as stc
 
4
import keyword
 
5
 
 
6
import os
 
7
import sys
 
8
 
 
9
try:
 
10
    dirName = os.path.dirname(os.path.abspath(__file__))
 
11
except:
 
12
    dirName = os.path.dirname(os.path.abspath(sys.argv[0]))
 
13
 
 
14
sys.path.append(os.path.split(dirName)[0])
 
15
 
 
16
try:
 
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
 
20
 
 
21
import images
 
22
 
 
23
if wx.Platform == '__WXMSW__':
 
24
    faces = { 'times': 'Times New Roman',
 
25
              'mono' : 'Courier New',
 
26
              'helv' : 'Arial',
 
27
              'other': 'Courier New',
 
28
              'size' : 9,
 
29
              'size2': 7,
 
30
              }
 
31
elif wx.Platform == '__WXMAC__':
 
32
    faces = { 'times': 'Times New Roman',
 
33
              'mono' : 'Courier New',
 
34
              'helv' : 'Arial',
 
35
              'other': 'Comic Sans MS',
 
36
              'size' : 12,
 
37
              'size2': 10,
 
38
              }
 
39
else:
 
40
    faces = { 'times': 'Times',
 
41
              'mono' : 'Courier',
 
42
              'helv' : 'Helvetica',
 
43
              'other': 'new century schoolbook',
 
44
              'size' : 12,
 
45
              'size2': 10,
 
46
              }
 
47
 
 
48
#----------------------------------------------------------------------
 
49
class PythonSTC(stc.StyledTextCtrl):
 
50
 
 
51
    def __init__(self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition,
 
52
                 size=wx.DefaultSize, style=0):
 
53
 
 
54
        stc.StyledTextCtrl.__init__(self, parent, id, pos, size, style)
 
55
 
 
56
        self.SetReadOnly(True)
 
57
        self.SetLexer(stc.STC_LEX_PYTHON)
 
58
        self.SetKeyWords(0, " ".join(keyword.kwlist))
 
59
 
 
60
        self.SetProperty("fold", "1")
 
61
        self.SetProperty("tab.timmy.whinge.level", "1")
 
62
 
 
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)
 
69
 
 
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.
 
73
 
 
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
 
77
 
 
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")
 
83
 
 
84
        # Python styles
 
85
        # Default 
 
86
        self.StyleSetSpec(stc.STC_P_DEFAULT, "fore:#000000,face:%(helv)s,size:%(size)d" % faces)
 
87
        # Comments
 
88
        self.StyleSetSpec(stc.STC_P_COMMENTLINE, "fore:#007F00,face:%(other)s,size:%(size)d" % faces)
 
89
        # Number
 
90
        self.StyleSetSpec(stc.STC_P_NUMBER, "fore:#007F7F,size:%(size)d" % faces)
 
91
        # String
 
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)
 
95
        # Keyword
 
96
        self.StyleSetSpec(stc.STC_P_WORD, "fore:#00007F,bold,size:%(size)d" % faces)
 
97
        # Triple quotes
 
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)
 
105
        # Operators
 
106
        self.StyleSetSpec(stc.STC_P_OPERATOR, "bold,size:%(size)d" % faces)
 
107
        # Identifiers
 
108
        self.StyleSetSpec(stc.STC_P_IDENTIFIER, "fore:#000000,face:%(helv)s,size:%(size)d" % faces)
 
109
        # Comment-blocks
 
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)
 
113
 
 
114
        self.SetCaretForeground("BLUE")
 
115
 
 
116
 
 
117
    # Some methods to make it compatible with how the wxTextCtrl is used
 
118
    def SetValue(self, value):
 
119
        if wx.USE_UNICODE:
 
120
            value = value.decode('iso8859_1')
 
121
 
 
122
        self.SetReadOnly(False)
 
123
        self.SetText(value)
 
124
        self.SetReadOnly(True)
 
125
 
 
126
 
 
127
class RulerCtrlDemo(wx.Frame):
 
128
 
 
129
    def __init__(self, parent, log):
 
130
 
 
131
        wx.Frame.__init__(self, parent)
 
132
        self.panel = wx.Panel(self, -1)
 
133
 
 
134
        statusbar = self.CreateStatusBar(2, wx.ST_SIZEGRIP)
 
135
        statusbar.SetStatusWidths([-2, -1])
 
136
        # statusbar fields
 
137
        statusbar_fields = [("RulerCtrl wxPython Demo, Andrea Gavana @ 03 Nov 2006"),
 
138
                            ("Welcome To wxPython!")]
 
139
 
 
140
        for i in range(len(statusbar_fields)):
 
141
            statusbar.SetStatusText(statusbar_fields[i], i)
 
142
 
 
143
        self.CreateMenu()
 
144
        self.LayoutItems()
 
145
 
 
146
        self.SetIcon(images.Mondrian.GetIcon())
 
147
        sizex = wx.SystemSettings_GetMetric(wx.SYS_SCREEN_X)
 
148
        sizey = wx.SystemSettings_GetMetric(wx.SYS_SCREEN_Y)
 
149
 
 
150
        self.SetSize((3*sizex/4, 3*sizey/4))
 
151
        self.SendSizeEvent()
 
152
        self.CenterOnScreen()
 
153
 
 
154
 
 
155
    def LayoutItems(self):
 
156
 
 
157
        self.stc = PythonSTC(self.panel, -1)
 
158
        try:
 
159
            fid = open("RulerCtrl.py", "rt")
 
160
        except:
 
161
            fid = open("agw/RulerCtrl.py", "rt")
 
162
 
 
163
        text = fid.read()
 
164
        fid.close()
 
165
        self.stc.SetValue(text)
 
166
 
 
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)
 
170
 
 
171
        self.rightbottomsizer_staticbox1 = wx.StaticBox(self.panel, -1, "Options")
 
172
        self.rightbottomsizer_staticbox2 = wx.StaticBox(self.panel, -1, "Messages")
 
173
 
 
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)
 
185
 
 
186
        self.SetProperties()
 
187
        self.DoLayout()
 
188
 
 
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)
 
198
 
 
199
        self.Bind(RC.EVT_INDICATOR_CHANGING, self.OnIndicatorChanging, id=103)
 
200
        self.Bind(RC.EVT_INDICATOR_CHANGED, self.OnIndicatorChanged, id=101, id2=104)
 
201
 
 
202
 
 
203
    def SetProperties(self):
 
204
 
 
205
        self.SetTitle("RulerCtrl wxPython Demo ;-)")
 
206
        self.rulerformat.SetSelection(0)
 
207
        self.alwayslabel.SetValue(1)
 
208
 
 
209
        self.ruler1.SetFormat(RC.IntFormat)
 
210
        self.ruler2.SetFormat(RC.IntFormat)
 
211
        self.ruler3.SetFormat(RC.IntFormat)
 
212
 
 
213
        self.ruler3.SetRange(1, 70)
 
214
        self.ruler3.SetLabelEdges(True)
 
215
 
 
216
        self.ruler1.LabelMinor(True)
 
217
        self.ruler2.LabelMinor(True)
 
218
        self.ruler3.LabelMinor(False)
 
219
 
 
220
        self.ruler1.AddIndicator(101, 2)
 
221
        self.ruler2.AddIndicator(102, 2)
 
222
        self.ruler2.AddIndicator(103, 4)
 
223
        self.ruler3.AddIndicator(104, 50)
 
224
 
 
225
        self.ruler1.SetDrawingParent(self.stc)
 
226
        self.ruler2.SetDrawingParent(self.stc)
 
227
 
 
228
 
 
229
    def DoLayout(self):
 
230
 
 
231
        bottomsizer1 = wx.StaticBoxSizer(self.rightbottomsizer_staticbox1, wx.VERTICAL)
 
232
        bottomsizer2 = wx.StaticBoxSizer(self.rightbottomsizer_staticbox2, wx.VERTICAL)
 
233
 
 
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)
 
240
 
 
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)
 
245
 
 
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)
 
251
 
 
252
        mainsizer.Add((10, 0))
 
253
        bottomrightsizer.Add(self.ruler3, 0, wx.EXPAND | wx.ALL, 20)
 
254
 
 
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)
 
279
 
 
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))
 
286
 
 
287
        mainsizer.Add(bottomrightsizer, 2, wx.EXPAND, 0)
 
288
        self.panel.SetSizer(mainsizer)
 
289
        mainsizer.Fit(self.panel)
 
290
        mainsizer.SetSizeHints(self.panel)
 
291
 
 
292
        framesizer = wx.BoxSizer(wx.VERTICAL)
 
293
        framesizer.Add(self.panel, 1, wx.EXPAND)
 
294
        self.SetSizer(framesizer)
 
295
        framesizer.Layout()
 
296
 
 
297
 
 
298
    def OnIndicatorChanging(self, event):
 
299
 
 
300
        # Show how to block a changing indicator
 
301
        self.Write("NoNoNoNoNo! You Can't Change My Value!")
 
302
        return
 
303
 
 
304
 
 
305
    def OnIndicatorChanged(self, event):
 
306
 
 
307
        self.Write("New Indicator Value Is: %0.2f"%event.GetValue())
 
308
        event.Skip()
 
309
 
 
310
 
 
311
    def OnSize(self, event):
 
312
 
 
313
        event.Skip()
 
314
 
 
315
        # Try to emulate the rulers inside a text editor        
 
316
        wx.CallAfter(self.SizeRulers)
 
317
 
 
318
 
 
319
    def Write(self, text):
 
320
 
 
321
        self.messages.AppendText(text + "\n")
 
322
 
 
323
 
 
324
    def SizeRulers(self):
 
325
 
 
326
        dc = wx.MemoryDC()        
 
327
        width, height = self.stc.GetSize()
 
328
        dc.SelectObject(wx.EmptyBitmap(width, height))
 
329
        widthMM, heightMM = dc.GetSizeMM()
 
330
        dc.SelectObject(wx.NullBitmap)
 
331
 
 
332
        self.ruler1.SetRange(0, widthMM/10)
 
333
        self.ruler2.SetRange(0, heightMM/10)
 
334
 
 
335
 
 
336
    def OnComboFormat(self, event):
 
337
 
 
338
        self.ruler3.SetFormat(event.GetSelection()+1)
 
339
        event.Skip()
 
340
 
 
341
 
 
342
    def OnFlip(self, event):
 
343
 
 
344
        self.ruler3.SetFlip(event.IsChecked())
 
345
        event.Skip()
 
346
 
 
347
 
 
348
    def OnLogScale(self, event):
 
349
 
 
350
        self.ruler3.SetLog(event.IsChecked())
 
351
        event.Skip()
 
352
 
 
353
 
 
354
    def OnLabelMinor(self, event): 
 
355
 
 
356
        self.ruler3.LabelMinor(event.IsChecked())
 
357
        event.Skip()
 
358
 
 
359
 
 
360
    def OnAlwaysLabel(self, event):
 
361
 
 
362
        self.ruler3.SetLabelEdges(event.IsChecked())
 
363
        event.Skip()
 
364
 
 
365
 
 
366
    def OnBackgroundColour(self, event):
 
367
 
 
368
        self.ruler3.SetBackgroundColour(event.GetValue())
 
369
 
 
370
 
 
371
    def OnTickColour(self, event):
 
372
 
 
373
        self.ruler3.SetTickPenColour(event.GetValue())        
 
374
 
 
375
 
 
376
    def OnLabelColour(self, event):
 
377
 
 
378
        self.ruler3.SetLabelColour(event.GetValue())        
 
379
 
 
380
 
 
381
    def CreateMenu(self):
 
382
 
 
383
        menuBar = wx.MenuBar(wx.MB_DOCKABLE)
 
384
        fileMenu = wx.Menu()
 
385
        helpMenu = wx.Menu()
 
386
 
 
387
        item = wx.MenuItem(fileMenu, wx.ID_ANY, "E&xit")
 
388
        self.Bind(wx.EVT_MENU, self.OnQuit, item)
 
389
        fileMenu.AppendItem(item)
 
390
 
 
391
        item = wx.MenuItem(helpMenu, wx.ID_ANY, "About")
 
392
        self.Bind(wx.EVT_MENU, self.OnAbout, item)
 
393
        helpMenu.AppendItem(item)
 
394
 
 
395
        menuBar.Append(fileMenu, "&File")
 
396
        menuBar.Append(helpMenu, "&Help")
 
397
 
 
398
        self.SetMenuBar(menuBar)
 
399
 
 
400
 
 
401
    def OnQuit(self, event):
 
402
 
 
403
        self.Destroy()
 
404
 
 
405
 
 
406
    def OnAbout(self, event):
 
407
 
 
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 + "!!"
 
414
 
 
415
        dlg = wx.MessageDialog(self, msg, "RulerCtrl wxPython Demo",
 
416
                               wx.OK | wx.ICON_INFORMATION)
 
417
        dlg.ShowModal()
 
418
        dlg.Destroy()
 
419
 
 
420
 
 
421
#---------------------------------------------------------------------------
 
422
 
 
423
 
 
424
class TestPanel(wx.Panel):
 
425
    def __init__(self, parent, log):
 
426
        self.log = log
 
427
        wx.Panel.__init__(self, parent, -1)
 
428
 
 
429
        b = wx.Button(self, -1, " Test RulerCtrl ", (50,50))
 
430
        self.Bind(wx.EVT_BUTTON, self.OnButton, b)
 
431
 
 
432
 
 
433
    def OnButton(self, evt):
 
434
        self.win = RulerCtrlDemo(self, self.log)
 
435
        self.win.Show(True)
 
436
 
 
437
#----------------------------------------------------------------------
 
438
 
 
439
def runTest(frame, nb, log):
 
440
    win = TestPanel(nb, log)
 
441
    return win
 
442
 
 
443
#----------------------------------------------------------------------
 
444
 
 
445
 
 
446
overview = RC.__doc__
 
447
 
 
448
 
 
449
if __name__ == '__main__':
 
450
    import sys,os
 
451
    import run
 
452
    run.main(['', os.path.basename(sys.argv[0])] + sys.argv[1:])
 
453