diff --git a/include/wx/generic/treectrl.h b/include/wx/generic/treectrl.h index 0158561753..44b152b970 100644 --- a/include/wx/generic/treectrl.h +++ b/include/wx/generic/treectrl.h @@ -370,7 +370,11 @@ public: // 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 diff --git a/include/wx/msw/treectrl.h b/include/wx/msw/treectrl.h index d50417d5af..a67bd48851 100644 --- a/include/wx/msw/treectrl.h +++ b/include/wx/msw/treectrl.h @@ -338,7 +338,11 @@ public: // 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 diff --git a/samples/treectrl/treetest.cpp b/samples/treectrl/treetest.cpp index 4095a541e6..58597fb2cb 100644 --- a/samples/treectrl/treetest.cpp +++ b/samples/treectrl/treetest.cpp @@ -46,6 +46,7 @@ BEGIN_EVENT_TABLE(MyFrame, wxFrame) 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() @@ -100,10 +101,12 @@ MyFrame::MyFrame(const wxString& title, int x, int y, int w, int h) wxMenu *file_menu = new wxMenu; file_menu->Append(TreeTest_Dump, "D&ump tree items"); - file_menu->Append(TreeTest_Delete, "&Delete this item"); - file_menu->Append(TreeTest_DeleteAll, "Delete &all 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->AppendSeparator(); file_menu->Append(TreeTest_Bold, "Make item &bold"); file_menu->Append(TreeTest_UnBold, "Make item ¬ bold"); file_menu->AppendSeparator(); @@ -190,6 +193,12 @@ void MyFrame::OnDelete(wxCommandEvent& WXUNUSED(event)) 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(); diff --git a/samples/treectrl/treetest.h b/samples/treectrl/treetest.h index 8ca521827d..4c5dab2d1c 100644 --- a/samples/treectrl/treetest.h +++ b/samples/treectrl/treetest.h @@ -86,6 +86,7 @@ public: void OnAbout(wxCommandEvent& event); void OnDump(wxCommandEvent& event); void OnDelete(wxCommandEvent& event); + void OnDeleteChildren(wxCommandEvent& event); void OnDeleteAll(wxCommandEvent& event); void OnRecreate(wxCommandEvent& event); @@ -109,6 +110,7 @@ enum TreeTest_Bold, TreeTest_UnBold, TreeTest_Delete, + TreeTest_DeleteChildren, TreeTest_DeleteAll, TreeTest_Recreate, TreeTest_Ctrl = 100 diff --git a/src/generic/treectrl.cpp b/src/generic/treectrl.cpp index ba33d471b7..fb50c25a17 100644 --- a/src/generic/treectrl.cpp +++ b/src/generic/treectrl.cpp @@ -81,6 +81,7 @@ public: wxGenericTreeItem *GetParent() const { return m_parent; } // operations + void DeleteChildren(); void Reset(); // get count of all children (and grand children if 'recursively') @@ -182,9 +183,16 @@ wxGenericTreeItem::~wxGenericTreeItem() { 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 ) @@ -207,7 +215,7 @@ void wxGenericTreeItem::Reset() m_level = 0; - m_children.Empty(); + DeleteChildren(); m_isCollapsed = TRUE; m_parent = (wxGenericTreeItem *)NULL; @@ -690,11 +698,25 @@ wxTreeItemId wxTreeCtrl::AppendItem(const wxTreeItemId& parentId, 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); @@ -779,7 +801,7 @@ void wxTreeCtrl::Collapse(const wxTreeItemId& itemId) void wxTreeCtrl::CollapseAndReset(const wxTreeItemId& item) { Collapse(item); - Delete(item); + DeleteChildren(item); } void wxTreeCtrl::Toggle(const wxTreeItemId& itemId) @@ -1061,22 +1083,26 @@ void wxTreeCtrl::PaintLevel( wxGenericTreeItem *item, wxDC &dc, int level, int & } } - if ( !item->IsExpanded() ) - return; - - int semiOldY = y; - - wxArrayTreeItems& children = item->GetChildren(); - size_t count = children.Count(); - for ( size_t n = 0; n < count; n++ ) + if ( item->IsExpanded() ) { - y += m_lineHeight; - semiOldY = y; + int semiOldY = y; - PaintLevel( children[n], dc, level+1, 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 ); + } + + // 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 ); } // -----------------------------------------------------------------------------