6 #--------------------------------------------------------------------------- 
   8 class MyTreeCtrl(wx
.TreeCtrl
): 
   9     def __init__(self
, parent
, id, pos
, size
, style
, log
): 
  10         wx
.TreeCtrl
.__init
__(self
, parent
, id, pos
, size
, style
) 
  13     def OnCompareItems(self
, item1
, item2
): 
  14         t1 
= self
.GetItemText(item1
) 
  15         t2 
= self
.GetItemText(item2
) 
  16         self
.log
.WriteText('compare: ' + t1 
+ ' <> ' + t2 
+ '\n') 
  21 #--------------------------------------------------------------------------- 
  23 class TestTreeCtrlPanel(wx
.Panel
): 
  24     def __init__(self
, parent
, log
): 
  25         # Use the WANTS_CHARS style so the panel doesn't eat the Return key. 
  26         wx
.Panel
.__init
__(self
, parent
, -1, style
=wx
.WANTS_CHARS
) 
  27         self
.Bind(wx
.EVT_SIZE
, self
.OnSize
) 
  32         self
.tree 
= MyTreeCtrl(self
, tID
, wx
.DefaultPosition
, wx
.DefaultSize
, 
  40         il 
= wx
.ImageList(isz
[0], isz
[1]) 
  41         fldridx     
= il
.Add(wx
.ArtProvider_GetBitmap(wx
.ART_FOLDER
,      wx
.ART_OTHER
, isz
)) 
  42         fldropenidx 
= il
.Add(wx
.ArtProvider_GetBitmap(wx
.ART_FILE_OPEN
,   wx
.ART_OTHER
, isz
)) 
  43         fileidx     
= il
.Add(wx
.ArtProvider_GetBitmap(wx
.ART_NORMAL_FILE
, wx
.ART_OTHER
, isz
)) 
  44         smileidx    
= il
.Add(images
.getSmilesBitmap()) 
  46         self
.tree
.SetImageList(il
) 
  49         # NOTE:  For some reason tree items have to have a data object in 
  50         #        order to be sorted.  Since our compare just uses the labels 
  51         #        we don't need any real data, so we'll just use None below for 
  54         self
.root 
= self
.tree
.AddRoot("The Root Item") 
  55         self
.tree
.SetPyData(self
.root
, None) 
  56         self
.tree
.SetItemImage(self
.root
, fldridx
, wx
.TreeItemIcon_Normal
) 
  57         self
.tree
.SetItemImage(self
.root
, fldropenidx
, wx
.TreeItemIcon_Expanded
) 
  61             child 
= self
.tree
.AppendItem(self
.root
, "Item %d" % x
) 
  62             self
.tree
.SetPyData(child
, None) 
  63             self
.tree
.SetItemImage(child
, fldridx
, wx
.TreeItemIcon_Normal
) 
  64             self
.tree
.SetItemImage(child
, fldropenidx
, wx
.TreeItemIcon_Expanded
) 
  67                 last 
= self
.tree
.AppendItem(child
, "item %d-%s" % (x
, chr(ord("a")+y
))) 
  68                 self
.tree
.SetPyData(last
, None) 
  69                 self
.tree
.SetItemImage(last
, fldridx
, wx
.TreeItemIcon_Normal
) 
  70                 self
.tree
.SetItemImage(last
, fldropenidx
, wx
.TreeItemIcon_Expanded
) 
  73                     item 
= self
.tree
.AppendItem(last
,  "item %d-%s-%d" % (x
, chr(ord("a")+y
), z
)) 
  74                     self
.tree
.SetPyData(item
, None) 
  75                     self
.tree
.SetItemImage(item
, fileidx
, wx
.TreeItemIcon_Normal
) 
  76                     self
.tree
.SetItemImage(item
, smileidx
, wx
.TreeItemIcon_Selected
) 
  78         self
.tree
.Expand(self
.root
) 
  79         self
.Bind(wx
.EVT_TREE_ITEM_EXPANDED
, self
.OnItemExpanded
, self
.tree
) 
  80         self
.Bind(wx
.EVT_TREE_ITEM_COLLAPSED
, self
.OnItemCollapsed
, self
.tree
) 
  81         self
.Bind(wx
.EVT_TREE_SEL_CHANGED
, self
.OnSelChanged
, self
.tree
) 
  82         self
.Bind(wx
.EVT_TREE_BEGIN_LABEL_EDIT
, self
.OnBeginEdit
, self
.tree
) 
  83         self
.Bind(wx
.EVT_TREE_END_LABEL_EDIT
, self
.OnEndEdit
, self
.tree
) 
  84         self
.Bind(wx
.EVT_TREE_ITEM_ACTIVATED
, self
.OnActivate
, self
.tree
) 
  86         self
.tree
.Bind(wx
.EVT_LEFT_DCLICK
, self
.OnLeftDClick
) 
  87         self
.tree
.Bind(wx
.EVT_RIGHT_DOWN
, self
.OnRightDown
) 
  88         self
.tree
.Bind(wx
.EVT_RIGHT_UP
, self
.OnRightUp
) 
  91     def OnRightDown(self
, event
): 
  92         pt 
= event
.GetPosition(); 
  93         item
, flags 
= self
.tree
.HitTest(pt
) 
  95             self
.log
.WriteText("OnRightClick: %s, %s, %s\n" % 
  96                                (self
.tree
.GetItemText(item
), type(item
), item
.__class
__)) 
  97             self
.tree
.SelectItem(item
) 
 100     def OnRightUp(self
, event
): 
 101         pt 
= event
.GetPosition(); 
 102         item
, flags 
= self
.tree
.HitTest(pt
) 
 104             self
.log
.WriteText("OnRightUp: %s (manually starting label edit)\n" 
 105                                % self
.tree
.GetItemText(item
)) 
 106             self
.tree
.EditLabel(item
) 
 110     def OnBeginEdit(self
, event
): 
 111         self
.log
.WriteText("OnBeginEdit\n") 
 112         # show how to prevent edit... 
 113         item 
= event
.GetItem() 
 114         if item 
and self
.tree
.GetItemText(item
) == "The Root Item": 
 116             self
.log
.WriteText("You can't edit this one...\n") 
 118             # Lets just see what's visible of its children 
 120             root 
= event
.GetItem() 
 121             (child
, cookie
) = self
.tree
.GetFirstChild(root
) 
 124                 self
.log
.WriteText("Child [%s] visible = %d" % 
 125                                    (self
.tree
.GetItemText(child
), 
 126                                     self
.tree
.IsVisible(child
))) 
 127                 (child
, cookie
) = self
.tree
.GetNextChild(root
, cookie
) 
 132     def OnEndEdit(self
, event
): 
 133         self
.log
.WriteText("OnEndEdit: %s %s\n" % 
 134                            (event
.IsEditCancelled(), event
.GetLabel()) ) 
 135         # show how to reject edit, we'll not allow any digits 
 136         for x 
in event
.GetLabel(): 
 137             if x 
in string
.digits
: 
 138                 self
.log
.WriteText("You can't enter digits...\n") 
 143     def OnLeftDClick(self
, event
): 
 144         pt 
= event
.GetPosition(); 
 145         item
, flags 
= self
.tree
.HitTest(pt
) 
 147             self
.log
.WriteText("OnLeftDClick: %s\n" % self
.tree
.GetItemText(item
)) 
 148             parent 
= self
.tree
.GetItemParent(item
) 
 150                 self
.tree
.SortChildren(parent
) 
 154     def OnSize(self
, event
): 
 155         w
,h 
= self
.GetClientSizeTuple() 
 156         self
.tree
.SetDimensions(0, 0, w
, h
) 
 159     def OnItemExpanded(self
, event
): 
 160         item 
= event
.GetItem() 
 162             self
.log
.WriteText("OnItemExpanded: %s\n" % self
.tree
.GetItemText(item
)) 
 164     def OnItemCollapsed(self
, event
): 
 165         item 
= event
.GetItem() 
 167             self
.log
.WriteText("OnItemCollapsed: %s\n" % self
.tree
.GetItemText(item
)) 
 169     def OnSelChanged(self
, event
): 
 170         self
.item 
= event
.GetItem() 
 172             self
.log
.WriteText("OnSelChanged: %s\n" % self
.tree
.GetItemText(self
.item
)) 
 173             if wx
.Platform 
== '__WXMSW__': 
 174                 self
.log
.WriteText("BoundingRect: %s\n" % 
 175                                    self
.tree
.GetBoundingRect(self
.item
, True)) 
 176             #items = self.tree.GetSelections() 
 177             #print map(self.tree.GetItemText, items) 
 181     def OnActivate(self
, event
): 
 183             self
.log
.WriteText("OnActivate: %s\n" % self
.tree
.GetItemText(self
.item
)) 
 186 #--------------------------------------------------------------------------- 
 188 def runTest(frame
, nb
, log
): 
 189     win 
= TestTreeCtrlPanel(nb
, log
) 
 192 #--------------------------------------------------------------------------- 
 199 A TreeCtrl presents information as a hierarchy, with items that may be  
 200 expanded to show further items. Items in a tree control are referenced by  
 201 wx.TreeItemId handles. 
 207 if __name__ 
== '__main__': 
 210     run
.main(['', os
.path
.basename(sys
.argv
[0])] + sys
.argv
[1:])