+ wxGenericTreeItem *item = new wxGenericTreeItem(parent,
+ text, dc,
+ image, selImage,
+ data);
+
+ if ( data != NULL )
+ {
+ data->m_pItem = item;
+ }
+
+ parent->Insert( item, previous );
+
+ m_dirty = TRUE;
+
+ return item;
+}
+
+wxTreeItemId wxTreeCtrl::AddRoot(const wxString& text,
+ int image, int selImage,
+ wxTreeItemData *data)
+{
+ wxCHECK_MSG( !m_anchor, wxTreeItemId(), _T("tree can have only one root") );
+
+ wxClientDC dc(this);
+ m_anchor = new wxGenericTreeItem((wxGenericTreeItem *)NULL, text, dc,
+ image, selImage, data);
+ if ( data != NULL )
+ {
+ data->m_pItem = m_anchor;
+ }
+
+ AdjustMyScrollbars();
+ Refresh();
+
+ return m_anchor;
+}
+
+wxTreeItemId wxTreeCtrl::PrependItem(const wxTreeItemId& parent,
+ const wxString& text,
+ int image, int selImage,
+ wxTreeItemData *data)
+{
+ return DoInsertItem(parent, 0u, text, image, selImage, data);
+}
+
+wxTreeItemId wxTreeCtrl::InsertItem(const wxTreeItemId& parentId,
+ const wxTreeItemId& idPrevious,
+ const wxString& text,
+ int image, int selImage,
+ wxTreeItemData *data)
+{
+ wxGenericTreeItem *parent = parentId.m_pItem;
+ if ( !parent )
+ {
+ // should we give a warning here?
+ return AddRoot(text, image, selImage, data);
+ }
+
+ int index = parent->GetChildren().Index(idPrevious.m_pItem);
+ wxASSERT_MSG( index != wxNOT_FOUND,
+ _T("previous item in wxTreeCtrl::InsertItem() is not a sibling") );
+ return DoInsertItem(parentId, (size_t)index, text, image, selImage, data);
+}
+
+wxTreeItemId wxTreeCtrl::AppendItem(const wxTreeItemId& parentId,
+ const wxString& text,
+ int image, int selImage,
+ wxTreeItemData *data)
+{
+ wxGenericTreeItem *parent = parentId.m_pItem;
+ if ( !parent )
+ {
+ // should we give a warning here?
+ return AddRoot(text, image, selImage, data);
+ }
+
+ return DoInsertItem(parent, parent->GetChildren().Count(), text,
+ image, selImage, data);
+}
+
+void wxTreeCtrl::SendDeleteEvent(wxGenericTreeItem *item)
+{
+ wxTreeEvent event( wxEVT_COMMAND_TREE_DELETE_ITEM, GetId() );
+ event.m_item = item;
+ event.SetEventObject( this );
+ ProcessEvent( event );
+}
+
+void wxTreeCtrl::DeleteChildren(const wxTreeItemId& itemId)
+{
+ wxGenericTreeItem *item = itemId.m_pItem;
+ item->DeleteChildren(this);
+
+ m_dirty = TRUE;
+}
+
+void wxTreeCtrl::Delete(const wxTreeItemId& itemId)
+{
+ wxGenericTreeItem *item = itemId.m_pItem;
+ wxGenericTreeItem *parent = item->GetParent();
+
+ if ( parent )
+ {
+ parent->GetChildren().Remove(item);
+ }
+
+ item->DeleteChildren(this);
+ SendDeleteEvent(item);
+ delete item;
+
+ m_dirty = TRUE;
+}
+
+void wxTreeCtrl::DeleteAllItems()
+{
+ if ( m_anchor )
+ {
+ m_anchor->DeleteChildren(this);
+ delete m_anchor;
+
+ m_anchor = NULL;
+
+ m_dirty = TRUE;
+ }
+}
+
+void wxTreeCtrl::Expand(const wxTreeItemId& itemId)
+{
+ wxGenericTreeItem *item = itemId.m_pItem;
+
+ if ( !item->HasPlus() )
+ return;
+
+ if ( item->IsExpanded() )
+ return;
+
+ wxTreeEvent event( wxEVT_COMMAND_TREE_ITEM_EXPANDING, GetId() );
+ event.m_item = item;
+ event.SetEventObject( this );
+ if ( ProcessEvent( event ) && event.m_code )
+ {
+ // cancelled by program
+ return;
+ }
+
+ item->Expand();
+ CalculatePositions();
+
+ RefreshSubtree(item);
+
+ event.SetEventType(wxEVT_COMMAND_TREE_ITEM_EXPANDED);
+ ProcessEvent( event );
+}
+
+void wxTreeCtrl::Collapse(const wxTreeItemId& itemId)
+{
+ wxGenericTreeItem *item = itemId.m_pItem;
+
+ if ( !item->IsExpanded() )
+ return;
+
+ wxTreeEvent event( wxEVT_COMMAND_TREE_ITEM_COLLAPSING, GetId() );
+ event.m_item = item;
+ event.SetEventObject( this );
+ if ( ProcessEvent( event ) && event.m_code )
+ {
+ // cancelled by program
+ return;
+ }
+
+ item->Collapse();
+
+ wxArrayTreeItems& 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);