// delete this item and associated data if any
void Delete(const wxTreeItemId& item);
+ // delete all children (but don't delete the item itself)
+ // NB: this won't send wxEVT_COMMAND_TREE_ITEM_DELETED events
+ void DeleteChildren(const wxTreeItemId& item);
// delete all items from the tree
+ // NB: this won't send wxEVT_COMMAND_TREE_ITEM_DELETED events
void DeleteAllItems();
// expand this item
// delete this item and associated data if any
void Delete(const wxTreeItemId& item);
+ // delete all children (but don't delete the item itself)
+ // NB: this won't send wxEVT_COMMAND_TREE_ITEM_DELETED events
+ void DeleteChildren(const wxTreeItemId& item);
// delete all items from the tree
+ // NB: this won't send wxEVT_COMMAND_TREE_ITEM_DELETED events
void DeleteAllItems();
// expand this item
EVT_MENU(TreeTest_Bold, MyFrame::OnSetBold)
EVT_MENU(TreeTest_UnBold, MyFrame::OnClearBold)
EVT_MENU(TreeTest_Delete, MyFrame::OnDelete)
+ EVT_MENU(TreeTest_DeleteChildren, MyFrame::OnDeleteChildren)
EVT_MENU(TreeTest_DeleteAll, MyFrame::OnDeleteAll)
EVT_MENU(TreeTest_Recreate, MyFrame::OnRecreate)
END_EVENT_TABLE()
wxMenu *file_menu = new wxMenu;
file_menu->Append(TreeTest_Dump, "D&ump tree items");
+ file_menu->Append(TreeTest_Recreate, "&Recreate the tree");
+ file_menu->AppendSeparator();
file_menu->Append(TreeTest_Delete, "&Delete this item");
+ file_menu->Append(TreeTest_DeleteChildren, "Delete &children");
file_menu->Append(TreeTest_DeleteAll, "Delete &all items");
- file_menu->Append(TreeTest_Recreate, "&Recreate the tree");
file_menu->AppendSeparator();
file_menu->Append(TreeTest_Bold, "Make item &bold");
file_menu->Append(TreeTest_UnBold, "Make item ¬ bold");
m_treeCtrl->Delete(item);
}
+void MyFrame::OnDeleteChildren(wxCommandEvent& WXUNUSED(event))
+{
+ wxTreeItemId item = m_treeCtrl->GetSelection();
+ m_treeCtrl->DeleteChildren(item);
+}
+
void MyFrame::OnDeleteAll(wxCommandEvent& WXUNUSED(event))
{
m_treeCtrl->DeleteAllItems();
void OnAbout(wxCommandEvent& event);
void OnDump(wxCommandEvent& event);
void OnDelete(wxCommandEvent& event);
+ void OnDeleteChildren(wxCommandEvent& event);
void OnDeleteAll(wxCommandEvent& event);
void OnRecreate(wxCommandEvent& event);
TreeTest_Bold,
TreeTest_UnBold,
TreeTest_Delete,
+ TreeTest_DeleteChildren,
TreeTest_DeleteAll,
TreeTest_Recreate,
TreeTest_Ctrl = 100
wxGenericTreeItem *GetParent() const { return m_parent; }
// operations
+ void DeleteChildren();
void Reset();
// get count of all children (and grand children if 'recursively')
{
delete m_data;
+ DeleteChildren();
+}
+
+void wxGenericTreeItem::DeleteChildren()
+{
size_t count = m_children.Count();
for ( size_t n = 0; n < count; n++ )
delete m_children[n];
+
+ m_children.Empty();
}
void wxGenericTreeItem::SetText( const wxString &text, wxDC& dc )
m_level = 0;
- m_children.Empty();
+ DeleteChildren();
m_isCollapsed = TRUE;
m_parent = (wxGenericTreeItem *)NULL;
image, selImage, data);
}
+void wxTreeCtrl::DeleteChildren(const wxTreeItemId& itemId)
+{
+ wxGenericTreeItem *item = itemId.m_pItem;
+ item->DeleteChildren();
+
+ m_dirty = TRUE;
+}
+
void wxTreeCtrl::Delete(const wxTreeItemId& itemId)
{
wxGenericTreeItem *item = itemId.m_pItem;
wxGenericTreeItem *parent = item->GetParent();
+ // notify the parent...
+ wxTreeEvent event( wxEVT_COMMAND_TREE_DELETE_ITEM, GetId() );
+ event.m_item = item;
+ event.SetEventObject( this );
+ ProcessEvent( event );
+
if ( parent )
{
parent->GetChildren().Remove(item);
void wxTreeCtrl::CollapseAndReset(const wxTreeItemId& item)
{
Collapse(item);
- Delete(item);
+ DeleteChildren(item);
}
void wxTreeCtrl::Toggle(const wxTreeItemId& itemId)
}
}
- if ( !item->IsExpanded() )
- return;
+ if ( item->IsExpanded() )
+ {
+ int semiOldY = y;
- int semiOldY = y;
+ wxArrayTreeItems& children = item->GetChildren();
+ size_t count = children.Count();
+ for ( size_t n = 0; n < count; n++ )
+ {
+ y += m_lineHeight;
+ semiOldY = y;
- wxArrayTreeItems& children = item->GetChildren();
- size_t count = children.Count();
- for ( size_t n = 0; n < count; n++ )
- {
- y += m_lineHeight;
- semiOldY = y;
+ PaintLevel( children[n], dc, level+1, y );
+ }
- PaintLevel( children[n], dc, level+1, y );
+ // it may happen that the item is expanded but has no items (when you
+ // delete all its children for example) - don't draw the vertical line
+ // in this case
+ if ( count > 0 )
+ dc.DrawLine( horizX+15, oldY+5, horizX+15, semiOldY );
}
-
- dc.DrawLine( horizX+15, oldY+5, horizX+15, semiOldY );
}
// -----------------------------------------------------------------------------