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