// 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 );
 }
 
 // -----------------------------------------------------------------------------