]> git.saurik.com Git - wxWidgets.git/commitdiff
1. added wxTreeCtrl::DeleteChildren()
authorVadim Zeitlin <vadim@wxwidgets.org>
Thu, 17 Dec 1998 18:41:00 +0000 (18:41 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Thu, 17 Dec 1998 18:41:00 +0000 (18:41 +0000)
2. wxTreeCtrl::CollapseAndReset() doesn't destroy the item itself any more
3. wxTreeCtrl::Delete() sends wxEVT_COMMAND_TREE_CHILDREN event (but
   DeleteChildren() and DeleteAll() do not!)
4. Sample modified to show the new function too
5. Micro redraw bug fixed (small vertical line was sometimes drawn when it
   shouldn't have been)

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@1224 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/generic/treectrl.h
include/wx/msw/treectrl.h
samples/treectrl/treetest.cpp
samples/treectrl/treetest.h
src/generic/treectrl.cpp

index 0158561753f500947457dec83cabb35983172a7a..44b152b9703eb3db27284d65599437ff24114830 100644 (file)
@@ -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
index d50417d5af0e0dc8daae4c31a8504aeab98046ad..a67bd488510357df86bffca1f984bd2e9f688cdb 100644 (file)
@@ -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
index 4095a541e69289d3fbe7e91af35202c410c774ff..58597fb2cbdb3c1f87b63fa34d7ac173791a0a4f 100644 (file)
@@ -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,9 +101,11 @@ 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_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 &not bold");
@@ -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();
index 8ca521827db78dd01d95bf5506291c672a629636..4c5dab2d1c5d512bbe3fe55217929b22b55a21ff 100644 (file)
@@ -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
index ba33d471b7164adec6bc96d1e16530a9717674ec..fb50c25a1768cfbbaf559dd0a0b6d51994091ff0 100644 (file)
@@ -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;
+  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 );
 }
 
 // -----------------------------------------------------------------------------