import wx, wx.lib.customtreectrl, wx.gizmos
-try:
- import treemixin
-except ImportError:
- from wx.lib.mixins import treemixin
+import treemixin
-overview = treemixin.__doc__
class TreeModel(object):
''' TreeModel holds the domain objects that are shown in the different
wx.lib.customtreectrl.CustomTreeCtrl):
def __init__(self, *args, **kwargs):
self.checked = {}
- kwargs['ctstyle'] = wx.TR_DEFAULT_STYLE | wx.TR_HIDE_ROOT | \
- wx.TR_HAS_BUTTONS | wx.TR_FULL_ROW_HIGHLIGHT
+ kwargs['style'] = wx.TR_HIDE_ROOT | \
+ wx.TR_HAS_BUTTONS | wx.TR_FULL_ROW_HIGHLIGHT
super(VirtualCustomTreeCtrl, self).__init__(*args, **kwargs)
self.Bind(wx.lib.customtreectrl.EVT_TREE_ITEM_CHECKED,
self.OnItemChecked)
-import wx, wx.gizmos, wx.lib.customtreectrl, unittest
-try:
- import treemixin
-except ImportError:
- from wx.lib.mixins import treemixin
+import wx, wx.gizmos, wx.lib.customtreectrl, unittest, treemixin
# VirtualTree tests
item, cookie = self.tree.GetFirstChild(self.tree.GetRootItem())
self.assertEqual(wx.RED, self.tree.GetItemTextColour(item))
+ def testRefreshItemThatHasNoCorrespondingNodeInTheTree(self):
+ # The item to refresh might be in a collapsed branch of the tree
+ # and not present yet.
+ self.tree.PrepareChildrenCount((0,), 1)
+ self.tree.RefreshItem((0,0))
+ item, cookie = self.tree.GetFirstChild(self.tree.GetRootItem())
+ self.failIf(self.tree.ItemHasChildren(item))
+
# TreeAPIHarmonizer tests
self.tree.ExpandAllChildren(self.item)
self.failUnless(self.tree.IsExpanded(self.item))
+ def testGetFirstVisibleItem(self):
+ self.tree.DeleteAllItems()
+ self.failIf(self.tree.GetFirstVisibleItem())
+
class TreeAPIHarmonizerNoTreeListCtrlCommonTests(object):
''' Tests that should succeed for all tree controls, except the
self.assertEqual(1, len(self.eventsReceived))
+
class VanillaTreeCtrlTestCase(VanillaTreeCommonTests, VanillaTreeTestCase):
TreeClass = wx.TreeCtrl
TreeClass = wx.lib.customtreectrl.CustomTreeCtrl
-# Tests of the tree controls without any mixin, to document behaviour
-# that is either different between tree control widgets or undesired
-# behaviour.
-
-class TreeCtrlTestCase(unittest.TestCase):
- def setUp(self):
- self.frame = wx.Frame(None)
- self.tree = wx.TreeCtrl(self.frame, style=wx.TR_HIDE_ROOT)
-
- def testSelectHiddenRootItem(self):
- root = self.tree.AddRoot('Hidden root')
- self.tree.SelectItem(root)
- self.assertEqual(root, self.tree.GetSelection())
-
-
-class CustomTreeCtrlTestCase(unittest.TestCase):
- def setUp(self):
- self.frame = wx.Frame(None)
- self.tree = wx.lib.customtreectrl.CustomTreeCtrl(self.frame,
- style=wx.TR_HIDE_ROOT)
-
- def testSelectHiddenRootItem(self):
- root = self.tree.AddRoot('Hidden root')
- self.tree.SelectItem(root)
- self.assertEqual(root, self.tree.GetSelection())
+class VanillaTreeItemIdTestCase(unittest.TestCase):
+ def testTreeItemIdIsFalseDefault(self):
+ self.failIf(wx.TreeItemId())
if __name__ == '__main__':
Author: Frank Niessink <frank@niessink.com>
License: wxWidgets license
-Version: 0.9.1
-Date: 26 March 2007
+Version: 1.0
+Date: 15 April 2007
ExpansionState is based on code and ideas from Karsten Hilbert.
Andrea Gavana provided help with the CustomTreeCtrl integration.
''' This class attempts to hide the differences in API between the
different tree controls that are part of wxPython. '''
- def __init__(self, *args, **kwargs):
- # CustomTreeCtrl uses a different keyword for the window style
- # argument ('ctstyle'). To hide this, we replace the 'style' keyword
- # by 'ctstyle' if we're mixed in with CustomTreeCtrl.
- if isinstance(self, wx.lib.customtreectrl.CustomTreeCtrl):
- kwargs['ctstyle'] = kwargs.pop('style', wx.TR_DEFAULT_STYLE)
- super(TreeAPIHarmonizer, self).__init__(*args, **kwargs)
-
def __callSuper(self, methodName, default, *args, **kwargs):
# If our super class has a method called methodName, call it,
# otherwise return the default value.
else:
selections = []
# If the root item is hidden, it should never be selected,
- # unfortunately, CustomTreeCtrl and TreeCtrl allow it to be selected.
+ # unfortunately, CustomTreeCtrl allows it to be selected.
if self.HasFlag(wx.TR_HIDE_ROOT):
rootItem = self.GetRootItem()
if rootItem and rootItem in selections:
selections.remove(rootItem)
return selections
+ def GetFirstVisibleItem(self):
+ # TreeListCtrl raises an exception or even crashes when invoking
+ # GetFirstVisibleItem on an empty tree.
+ if self.GetRootItem():
+ return super(TreeAPIHarmonizer, self).GetFirstVisibleItem()
+ else:
+ return wx.TreeItemId()
+
def SelectItem(self, item, *args, **kwargs):
# Prevent the hidden root from being selected, otherwise TreeCtrl
# crashes
super(TreeAPIHarmonizer, self).ExpandAll(item)
def ExpandAllChildren(self, item):
- # TreeListCtrl doesn't have ExpandallChildren
+ # TreeListCtrl and CustomTreeCtrl don't have ExpandallChildren
try:
super(TreeAPIHarmonizer, self).ExpandAllChildren(item)
except AttributeError:
def RefreshItem(self, index):
''' Redraws the item with the specified index. '''
- item = self.GetItemByIndex(index)
+ try:
+ item = self.GetItemByIndex(index)
+ except IndexError:
+ # There's no corresponding item for index, because its parent
+ # has not been expanded yet.
+ return
hasChildren = bool(self.OnGetChildrenCount(index))
self.DoRefreshItem(item, index, hasChildren)