+ wxArrayGenericTreeItems& children = item->GetChildren();
+ size_t count = children.Count();
+ for ( size_t n = 0; n < count; n++ )
+ {
+ Collapse(children[n]);
+ }
+
+ CalculatePositions();
+
+ RefreshSubtree(item);
+
+ event.SetEventType(wxEVT_COMMAND_TREE_ITEM_COLLAPSED);
+ ProcessEvent( event );
+}
+
+void wxTreeCtrl::CollapseAndReset(const wxTreeItemId& item)
+{
+ Collapse(item);
+ DeleteChildren(item);
+}
+
+void wxTreeCtrl::Toggle(const wxTreeItemId& itemId)
+{
+ wxGenericTreeItem *item = itemId.m_pItem;
+
+ if (item->IsExpanded())
+ Collapse(itemId);
+ else
+ Expand(itemId);
+}
+
+void wxTreeCtrl::Unselect()
+{
+ if (m_current)
+ {
+ m_current->SetHilight( FALSE );
+ RefreshLine( m_current );
+ }
+}
+
+void wxTreeCtrl::UnselectAllChildren(wxGenericTreeItem *item)
+{
+ if (item->IsSelected())
+ {
+ item->SetHilight(FALSE);
+ RefreshLine(item);
+ }
+
+ if (item->HasChildren())
+ {
+ wxArrayGenericTreeItems& children = item->GetChildren();
+ size_t count = children.Count();
+ for ( size_t n = 0; n < count; ++n )
+ {
+ UnselectAllChildren(children[n]);
+ }
+ }
+}
+
+void wxTreeCtrl::UnselectAll()
+{
+ UnselectAllChildren(GetRootItem().m_pItem);
+}
+
+// Recursive function !
+// To stop we must have crt_item<last_item
+// Algorithm :
+// Tag all next children, when no more children,
+// Move to parent (not to tag)
+// Keep going... if we found last_item, we stop.
+bool wxTreeCtrl::TagNextChildren(wxGenericTreeItem *crt_item, wxGenericTreeItem *last_item, bool select)
+{
+ wxGenericTreeItem *parent = crt_item->GetParent();
+
+ if (parent == NULL) // This is root item
+ return TagAllChildrenUntilLast(crt_item, last_item, select);
+
+ wxArrayGenericTreeItems& children = parent->GetChildren();
+ int index = children.Index(crt_item);
+ wxASSERT( index != wxNOT_FOUND ); // I'm not a child of my parent?
+
+ size_t count = children.Count();
+ for (size_t n=(size_t)(index+1); n<count; ++n)
+ {
+ if (TagAllChildrenUntilLast(children[n], last_item, select)) return TRUE;
+ }
+
+ return TagNextChildren(parent, last_item, select);
+}
+
+bool wxTreeCtrl::TagAllChildrenUntilLast(wxGenericTreeItem *crt_item, wxGenericTreeItem *last_item, bool select)
+{
+ crt_item->SetHilight(select);
+ RefreshLine(crt_item);
+
+ if (crt_item==last_item)
+ return TRUE;
+
+ if (crt_item->HasChildren())
+ {
+ wxArrayGenericTreeItems& children = crt_item->GetChildren();
+ size_t count = children.Count();
+ for ( size_t n = 0; n < count; ++n )
+ {
+ if (TagAllChildrenUntilLast(children[n], last_item, select))
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+void wxTreeCtrl::SelectItemRange(wxGenericTreeItem *item1, wxGenericTreeItem *item2)
+{
+ // item2 is not necessary after item1
+ wxGenericTreeItem *first=NULL, *last=NULL;