1#!/usr/bin/env python
2#   Tags: phoenix-port, py3-port
3
4import os
5import string
6import random
7
8import wx
9import wx.lib.colourselect as csel
10import wx.lib.colourutils as cutils
11
12import sys
13
14from six import BytesIO
15
16try:
17    dirName = os.path.dirname(os.path.abspath(__file__))
18except:
19    dirName = os.path.dirname(os.path.abspath(sys.argv[0]))
20
21sys.path.append(os.path.split(dirName)[0])
22
23try:
24    from agw import hypertreelist as HTL
25    bitmapDir = "bitmaps/"
26except ImportError: # if it's not there locally, try the wxPython lib.
27    import wx.lib.agw.hypertreelist as HTL
28    bitmapDir = "agw/bitmaps/"
29
30import ListCtrl
31import images
32
33
34penstyle = ["wx.PENSTYLE_SOLID", "wx.PENSTYLE_TRANSPARENT", "wx.PENSTYLE_DOT",
35            "wx.PENSTYLE_LONG_DASH", "wx.PENSTYLE_DOT_DASH", "wx.PENSTYLE_USER_DASH",
36            "wx.PENSTYLE_BDIAGONAL_HATCH", "wx.PENSTYLE_CROSSDIAG_HATCH",
37            "wx.PENSTYLE_FDIAGONAL_HATCH", "wx.PENSTYLE_CROSS_HATCH",
38            "wx.PENSTYLE_HORIZONTAL_HATCH", "wx.PENSTYLE_VERTICAL_HATCH"]
39
40ArtIDs = [ "None",
41           "wx.ART_ADD_BOOKMARK",
42           "wx.ART_DEL_BOOKMARK",
43           "wx.ART_HELP_SIDE_PANEL",
44           "wx.ART_HELP_SETTINGS",
45           "wx.ART_HELP_BOOK",
46           "wx.ART_HELP_FOLDER",
47           "wx.ART_HELP_PAGE",
48           "wx.ART_GO_BACK",
49           "wx.ART_GO_FORWARD",
50           "wx.ART_GO_UP",
51           "wx.ART_GO_DOWN",
52           "wx.ART_GO_TO_PARENT",
53           "wx.ART_GO_HOME",
54           "wx.ART_FILE_OPEN",
55           "wx.ART_PRINT",
56           "wx.ART_HELP",
57           "wx.ART_TIP",
58           "wx.ART_REPORT_VIEW",
59           "wx.ART_LIST_VIEW",
60           "wx.ART_NEW_DIR",
61           "wx.ART_HARDDISK",
62           "wx.ART_FLOPPY",
63           "wx.ART_CDROM",
64           "wx.ART_REMOVABLE",
65           "wx.ART_FOLDER",
66           "wx.ART_FOLDER_OPEN",
67           "wx.ART_GO_DIR_UP",
68           "wx.ART_EXECUTABLE_FILE",
69           "wx.ART_NORMAL_FILE",
70           "wx.ART_TICK_MARK",
71           "wx.ART_CROSS_MARK",
72           "wx.ART_ERROR",
73           "wx.ART_QUESTION",
74           "wx.ART_WARNING",
75           "wx.ART_INFORMATION",
76           "wx.ART_MISSING_IMAGE",
77           "SmileBitmap"
78           ]
79
80keyMap = {
81    wx.WXK_BACK : "WXK_BACK",
82    wx.WXK_TAB : "WXK_TAB",
83    wx.WXK_RETURN : "WXK_RETURN",
84    wx.WXK_ESCAPE : "WXK_ESCAPE",
85    wx.WXK_SPACE : "WXK_SPACE",
86    wx.WXK_DELETE : "WXK_DELETE",
87    wx.WXK_START : "WXK_START",
88    wx.WXK_LBUTTON : "WXK_LBUTTON",
89    wx.WXK_RBUTTON : "WXK_RBUTTON",
90    wx.WXK_CANCEL : "WXK_CANCEL",
91    wx.WXK_MBUTTON : "WXK_MBUTTON",
92    wx.WXK_CLEAR : "WXK_CLEAR",
93    wx.WXK_SHIFT : "WXK_SHIFT",
94    wx.WXK_ALT : "WXK_ALT",
95    wx.WXK_CONTROL : "WXK_CONTROL",
96    wx.WXK_MENU : "WXK_MENU",
97    wx.WXK_PAUSE : "WXK_PAUSE",
98    wx.WXK_CAPITAL : "WXK_CAPITAL",
99    wx.WXK_END : "WXK_END",
100    wx.WXK_HOME : "WXK_HOME",
101    wx.WXK_LEFT : "WXK_LEFT",
102    wx.WXK_UP : "WXK_UP",
103    wx.WXK_RIGHT : "WXK_RIGHT",
104    wx.WXK_DOWN : "WXK_DOWN",
105    wx.WXK_SELECT : "WXK_SELECT",
106    wx.WXK_PRINT : "WXK_PRINT",
107    wx.WXK_EXECUTE : "WXK_EXECUTE",
108    wx.WXK_SNAPSHOT : "WXK_SNAPSHOT",
109    wx.WXK_INSERT : "WXK_INSERT",
110    wx.WXK_HELP : "WXK_HELP",
111    wx.WXK_NUMPAD0 : "WXK_NUMPAD0",
112    wx.WXK_NUMPAD1 : "WXK_NUMPAD1",
113    wx.WXK_NUMPAD2 : "WXK_NUMPAD2",
114    wx.WXK_NUMPAD3 : "WXK_NUMPAD3",
115    wx.WXK_NUMPAD4 : "WXK_NUMPAD4",
116    wx.WXK_NUMPAD5 : "WXK_NUMPAD5",
117    wx.WXK_NUMPAD6 : "WXK_NUMPAD6",
118    wx.WXK_NUMPAD7 : "WXK_NUMPAD7",
119    wx.WXK_NUMPAD8 : "WXK_NUMPAD8",
120    wx.WXK_NUMPAD9 : "WXK_NUMPAD9",
121    wx.WXK_MULTIPLY : "WXK_MULTIPLY",
122    wx.WXK_ADD : "WXK_ADD",
123    wx.WXK_SEPARATOR : "WXK_SEPARATOR",
124    wx.WXK_SUBTRACT : "WXK_SUBTRACT",
125    wx.WXK_DECIMAL : "WXK_DECIMAL",
126    wx.WXK_DIVIDE : "WXK_DIVIDE",
127    wx.WXK_F1 : "WXK_F1",
128    wx.WXK_F2 : "WXK_F2",
129    wx.WXK_F3 : "WXK_F3",
130    wx.WXK_F4 : "WXK_F4",
131    wx.WXK_F5 : "WXK_F5",
132    wx.WXK_F6 : "WXK_F6",
133    wx.WXK_F7 : "WXK_F7",
134    wx.WXK_F8 : "WXK_F8",
135    wx.WXK_F9 : "WXK_F9",
136    wx.WXK_F10 : "WXK_F10",
137    wx.WXK_F11 : "WXK_F11",
138    wx.WXK_F12 : "WXK_F12",
139    wx.WXK_F13 : "WXK_F13",
140    wx.WXK_F14 : "WXK_F14",
141    wx.WXK_F15 : "WXK_F15",
142    wx.WXK_F16 : "WXK_F16",
143    wx.WXK_F17 : "WXK_F17",
144    wx.WXK_F18 : "WXK_F18",
145    wx.WXK_F19 : "WXK_F19",
146    wx.WXK_F20 : "WXK_F20",
147    wx.WXK_F21 : "WXK_F21",
148    wx.WXK_F22 : "WXK_F22",
149    wx.WXK_F23 : "WXK_F23",
150    wx.WXK_F24 : "WXK_F24",
151    wx.WXK_NUMLOCK : "WXK_NUMLOCK",
152    wx.WXK_SCROLL : "WXK_SCROLL",
153    wx.WXK_PAGEUP : "WXK_PAGEUP",
154    wx.WXK_PAGEDOWN : "WXK_PAGEDOWN",
155    wx.WXK_NUMPAD_SPACE : "WXK_NUMPAD_SPACE",
156    wx.WXK_NUMPAD_TAB : "WXK_NUMPAD_TAB",
157    wx.WXK_NUMPAD_ENTER : "WXK_NUMPAD_ENTER",
158    wx.WXK_NUMPAD_F1 : "WXK_NUMPAD_F1",
159    wx.WXK_NUMPAD_F2 : "WXK_NUMPAD_F2",
160    wx.WXK_NUMPAD_F3 : "WXK_NUMPAD_F3",
161    wx.WXK_NUMPAD_F4 : "WXK_NUMPAD_F4",
162    wx.WXK_NUMPAD_HOME : "WXK_NUMPAD_HOME",
163    wx.WXK_NUMPAD_LEFT : "WXK_NUMPAD_LEFT",
164    wx.WXK_NUMPAD_UP : "WXK_NUMPAD_UP",
165    wx.WXK_NUMPAD_RIGHT : "WXK_NUMPAD_RIGHT",
166    wx.WXK_NUMPAD_DOWN : "WXK_NUMPAD_DOWN",
167    wx.WXK_NUMPAD_PAGEUP : "WXK_NUMPAD_PAGEUP",
168    wx.WXK_NUMPAD_PAGEDOWN : "WXK_NUMPAD_PAGEDOWN",
169    wx.WXK_NUMPAD_END : "WXK_NUMPAD_END",
170    wx.WXK_NUMPAD_BEGIN : "WXK_NUMPAD_BEGIN",
171    wx.WXK_NUMPAD_INSERT : "WXK_NUMPAD_INSERT",
172    wx.WXK_NUMPAD_DELETE : "WXK_NUMPAD_DELETE",
173    wx.WXK_NUMPAD_EQUAL : "WXK_NUMPAD_EQUAL",
174    wx.WXK_NUMPAD_MULTIPLY : "WXK_NUMPAD_MULTIPLY",
175    wx.WXK_NUMPAD_ADD : "WXK_NUMPAD_ADD",
176    wx.WXK_NUMPAD_SEPARATOR : "WXK_NUMPAD_SEPARATOR",
177    wx.WXK_NUMPAD_SUBTRACT : "WXK_NUMPAD_SUBTRACT",
178    wx.WXK_NUMPAD_DECIMAL : "WXK_NUMPAD_DECIMAL",
179    wx.WXK_NUMPAD_DIVIDE : "WXK_NUMPAD_DIVIDE"
180    }
181
182
183#----------------------------------------------------------------------
184def GetMondrianData():
185    return \
186'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00 \x00\x00\x00 \x08\x06\x00\
187\x00\x00szz\xf4\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\x00\x00qID\
188ATX\x85\xed\xd6;\n\x800\x10E\xd1{\xc5\x8d\xb9r\x97\x16\x0b\xad$\x8a\x82:\x16\
189o\xda\x84pB2\x1f\x81Fa\x8c\x9c\x08\x04Z{\xcf\xa72\xbcv\xfa\xc5\x08 \x80r\x80\
190\xfc\xa2\x0e\x1c\xe4\xba\xfaX\x1d\xd0\xde]S\x07\x02\xd8>\xe1wa-`\x9fQ\xe9\
191\x86\x01\x04\x10\x00\\(Dk\x1b-\x04\xdc\x1d\x07\x14\x98;\x0bS\x7f\x7f\xf9\x13\
192\x04\x10@\xf9X\xbe\x00\xc9 \x14K\xc1<={\x00\x00\x00\x00IEND\xaeB`\x82'
193
194def GetMondrianBitmap():
195    return wx.Bitmap(GetMondrianImage())
196
197def GetMondrianImage():
198    stream = BytesIO(GetMondrianData())
199    return wx.Image(stream)
200
201def GetMondrianIcon():
202    icon = wx.Icon()
203    icon.CopyFromBitmap(GetMondrianBitmap())
204    return icon
205
206
207#----------------------------------------------------------------------
208def GetSmilesData():
209    return \
210'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\
211\x00\x00\x00\x1f\xf3\xffa\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\
212\x00\x02\x89IDAT8\x8dm\x93\xddK\x93a\x18\xc6\x7f\xef\xc7\xb3\xa6\xc3 aV\xcc\
213\xad\x99\x8d\\\x08\x11AAd\x91\x95\x85F\'\x9dD\x8d\xa8\xe9\xb6X\x87\xe1\x7f\
214\xd0A\xe2y\'\xe6I\x7f@\'!T\x96\'A\x10A\xf4!\xcc\xd1\xb7&DP \xba\xe5\xde\xd7\
215\xed\xea\xc0\xcdF\xf9\xc0u\xf2<\xcf\xc5}\xdf\xd7u\xddX\xb6\xc3\xbfH\xa5.)\
216\x1e\xdf)\xd7\xb5d\x8c\xadD"\xaa\\.\xa3\xcd\xfe\xda4\x9dl&\xad\xceHP\xbd\xbd\
217\x9fx\xf0\xe0\x08\xe5\xf2eJ\xa5\x8b\xdc\xbf\xbf\x9f\xae\xaeGtFj\xcaf\xae\xa9\
218\x99cY\xb6\x03\xc0\xe9S\xc7\x14\x8b\xfd\xe4\xce\x9d\xf3\x18\xe3\x01%`\x05\
219\xa8\x02\x15\xe0#\xbe_ \x9f\xf7\x98\x9f?\xc2\xf4\x93\xe7\x16\xb0\xdeA6\x93V,\
220\x06\x13\x13\xb71&\t\x84\xea\xc4F\xb1U\xa0\x8c1\x16\x13\x13[\x88\xc5\x9e\x91\
221\xcd\\]\x7f\xb4l\x87h\xb4]\x9eW\x90\xf4E\xd2c\x8d\x8e\x8e\n\x90\x94\x92\x94\
222\x12\xa0p8,\xa9UR\x8b<\x0fE;\x91e;\xb8\xd9LZ]]k\x18\xd3\x028@\x8d\xf1\xf1\
223\xf1\xa6)\x97\xe8\xe9\xe9ann\x0eh\x05\xd50\x04\xb9q\xbd\xca\xe7\xf9\x94\xec\
224\x99\x99\x87\x0c\rE\x80E\xe0#\xf0\xba\x89\\\x01\x16YXXh\xba\xabA\xa5\x95\xa1\
225\x93m\xcc\xccLa\x19c\xabT\xba\x891m\xc0*\xc3\xc3\xdf\x99\x9c\xf46\x84\x83\
226\x85\xba\xa0ur\xb5\nK\x1d\xf8\xab\x0e\xa1]\xf3\r\x1b\xbd\xba\xe2\xcbLN\xfa\
227\xc0\x12\xf0\x0e(6\x91\x05Zcwg\x10\xfc\x16\xf0\x83\x00\xd8\xf1x\x84b\xf1\x1b\
228\xf0\x03(\x92L\xbe\x04^\xd4+\xeb/\x19\x1f\xaa6\x9f\xbf/C\xb9\x8d\xe2\x9cE|W\
229\x18\xb7\xbf\xff\x0cSS\xf7\xe8\xed\r\x00\xa2P\x80PH\x94\x1a\x85\xa9\x01kP\
230\xb58\xb8\xaf\r}\x89@y+S\x8f\x7f\xd1\x7f\xfcd\xc3FK\x9e\xd7R\xb7i\xdd*\x05\
231\x83\n\x04\x02r]G\xa1\xa0\xab\xfd\xdd\xed\xd2\xe2^\xa9\xd0\'\xef\xd5\tEw\x04\
232\xb4\x11\xe5\xc1\xc14\xf9\xfc\xeaz\x9b\r\xfc\xf6\xa9\xf8>\xbecq8\xd9\xc1\xeb\
233\xa7QX\x0e\xc3Z\x80\xfc\xad"\x83g\xce\xb1\x11$\xcbv\x18\x18\xe8\xd3\xc8\x08\
234\xf2<$\xd5Q\xb5\xa5\x95m\xd2\xb7\xa4\xf4\xe1\x90\xbc7G5ra\x87\x06\x8e\x1f\
235\xd0\x7f\xcb4\xfd\xe4\xb9\xe58\xc3tw\xc3\xd8\x18\xcc\xce\x82_q\xf0+6\xb3\xef\
236W\x18\xbb\xfb\x95\xee\xb3/p\xb6\xf61\xfd\xec\xad\xb5\x11\x8b\xcdV4\x97K+\x91\
237\xd8.\xe3"\xe3\xa2\xc4\x9e\x0e\xe52W6]\xe7?\xc6#-\xf1\x056\x98<\x00\x00\x00\
238\x00IEND\xaeB`\x82'
239
240def GetSmilesBitmap():
241    return wx.Bitmap(GetSmilesImage())
242
243def GetSmilesImage():
244    stream = BytesIO(GetSmilesData())
245    return wx.Image(stream)
246
247
248#-----------------------------------------------------------------------------
249# PATH & FILE FILLING (OS INDEPENDENT)
250#-----------------------------------------------------------------------------
251
252def opj(path):
253    """Convert paths to the platform-specific separator"""
254    str = os.path.join(*tuple(path.split('/')))
255    # HACK: on Linux, a leading / gets lost...
256    if path.startswith('/'):
257        str = '/' + str
258    return str
259
260#-----------------------------------------------------------------------------
261
262#---------------------------------------------------------------------------
263# Just A Dialog To Select Pen Styles
264#---------------------------------------------------------------------------
265class PenDialog(wx.Dialog):
266
267    def __init__(self, parent=None, id=-1, title="", pos=wx.DefaultPosition,
268                 size=wx.DefaultSize, style=wx.DEFAULT_DIALOG_STYLE, oldpen=None,
269                 pentype=0):
270
271        wx.Dialog.__init__(self, parent, id, title, pos, size, style)
272
273        self.colourbutton = wx.Button(self, -1, "")
274        self.spinwidth = wx.SpinCtrl(self, -1, "1", min=1, max=3, style=wx.SP_ARROW_KEYS)
275
276        self.combostyle = wx.ComboBox(self, -1, choices=penstyle, style=wx.CB_DROPDOWN|wx.CB_READONLY)
277
278        choices = ["[1, 1]", "[2, 2]", "[3, 3]", "[4, 4]"]
279        self.combodash = wx.ComboBox(self, -1, choices=choices, style=wx.CB_DROPDOWN|wx.CB_READONLY)
280
281        self.okbutton = wx.Button(self, -1, "Ok")
282        self.cancelbutton = wx.Button(self, -1, "Cancel")
283
284        self.oldpen = oldpen
285        self.parent = parent
286        self.pentype = pentype
287
288        self.__set_properties()
289        self.__do_layout()
290
291        self.Bind(wx.EVT_BUTTON, self.OnColour, self.colourbutton)
292        self.Bind(wx.EVT_COMBOBOX, self.OnStyle, self.combostyle)
293        self.Bind(wx.EVT_BUTTON, self.OnOk, self.okbutton)
294        self.Bind(wx.EVT_BUTTON, self.OnCancel, self.cancelbutton)
295
296
297    def __set_properties(self):
298
299        self.SetTitle("Pen Dialog Selector")
300        self.colourbutton.SetMinSize((25, 25))
301        self.colourbutton.SetBackgroundColour(self.oldpen.GetColour())
302
303        style = self.oldpen.GetStyle()
304        for count, st in enumerate(penstyle):
305            if eval(st) == style:
306                self.combostyle.SetSelection(count)
307                if count == 5:
308                    self.combodash.Enable(True)
309                else:
310                    self.combodash.Enable(False)
311                break
312
313        if self.combodash.IsEnabled():
314            dashes = repr(self.oldpen.GetDashes())
315            self.combodash.SetValue(dashes)
316
317        self.spinwidth.SetValue(self.oldpen.GetWidth())
318        self.okbutton.SetDefault()
319
320        if self.pentype == 1:
321            self.spinwidth.Enable(False)
322
323
324    def __do_layout(self):
325
326        mainsizer = wx.BoxSizer(wx.VERTICAL)
327        bottomsizer = wx.BoxSizer(wx.HORIZONTAL)
328        middlesizer = wx.BoxSizer(wx.VERTICAL)
329        stylesizer = wx.BoxSizer(wx.HORIZONTAL)
330        widthsizer = wx.BoxSizer(wx.HORIZONTAL)
331        coloursizer = wx.BoxSizer(wx.HORIZONTAL)
332        label_1 = wx.StaticText(self, -1, "Please Choose The Pen Settings:")
333        label_1.SetFont(wx.Font(8, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_BOLD, 0, ""))
334        mainsizer.Add(label_1, 0, wx.ALL|wx.ADJUST_MINSIZE, 10)
335        label_2 = wx.StaticText(self, -1, "Pen Colour")
336        coloursizer.Add(label_2, 0, wx.ALL|wx.ALIGN_CENTER_VERTICAL|wx.ADJUST_MINSIZE, 5)
337        coloursizer.Add((5, 5), 1, wx.ADJUST_MINSIZE, 0)
338        coloursizer.Add(self.colourbutton, 0, wx.ALL|wx.ADJUST_MINSIZE, 5)
339        middlesizer.Add(coloursizer, 0, wx.EXPAND, 0)
340        label_3 = wx.StaticText(self, -1, "Pen Width")
341        widthsizer.Add(label_3, 0, wx.ALL|wx.ALIGN_CENTER_VERTICAL|wx.ADJUST_MINSIZE, 5)
342        widthsizer.Add((5, 5), 1, wx.ADJUST_MINSIZE, 0)
343        widthsizer.Add(self.spinwidth, 0, wx.ALL|wx.ALIGN_CENTER_VERTICAL|wx.ADJUST_MINSIZE, 5)
344        middlesizer.Add(widthsizer, 0, wx.EXPAND, 0)
345        label_4 = wx.StaticText(self, -1, "Pen Style")
346        stylesizer.Add(label_4, 0, wx.ALL|wx.ALIGN_CENTER_VERTICAL|wx.ADJUST_MINSIZE, 5)
347        stylesizer.Add((5, 5), 1, wx.ADJUST_MINSIZE, 0)
348        stylesizer.Add(self.combostyle, 0, wx.ALL|wx.ALIGN_CENTER_VERTICAL|wx.ADJUST_MINSIZE, 5)
349        stylesizer.Add(self.combodash, 0, wx.ALL|wx.ALIGN_CENTER_VERTICAL|wx.ADJUST_MINSIZE, 5)
350        middlesizer.Add(stylesizer, 0, wx.BOTTOM|wx.EXPAND, 5)
351        mainsizer.Add(middlesizer, 1, wx.EXPAND, 0)
352        bottomsizer.Add(self.okbutton, 0, wx.ALL|wx.ALIGN_CENTER_VERTICAL|wx.ADJUST_MINSIZE, 20)
353        bottomsizer.Add((20, 20), 1, wx.ADJUST_MINSIZE, 0)
354        bottomsizer.Add(self.cancelbutton, 0, wx.ALL|wx.ALIGN_CENTER_VERTICAL|wx.ADJUST_MINSIZE, 20)
355        mainsizer.Add(bottomsizer, 0, wx.EXPAND, 0)
356        self.SetAutoLayout(True)
357        self.SetSizer(mainsizer)
358        mainsizer.Fit(self)
359        mainsizer.SetSizeHints(self)
360        self.Layout()
361        self.Centre()
362
363
364    def OnColour(self, event):
365
366        obj = event.GetEventObject()
367        old = obj.GetBackgroundColour()
368        colourdata = wx.ColourData()
369        colourdata.SetColour(old)
370        dlg = wx.ColourDialog(self, colourdata)
371
372        dlg.GetColourData().SetChooseFull(True)
373
374        if dlg.ShowModal() == wx.ID_OK:
375
376            # If the user selected OK, then the dialog's wx.ColourData will
377            # contain valid information. Fetch the data ...
378            data = dlg.GetColourData()
379
380            # ... then do something with it. The actual colour data will be
381            # returned as a three-tuple (r, g, b) in this particular case.
382            col1 = data.GetColour().Get()
383            obj.SetBackgroundColour(col1)
384        # Once the dialog is destroyed, Mr. wx.ColourData is no longer your
385        # friend. Don't use it again!
386        dlg.Destroy()
387
388        event.Skip()
389
390
391    def OnStyle(self, event):
392
393        choice = event.GetEventObject().GetValue()
394        self.combodash.Enable(choice==5)
395        event.Skip()
396
397
398    def OnOk(self, event):
399
400        colour = self.colourbutton.GetBackgroundColour()
401        style = eval(self.combostyle.GetValue())
402        width = int(self.spinwidth.GetValue())
403
404        dashes = None
405        if self.combostyle.GetSelection() == 5:
406            dashes = eval(self.combodash.GetValue())
407
408        pen = wx.Pen(colour, width, style)
409
410        if dashes:
411            pen.SetDashes(dashes)
412
413        pen.SetCap(wx.CAP_BUTT)
414
415        if self.pentype == 0:
416            self.parent.SetConnectionPen(pen)
417        else:
418            self.parent.SetBorderPen(pen)
419
420        self.EndModal(wx.ID_OK)
421
422
423    def OnCancel(self, event):
424        self.EndModal(wx.ID_CANCEL)
425
426
427#---------------------------------------------------------------------------
428# Just A Dialog To Select Tree Buttons Icons
429#---------------------------------------------------------------------------
430class TreeDialog(wx.Dialog):
431
432    def __init__(self, parent=None, id=-1, title="", pos=wx.DefaultPosition,
433                 size=wx.DefaultSize, style=wx.DEFAULT_DIALOG_STYLE, oldicons=None):
434
435        wx.Dialog.__init__(self, parent, id, title, pos, size, style)
436
437        self.listicons = wx.ListBox(self, -1, choices=["Set 1", "Set 2", "Set 3", "Set 4", "Set 5"], style=wx.LB_SINGLE)
438
439        bitmap_plus = opj(bitmapDir + "plus" + str(oldicons+1) + ".ico")
440        bitmap_minus = opj(bitmapDir+ "minus" + str(oldicons+1) + ".ico")
441
442        bitmap_plus = wx.Image(bitmap_plus, wx.BITMAP_TYPE_ICO)
443        bitmap_plus.Rescale(24, 24)
444        bitmap_plus = bitmap_plus.ConvertToBitmap()
445        bitmap_minus = wx.Image(bitmap_minus, wx.BITMAP_TYPE_ICO)
446        bitmap_minus.Rescale(24, 24)
447        bitmap_minus = bitmap_minus.ConvertToBitmap()
448
449        self.bitmap_plus = wx.StaticBitmap(self, -1, bitmap_plus)
450        self.bitmap_minus = wx.StaticBitmap(self, -1, bitmap_minus)
451
452        self.okbutton = wx.Button(self, -1, "Ok")
453        self.cancelbutton = wx.Button(self, -1, "Cancel")
454
455        self.parent = parent
456
457        self.__set_properties()
458        self.__do_layout()
459
460        self.Bind(wx.EVT_BUTTON, self.OnOk, self.okbutton)
461        self.Bind(wx.EVT_BUTTON, self.OnCancel, self.cancelbutton)
462        self.Bind(wx.EVT_LISTBOX, self.OnListBox, self.listicons)
463
464
465    def __set_properties(self):
466
467        self.SetTitle("Tree Buttons Selector")
468        self.listicons.SetSelection(0)
469        self.okbutton.SetDefault()
470
471
472    def __do_layout(self):
473
474        mainsizer = wx.BoxSizer(wx.VERTICAL)
475        bottomsizer = wx.BoxSizer(wx.HORIZONTAL)
476        topsizer = wx.BoxSizer(wx.HORIZONTAL)
477        rightsizer = wx.BoxSizer(wx.VERTICAL)
478        sizer_2 = wx.BoxSizer(wx.HORIZONTAL)
479        sizer_1 = wx.BoxSizer(wx.HORIZONTAL)
480        label_1 = wx.StaticText(self, -1, "Please Choose One Of These Sets Of Icons:")
481        label_1.SetFont(wx.Font(8, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_BOLD, 0, ""))
482        mainsizer.Add(label_1, 0, wx.ALL|wx.ADJUST_MINSIZE, 10)
483        topsizer.Add(self.listicons, 0, wx.ALL|wx.EXPAND|wx.ADJUST_MINSIZE, 5)
484        label_2 = wx.StaticText(self, -1, "Collapsed")
485        sizer_1.Add(label_2, 0, wx.RIGHT|wx.ALIGN_CENTER_VERTICAL|wx.ADJUST_MINSIZE, 10)
486        sizer_1.Add((20, 20), 1, wx.ALIGN_RIGHT|wx.ADJUST_MINSIZE, 0)
487        sizer_1.Add(self.bitmap_plus, 1, wx.RIGHT|wx.EXPAND|wx.ALIGN_CENTER_VERTICAL|wx.ADJUST_MINSIZE, 10)
488        rightsizer.Add(sizer_1, 0, wx.EXPAND, 0)
489        label_3 = wx.StaticText(self, -1, "Expanded")
490        sizer_2.Add(label_3, 0, wx.RIGHT|wx.ALIGN_CENTER_VERTICAL|wx.ADJUST_MINSIZE, 10)
491        sizer_2.Add((20, 20), 1, wx.ADJUST_MINSIZE, 0)
492        sizer_2.Add(self.bitmap_minus, 1, wx.RIGHT|wx.EXPAND|wx.ALIGN_CENTER_VERTICAL|wx.ADJUST_MINSIZE, 10)
493        rightsizer.Add(sizer_2, 0, wx.EXPAND, 0)
494        topsizer.Add(rightsizer, 0, wx.ALL|wx.EXPAND, 5)
495        mainsizer.Add(topsizer, 1, wx.EXPAND, 0)
496        bottomsizer.Add(self.okbutton, 0, wx.ALL|wx.ADJUST_MINSIZE, 20)
497        bottomsizer.Add((20, 20), 1, wx.ADJUST_MINSIZE, 0)
498        bottomsizer.Add(self.cancelbutton, 0, wx.ALL|wx.ADJUST_MINSIZE, 20)
499        mainsizer.Add(bottomsizer, 0, wx.EXPAND, 0)
500        self.SetAutoLayout(True)
501        self.SetSizer(mainsizer)
502        mainsizer.Fit(self)
503        mainsizer.SetSizeHints(self)
504        self.Layout()
505
506
507    def OnListBox(self, event):
508
509        selection = self.listicons.GetSelection()
510        bitmap_plus = opj(bitmapDir + "plus" + str(selection+1) + ".ico")
511        bitmap_minus = opj(bitmapDir+ "minus" + str(selection+1) + ".ico")
512
513        bitmap_plus = wx.Image(bitmap_plus, wx.BITMAP_TYPE_ICO)
514        bitmap_plus.Rescale(24, 24)
515        bitmap_plus = bitmap_plus.ConvertToBitmap()
516        bitmap_minus = wx.Image(bitmap_minus, wx.BITMAP_TYPE_ICO)
517        bitmap_minus.Rescale(24, 24)
518        bitmap_minus = bitmap_minus.ConvertToBitmap()
519
520        self.bitmap_plus.SetBitmap(bitmap_plus)
521        self.bitmap_minus.SetBitmap(bitmap_minus)
522
523        self.bitmap_plus.Refresh()
524        self.bitmap_minus.Refresh()
525        event.Skip()
526
527
528    def OnOk(self, event):
529
530        selection = self.listicons.GetSelection()
531        self.parent.SetTreeButtons(selection)
532        self.EndModal(wx.ID_OK)
533
534
535    def OnCancel(self, event):
536        self.EndModal(wx.ID_CANCEL)
537
538
539#---------------------------------------------------------------------------
540# Just A Dialog To Select Tree Check/Radio Item Icons
541#---------------------------------------------------------------------------
542class CheckDialog(wx.Dialog):
543
544    def __init__(self, parent=None, id=-1, title="", pos=wx.DefaultPosition,
545                 size=wx.DefaultSize, style=wx.DEFAULT_DIALOG_STYLE):
546
547        wx.Dialog.__init__(self, parent, id, title, pos, size, style)
548
549        self.listicons = wx.ListBox(self, -1, choices=["Set 1", "Set 2"], style=wx.LB_SINGLE)
550
551        bitmap_check = wx.Bitmap(opj(bitmapDir+ "checked.ico"), wx.BITMAP_TYPE_ICO)
552        bitmap_uncheck = wx.Bitmap(opj(bitmapDir+ "notchecked.ico"), wx.BITMAP_TYPE_ICO)
553        bitmap_flag = wx.Bitmap(opj(bitmapDir+ "flagged.ico"), wx.BITMAP_TYPE_ICO)
554        bitmap_unflag = wx.Bitmap(opj(bitmapDir+ "notflagged.ico"), wx.BITMAP_TYPE_ICO)
555
556        self.bitmap_check = wx.StaticBitmap(self, -1, bitmap_check)
557        self.bitmap_uncheck = wx.StaticBitmap(self, -1, bitmap_uncheck)
558        self.bitmap_flag = wx.StaticBitmap(self, -1, bitmap_flag)
559        self.bitmap_unflag = wx.StaticBitmap(self, -1, bitmap_unflag)
560
561        self.okbutton = wx.Button(self, -1, "Ok")
562        self.cancelbutton = wx.Button(self, -1, "Cancel")
563
564        self.parent = parent
565
566        self.__set_properties()
567        self.__do_layout()
568
569        self.Bind(wx.EVT_BUTTON, self.OnOk, self.okbutton)
570        self.Bind(wx.EVT_BUTTON, self.OnCancel, self.cancelbutton)
571        self.Bind(wx.EVT_LISTBOX, self.OnListBox, self.listicons)
572
573
574    def __set_properties(self):
575
576        self.SetTitle("Check/Radio Icon Selector")
577        self.listicons.SetSelection(0)
578        self.okbutton.SetDefault()
579
580
581    def __do_layout(self):
582
583        mainsizer = wx.BoxSizer(wx.VERTICAL)
584        bottomsizer = wx.BoxSizer(wx.HORIZONTAL)
585        topsizer = wx.BoxSizer(wx.HORIZONTAL)
586        rightsizer = wx.BoxSizer(wx.VERTICAL)
587        sizer_2 = wx.BoxSizer(wx.HORIZONTAL)
588        sizer_1 = wx.BoxSizer(wx.HORIZONTAL)
589        sizer_3 = wx.BoxSizer(wx.HORIZONTAL)
590        sizer_4 = wx.BoxSizer(wx.HORIZONTAL)
591        label_1 = wx.StaticText(self, -1, "Please Choose One Of These Sets Of Icons:")
592        label_1.SetFont(wx.Font(8, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_BOLD, 0, ""))
593        mainsizer.Add(label_1, 0, wx.ALL|wx.ADJUST_MINSIZE, 10)
594        topsizer.Add(self.listicons, 0, wx.ALL|wx.EXPAND|wx.ADJUST_MINSIZE, 5)
595        label_2 = wx.StaticText(self, -1, "Checked")
596        sizer_1.Add(label_2, 0, wx.RIGHT|wx.ALIGN_CENTER_VERTICAL|wx.ADJUST_MINSIZE, 10)
597        sizer_1.Add((20, 20), 1, wx.ALIGN_RIGHT|wx.ADJUST_MINSIZE, 0)
598        sizer_1.Add(self.bitmap_check, 0, wx.RIGHT|wx.ALIGN_CENTER_VERTICAL|wx.ADJUST_MINSIZE, 10)
599        rightsizer.Add(sizer_1, 0, wx.EXPAND, 0)
600        label_3 = wx.StaticText(self, -1, "Not Checked")
601        sizer_2.Add(label_3, 0, wx.RIGHT|wx.ALIGN_CENTER_VERTICAL|wx.ADJUST_MINSIZE, 10)
602        sizer_2.Add((20, 20), 1, wx.ADJUST_MINSIZE, 0)
603        sizer_2.Add(self.bitmap_uncheck, 0, wx.RIGHT|wx.ALIGN_CENTER_VERTICAL|wx.ADJUST_MINSIZE, 10)
604        rightsizer.Add(sizer_2, 0, wx.EXPAND, 0)
605        label_4 = wx.StaticText(self, -1, "Flagged")
606        sizer_3.Add(label_4, 0, wx.RIGHT|wx.ALIGN_CENTER_VERTICAL|wx.ADJUST_MINSIZE, 10)
607        sizer_3.Add((20, 20), 1, wx.ADJUST_MINSIZE, 0)
608        sizer_3.Add(self.bitmap_flag, 0, wx.RIGHT|wx.ALIGN_CENTER_VERTICAL|wx.ADJUST_MINSIZE, 10)
609        rightsizer.Add(sizer_3, 0, wx.EXPAND, 0)
610        label_5 = wx.StaticText(self, -1, "Not Flagged")
611        sizer_4.Add(label_5, 0, wx.RIGHT|wx.ALIGN_CENTER_VERTICAL|wx.ADJUST_MINSIZE, 10)
612        sizer_4.Add((20, 20), 1, wx.ADJUST_MINSIZE, 0)
613        sizer_4.Add(self.bitmap_unflag, 0, wx.RIGHT|wx.ALIGN_CENTER_VERTICAL|wx.ADJUST_MINSIZE, 10)
614        rightsizer.Add(sizer_4, 0, wx.EXPAND, 0)
615
616        topsizer.Add(rightsizer, 0, wx.ALL|wx.EXPAND, 5)
617        mainsizer.Add(topsizer, 1, wx.EXPAND, 0)
618        bottomsizer.Add(self.okbutton, 0, wx.ALL|wx.ADJUST_MINSIZE, 20)
619        bottomsizer.Add((20, 20), 1, wx.ADJUST_MINSIZE, 0)
620        bottomsizer.Add(self.cancelbutton, 0, wx.ALL|wx.ADJUST_MINSIZE, 20)
621        mainsizer.Add(bottomsizer, 0, wx.EXPAND, 0)
622        self.SetAutoLayout(True)
623        self.SetSizer(mainsizer)
624        mainsizer.Fit(self)
625        mainsizer.SetSizeHints(self)
626        self.Layout()
627
628
629    def OnListBox(self, event):
630
631        selection = self.listicons.GetSelection()
632
633        if selection == 0:
634            bitmap_check = opj(bitmapDir + "checked.ico")
635            bitmap_uncheck = opj(bitmapDir + "notchecked.ico")
636            bitmap_flag = opj(bitmapDir + "flagged.ico")
637            bitmap_unflag = opj(bitmapDir + "notflagged.ico")
638        else:
639            bitmap_check = opj(bitmapDir + "aquachecked.ico")
640            bitmap_uncheck = opj(bitmapDir + "aquanotchecked.ico")
641            bitmap_flag = opj(bitmapDir + "aquaflagged.ico")
642            bitmap_unflag = opj(bitmapDir + "aquanotflagged.ico")
643
644        bitmap_check = wx.Bitmap(bitmap_check, wx.BITMAP_TYPE_ICO)
645        bitmap_uncheck = wx.Bitmap(bitmap_uncheck, wx.BITMAP_TYPE_ICO)
646        bitmap_flag = wx.Bitmap(bitmap_flag, wx.BITMAP_TYPE_ICO)
647        bitmap_unflag = wx.Bitmap(bitmap_unflag, wx.BITMAP_TYPE_ICO)
648
649        self.bitmap_uncheck.SetBitmap(bitmap_uncheck)
650        self.bitmap_check.SetBitmap(bitmap_check)
651        self.bitmap_unflag.SetBitmap(bitmap_unflag)
652        self.bitmap_flag.SetBitmap(bitmap_flag)
653
654        self.bitmap_check.Refresh()
655        self.bitmap_uncheck.Refresh()
656        self.bitmap_flag.Refresh()
657        self.bitmap_unflag.Refresh()
658
659        event.Skip()
660
661
662    def OnOk(self, event):
663
664        selection = self.listicons.GetSelection()
665        self.parent.SetCheckRadio(selection)
666        self.EndModal(wx.ID_OK)
667
668
669    def OnCancel(self, event):
670        self.EndModal(wx.ID_CANCEL)
671
672
673#---------------------------------------------------------------------------
674# Just A Dialog To Select Tree Items Icons
675#---------------------------------------------------------------------------
676class TreeIcons(wx.Dialog):
677
678    def __init__(self, parent=None, id=-1, title="", pos=wx.DefaultPosition,
679                 size=wx.DefaultSize, style=wx.DEFAULT_DIALOG_STYLE, oldpen=None,
680                 bitmaps=None):
681
682        wx.Dialog.__init__(self, parent, id, title, pos, size, style)
683
684        self.bitmaps = [None, None, None, None]
685        empty = wx.Bitmap(16, 16)
686        self.parent = parent
687
688        self.bitmaps[0] = wx.StaticBitmap(self, -1, empty)
689        self.combonormal = wx.ComboBox(self, -1, choices=ArtIDs, style=wx.CB_DROPDOWN|wx.CB_READONLY)
690        self.bitmaps[1] = wx.StaticBitmap(self, -1, empty)
691        self.comboselected = wx.ComboBox(self, -1, choices=ArtIDs, style=wx.CB_DROPDOWN|wx.CB_READONLY)
692        self.bitmaps[2] = wx.StaticBitmap(self, -1, empty)
693        self.comboexpanded = wx.ComboBox(self, -1, choices=ArtIDs, style=wx.CB_DROPDOWN|wx.CB_READONLY)
694        self.bitmaps[3] = wx.StaticBitmap(self, -1, empty)
695        self.comboselectedexpanded = wx.ComboBox(self, -1, choices=ArtIDs, style=wx.CB_DROPDOWN|wx.CB_READONLY)
696        self.okbutton = wx.Button(self, -1, "Ok")
697        self.cancelbutton = wx.Button(self, -1, "Cancel")
698
699        self.combonormal.SetSelection(bitmaps[0] >= 0 and bitmaps[0]+1 or 0)
700        self.comboselected.SetSelection(bitmaps[1] >= 0 and bitmaps[1]+1 or 0)
701        self.comboexpanded.SetSelection(bitmaps[2] >= 0 and bitmaps[2]+1 or 0)
702        self.comboselectedexpanded.SetSelection(bitmaps[3] >= 0 and bitmaps[3]+1 or 0)
703
704        self.GetBitmaps(bitmaps)
705
706        self.__set_properties()
707        self.__do_layout()
708
709        self.Bind(wx.EVT_COMBOBOX, self.OnComboNormal, self.combonormal)
710        self.Bind(wx.EVT_COMBOBOX, self.OnComboSelected, self.comboselected)
711        self.Bind(wx.EVT_COMBOBOX, self.OnComboExpanded, self.comboexpanded)
712        self.Bind(wx.EVT_COMBOBOX, self.OnComboSelectedExpanded, self.comboselectedexpanded)
713        self.Bind(wx.EVT_BUTTON, self.OnOk, self.okbutton)
714        self.Bind(wx.EVT_BUTTON, self.OnCancel, self.cancelbutton)
715
716
717    def __set_properties(self):
718
719        self.SetTitle("Item Icon Selector")
720        self.okbutton.SetDefault()
721
722
723    def __do_layout(self):
724
725        mainsizer = wx.BoxSizer(wx.VERTICAL)
726        sizer_2 = wx.BoxSizer(wx.HORIZONTAL)
727        gridsizer = wx.FlexGridSizer(cols=3, hgap=5, vgap=5)
728        label_1 = wx.StaticText(self, -1, "Please Choose The Icons For This Item (All Are Optional):")
729        label_1.SetFont(wx.Font(8, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_BOLD, 0, ""))
730        mainsizer.Add(label_1, 0, wx.ALL|wx.ADJUST_MINSIZE, 10)
731        label_2 = wx.StaticText(self, -1, "TreeIcon_Normal:")
732        gridsizer.Add(label_2, 0, wx.LEFT|wx.ALIGN_CENTER_VERTICAL|wx.ADJUST_MINSIZE, 5)
733        gridsizer.Add(self.bitmaps[0], 0, wx.LEFT|wx.RIGHT|wx.ALIGN_CENTER_VERTICAL|wx.ADJUST_MINSIZE, 5)
734        gridsizer.Add(self.combonormal, 0, wx.ALIGN_CENTER_VERTICAL|wx.ADJUST_MINSIZE, 0)
735        label_3 = wx.StaticText(self, -1, "TreeIcon_Selected:")
736        gridsizer.Add(label_3, 0, wx.LEFT|wx.ALIGN_CENTER_VERTICAL|wx.ADJUST_MINSIZE, 5)
737        gridsizer.Add(self.bitmaps[1], 0, wx.LEFT|wx.RIGHT|wx.ALIGN_CENTER_VERTICAL|wx.ADJUST_MINSIZE, 5)
738        gridsizer.Add(self.comboselected, 0, wx.ALIGN_CENTER_VERTICAL|wx.ADJUST_MINSIZE, 0)
739        label_4 = wx.StaticText(self, -1, "TreeIcon_Expanded:")
740        gridsizer.Add(label_4, 0, wx.LEFT|wx.ALIGN_CENTER_VERTICAL|wx.ADJUST_MINSIZE, 5)
741        gridsizer.Add(self.bitmaps[2], 0, wx.LEFT|wx.RIGHT|wx.ALIGN_CENTER_VERTICAL|wx.ADJUST_MINSIZE, 5)
742        gridsizer.Add(self.comboexpanded, 0, wx.ALIGN_CENTER_VERTICAL|wx.ADJUST_MINSIZE, 0)
743        label_5 = wx.StaticText(self, -1, "TreeIcon_SelectedExpanded:")
744        gridsizer.Add(label_5, 0, wx.LEFT|wx.ALIGN_CENTER_VERTICAL|wx.ADJUST_MINSIZE, 5)
745        gridsizer.Add(self.bitmaps[3], 0, wx.LEFT|wx.RIGHT|wx.ALIGN_CENTER_VERTICAL|wx.ADJUST_MINSIZE, 5)
746        gridsizer.Add(self.comboselectedexpanded, 0, wx.ALIGN_CENTER_VERTICAL|wx.ADJUST_MINSIZE, 0)
747        gridsizer.AddGrowableCol(0)
748        gridsizer.AddGrowableCol(1)
749        gridsizer.AddGrowableCol(2)
750        mainsizer.Add(gridsizer, 0, wx.ALL|wx.EXPAND, 5)
751        sizer_2.Add(self.okbutton, 0, wx.ALL|wx.ALIGN_CENTER_VERTICAL|wx.ADJUST_MINSIZE, 20)
752        sizer_2.Add((20, 20), 1, wx.ADJUST_MINSIZE, 0)
753        sizer_2.Add(self.cancelbutton, 0, wx.ALL|wx.ALIGN_CENTER_VERTICAL|wx.ADJUST_MINSIZE, 20)
754        mainsizer.Add(sizer_2, 1, wx.EXPAND, 0)
755        self.SetAutoLayout(True)
756        self.SetSizer(mainsizer)
757        mainsizer.Fit(self)
758        mainsizer.SetSizeHints(self)
759        self.Layout()
760        self.Centre()
761
762
763    def OnComboNormal(self, event):
764
765        input = event.GetSelection()
766        self.GetBitmap(input, 0)
767        event.Skip()
768
769
770    def OnComboSelected(self, event):
771
772        input = event.GetSelection()
773        self.GetBitmap(input, 1)
774        event.Skip()
775
776
777    def OnComboExpanded(self, event):
778
779        input = event.GetSelection()
780        self.GetBitmap(input, 2)
781        event.Skip()
782
783
784    def OnComboSelectedExpanded(self, event):
785
786        input = event.GetSelection()
787        self.GetBitmap(input, 3)
788        event.Skip()
789
790
791    def OnOk(self, event):
792
793        bitmaps = [-1, -1, -1, -1]
794        normal = self.combonormal.GetSelection()
795        selected = self.comboselected.GetSelection()
796        expanded = self.comboexpanded.GetSelection()
797        selexp = self.comboselectedexpanded.GetSelection()
798
799        bitmaps = [(normal > 0 and normal or -1), (selected > 0 and selected or -1),
800                   (expanded > 0 and expanded or -1), (selexp > 0 and selexp or -1)]
801
802        newbitmaps = []
803
804        for bmp in bitmaps:
805            if bmp > 0:
806                newbitmaps.append(bmp-1)
807            else:
808                newbitmaps.append(bmp)
809
810        self.parent.SetNewIcons(newbitmaps)
811
812        self.EndModal(wx.ID_OK)
813
814
815    def OnCancel(self, event):
816        self.EndModal(wx.ID_CANCEL)
817
818
819    def GetBitmap(self, input, which):
820
821        if input == 0:
822            bmp = wx.Bitmap(16,16)
823            self.ClearBmp(bmp)
824        elif input > 36:
825            bmp = GetSmilesBitmap()
826        else:
827            bmp = wx.ArtProvider.GetBitmap(eval(ArtIDs[input]), wx.ART_OTHER, (16,16))
828            if not bmp.IsOk():
829                bmp = wx.Bitmap(16,16)
830                self.ClearBmp(bmp)
831
832        self.bitmaps[which].SetBitmap(bmp)
833        self.bitmaps[which].Refresh()
834
835
836    def GetBitmaps(self, bitmaps):
837
838        output = []
839
840        for count, input in enumerate(bitmaps):
841            if input < 0:
842                bmp = wx.Bitmap(16,16)
843                self.ClearBmp(bmp)
844            elif input > 35:
845                bmp = GetSmilesBitmap()
846            else:
847                bmp = wx.ArtProvider.GetBitmap(eval(ArtIDs[input+1]), wx.ART_OTHER, (16,16))
848                if not bmp.IsOk():
849                    bmp = wx.Bitmap(16,16)
850                    self.ClearBmp(bmp)
851
852            self.bitmaps[count].SetBitmap(bmp)
853
854
855    def ClearBmp(self, bmp):
856
857        dc = wx.MemoryDC()
858        dc.SelectObject(bmp)
859        dc.SetBackground(wx.Brush("white"))
860        dc.Clear()
861
862
863#---------------------------------------------------------------------------
864# Custom Renderer for the column headers
865#---------------------------------------------------------------------------
866class HyperTreeHeaderRenderer(object):
867    """
868    Draws the column headers as a solid color (self.color)
869    """
870
871    def __init__(self, parent):
872        self.color = wx.Colour(150,150,150)
873
874    def DrawTextFormatted(self, dc, text, rect):
875        """
876        Draws the item text, correctly formatted.
877
878        :param `dc`: an instance of `wx.DC`;
879        :param `text`: the item text;
880        :param `rect`: the item client rectangle.
881        """
882
883        # determine if the string can fit inside the current width
884        w, h, dummy = dc.GetFullMultiLineTextExtent(text)
885        width = rect.width
886
887        if w <= width:
888
889            dc.DrawLabel(text, rect, wx.ALIGN_CENTER_VERTICAL)
890
891        else:
892
893            # determine the base width
894            ellipsis = "..."
895            base_w, h = dc.GetTextExtent(ellipsis)
896
897            # continue until we have enough space or only one character left
898
899            newText = text.split("\n")
900            theText = ""
901
902            for text in newText:
903
904                lenText = len(text)
905                drawntext = text
906                w, dummy = dc.GetTextExtent(text)
907
908                while lenText > 1:
909
910                    if w + base_w <= width:
911                        break
912
913                    w_c, h_c = dc.GetTextExtent(drawntext[-1])
914                    drawntext = drawntext[0:-1]
915                    lenText -= 1
916                    w -= w_c
917
918                # if still not enough space, remove ellipsis characters
919                while len(ellipsis) > 0 and w + base_w > width:
920                    ellipsis = ellipsis[0:-1]
921                    base_w, h = dc.GetTextExtent(ellipsis)
922
923                theText += drawntext + ellipsis + "\n"
924
925            theText = theText.rstrip()
926            dc.DrawLabel(theText, rect, wx.ALIGN_CENTER_VERTICAL)
927
928
929
930    def DrawHeaderButton(self, dc, rect, flags=0, params=None):
931
932        if params != None:
933            text_align = params.m_labelAlignment
934            bitmap     = params.m_labelBitmap
935            text_color = params.m_labelColour
936            text_font  = params.m_labelFont
937            text       = params.m_labelText
938
939        color = self.color
940
941        if flags & wx.CONTROL_DISABLED:
942            color = wx.Colour(wx.WHITE)
943        elif flags & wx.CONTROL_SELECTED:
944            color = wx.Colour(wx.BLUE)
945        if flags & wx.CONTROL_PRESSED:
946            self._pressed = True
947            color = cutils.AdjustColour(color,-30)
948        elif flags & wx.CONTROL_CURRENT:
949            self._hover = True
950            color = cutils.AdjustColour(color,50)
951
952        # Draw a solid background in self.color
953        dc.SetBrush(wx.Brush(color, wx.BRUSHSTYLE_SOLID))
954        dc.SetBackgroundMode(wx.SOLID)
955        dc.SetPen(wx.TRANSPARENT_PEN)
956        dc.DrawRectangle(rect)
957
958        # Draw the column divider on the right
959        x = rect.width + rect.x - 2
960        dc.SetPen(wx.Pen(cutils.AdjustColour(color,-30)))
961        dc.DrawLine(x,2,x,rect.height-2)
962        x += 1
963        dc.SetPen(wx.Pen(cutils.AdjustColour(color,30)))
964        dc.DrawLine(x,2,x,rect.height-2)
965
966        dc.SetBackgroundMode(wx.TRANSPARENT)
967
968        if params == None:
969            return
970
971        # We need to draw the text and/or icon bitmap
972        dc.SetFont(text_font)
973        dc.SetTextForeground(text_color)
974
975        # Determine the width of the text
976        wLabel, hLabel, dummy = dc.GetFullMultiLineTextExtent(text)
977        wLabel += 4  # 2 pixel margin either side
978
979        # and the width of the icon, if any
980        if bitmap:
981            wLabel += bitmap.GetWidth() + 2  # 2 is a margin between the image and text
982
983        # ALIGN_LEFT if the label is larger than the available space
984        text_align = (wLabel < rect.width and [text_align] or [wx.ALIGN_LEFT])[0]
985
986        x = rect.x + 2
987
988        if text_align == wx.ALIGN_LEFT:
989            xAligned = x
990
991        elif text_align == wx.ALIGN_RIGHT:
992            xAligned = x + rect.width - wLabel - 1
993
994        elif text_align == wx.ALIGN_CENTER:
995            xAligned = x + (rect.width - wLabel)/2
996
997        if bitmap:
998            dc.DrawBitmap(bitmap, xAligned + wLabel - bitmap.GetWidth() , 2, True)
999
1000        dc.SetClippingRegion(x, 1, rect.width-2, rect.height - 2)
1001        self.DrawTextFormatted(dc, text, wx.Rect(xAligned+2, 1, rect.width-2, rect.height-2))
1002        dc.DestroyClippingRegion()
1003
1004
1005
1006
1007#---------------------------------------------------------------------------
1008# HyperTreeList Demo Implementation
1009#---------------------------------------------------------------------------
1010class HyperTreeListDemo(wx.Frame):
1011
1012    def __init__(self, parent, log):
1013
1014        wx.Frame.__init__(self, parent)
1015
1016        self.SetMinSize((640, 480))
1017        self.SetIcon(images.Mondrian.GetIcon())
1018        self.SetTitle("HyperTreeList wxPython Demo ;-)")
1019
1020        self.CenterOnParent()
1021
1022        statusbar = self.CreateStatusBar(2)
1023        statusbar.SetStatusWidths([-2, -1])
1024        # statusbar fields
1025        statusbar_fields = [("HyperTreeList Demo, Andrea Gavana @ 08 May 2007"),
1026                            ("Welcome To wxPython!")]
1027
1028        for i in range(len(statusbar_fields)):
1029            statusbar.SetStatusText(statusbar_fields[i], i)
1030
1031        self.CreateMenuBar()
1032
1033        self.oldicons = 0
1034
1035        splitter = wx.SplitterWindow(self, -1, style=wx.CLIP_CHILDREN | wx.SP_LIVE_UPDATE | wx.SP_3D)
1036        panel = wx.Panel(splitter, -1, style=wx.WANTS_CHARS)
1037
1038        # Set up a log window
1039        self.log = log
1040
1041        sizer = wx.BoxSizer(wx.VERTICAL)
1042        # Create the HyperTreeList
1043        self.tree = HyperTreeList(panel, -1, log=self.log)
1044
1045        sizer.Add(self.tree, 1, wx.EXPAND)
1046        panel.SetSizer(sizer)
1047        sizer.Layout()
1048
1049        self.columnBackgroundColours = [wx.LIGHT_GREY for i in range(self.tree.GetColumnCount())]
1050
1051
1052        self.leftpanel = wx.ScrolledWindow(splitter, -1, style=wx.SUNKEN_BORDER)
1053        self.PopulateLeftPanel(self.tree.styles, self.tree.events)
1054
1055        splitter.SplitVertically(self.leftpanel, panel, 300)
1056
1057        splitter.SetMinimumPaneSize(120)
1058        self.leftpanel.SetBackgroundColour(wx.WHITE)
1059        self.leftpanel.SetScrollRate(20, 20)
1060
1061        self.Fit()
1062
1063
1064    def CreateMenuBar(self):
1065
1066        file_menu = wx.Menu()
1067
1068        AS_EXIT = wx.NewIdRef()
1069        file_menu.Append(AS_EXIT, "&Exit")
1070        self.Bind(wx.EVT_MENU, self.OnClose, id=AS_EXIT)
1071
1072        help_menu = wx.Menu()
1073
1074        AS_ABOUT = wx.NewIdRef()
1075        help_menu.Append(AS_ABOUT, "&About...")
1076        self.Bind(wx.EVT_MENU, self.OnAbout, id=AS_ABOUT)
1077
1078        menu_bar = wx.MenuBar()
1079
1080        menu_bar.Append(file_menu, "&File")
1081        menu_bar.Append(help_menu, "&Help")
1082
1083        self.SetMenuBar(menu_bar)
1084
1085
1086    def OnClose(self, event):
1087
1088        self.Destroy()
1089
1090
1091    def OnAbout(self, event):
1092
1093        msg = "This Is The About Dialog Of The HyperTreeList Demo.\n\n" + \
1094              "Author: Andrea Gavana @ 08 May 2007\n\n" + \
1095              "Please Report Any Bug/Requests Of Improvements\n" + \
1096              "To Me At The Following Adresses:\n\n" + \
1097              "andrea.gavana@maerskoil.com\n" + "andrea.gavana@gmail.com\n\n" + \
1098              "Welcome To wxPython " + wx.VERSION_STRING + "!!"
1099
1100        dlg = wx.MessageDialog(self, msg, "HyperTreeList Demo",
1101                               wx.OK | wx.ICON_INFORMATION)
1102
1103        if wx.Platform != '__WXMAC__':
1104            dlg.SetFont(wx.Font(8, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL, False))
1105
1106        dlg.ShowModal()
1107        dlg.Destroy()
1108
1109
1110    def PopulateLeftPanel(self, styles, events):
1111
1112        mainsizer = wx.BoxSizer(wx.VERTICAL)
1113        recreatetree = wx.Button(self.leftpanel, -1, "Recreate HyperTreeList")
1114        mainsizer.Add(recreatetree, 0, wx.ALL|wx.ALIGN_CENTER, 10)
1115        recreatetree.Bind(wx.EVT_BUTTON, self.OnRecreateTree)
1116
1117        staticboxstyles = wx.StaticBox(self.leftpanel, -1, "HyperTreeList Styles")
1118        stylesizer = wx.StaticBoxSizer(staticboxstyles, wx.VERTICAL)
1119        staticboxcolumns = wx.StaticBox(self.leftpanel, -1, "HyperTreeList Columns")
1120        columnssizer = wx.StaticBoxSizer(staticboxcolumns, wx.VERTICAL)
1121        staticboxevents = wx.StaticBox(self.leftpanel, -1, "HyperTreeList Events")
1122        eventssizer = wx.StaticBoxSizer(staticboxevents, wx.VERTICAL)
1123        staticboxcolours = wx.StaticBox(self.leftpanel, -1, "HyperTreeList Images/Colours")
1124        colourssizer = wx.StaticBoxSizer(staticboxcolours, wx.VERTICAL)
1125        staticboxthemes = wx.StaticBox(self.leftpanel, -1, "HyperTreeList Themes/Gradients")
1126        themessizer = wx.StaticBoxSizer(staticboxthemes, wx.VERTICAL)
1127
1128        self.treestyles = []
1129        self.treeevents = []
1130
1131        for count, style in enumerate(styles):
1132
1133            if count == 0:
1134                tags = wx.ALL
1135            else:
1136                tags = wx.LEFT|wx.RIGHT|wx.BOTTOM
1137
1138            if style != "TR_DEFAULT_STYLE":
1139                check = wx.CheckBox(self.leftpanel, -1, style)
1140                stylesizer.Add(check, 0, tags, 3)
1141
1142                if style in ["TR_HAS_BUTTONS", "TR_HAS_VARIABLE_ROW_HEIGHT"]:
1143                    check.SetValue(1)
1144
1145                if style == "TR_HAS_VARIABLE_ROW_HEIGHT":
1146                    check.Enable(False)
1147
1148                check.Bind(wx.EVT_CHECKBOX, self.OnCheckStyle)
1149                self.treestyles.append(check)
1150
1151        flexgridcolumn = wx.FlexGridSizer(cols=2, hgap=5, vgap=5)
1152        flexgridcolumn.AddGrowableCol(0)
1153        label = wx.StaticText(self.leftpanel, -1, "Text Font")
1154        label.SetFont(wx.Font(8, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_BOLD, 0, ""))
1155        self.buttonfont = wx.Button(self.leftpanel, -1, "Choose...")
1156        self.buttonfont.Bind(wx.EVT_BUTTON, self.OnColumnFont)
1157        flexgridcolumn.Add(label, 0, wx.ALIGN_CENTER_VERTICAL)
1158        flexgridcolumn.Add(self.buttonfont, 0)
1159
1160        label = wx.StaticText(self.leftpanel, -1, "Text Colour")
1161        label.SetFont(wx.Font(8, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_BOLD, 0, ""))
1162        self.columncolour = csel.ColourSelect(self.leftpanel, -1, "Choose...", wx.BLACK)
1163        self.columncolour.Bind(csel.EVT_COLOURSELECT, self.OnColumnColour)
1164        flexgridcolumn.Add(label, 0, wx.ALIGN_CENTER_VERTICAL)
1165        flexgridcolumn.Add(self.columncolour, 0)
1166
1167        label = wx.StaticText(self.leftpanel, -1, "Column Background Colour")
1168        label.SetFont(wx.Font(8, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_BOLD, 0, ""))
1169        self.columnchoice = wx.Choice(self.leftpanel, -1, choices = ["1","2","3"])
1170        self.columnchoice.SetSelection(0)
1171        self.columnchoice.Bind(wx.EVT_CHOICE, self.OnColumnChoiceChanged)
1172        self.columnbackgroundcolour = csel.ColourSelect(self.leftpanel, -1, "Choose...", wx.LIGHT_GREY)
1173        self.columnbackgroundcolour.Bind(csel.EVT_COLOURSELECT, self.OnColumnBackgroundColour)
1174        flexgridcolumn.Add(label, 0, wx.ALIGN_CENTER_VERTICAL)
1175        hSizer = wx.BoxSizer(wx.HORIZONTAL)
1176        hSizer.Add(self.columnchoice, 0, wx.RIGHT, 5)
1177        hSizer.Add(self.columnbackgroundcolour)
1178        flexgridcolumn.Add(hSizer)
1179
1180        label = wx.StaticText(self.leftpanel, -1, "Alignment")
1181        label.SetFont(wx.Font(8, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_BOLD, 0, ""))
1182        alignment = wx.Choice(self.leftpanel, -1, choices=["wx.LEFT", "wx.CENTER", "wx.RIGHT"])
1183        alignment.Bind(wx.EVT_CHOICE, self.OnColumnAlignment)
1184        flexgridcolumn.Add(label, 0, wx.ALIGN_CENTER_VERTICAL)
1185        flexgridcolumn.Add(alignment, 0)
1186
1187        label = wx.StaticText(self.leftpanel, -1, "Width Options")
1188        label.SetFont(wx.Font(8, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_BOLD, 0, ""))
1189        widthoptions = wx.Choice(self.leftpanel, -1, choices=["USEHEADER", "AUTOSIZE"])
1190        widthoptions.Bind(wx.EVT_CHOICE, self.OnColumnWidth)
1191        flexgridcolumn.Add(label, 0, wx.ALIGN_CENTER_VERTICAL)
1192        flexgridcolumn.Add(widthoptions, 0)
1193
1194        columnimages = wx.CheckBox(self.leftpanel, -1, "Images On Columns", style=wx.ALIGN_RIGHT)
1195        columnimages.SetFont(wx.Font(8, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_BOLD, 0, ""))
1196        columnimages.Bind(wx.EVT_CHECKBOX, self.OnColumnImages)
1197        flexgridcolumn.Add(columnimages, 0, wx.ALIGN_CENTER_VERTICAL)
1198        flexgridcolumn.Add((20,20), 0)
1199
1200        columnimages = wx.CheckBox(self.leftpanel, -1, "Custom Renderer", style=wx.ALIGN_RIGHT)
1201        columnimages.SetFont(wx.Font(8, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_BOLD, 0, ""))
1202        columnimages.Bind(wx.EVT_CHECKBOX, self.OnCustomRenderer)
1203        flexgridcolumn.Add(columnimages, 0, wx.ALIGN_CENTER_VERTICAL)
1204        flexgridcolumn.Add((20,20), 0)
1205
1206        columnssizer.Add(flexgridcolumn, 1, wx.EXPAND)
1207
1208        for count, event in enumerate(events):
1209
1210            if count == 0:
1211                tags = wx.ALL
1212            else:
1213                tags = wx.LEFT|wx.RIGHT|wx.BOTTOM
1214
1215            if count not in [6, 17, 22, 23]:
1216                check = wx.CheckBox(self.leftpanel, -1, event)
1217                eventssizer.Add(check, 0, tags, 3)
1218
1219                if event in ["EVT_TREE_ITEM_EXPANDED", "EVT_TREE_ITEM_COLLAPSED",
1220                             "EVT_TREE_SEL_CHANGED", "EVT_TREE_SEL_CHANGING"]:
1221
1222                    check.SetValue(1)
1223
1224                check.Bind(wx.EVT_CHECKBOX, self.OnCheckEvent)
1225                self.treeevents.append(check)
1226
1227        sizer1 = wx.BoxSizer(wx.HORIZONTAL)
1228        label = wx.StaticText(self.leftpanel, -1, "Connection Pen")
1229        font = label.GetFont()
1230        font.SetWeight(wx.FONTWEIGHT_BOLD)
1231        label.SetFont(font)
1232        buttonconnection = wx.Button(self.leftpanel, -1, "Choose...")
1233        buttonconnection.Bind(wx.EVT_BUTTON, self.OnButtonConnection)
1234        sizer1.Add(label, 0, wx.ALL|wx.ALIGN_CENTER, 5)
1235        sizer1.Add((1,0), 1, wx.EXPAND)
1236        sizer1.Add(buttonconnection, 0, wx.ALL|wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_RIGHT, 5)
1237
1238        sizer2 = wx.BoxSizer(wx.HORIZONTAL)
1239        label = wx.StaticText(self.leftpanel, -1, "Border Pen")
1240        font = label.GetFont()
1241        font.SetWeight(wx.FONTWEIGHT_BOLD)
1242        label.SetFont(font)
1243        buttonborder = wx.Button(self.leftpanel, -1, "Choose...")
1244        buttonborder.Bind(wx.EVT_BUTTON, self.OnButtonBorder)
1245        sizer2.Add(label, 0, wx.LEFT|wx.RIGHT|wx.BOTTOM|wx.ALIGN_CENTER, 5)
1246        sizer2.Add((1,0), 1, wx.EXPAND)
1247        sizer2.Add(buttonborder, 0, wx.LEFT|wx.RIGHT|wx.BOTTOM|wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_RIGHT, 5)
1248
1249        sizer3 = wx.BoxSizer(wx.HORIZONTAL)
1250        label = wx.StaticText(self.leftpanel, -1, "Tree Buttons")
1251        font = label.GetFont()
1252        font.SetWeight(wx.FONTWEIGHT_BOLD)
1253        label.SetFont(font)
1254        buttontree = wx.Button(self.leftpanel, -1, "Choose...")
1255        buttontree.Bind(wx.EVT_BUTTON, self.OnButtonTree)
1256        sizer3.Add(label, 0, wx.LEFT|wx.RIGHT|wx.BOTTOM|wx.ALIGN_CENTER, 5)
1257        sizer3.Add((1,0), 1, wx.EXPAND)
1258        sizer3.Add(buttontree, 0, wx.LEFT|wx.RIGHT|wx.BOTTOM|wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_RIGHT, 5)
1259
1260        sizer4 = wx.BoxSizer(wx.HORIZONTAL)
1261        label = wx.StaticText(self.leftpanel, -1, "Check/Radio Buttons")
1262        font = label.GetFont()
1263        font.SetWeight(wx.FONTWEIGHT_BOLD)
1264        label.SetFont(font)
1265        buttoncr = wx.Button(self.leftpanel, -1, "Choose...")
1266        buttoncr.Bind(wx.EVT_BUTTON, self.OnButtonCheckRadio)
1267        sizer4.Add(label, 0, wx.LEFT|wx.RIGHT|wx.BOTTOM|wx.ALIGN_CENTER, 5)
1268        sizer4.Add((1,0), 1, wx.EXPAND)
1269        sizer4.Add(buttoncr, 0, wx.LEFT|wx.RIGHT|wx.BOTTOM|wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_RIGHT, 5)
1270
1271        sizer5 = wx.BoxSizer(wx.HORIZONTAL)
1272        radioimage = wx.RadioButton(self.leftpanel, -1, "Image Background", style=wx.RB_GROUP)
1273        radioimage.Bind(wx.EVT_RADIOBUTTON, self.OnBackgroundImage)
1274        self.imagebutton = wx.Button(self.leftpanel, -1, "Choose...")
1275        self.imagebutton.Bind(wx.EVT_BUTTON, self.OnChooseImage)
1276        sizer5.Add(radioimage, 0, wx.ALL|wx.ALIGN_CENTER, 5)
1277        sizer5.Add((1,0), 1, wx.EXPAND)
1278        sizer5.Add(self.imagebutton, 0, wx.ALL|wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_RIGHT, 5)
1279
1280        sizer6 = wx.BoxSizer(wx.HORIZONTAL)
1281        radiobackground = wx.RadioButton(self.leftpanel, -1, "Background Colour")
1282        radiobackground.Bind(wx.EVT_RADIOBUTTON, self.OnBackgroundColour)
1283        self.backbutton = csel.ColourSelect(self.leftpanel, -1, "Choose...", wx.WHITE)
1284        self.backbutton.Bind(csel.EVT_COLOURSELECT, self.OnChooseBackground)
1285        sizer6.Add(radiobackground, 0, wx.LEFT|wx.RIGHT|wx.BOTTOM|wx.ALIGN_CENTER, 5)
1286        sizer6.Add((1,0), 1, wx.EXPAND)
1287        sizer6.Add(self.backbutton, 0, wx.LEFT|wx.RIGHT|wx.BOTTOM|wx.ALIGN_CENTER, 5)
1288
1289        colourssizer.Add(sizer1, 0, wx.EXPAND)
1290        colourssizer.Add(sizer2, 0, wx.EXPAND)
1291        colourssizer.Add(sizer3, 0, wx.EXPAND)
1292        colourssizer.Add(sizer4, 0, wx.EXPAND)
1293        colourssizer.Add(sizer5, 0, wx.EXPAND)
1294        colourssizer.Add(sizer6, 0, wx.EXPAND)
1295
1296        sizera = wx.BoxSizer(wx.HORIZONTAL)
1297        self.checknormal = wx.CheckBox(self.leftpanel, -1, "Standard Colours")
1298        self.focus = csel.ColourSelect(self.leftpanel, -1, "Focus",
1299                                       self.tree.GetHilightFocusColour())
1300        self.unfocus = csel.ColourSelect(self.leftpanel, -1, "Non-Focus",
1301                                         self.tree.GetHilightNonFocusColour())
1302        self.checknormal.Bind(wx.EVT_CHECKBOX, self.OnCheckNormal)
1303        self.focus.Bind(csel.EVT_COLOURSELECT, self.OnFocusColour)
1304        self.unfocus.Bind(csel.EVT_COLOURSELECT, self.OnNonFocusColour)
1305        sizera1 = wx.BoxSizer(wx.VERTICAL)
1306        sizera1.Add(self.focus, 0, wx.BOTTOM, 2)
1307        sizera1.Add(self.unfocus, 0)
1308        sizera.Add(self.checknormal, 0, wx.ALL, 3)
1309        sizera.Add((1, 0), 1, wx.EXPAND)
1310        sizera.Add(sizera1, 0, wx.ALL|wx.ALIGN_CENTER_HORIZONTAL|wx.EXPAND, 3)
1311
1312        sizerb = wx.BoxSizer(wx.VERTICAL)
1313        self.checkgradient = wx.CheckBox(self.leftpanel, -1, "Gradient Theme")
1314        self.checkgradient.Bind(wx.EVT_CHECKBOX, self.OnCheckGradient)
1315        sizerb1 = wx.BoxSizer(wx.HORIZONTAL)
1316        sizerb1.Add((10, 0))
1317        self.radiohorizontal = wx.RadioButton(self.leftpanel, -1, "Horizontal", style=wx.RB_GROUP)
1318        self.radiohorizontal.Bind(wx.EVT_RADIOBUTTON, self.OnHorizontal)
1319        sizerb1.Add(self.radiohorizontal, 0, wx.TOP|wx.BOTTOM, 3)
1320        sizerb2 = wx.BoxSizer(wx.HORIZONTAL)
1321        sizerb2.Add((10, 0))
1322        self.radiovertical = wx.RadioButton(self.leftpanel, -1, "Vertical")
1323        self.radiovertical.Bind(wx.EVT_RADIOBUTTON, self.OnVertical)
1324        sizerb2.Add(self.radiovertical, 0, wx.BOTTOM, 3)
1325        sizerb3 = wx.BoxSizer(wx.HORIZONTAL)
1326        self.firstcolour = csel.ColourSelect(self.leftpanel, -1, "First Colour",
1327                                             self.tree.GetFirstGradientColour())
1328        self.secondcolour = csel.ColourSelect(self.leftpanel, -1, "Second Colour",
1329                                              self.tree.GetSecondGradientColour())
1330        self.firstcolour.Bind(csel.EVT_COLOURSELECT, self.OnFirstColour)
1331        self.secondcolour.Bind(csel.EVT_COLOURSELECT, self.OnSecondColour)
1332        sizerb3.Add(self.firstcolour, 0, wx.TOP|wx.BOTTOM|wx.ALIGN_CENTER_HORIZONTAL, 3)
1333        sizerb3.Add(self.secondcolour, 0, wx.LEFT|wx.TOP|wx.BOTTOM|wx.ALIGN_CENTER_HORIZONTAL, 3)
1334        sizerb.Add(self.checkgradient, 0, wx.ALL, 3)
1335        sizerb.Add(sizerb1, 0)
1336        sizerb.Add(sizerb2, 0)
1337        sizerb.Add(sizerb3, 0, wx.ALIGN_CENTER)
1338
1339        self.checkvista = wx.CheckBox(self.leftpanel, -1, "Windows Vista Theme")
1340        self.checkvista.Bind(wx.EVT_CHECKBOX, self.OnVista)
1341
1342        themessizer.Add(sizera, 0, wx.EXPAND)
1343        themessizer.Add(sizerb, 0, wx.EXPAND)
1344        themessizer.Add((0, 5))
1345        themessizer.Add(self.checkvista, 0, wx.EXPAND|wx.ALL, 3)
1346
1347        mainsizer.Add(stylesizer, 0, wx.EXPAND|wx.ALL, 5)
1348        mainsizer.Add(columnssizer, 0, wx.EXPAND|wx.ALL, 5)
1349        mainsizer.Add(colourssizer, 0, wx.EXPAND|wx.ALL, 5)
1350        mainsizer.Add(themessizer, 0, wx.EXPAND|wx.ALL, 5)
1351        mainsizer.Add(eventssizer, 0, wx.EXPAND|wx.ALL, 5)
1352
1353        self.leftpanel.SetSizer(mainsizer)
1354        mainsizer.Layout()
1355
1356        radiobackground.SetValue(1)
1357        self.checknormal.SetValue(1)
1358        self.radiohorizontal.Enable(False)
1359        self.radiovertical.Enable(False)
1360        self.firstcolour.Enable(False)
1361        self.secondcolour.Enable(False)
1362        self.imagebutton.Enable(False)
1363
1364
1365    def OnRecreateTree(self, event):
1366
1367        panelparent = self.tree.GetParent()
1368        panelsizer = panelparent.GetSizer()
1369        panelparent.Freeze()
1370
1371        panelsizer.Detach(self.tree)
1372        self.tree.Destroy()
1373        del self.tree
1374        self.tree = HyperTreeList(panelparent, -1, log=self.log)
1375        panelsizer.Add(self.tree, 1, wx.EXPAND)
1376        panelsizer.Layout()
1377
1378        for col in range(self.tree.GetColumnCount()):
1379            colColour = self.columnBackgroundColours[col]
1380            self.ColourColumnItems(colColour, col)
1381
1382        panelparent.Thaw()
1383
1384
1385    def OnCheckStyle(self, event):
1386
1387        self.tree.ChangeStyle(self.treestyles)
1388        event.Skip()
1389
1390
1391    def OnCheckEvent(self, event):
1392
1393        obj = event.GetEventObject()
1394        self.tree.BindEvents(obj)
1395
1396        event.Skip()
1397
1398
1399    def OnButtonConnection(self, event):
1400
1401        pen = self.tree.GetConnectionPen()
1402        dlg = PenDialog(self, -1, oldpen=pen, pentype=0)
1403
1404        dlg.ShowModal()
1405        dlg.Destroy()
1406
1407
1408    def OnColumnFont(self, event):
1409
1410        font = self.tree.GetColumn(0).GetFont()
1411
1412        data = wx.FontData()
1413        data.SetInitialFont(font)
1414        dlg = wx.FontDialog(self, data)
1415
1416        if dlg.ShowModal() == wx.ID_OK:
1417            data = dlg.GetFontData()
1418            font = data.GetChosenFont()
1419            for i in range(0, self.tree.GetMainWindow().GetColumnCount()):
1420                self.tree.SetColumnFont(i, font)
1421
1422        dlg.Destroy()
1423        event.Skip()
1424
1425
1426    def OnColumnColour(self, event):
1427
1428        col1 = event.GetValue()
1429        for i in range(0, self.tree.GetMainWindow().GetColumnCount()):
1430            self.tree.SetColumnColour(i, col1)
1431
1432        event.Skip()
1433
1434    def OnColumnChoiceChanged(self, event):
1435
1436        selectedColumn = self.columnchoice.GetCurrentSelection()
1437
1438        if  selectedColumn in range(3):
1439            colour = self.columnBackgroundColours[selectedColumn]
1440            self.columnbackgroundcolour.SetValue(colour)
1441
1442    def ColourColumnItems(self, colour, col):
1443
1444        def ColourItems(item,colour,col):
1445
1446            next = item
1447
1448            while next != None:
1449
1450                self.tree.SetItemBackgroundColour(next, colour, col)
1451
1452                cookie=0
1453                child, cockie = self.tree.GetNextChild(next, cookie)
1454
1455                while child != None:
1456                    ColourItems(child, colour, col)
1457                    child, cookie = self.tree.GetNextChild(next, cookie)
1458
1459                next = self.tree.GetNextSibling(next)
1460
1461        root = self.tree.GetRootItem()
1462        ColourItems(root, colour, col)
1463
1464    def OnColumnBackgroundColour(self, event):
1465
1466        columnBackgroundColour = event.GetValue()
1467        selectedColumn = self.columnchoice.GetCurrentSelection()
1468        self.columnBackgroundColours[selectedColumn] = columnBackgroundColour
1469
1470        self.ColourColumnItems(columnBackgroundColour, selectedColumn)
1471
1472        event.Skip()
1473
1474    def OnColumnAlignment(self, event):
1475
1476        selection = event.GetSelection()
1477        if selection == 0:
1478            alignment = wx.ALIGN_LEFT
1479        elif selection == 1:
1480            alignment = wx.ALIGN_CENTER
1481        else:
1482            alignment = wx.ALIGN_RIGHT
1483
1484        for i in range(1, self.tree.GetMainWindow().GetColumnCount()):
1485            self.tree.SetColumnAlignment(i, alignment)
1486
1487        event.Skip()
1488
1489
1490    def OnColumnImages(self, event):
1491
1492        for i in range(self.tree.GetMainWindow().GetColumnCount()):
1493            randimage = random.randint(1, len(ArtIDs))
1494            img = (event.IsChecked() and [randimage] or [-1])[0]
1495            self.tree.SetColumnImage(i, img)
1496
1497        event.Skip()
1498
1499    def OnCustomRenderer(self, event):
1500
1501        if event.IsChecked():
1502            renderer = HyperTreeHeaderRenderer(self)
1503            renderer.color = wx.Colour(211,227,247)
1504            renderer.text_color = wx.Colour(30,30,30)
1505            self.tree.SetHeaderCustomRenderer(renderer)
1506        else:
1507            renderer = None
1508            self.tree.SetHeaderCustomRenderer(renderer)
1509
1510        self.Refresh()
1511
1512        event.Skip()
1513
1514
1515
1516    def OnColumnWidth(self, event):
1517
1518        selection = event.GetSelection()
1519        if selection == 0:    # wx.LIST_AUTOSIZE_USEHEADER
1520            choice = wx.LIST_AUTOSIZE_USEHEADER
1521        else:
1522            choice = wx.LIST_AUTOSIZE
1523
1524        for i in range(self.tree.GetMainWindow().GetColumnCount()):
1525            self.tree.SetColumnWidth(i, choice)
1526
1527        event.Skip()
1528
1529
1530    def SetConnectionPen(self, pen):
1531
1532        self.tree.SetConnectionPen(pen)
1533
1534
1535    def OnButtonBorder(self, event):
1536
1537        pen = self.tree.GetBorderPen()
1538        dlg = PenDialog(self, -1, oldpen=pen, pentype=1)
1539
1540        dlg.ShowModal()
1541        dlg.Destroy()
1542
1543
1544    def SetBorderPen(self, pen):
1545
1546        self.tree.SetBorderPen(pen)
1547
1548
1549    def OnButtonTree(self, event):
1550
1551        dlg = TreeDialog(self, -1, oldicons=self.oldicons)
1552        dlg.ShowModal()
1553        dlg.Destroy()
1554
1555
1556    def OnButtonCheckRadio(self, event):
1557
1558        dlg = CheckDialog(self, -1)
1559        dlg.ShowModal()
1560        dlg.Destroy()
1561
1562
1563    def SetTreeButtons(self, selection):
1564
1565        bitmap_plus = opj(bitmapDir + "plus" + str(selection+1) + ".ico")
1566        bitmap_minus = opj(bitmapDir + "minus" + str(selection+1) + ".ico")
1567
1568        bitmap = wx.Bitmap(bitmap_plus, wx.BITMAP_TYPE_ICO)
1569        width = bitmap.GetWidth()
1570
1571        il = wx.ImageList(width, width)
1572
1573        il.Add(wx.Bitmap(bitmap_plus, wx.BITMAP_TYPE_ICO))
1574        il.Add(wx.Bitmap(bitmap_plus, wx.BITMAP_TYPE_ICO))
1575        il.Add(wx.Bitmap(bitmap_minus, wx.BITMAP_TYPE_ICO))
1576        il.Add(wx.Bitmap(bitmap_minus, wx.BITMAP_TYPE_ICO))
1577
1578        self.il = il
1579        self.tree.SetButtonsImageList(il)
1580
1581
1582    def SetCheckRadio(self, selection):
1583
1584        if selection == 0:
1585            self.tree.SetImageListCheck(13, 13)
1586        else:
1587            bitmap_check = opj(bitmapDir + "aquachecked.ico")
1588            bitmap_uncheck = opj(bitmapDir + "aquanotchecked.ico")
1589            bitmap_flag = opj(bitmapDir + "aquaflagged.ico")
1590            bitmap_unflag = opj(bitmapDir + "aquanotflagged.ico")
1591
1592            il = wx.ImageList(16, 16)
1593
1594            il.Add(wx.Bitmap(bitmap_check, wx.BITMAP_TYPE_ICO))
1595            il.Add(wx.Bitmap(bitmap_uncheck, wx.BITMAP_TYPE_ICO))
1596            il.Add(wx.Bitmap(bitmap_uncheck, wx.BITMAP_TYPE_ICO)) # TODO: we need an "undetermined check" icon...
1597            il.Add(wx.Bitmap(bitmap_flag, wx.BITMAP_TYPE_ICO))
1598            il.Add(wx.Bitmap(bitmap_unflag, wx.BITMAP_TYPE_ICO))
1599            self.tree.SetImageListCheck(16, 16, il)
1600
1601
1602    def OnBackgroundImage(self, event):
1603
1604        if hasattr(self, "backgroundimage"):
1605            self.tree.SetBackgroundImage(self.backgroundimage)
1606
1607        self.backbutton.Enable(False)
1608        self.imagebutton.Enable(True)
1609
1610        event.Skip()
1611
1612
1613    def OnChooseImage(self, event):
1614
1615        wildcard = "JPEG Files (*.jpg)|*.jpg|"     \
1616                   "Bitmap Files (*.bmp)|*.bmp|" \
1617                   "PNG Files (*.png)|*.png|"    \
1618                   "Icon Files (*.ico)|*.ico|"        \
1619                   "GIF Files (*.gif)|*.gif|"        \
1620                   "All files (*.*)|*.*"
1621
1622        dlg = wx.FileDialog(self, "Choose An Image File", ".", "", wildcard, wx.FD_OPEN)
1623
1624        if dlg.ShowModal() == wx.ID_OK:
1625            path = dlg.GetPath()
1626        else:
1627            dlg.Destroy()
1628            return
1629
1630        dlg.Destroy()
1631        bitmap = wx.Bitmap(path, wx.BITMAP_TYPE_ANY)
1632        self.tree.SetBackgroundImage(bitmap)
1633        self.backgroundimage = bitmap
1634
1635        event.Skip()
1636
1637
1638    def OnBackgroundColour(self, event):
1639
1640        self.imagebutton.Enable(False)
1641        self.backbutton.Enable(True)
1642        self.tree.SetBackgroundImage(None)
1643
1644        event.Skip()
1645
1646
1647    def OnChooseBackground(self, event):
1648
1649        col1 = event.GetValue()
1650        self.tree.SetBackgroundColour(col1)
1651        event.Skip()
1652
1653
1654    def OnCheckNormal(self, event):
1655
1656        self.radiohorizontal.Enable(False)
1657        self.radiovertical.Enable(False)
1658        self.firstcolour.Enable(False)
1659        self.secondcolour.Enable(False)
1660        self.focus.Enable(True)
1661        self.unfocus.Enable(True)
1662        self.checkgradient.SetValue(0)
1663        self.checkvista.SetValue(0)
1664        self.tree.EnableSelectionGradient(False)
1665        self.tree.EnableSelectionVista(False)
1666        event.Skip()
1667
1668
1669    def OnFocusColour(self, event):
1670
1671        col1 = event.GetValue()
1672        self.tree.SetHilightFocusColour(col1)
1673        event.Skip()
1674
1675
1676    def OnNonFocusColour(self, event):
1677
1678        col1 = event.GetValue()
1679        self.tree.SetHilightNonFocusColour(col1)
1680        event.Skip()
1681
1682
1683    def OnCheckGradient(self, event):
1684
1685        self.radiohorizontal.Enable(True)
1686        self.radiovertical.Enable(True)
1687        self.firstcolour.Enable(True)
1688        self.secondcolour.Enable(True)
1689        self.checknormal.SetValue(0)
1690        self.checkvista.SetValue(0)
1691        self.focus.Enable(False)
1692        self.unfocus.Enable(False)
1693        self.tree.SetGradientStyle(self.radiovertical.GetValue())
1694        self.tree.EnableSelectionVista(False)
1695        self.tree.EnableSelectionGradient(True)
1696
1697        event.Skip()
1698
1699
1700    def OnHorizontal(self, event):
1701
1702        self.tree.SetGradientStyle(self.radiovertical.GetValue())
1703        event.Skip()
1704
1705
1706    def OnVertical(self, event):
1707
1708        self.tree.SetGradientStyle(self.radiovertical.GetValue())
1709        event.Skip()
1710
1711
1712    def OnFirstColour(self, event):
1713
1714        col1 = event.GetValue()
1715        self.tree.SetFirstGradientColour(wx.Colour(col1[0], col1[1], col1[2]))
1716        event.Skip()
1717
1718
1719    def OnSecondColour(self, event):
1720
1721        col1 = event.GetValue()
1722        self.tree.SetSecondGradientColour(wx.Colour(col1[0], col1[1], col1[2]))
1723        event.Skip()
1724
1725
1726    def OnVista(self, event):
1727
1728        self.radiohorizontal.Enable(False)
1729        self.radiovertical.Enable(False)
1730        self.firstcolour.Enable(False)
1731        self.secondcolour.Enable(False)
1732        self.checknormal.SetValue(0)
1733        self.checkgradient.SetValue(0)
1734        self.focus.Enable(False)
1735        self.unfocus.Enable(False)
1736        self.tree.EnableSelectionGradient(False)
1737        self.tree.EnableSelectionVista(True)
1738
1739        event.Skip()
1740
1741
1742#---------------------------------------------------------------------------
1743# HyperTreeList Implementation
1744#---------------------------------------------------------------------------
1745class HyperTreeList(HTL.HyperTreeList):
1746
1747    def __init__(self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition,
1748                 size=wx.DefaultSize,
1749                 style=wx.SUNKEN_BORDER,
1750                 agwStyle=wx.TR_HAS_BUTTONS | wx.TR_HAS_VARIABLE_ROW_HEIGHT,
1751                 log=None):
1752
1753        HTL.HyperTreeList.__init__(self, parent, id, pos, size, style, agwStyle)
1754
1755        alldata = dir(HTL)
1756
1757        treestyles = []
1758        events = []
1759        for data in alldata:
1760            if data.startswith("TR_"):
1761                treestyles.append(data)
1762            elif data.startswith("EVT_"):
1763                events.append(data)
1764
1765        events = events + [i for i in dir(wx) if i.startswith("EVT_TREE_")]
1766        for evt in ["EVT_TREE_GET_INFO", "EVT_TREE_SET_INFO", "EVT_TREE_ITEM_MIDDLE_CLICK",
1767                    "EVT_TREE_STATE_IMAGE_CLICK"]:
1768            events.remove(evt)
1769
1770        treestyles = treestyles + [i for i in dir(wx) if i.startswith("TR_")]
1771        treeset = {}
1772        treestyles = [treeset.setdefault(e,e) for e in treestyles if e not in treeset]
1773
1774        treestyles.sort()
1775
1776        self.events = events
1777        self.styles = treestyles
1778        self.item = None
1779
1780        il = wx.ImageList(16, 16)
1781
1782        for items in ArtIDs[1:-1]:
1783            bmp = wx.ArtProvider.GetBitmap(eval(items), wx.ART_TOOLBAR, (16, 16))
1784            il.Add(bmp)
1785
1786        smileidx = il.Add(images.Smiles.GetBitmap())
1787        numicons = il.GetImageCount()
1788
1789        self.AssignImageList(il)
1790        self.count = 0
1791        self.log = log
1792
1793        # NOTE:  For some reason tree items have to have a data object in
1794        #        order to be sorted.  Since our compare just uses the labels
1795        #        we don't need any real data, so we'll just use None below for
1796        #        the item data.
1797
1798        # create some columns
1799        self.AddColumn("Main column")
1800        self.AddColumn("Column 1")
1801        self.AddColumn("Column 2")
1802        self.SetMainColumn(0) # the one with the tree in it...
1803        self.SetColumnWidth(0, 175)
1804
1805        self.root = self.AddRoot("The Root Item")
1806
1807        if not(self.GetAGWWindowStyleFlag() & wx.TR_HIDE_ROOT):
1808            self.SetPyData(self.root, None)
1809            self.SetItemImage(self.root, 24, which=wx.TreeItemIcon_Normal)
1810            self.SetItemImage(self.root, 13, which=wx.TreeItemIcon_Expanded)
1811            self.SetItemText(self.root, "col 1 root", 1)
1812            self.SetItemText(self.root, "col 2 root", 2)
1813
1814        textctrl = wx.TextCtrl(self.GetMainWindow(), -1, "I Am A Simple\nMultiline wx.TexCtrl", style=wx.TE_MULTILINE)
1815        self.gauge = wx.Gauge(self.GetMainWindow(), -1, 50, style=wx.GA_HORIZONTAL|wx.GA_SMOOTH)
1816        self.gauge.SetValue(0)
1817        combobox = wx.ComboBox(self.GetMainWindow(), -1, choices=["That", "Was", "A", "Nice", "Holiday!"], style=wx.CB_READONLY|wx.CB_DROPDOWN)
1818        button1 = wx.Button(self.GetMainWindow(), -1, "wxPython")
1819        button1.SetSize(button1.GetBestSize())
1820        button2 = wx.Button(self.GetMainWindow(), -1, "Rules!")
1821        button2.SetSize(button2.GetBestSize())
1822        listctrl = ListCtrl.TestListCtrlPanel(self.GetMainWindow(), self.log)
1823        listctrl.SetSize((500, 200))
1824
1825        textctrl.Bind(wx.EVT_CHAR, self.OnTextCtrl)
1826        combobox.Bind(wx.EVT_COMBOBOX, self.OnComboBox)
1827
1828        for x in range(15):
1829            txt = "Item %d" % x
1830            if x == 1:
1831                child = self.AppendItem(self.root, txt + "\nHello World\nHappy wxPython-ing!")
1832                self.SetItemBold(child, True)
1833            else:
1834                child = self.AppendItem(self.root, txt)
1835
1836            self.SetPyData(child, None)
1837            self.SetItemText(child, txt + " (c1)", 1)
1838            self.SetItemText(child, txt + " (c2)", 2)
1839            self.SetItemImage(child, 24, which=wx.TreeItemIcon_Normal)
1840            self.SetItemImage(child, 13, which=wx.TreeItemIcon_Expanded)
1841
1842            for y in range(5):
1843                txt = "item %d-%s" % (x, chr(ord("a")+y))
1844                if y == 0 and x == 1:
1845                    last = self.AppendItem(child, txt, ct_type=2, wnd=self.gauge)
1846                elif y == 1 and x == 2:
1847                    last = self.AppendItem(child, txt, ct_type=1, wnd=textctrl)
1848                    if random.randint(0, 3) == 1:
1849                        self.SetItem3State(last, True)
1850                elif 2 < y < 4:
1851                    last = self.AppendItem(child, txt)
1852                elif y == 4 and x == 1:
1853                    last = self.AppendItem(child, txt, wnd=combobox)
1854                else:
1855                    last = self.AppendItem(child, txt, ct_type=2)
1856
1857                self.SetPyData(last, None)
1858                self.SetItemText(last, txt + " (c1)", 1)
1859                self.SetItemText(last, txt + " (c2)", 2)
1860                self.SetItemImage(last, 24, which=wx.TreeItemIcon_Normal)
1861                self.SetItemImage(last, 13, which=wx.TreeItemIcon_Expanded)
1862
1863                if y == 3 and x == 0:
1864                    self.SetItemWindow(last, button1, 1)
1865                    self.SetItemWindow(last, button2, 2)
1866
1867                for z in range(5):
1868                    txt = "item %d-%s-%d" % (x, chr(ord("a")+y), z)
1869                    if z > 2:
1870                        item = self.AppendItem(last, txt, ct_type=1)
1871                        if random.randint(0, 3) == 1:
1872                            self.SetItem3State(item, True)
1873                    elif 0 < z <= 2:
1874                        item = self.AppendItem(last, txt, ct_type=2)
1875                    elif z == 0:
1876                        item = self.AppendItem(last, txt)
1877
1878                    self.SetPyData(item, None)
1879
1880                    if x == 0 and y == 0 and z == 0:
1881                        self.SetItemText(item, "", 1)
1882                        self.SetItemText(item, txt + " (c2)", 2)
1883                        self.SetItemWindow(item, self.CreateTreeCtrl(), 1)
1884                    elif x == 0 and y == 0 and z == 1:
1885                        self.SetItemText(item, txt + " (c1)", 1)
1886                        self.SetItemText(item, "", 2)
1887                        self.SetItemWindow(item, listctrl, 2)
1888                    else:
1889                        self.SetItemText(item, txt + " (c1)", 1)
1890                        self.SetItemText(item, txt + " (c2)", 2)
1891                        if z == 0:
1892                            self.SetItemHyperText(item, True)
1893
1894                    self.SetItemImage(item, 28, which=wx.TreeItemIcon_Normal)
1895                    self.SetItemImage(item, numicons-1, which=wx.TreeItemIcon_Selected)
1896
1897        self.GetMainWindow().Bind(wx.EVT_LEFT_DCLICK, self.OnLeftDClick)
1898        self.Bind(wx.EVT_IDLE, self.OnIdle)
1899
1900        self.eventdict = {'EVT_TREE_BEGIN_DRAG': self.OnBeginDrag, 'EVT_TREE_BEGIN_LABEL_EDIT': self.OnBeginEdit,
1901                          'EVT_TREE_BEGIN_RDRAG': self.OnBeginRDrag, 'EVT_TREE_DELETE_ITEM': self.OnDeleteItem,
1902                          'EVT_TREE_END_DRAG': self.OnEndDrag, 'EVT_TREE_END_LABEL_EDIT': self.OnEndEdit,
1903                          'EVT_TREE_ITEM_ACTIVATED': self.OnActivate, 'EVT_TREE_ITEM_CHECKED': self.OnItemCheck,
1904                          'EVT_TREE_ITEM_CHECKING': self.OnItemChecking, 'EVT_TREE_ITEM_COLLAPSED': self.OnItemCollapsed,
1905                          'EVT_TREE_ITEM_COLLAPSING': self.OnItemCollapsing, 'EVT_TREE_ITEM_EXPANDED': self.OnItemExpanded,
1906                          'EVT_TREE_ITEM_EXPANDING': self.OnItemExpanding, 'EVT_TREE_ITEM_GETTOOLTIP': self.OnToolTip,
1907                          'EVT_TREE_ITEM_MENU': self.OnItemMenu, 'EVT_TREE_ITEM_RIGHT_CLICK': self.OnRightDown,
1908                          'EVT_TREE_KEY_DOWN': self.OnKey, 'EVT_TREE_SEL_CHANGED': self.OnSelChanged,
1909                          'EVT_TREE_SEL_CHANGING': self.OnSelChanging, "EVT_TREE_ITEM_HYPERLINK": self.OnHyperLink}
1910
1911        mainframe = wx.GetTopLevelParent(self)
1912
1913        if not hasattr(mainframe, "leftpanel"):
1914            self.Bind(wx.EVT_TREE_ITEM_EXPANDED, self.OnItemExpanded)
1915            self.Bind(wx.EVT_TREE_ITEM_COLLAPSED, self.OnItemCollapsed)
1916            self.Bind(wx.EVT_TREE_SEL_CHANGED, self.OnSelChanged)
1917            self.Bind(wx.EVT_TREE_SEL_CHANGING, self.OnSelChanging)
1918            self.GetMainWindow().Bind(wx.EVT_RIGHT_DOWN, self.OnRightDown)
1919            self.GetMainWindow().Bind(wx.EVT_RIGHT_UP, self.OnRightUp)
1920        else:
1921            for combos in mainframe.treeevents:
1922                self.BindEvents(combos)
1923
1924        if hasattr(mainframe, "leftpanel"):
1925            self.ChangeStyle(mainframe.treestyles)
1926
1927        if not(self.GetAGWWindowStyleFlag() & wx.TR_HIDE_ROOT):
1928            self.SelectItem(self.root)
1929            self.Expand(self.root)
1930
1931
1932    def CreateTreeCtrl(self):
1933
1934        tree = wx.TreeCtrl(self.GetMainWindow(), -1, wx.Point(0, 0), wx.Size(160, 200),
1935                           wx.TR_DEFAULT_STYLE)
1936
1937        items = []
1938
1939        imglist = wx.ImageList(16, 16, True, 2)
1940        imglist.Add(wx.ArtProvider.GetBitmap(wx.ART_FOLDER, wx.ART_OTHER, wx.Size(16,16)))
1941        imglist.Add(wx.ArtProvider.GetBitmap(wx.ART_NORMAL_FILE, wx.ART_OTHER, wx.Size(16,16)))
1942        tree.AssignImageList(imglist)
1943
1944        root = tree.AddRoot("HyperTreeList :-D", image=0)
1945
1946        items.append(tree.AppendItem(root, "Item 1", 0))
1947        items.append(tree.AppendItem(root, "Item 2", 0))
1948        items.append(tree.AppendItem(root, "Item 3", 0))
1949        items.append(tree.AppendItem(root, "Item 4", 0))
1950        items.append(tree.AppendItem(root, "Item 5", 0))
1951
1952        for ii in range(len(items)):
1953
1954            id = items[ii]
1955            tree.AppendItem(id, "Subitem 1", 1)
1956            tree.AppendItem(id, "Subitem 2", 1)
1957            tree.AppendItem(id, "Subitem 3", 1)
1958            tree.AppendItem(id, "Subitem 4", 1)
1959            tree.AppendItem(id, "Subitem 5", 1)
1960
1961        tree.Expand(root)
1962        tree.Expand(items[1])
1963        tree.Expand(items[3])
1964        tree.SelectItem(root)
1965
1966        return tree
1967
1968
1969    def BindEvents(self, choice, recreate=False):
1970
1971        value = choice.GetValue()
1972        text = choice.GetLabel()
1973
1974        evt = "wx." + text
1975        binder = self.eventdict[text]
1976
1977        if value == 1:
1978            if evt == "wx.EVT_TREE_BEGIN_RDRAG":
1979                self.GetMainWindow().Bind(wx.EVT_RIGHT_DOWN, None)
1980                self.GetMainWindow().Bind(wx.EVT_RIGHT_UP, None)
1981            try:
1982                self.Bind(eval(evt), binder)
1983            except:
1984                self.Bind(eval("HTL." + text), binder)
1985        else:
1986            try:
1987                self.Bind(eval(evt), None)
1988            except:
1989                self.Bind(eval("HTL." + text), None)
1990
1991            if evt == "wx.EVT_TREE_BEGIN_RDRAG":
1992                self.GetMainWindow().Bind(wx.EVT_RIGHT_DOWN, self.OnRightDown)
1993                self.GetMainWindow().Bind(wx.EVT_RIGHT_UP, self.OnRightUp)
1994
1995
1996    def ChangeStyle(self, combos):
1997
1998        style = 0
1999        for combo in combos:
2000            if combo.GetValue() == 1:
2001                if combo.GetLabel() == "TR_VIRTUAL":
2002                    style = style | HTL.TR_VIRTUAL
2003                else:
2004                    try:
2005                        style = style | eval("wx." + combo.GetLabel())
2006                    except:
2007                        style = style | eval("HTL." + combo.GetLabel())
2008
2009        if self.GetAGWWindowStyleFlag() != style:
2010            self.SetAGWWindowStyleFlag(style)
2011
2012
2013    def OnCompareItems(self, item1, item2):
2014
2015        t1 = self.GetItemText(item1)
2016        t2 = self.GetItemText(item2)
2017
2018        self.log.write('compare: ' + t1 + ' <> ' + t2 + "\n")
2019
2020        if t1 < t2:
2021            return -1
2022        if t1 == t2:
2023            return 0
2024
2025        return 1
2026
2027
2028    def OnIdle(self, event):
2029
2030        if self.gauge:
2031
2032            try:
2033                if self.gauge.IsEnabled() and self.gauge.IsShown():
2034                    self.count = self.count + 1
2035
2036                    if self.count >= 50:
2037                        self.count = 0
2038
2039                    self.gauge.SetValue(self.count)
2040
2041            except:
2042
2043                self.gauge = None
2044
2045        event.Skip()
2046
2047
2048    def OnRightDown(self, event):
2049
2050        pt = event.GetPosition()
2051        item, flags, column = self.HitTest(pt)
2052
2053        if item:
2054            self.item = item
2055            self.log.write("OnRightClick: %s, %s, %s\n" % (self.GetItemText(item), type(item), item.__class__))
2056            self.SelectItem(item)
2057
2058
2059    def OnRightUp(self, event):
2060
2061        item = self.item
2062
2063        if not item:
2064            event.Skip()
2065            return
2066
2067        if not self.IsItemEnabled(item):
2068            event.Skip()
2069            return
2070
2071        # Item Text Appearance
2072        ishtml = self.IsItemHyperText(item)
2073        back = self.GetItemBackgroundColour(item)
2074        fore = self.GetItemTextColour(item)
2075        isbold = self.IsBold(item)
2076        font = self.GetItemFont(item)
2077
2078        # Icons On Item
2079        normal = self.GetItemImage(item, wx.TreeItemIcon_Normal)
2080        selected = self.GetItemImage(item, wx.TreeItemIcon_Selected)
2081        expanded = self.GetItemImage(item, wx.TreeItemIcon_Expanded)
2082        selexp = self.GetItemImage(item, wx.TreeItemIcon_SelectedExpanded)
2083
2084        # Enabling/Disabling Windows Associated To An Item
2085        haswin = self.GetItemWindow(item)
2086
2087        # Enabling/Disabling Items
2088        enabled = self.IsItemEnabled(item)
2089
2090        # Generic Item's Info
2091        children = self.GetChildrenCount(item)
2092        itemtype = self.GetItemType(item)
2093        text = self.GetItemText(item)
2094        pydata = self.GetPyData(item)
2095
2096        self.current = item
2097        self.itemdict = {"ishtml": ishtml, "back": back, "fore": fore, "isbold": isbold,
2098                         "font": font, "normal": normal, "selected": selected, "expanded": expanded,
2099                         "selexp": selexp, "haswin": haswin, "children": children,
2100                         "itemtype": itemtype, "text": text, "pydata": pydata, "enabled": enabled}
2101
2102        menu = wx.Menu()
2103
2104        item2 = menu.Append(wx.ID_ANY, "Modify Item Text Colour")
2105        menu.AppendSeparator()
2106        if isbold:
2107            strs = "Make Item Text Not Bold"
2108        else:
2109            strs = "Make Item Text Bold"
2110        item3 = menu.Append(wx.ID_ANY, strs)
2111        item4 = menu.Append(wx.ID_ANY, "Change Item Font")
2112        item13 = menu.Append(wx.ID_ANY, "Change Item Background Colour")
2113        menu.AppendSeparator()
2114        if ishtml:
2115            strs = "Set Item As Non-Hyperlink"
2116        else:
2117            strs = "Set Item As Hyperlink"
2118        item5 = menu.Append(wx.ID_ANY, strs)
2119        menu.AppendSeparator()
2120
2121        item7 = menu.Append(wx.ID_ANY, "Disable Item")
2122
2123        menu.AppendSeparator()
2124        item14 = menu.Append(wx.ID_ANY, "Hide Item")
2125        item15 = menu.Append(wx.ID_ANY, "Unhide All Items")
2126        menu.AppendSeparator()
2127        item8 = menu.Append(wx.ID_ANY, "Change Item Icons")
2128        menu.AppendSeparator()
2129        item9 = menu.Append(wx.ID_ANY, "Get Other Information For This Item")
2130        menu.AppendSeparator()
2131
2132        item10 = menu.Append(wx.ID_ANY, "Delete Item")
2133        if item == self.GetRootItem():
2134            item10.Enable(False)
2135        item11 = menu.Append(wx.ID_ANY, "Prepend An Item")
2136        item12 = menu.Append(wx.ID_ANY, "Append An Item")
2137
2138        self.Bind(wx.EVT_MENU, self.OnItemForeground, item2)
2139        self.Bind(wx.EVT_MENU, self.OnItemBold, item3)
2140        self.Bind(wx.EVT_MENU, self.OnItemFont, item4)
2141        self.Bind(wx.EVT_MENU, self.OnItemHyperText, item5)
2142        self.Bind(wx.EVT_MENU, self.OnDisableItem, item7)
2143        self.Bind(wx.EVT_MENU, self.OnItemIcons, item8)
2144        self.Bind(wx.EVT_MENU, self.OnItemInfo, item9)
2145        self.Bind(wx.EVT_MENU, self.OnItemDelete, item10)
2146        self.Bind(wx.EVT_MENU, self.OnItemPrepend, item11)
2147        self.Bind(wx.EVT_MENU, self.OnItemAppend, item12)
2148        self.Bind(wx.EVT_MENU, self.OnItemBackground, item13)
2149        self.Bind(wx.EVT_MENU, self.OnHideItem, item14)
2150        self.Bind(wx.EVT_MENU, self.OnUnhideItems, item15)
2151
2152        self.PopupMenu(menu)
2153        menu.Destroy()
2154        event.Skip()
2155
2156
2157    def OnItemForeground(self, event):
2158
2159        colourdata = wx.ColourData()
2160        colourdata.SetColour(self.itemdict["fore"])
2161        dlg = wx.ColourDialog(self, colourdata)
2162
2163        dlg.GetColourData().SetChooseFull(True)
2164
2165        if dlg.ShowModal() == wx.ID_OK:
2166            data = dlg.GetColourData()
2167            col1 = data.GetColour().Get()
2168            self.SetItemTextColour(self.current, col1)
2169        dlg.Destroy()
2170        event.Skip()
2171
2172
2173    def OnItemBold(self, event):
2174
2175        self.SetItemBold(self.current, not self.itemdict["isbold"])
2176        event.Skip()
2177
2178
2179    def OnItemFont(self, event):
2180
2181        data = wx.FontData()
2182        font = self.itemdict["font"]
2183
2184        if font is None:
2185            font = wx.SystemSettings_GetFont(wx.SYS_DEFAULT_GUI_FONT)
2186
2187        data.SetInitialFont(font)
2188
2189        dlg = wx.FontDialog(self, data)
2190
2191        if dlg.ShowModal() == wx.ID_OK:
2192            data = dlg.GetFontData()
2193            font = data.GetChosenFont()
2194            self.SetItemFont(self.current, font)
2195
2196        dlg.Destroy()
2197        event.Skip()
2198
2199
2200    def OnItemHyperText(self, event):
2201
2202        self.SetItemHyperText(self.current, not self.itemdict["ishtml"])
2203        event.Skip()
2204
2205
2206    def OnDisableItem(self, event):
2207
2208        self.EnableItem(self.current, False)
2209        event.Skip()
2210
2211
2212    def OnHideItem(self, event):
2213
2214        self.HideItem(self.current)
2215        event.Skip()
2216
2217
2218    def OnUnhideItems(self, event):
2219
2220        item = self.GetRootItem()
2221        while item:
2222            if item.IsHidden():
2223                self.HideItem(item, False)
2224            item = self.GetNext(item)
2225        event.Skip()
2226
2227
2228    def OnItemIcons(self, event):
2229
2230        bitmaps = [self.itemdict["normal"], self.itemdict["selected"],
2231                   self.itemdict["expanded"], self.itemdict["selexp"]]
2232
2233        wx.BeginBusyCursor()
2234        dlg = TreeIcons(self, -1, bitmaps=bitmaps)
2235        wx.EndBusyCursor()
2236        dlg.ShowModal()
2237        dlg.Destroy()
2238
2239
2240    def SetNewIcons(self, bitmaps):
2241
2242        self.SetItemImage(self.current, bitmaps[0], which=wx.TreeItemIcon_Normal)
2243        self.SetItemImage(self.current, bitmaps[1], which=wx.TreeItemIcon_Selected)
2244        self.SetItemImage(self.current, bitmaps[2], which=wx.TreeItemIcon_Expanded)
2245        self.SetItemImage(self.current, bitmaps[3], which=wx.TreeItemIcon_SelectedExpanded)
2246
2247
2248    def OnItemInfo(self, event):
2249
2250        itemtext = self.itemdict["text"]
2251        numchildren = str(self.itemdict["children"])
2252        itemtype = self.itemdict["itemtype"]
2253        pydata = repr(type(self.itemdict["pydata"]))
2254
2255        if itemtype == 0:
2256            itemtype = "Normal"
2257        elif itemtype == 1:
2258            itemtype = "CheckBox"
2259        else:
2260            itemtype = "RadioButton"
2261
2262        strs = "Information On Selected Item:\n\n" + "Text: " + itemtext + "\n" \
2263               "Number Of Children: " + numchildren + "\n" \
2264               "Item Type: " + itemtype + "\n" \
2265               "Item Data Type: " + pydata + "\n"
2266
2267        dlg = wx.MessageDialog(self, strs, "HyperTreeListDemo Info", wx.OK | wx.ICON_INFORMATION)
2268        dlg.ShowModal()
2269        dlg.Destroy()
2270
2271        event.Skip()
2272
2273
2274    def OnItemDelete(self, event):
2275
2276        strs = "Are You Sure You Want To Delete Item " + self.GetItemText(self.current) + "?"
2277        dlg = wx.MessageDialog(None, strs, 'Deleting Item', wx.YES_NO | wx.NO_DEFAULT | wx.CANCEL | wx.ICON_QUESTION)
2278
2279        if dlg.ShowModal() in [wx.ID_NO, wx.ID_CANCEL]:
2280            dlg.Destroy()
2281            return
2282
2283        dlg.Destroy()
2284
2285        self.DeleteChildren(self.current)
2286        self.Delete(self.current)
2287        self.current = None
2288
2289        event.Skip()
2290
2291
2292    def OnItemPrepend(self, event):
2293
2294        dlg = wx.TextEntryDialog(self, "Please Enter The New Item Name", 'Item Naming', 'Python')
2295
2296        if dlg.ShowModal() == wx.ID_OK:
2297            newname = dlg.GetValue()
2298            newitem = self.PrependItem(self.current, newname)
2299            self.EnsureVisible(newitem)
2300
2301        dlg.Destroy()
2302        event.Skip()
2303
2304
2305    def OnItemAppend(self, event):
2306
2307        dlg = wx.TextEntryDialog(self, "Please Enter The New Item Name", 'Item Naming', 'Python')
2308
2309        if dlg.ShowModal() == wx.ID_OK:
2310            newname = dlg.GetValue()
2311            newitem = self.AppendItem(self.current, newname)
2312            self.EnsureVisible(newitem)
2313
2314        dlg.Destroy()
2315        event.Skip()
2316
2317
2318    def OnItemBackground(self, event):
2319
2320        colourdata = wx.ColourData()
2321        colourdata.SetColour(self.itemdict["back"])
2322        dlg = wx.ColourDialog(self, colourdata)
2323
2324        dlg.GetColourData().SetChooseFull(True)
2325
2326        if dlg.ShowModal() == wx.ID_OK:
2327            data = dlg.GetColourData()
2328            col1 = data.GetColour().Get()
2329            self.SetItemBackgroundColour(self.current, col1)
2330
2331        dlg.Destroy()
2332        event.Skip()
2333
2334
2335    def OnBeginEdit(self, event):
2336
2337        self.log.write("OnBeginEdit\n")
2338        # show how to prevent edit...
2339        item = event.GetItem()
2340        if item and self.GetItemText(item) == "The Root Item":
2341            wx.Bell()
2342            self.log.write("You can't edit this one...\n")
2343
2344            # Lets just see what's visible of its children
2345            cookie = 0
2346            root = event.GetItem()
2347            (child, cookie) = self.GetFirstChild(root)
2348
2349            while child:
2350                self.log.write("Child [%s] visible = %d\n" % (self.GetItemText(child), self.IsVisible(child)))
2351                (child, cookie) = self.GetNextChild(root, cookie)
2352
2353            event.Veto()
2354
2355
2356    def OnEndEdit(self, event):
2357
2358        self.log.write("OnEndEdit: %s %s\n" %(event.IsEditCancelled(), event.GetLabel()))
2359        # show how to reject edit, we'll not allow any digits
2360        for x in event.GetLabel():
2361            if x in string.digits:
2362                self.log.write("You can't enter digits...\n")
2363                event.Veto()
2364                return
2365
2366
2367    def OnLeftDClick(self, event):
2368
2369        pt = event.GetPosition()
2370        item, flags, column = self.HitTest(pt)
2371        if item and (flags & wx.TREE_HITTEST_ONITEMLABEL):
2372            if self.GetAGWWindowStyleFlag() & wx.TR_EDIT_LABELS:
2373                self.log.write("OnLeftDClick: %s (manually starting label edit)\n"% self.GetItemText(item))
2374                self.EditLabel(item)
2375            else:
2376                self.log.write("OnLeftDClick: Cannot Start Manual Editing, Missing Style TR_EDIT_LABELS\n")
2377
2378        event.Skip()
2379
2380
2381    def OnItemExpanded(self, event):
2382
2383        item = event.GetItem()
2384        if item:
2385            self.log.write("OnItemExpanded: %s\n" % self.GetItemText(item))
2386
2387
2388    def OnItemExpanding(self, event):
2389
2390        item = event.GetItem()
2391        if item:
2392            self.log.write("OnItemExpanding: %s\n" % self.GetItemText(item))
2393
2394        event.Skip()
2395
2396
2397    def OnItemCollapsed(self, event):
2398
2399        item = event.GetItem()
2400        if item:
2401            self.log.write("OnItemCollapsed: %s" % self.GetItemText(item))
2402
2403
2404    def OnItemCollapsing(self, event):
2405
2406        item = event.GetItem()
2407        if item:
2408            self.log.write("OnItemCollapsing: %s\n" % self.GetItemText(item))
2409
2410        event.Skip()
2411
2412
2413    def OnSelChanged(self, event):
2414
2415        self.item = event.GetItem()
2416        if self.item:
2417            self.log.write("OnSelChanged: %s" % self.GetItemText(self.item))
2418            if wx.Platform == '__WXMSW__':
2419                self.log.write(", BoundingRect: %s\n" % self.GetBoundingRect(self.item, True))
2420            else:
2421                self.log.write("\n")
2422
2423        event.Skip()
2424
2425
2426    def OnSelChanging(self, event):
2427
2428        item = event.GetItem()
2429        olditem = event.GetOldItem()
2430
2431        if item:
2432            if not olditem:
2433                olditemtext = "None"
2434            else:
2435                olditemtext = self.GetItemText(olditem)
2436            self.log.write("OnSelChanging: From %s To %s\n" %(olditemtext, self.GetItemText(item)))
2437
2438        event.Skip()
2439
2440
2441    def OnBeginDrag(self, event):
2442
2443        self.item = event.GetItem()
2444        if self.item:
2445            self.log.write("Beginning Drag...\n")
2446
2447            event.Allow()
2448
2449
2450    def OnBeginRDrag(self, event):
2451
2452        self.item = event.GetItem()
2453        if self.item:
2454            self.log.write("Beginning Right Drag...\n")
2455
2456            event.Allow()
2457
2458
2459    def OnEndDrag(self, event):
2460
2461        self.item = event.GetItem()
2462        if self.item:
2463            self.log.write("Ending Drag!\n")
2464
2465        event.Skip()
2466
2467
2468    def OnDeleteItem(self, event):
2469
2470        item = event.GetItem()
2471
2472        if not item:
2473            return
2474
2475        self.log.write("Deleting Item: %s\n" % self.GetItemText(item))
2476        event.Skip()
2477
2478
2479    def OnItemCheck(self, event):
2480
2481        item = event.GetItem()
2482        self.log.write("Item " + self.GetItemText(item) + " Has Been Cheched!\n")
2483        event.Skip()
2484
2485
2486    def OnItemChecking(self, event):
2487
2488        item = event.GetItem()
2489        self.log.write("Item " + self.GetItemText(item) + " Is Being Checked...\n")
2490        event.Skip()
2491
2492
2493    def OnToolTip(self, event):
2494
2495        item = event.GetItem()
2496        if item:
2497            event.SetToolTip(wx.ToolTip(self.GetItemText(item)))
2498
2499
2500    def OnItemMenu(self, event):
2501
2502        item = event.GetItem()
2503        if item:
2504            self.log.write("OnItemMenu: %s\n" % self.GetItemText(item))
2505
2506        event.Skip()
2507
2508
2509    def OnKey(self, event):
2510
2511        keycode = event.GetKeyCode()
2512        keyname = keyMap.get(keycode, None)
2513
2514        if keycode == wx.WXK_BACK:
2515            self.log.write("OnKeyDown: HAHAHAHA! I Vetoed Your Backspace! HAHAHAHA\n")
2516            return
2517
2518        if keyname is None:
2519            if "unicode" in wx.PlatformInfo:
2520                keycode = event.GetUnicodeKey()
2521                if keycode <= 127:
2522                    keycode = event.GetKeyCode()
2523                keyname = "\"" + unichr(event.GetUnicodeKey()) + "\""
2524                if keycode < 27:
2525                    keyname = "Ctrl-%s" % chr(ord('A') + keycode-1)
2526
2527            elif keycode < 256:
2528                if keycode == 0:
2529                    keyname = "NUL"
2530                elif keycode < 27:
2531                    keyname = "Ctrl-%s" % chr(ord('A') + keycode-1)
2532                else:
2533                    keyname = "\"%s\"" % chr(keycode)
2534            else:
2535                keyname = "unknown (%s)" % keycode
2536
2537        self.log.write("OnKeyDown: You Pressed '" + keyname + "'\n")
2538
2539        event.Skip()
2540
2541
2542    def OnActivate(self, event):
2543
2544        if self.item:
2545            self.log.write("OnActivate: %s\n" % self.GetItemText(self.item))
2546
2547        event.Skip()
2548
2549
2550    def OnHyperLink(self, event):
2551
2552        item = event.GetItem()
2553        if item:
2554            self.log.write("OnHyperLink: %s\n" % self.GetItemText(self.item))
2555
2556
2557    def OnTextCtrl(self, event):
2558
2559        keycode = event.GetKeyCode()
2560        char = chr(keycode) if keycode < 256 else ''
2561        self.log.write("EDITING THE TEXTCTRL: You Wrote '" + char + \
2562                       "' (KeyCode = " + str(keycode) + ")\n")
2563        event.Skip()
2564
2565
2566    def OnComboBox(self, event):
2567
2568        selection = event.GetEventObject().GetValue()
2569        self.log.write("CHOICE FROM COMBOBOX: You Chose '" + selection + "'\n")
2570        event.Skip()
2571
2572
2573#---------------------------------------------------------------------------
2574
2575
2576class TestPanel(wx.Panel):
2577    def __init__(self, parent, log):
2578        self.log = log
2579        wx.Panel.__init__(self, parent, -1)
2580
2581        b = wx.Button(self, -1, " Test HyperTreeList ", (50,50))
2582        self.Bind(wx.EVT_BUTTON, self.OnButton, b)
2583
2584
2585    def OnButton(self, evt):
2586        self.win = HyperTreeListDemo(self, self.log)
2587        self.win.Show(True)
2588
2589#----------------------------------------------------------------------
2590
2591def runTest(frame, nb, log):
2592    win = TestPanel(nb, log)
2593    return win
2594
2595#----------------------------------------------------------------------
2596
2597
2598overview = HTL.__doc__
2599
2600
2601if __name__ == '__main__':
2602    import sys,os
2603    import run
2604    run.main(['', os.path.basename(sys.argv[0])] + sys.argv[1:])
2605
2606