]> git.saurik.com Git - wxWidgets.git/commitdiff
Several fixes for removing/readding controls to the toolbar:
authorVadim Zeitlin <vadim@wxwidgets.org>
Thu, 27 Mar 2008 00:10:19 +0000 (00:10 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Thu, 27 Mar 2008 00:10:19 +0000 (00:10 +0000)
1. Don't destroy the control in wxToolBar::RemoveTool() as this prevents
   it from being added back with is the purpose of using RemoveTool() rather
   than DeleteTool().

2. Call wxToolBarTool::Attach/Detach() from the base code, not just from wxMSW
   and wxMac (wasn't called by wxGTK at all).

3. Allow adding back the removed control tool in wxGTK.

4. Add test for removing/adding back a control tool to the sample.

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

samples/toolbar/toolbar.cpp
src/common/tbarbase.cpp
src/gtk/tbargtk.cpp
src/gtk1/tbargtk.cpp
src/mac/carbon/toolbar.cpp
src/msw/toolbar.cpp

index 9098b0eb60821ee3a81d7c3c9a857793e0dc0167..8a4ef7d0b429d9443c58a5773ebce556e292eb51 100644 (file)
@@ -33,7 +33,6 @@
 #include "wx/image.h"
 #include "wx/filedlg.h"
 #include "wx/colordlg.h"
-#include "wx/spinctrl.h"
 #include "wx/srchctrl.h"
 
 // define this to use XPMs everywhere (by default, BMPs are used under Win)
@@ -54,6 +53,9 @@
 // native, 'installed' toolbar.
 #define USE_UNMANAGED_TOOLBAR 0
 
+// Define this as 0 for the platforms not supporting controls in toolbars
+#define USE_CONTROLS_IN_TOOLBAR 1
+
 // ----------------------------------------------------------------------------
 // resources
 // ----------------------------------------------------------------------------
@@ -102,6 +104,7 @@ public:
             const wxPoint& pos = wxDefaultPosition,
             const wxSize& size = wxDefaultSize,
             long style = wxDEFAULT_FRAME_STYLE|wxCLIP_CHILDREN|wxNO_FULL_REPAINT_ON_RESIZE);
+    virtual ~MyFrame();
 
     void PopulateToolbar(wxToolBarBase* toolBar);
     void RecreateToolbar();
@@ -126,6 +129,7 @@ public:
     void OnInsertPrint(wxCommandEvent& event);
     void OnChangeToolTip(wxCommandEvent& event);
     void OnToggleHelp(wxCommandEvent& WXUNUSED(event)) { DoToggleHelp(); }
+    void OnToggleSearch(wxCommandEvent& event);
     void OnToggleRadioBtn(wxCommandEvent& event);
 
     void OnToolbarStyle(wxCommandEvent& event);
@@ -165,13 +169,18 @@ private:
     wxTextCtrl         *m_textWindow;
 
     wxPanel            *m_panel;
+#if USE_UNMANAGED_TOOLBAR
     wxToolBar          *m_extraToolBar;
+#endif
 
     wxToolBar          *m_tbar;
 
     // the path to the custom bitmap for the test toolbar tool
     wxString            m_pathBmp;
 
+    // the search tool, initially NULL
+    wxToolBarToolBase *m_searchTool;
+
     DECLARE_EVENT_TABLE()
 };
 
@@ -185,21 +194,14 @@ static const long TOOLBAR_STYLE = wxTB_FLAT | wxTB_DOCKABLE | wxTB_TEXT;
 
 enum
 {
-    IDM_TOOLBAR_TOGGLETOOLBARSIZE = 200,
+    // toolbar menu items
+    IDM_TOOLBAR_TOGGLE_TOOLBAR = 200,
+    IDM_TOOLBAR_TOGGLE_HORIZONTAL_TEXT,
+    IDM_TOOLBAR_TOGGLE_ANOTHER_TOOLBAR,
+    IDM_TOOLBAR_TOGGLETOOLBARSIZE,
     IDM_TOOLBAR_TOGGLETOOLBARROWS,
     IDM_TOOLBAR_TOGGLETOOLTIPS,
     IDM_TOOLBAR_TOGGLECUSTOMDISABLED,
-    IDM_TOOLBAR_ENABLEPRINT,
-    IDM_TOOLBAR_DELETEPRINT,
-    IDM_TOOLBAR_INSERTPRINT,
-    IDM_TOOLBAR_TOGGLEHELP,
-    IDM_TOOLBAR_TOGGLERADIOBTN1,
-    IDM_TOOLBAR_TOGGLERADIOBTN2,
-    IDM_TOOLBAR_TOGGLERADIOBTN3,
-    IDM_TOOLBAR_TOGGLE_TOOLBAR,
-    IDM_TOOLBAR_TOGGLE_HORIZONTAL_TEXT,
-    IDM_TOOLBAR_TOGGLE_ANOTHER_TOOLBAR,
-    IDM_TOOLBAR_CHANGE_TOOLTIP,
     IDM_TOOLBAR_SHOW_TEXT,
     IDM_TOOLBAR_SHOW_ICONS,
     IDM_TOOLBAR_SHOW_BOTH,
@@ -213,8 +215,18 @@ enum
     IDM_TOOLBAR_OTHER_2,
     IDM_TOOLBAR_OTHER_3,
 
-    ID_COMBO = 1000,
-    ID_SPIN = 1001
+    // tools menu items
+    IDM_TOOLBAR_ENABLEPRINT,
+    IDM_TOOLBAR_DELETEPRINT,
+    IDM_TOOLBAR_INSERTPRINT,
+    IDM_TOOLBAR_TOGGLEHELP,
+    IDM_TOOLBAR_TOGGLESEARCH,
+    IDM_TOOLBAR_TOGGLERADIOBTN1,
+    IDM_TOOLBAR_TOGGLERADIOBTN2,
+    IDM_TOOLBAR_TOGGLERADIOBTN3,
+    IDM_TOOLBAR_CHANGE_TOOLTIP,
+
+    ID_COMBO = 1000
 };
 
 // ----------------------------------------------------------------------------
@@ -244,6 +256,7 @@ BEGIN_EVENT_TABLE(MyFrame, wxFrame)
     EVT_MENU(IDM_TOOLBAR_DELETEPRINT, MyFrame::OnDeletePrint)
     EVT_MENU(IDM_TOOLBAR_INSERTPRINT, MyFrame::OnInsertPrint)
     EVT_MENU(IDM_TOOLBAR_TOGGLEHELP, MyFrame::OnToggleHelp)
+    EVT_MENU(IDM_TOOLBAR_TOGGLESEARCH, MyFrame::OnToggleSearch)
     EVT_MENU_RANGE(IDM_TOOLBAR_TOGGLERADIOBTN1, IDM_TOOLBAR_TOGGLERADIOBTN3,
                    MyFrame::OnToggleRadioBtn)
     EVT_MENU(IDM_TOOLBAR_CHANGE_TOOLTIP, MyFrame::OnChangeToolTip)
@@ -421,10 +434,9 @@ void MyFrame::PopulateToolbar(wxToolBarBase* toolBar)
                      toolBarBitmaps[Tool_open], wxNullBitmap, wxITEM_NORMAL,
                      _T("Open file"), _T("This is help for open file tool"));
 
-    // the generic toolbar doesn't really support this
-#if wxUSE_TOOLBAR_NATIVE && !defined(__WXX11__) || defined(__WXUNIVERSAL__)
+#if USE_CONTROLS_IN_TOOLBAR
     // adding a combo to a vertical toolbar is not very smart
-    if ( !( toolBar->IsVertical() ) )
+    if ( !toolBar->IsVertical() )
     {
         wxComboBox *combo = new wxComboBox(toolBar, ID_COMBO, wxEmptyString, wxDefaultPosition, wxSize(100,-1) );
         combo->Append(_T("This"));
@@ -433,17 +445,8 @@ void MyFrame::PopulateToolbar(wxToolBarBase* toolBar)
         combo->Append(_T("in a"));
         combo->Append(_T("toolbar"));
         toolBar->AddControl(combo, _T("Combo Label"));
-
-        wxSpinCtrl *spin = new wxSpinCtrl( toolBar, ID_SPIN, wxT("0"), wxDefaultPosition, wxSize(80,wxDefaultCoord), 0, 0, 100 );
-        toolBar->AddControl( spin );
-
-        wxTextCtrl *text = new wxTextCtrl( toolBar, -1, wxT("text"), wxDefaultPosition, wxSize(80,wxDefaultCoord) );
-        toolBar->AddControl( text );
-
-        wxSearchCtrl *srch = new wxSearchCtrl( toolBar, -1, wxT("xx"), wxDefaultPosition, wxSize(80,wxDefaultCoord), wxSUNKEN_BORDER );
-        toolBar->AddControl( srch );
     }
-#endif // toolbars which don't support controls
+#endif // USE_CONTROLS_IN_TOOLBAR
 
     toolBar->AddTool(wxID_SAVE, _T("Save"), toolBarBitmaps[Tool_save], _T("Toggle button 1"), wxITEM_CHECK);
     toolBar->AddTool(wxID_COPY, _T("Copy"), toolBarBitmaps[Tool_copy], _T("Toggle button 2"), wxITEM_CHECK);
@@ -573,17 +576,6 @@ MyFrame::MyFrame(wxFrame* parent,
                               _T("Set toolbar at the right edge of the window"));
     tbarMenu->AppendSeparator();
 
-    tbarMenu->Append(IDM_TOOLBAR_ENABLEPRINT, _T("&Enable print button\tCtrl-E"));
-    tbarMenu->Append(IDM_TOOLBAR_DELETEPRINT, _T("&Delete print button\tCtrl-D"));
-    tbarMenu->Append(IDM_TOOLBAR_INSERTPRINT, _T("&Insert print button\tCtrl-I"));
-    tbarMenu->Append(IDM_TOOLBAR_TOGGLEHELP, _T("Toggle &help button\tCtrl-T"));
-    tbarMenu->AppendSeparator();
-    tbarMenu->Append(IDM_TOOLBAR_TOGGLERADIOBTN1, _T("Toggle &1st radio button\tCtrl-1"));
-    tbarMenu->Append(IDM_TOOLBAR_TOGGLERADIOBTN2, _T("Toggle &2nd radio button\tCtrl-2"));
-    tbarMenu->Append(IDM_TOOLBAR_TOGGLERADIOBTN3, _T("Toggle &3rd radio button\tCtrl-3"));
-    tbarMenu->AppendSeparator();
-    tbarMenu->Append(IDM_TOOLBAR_CHANGE_TOOLTIP, _T("Change tool tip"));
-    tbarMenu->AppendSeparator();
     tbarMenu->AppendRadioItem(IDM_TOOLBAR_SHOW_TEXT, _T("Show &text\tCtrl-Alt-T"));
     tbarMenu->AppendRadioItem(IDM_TOOLBAR_SHOW_ICONS, _T("Show &icons\tCtrl-Alt-I"));
     tbarMenu->AppendRadioItem(IDM_TOOLBAR_SHOW_BOTH, _T("Show &both\tCtrl-Alt-B"));
@@ -591,6 +583,19 @@ MyFrame::MyFrame(wxFrame* parent,
     tbarMenu->Append(IDM_TOOLBAR_BG_COL, _T("Choose bac&kground colour..."));
     tbarMenu->Append(IDM_TOOLBAR_CUSTOM_PATH, _T("Custom &bitmap...\tCtrl-B"));
 
+    wxMenu *toolMenu = new wxMenu;
+    toolMenu->Append(IDM_TOOLBAR_ENABLEPRINT, _T("&Enable print button\tCtrl-E"));
+    toolMenu->Append(IDM_TOOLBAR_DELETEPRINT, _T("&Delete print button\tCtrl-D"));
+    toolMenu->Append(IDM_TOOLBAR_INSERTPRINT, _T("&Insert print button\tCtrl-I"));
+    toolMenu->Append(IDM_TOOLBAR_TOGGLEHELP, _T("Toggle &help button\tCtrl-T"));
+    toolMenu->Append(IDM_TOOLBAR_TOGGLESEARCH, _T("Toggle &search field\tCtrl-F"));
+    toolMenu->AppendSeparator();
+    toolMenu->Append(IDM_TOOLBAR_TOGGLERADIOBTN1, _T("Toggle &1st radio button\tCtrl-1"));
+    toolMenu->Append(IDM_TOOLBAR_TOGGLERADIOBTN2, _T("Toggle &2nd radio button\tCtrl-2"));
+    toolMenu->Append(IDM_TOOLBAR_TOGGLERADIOBTN3, _T("Toggle &3rd radio button\tCtrl-3"));
+    toolMenu->AppendSeparator();
+    toolMenu->Append(IDM_TOOLBAR_CHANGE_TOOLTIP, _T("Change tooltip of \"New\""));
+
     wxMenu *fileMenu = new wxMenu;
     fileMenu->Append(wxID_EXIT, _T("E&xit\tAlt-X"), _T("Quit toolbar sample") );
 
@@ -601,6 +606,7 @@ MyFrame::MyFrame(wxFrame* parent,
 
     menuBar->Append(fileMenu, _T("&File"));
     menuBar->Append(tbarMenu, _T("&Toolbar"));
+    menuBar->Append(toolMenu, _T("Tool&s"));
     menuBar->Append(helpMenu, _T("&Help"));
 
     // Associate the menu bar with the frame
@@ -619,19 +625,30 @@ MyFrame::MyFrame(wxFrame* parent,
 #if USE_UNMANAGED_TOOLBAR
     m_extraToolBar = new wxToolBar(m_panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTB_TEXT|wxTB_FLAT|wxTB_TOP);
     PopulateToolbar(m_extraToolBar);
-#else
-    m_extraToolBar = NULL;
 #endif
     
     m_textWindow = new wxTextCtrl(m_panel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE);
 
     wxBoxSizer* sizer = new wxBoxSizer(wxVERTICAL);
     m_panel->SetSizer(sizer);
+#if USE_UNMANAGED_TOOLBAR
     if (m_extraToolBar)
         sizer->Add(m_extraToolBar, 0, wxEXPAND, 0);
+#endif
     sizer->Add(m_textWindow, 1, wxEXPAND, 0);
 }
 
+MyFrame::~MyFrame()
+{
+    if ( m_searchTool && !m_searchTool->GetToolBar() )
+    {
+        // we currently can't delete a toolbar tool ourselves, so we have to
+        // attach it to the toolbar just for it to be deleted, this is pretty
+        // ugly and will need to be changed
+        GetToolBar()->AddTool(m_searchTool);
+    }
+}
+
 void MyFrame::LayoutChildren()
 {
     wxSize size = GetClientSize();
@@ -844,6 +861,31 @@ void MyFrame::DoToggleHelp()
     tb->ToggleTool( wxID_HELP, !tb->GetToolState( wxID_HELP ) );
 }
 
+void MyFrame::OnToggleSearch(wxCommandEvent& WXUNUSED(event))
+{
+    static const int searchPos = 3;
+
+    wxToolBarBase * const tb = GetToolBar();
+    if ( !m_searchTool )
+    {
+        wxSearchCtrl * const srch = new wxSearchCtrl(tb, wxID_ANY, "needle");
+        srch->SetMinSize(wxSize(80, -1));
+        m_searchTool = tb->InsertControl(searchPos, srch);
+    }
+    else // tool already exists
+    {
+        if ( m_searchTool->GetToolBar() )
+        {
+            // attached now, remove it
+            tb->RemoveTool(m_searchTool->GetId());
+        }
+        else // tool exists in detached state, attach it back
+        {
+            tb->InsertTool(searchPos, m_searchTool);
+        }
+    }
+}
+
 void MyFrame::OnUpdateCopyAndCut(wxUpdateUIEvent& event)
 {
     event.Enable( m_textWindow->CanCopy() );
index abb467f5ca1882ee03afe354726cc64195d8c447..0e6d905ab36c63f45107752357bd717078210f03 100644 (file)
@@ -62,6 +62,8 @@ IMPLEMENT_DYNAMIC_CLASS(wxToolBarToolBase, wxObject)
 wxToolBarToolBase::~wxToolBarToolBase()
 {
     delete m_dropdownMenu;
+    if ( IsControl() )
+        GetControl()->Destroy();
 }
 
 
@@ -208,6 +210,7 @@ wxToolBarBase::InsertTool(size_t pos, wxToolBarToolBase *tool)
     }
 
     m_tools.Insert(pos, tool);
+    tool->Attach(this);
 
     return tool;
 }
@@ -314,17 +317,19 @@ wxToolBarToolBase *wxToolBarBase::RemoveTool(int id)
     {
         // don't give any error messages - sometimes we might call RemoveTool()
         // without knowing whether the tool is or not in the toolbar
-        return (wxToolBarToolBase *)NULL;
+        return NULL;
     }
 
     wxToolBarToolBase *tool = node->GetData();
+    wxCHECK_MSG( tool, NULL, "NULL tool in the tools list?" );
+
     if ( !DoDeleteTool(pos, tool) )
-    {
-        return (wxToolBarToolBase *)NULL;
-    }
+        return NULL;
 
     m_tools.Erase(node);
 
+    tool->Detach();
+
     return tool;
 }
 
index 68b72f8fbc885268637683acce9f0e07d3c366ce..b08e0e641bfd326c766bce0064a1bc2ed6aaf6ff 100644 (file)
@@ -103,6 +103,17 @@ public:
         Init();
     }
 
+    virtual ~wxToolBarTool()
+    {
+        if ( IsControl() && !m_item )
+        {
+            // if we're a control which is not currently attached to the
+            // toolbar (as indicated by NULL m_item), we must undo the extra
+            // reference we added in DoDeleteTool()
+            g_object_unref(GetControl()->m_widget);
+        }
+    }
+
     // is this a radio button?
     //
     // unlike GetKind(), can be called for any kind of tools, not just buttons
@@ -139,8 +150,12 @@ public:
         }
     }
 
-    GtkWidget            *m_item;
-    GtkWidget            *m_image;
+    // the toolbar element for button tools or a GtkAlignment containing the
+    // control for control tools
+    GtkWidget *m_item;
+
+    // a GtkImage containing the image for a button-type tool, may be NULL
+    GtkWidget *m_image;
 
 protected:
     void Init();
@@ -611,36 +626,29 @@ bool wxToolBar::DoInsertTool(size_t pos, wxToolBarToolBase *toolBase)
                         (tool->m_item, &req );
                     gtk_widget_set_size_request( dropdown, -1, req.height );
 
-                    gtk_toolbar_insert_widget(
-                                       m_toolbar,
-                                       dropdown,
-                                       (const char *) NULL,
-                                       (const char *) NULL,
-                                       posGtk+1
-                                      );
+                    gtk_toolbar_insert_widget(m_toolbar, dropdown, NULL, NULL,
+                                              posGtk + 1);
                 }
             }
             break;
 
         case wxTOOL_STYLE_SEPARATOR:
             gtk_toolbar_insert_space( m_toolbar, posGtk );
-
-            // skip the rest
-            return true;
+            break;
 
         case wxTOOL_STYLE_CONTROL:
-            GtkWidget* align = gtk_alignment_new(0.5, 0.5, 0, 0);
+            GtkWidget * const align = gtk_alignment_new(0.5, 0.5, 0, 0);
             gtk_widget_show(align);
-            gtk_container_add((GtkContainer*)align, tool->GetControl()->m_widget);
-            gtk_toolbar_insert_widget(
-                                       m_toolbar,
-                                       align,
-                                       (const char *) NULL,
-                                       (const char *) NULL,
-                                       posGtk
-                                      );
+            gtk_container_add(GTK_CONTAINER(align),
+                              tool->GetControl()->m_widget);
+            gtk_toolbar_insert_widget(m_toolbar, align, NULL, NULL, posGtk);
+
             // release reference obtained by wxInsertChildInToolBar
             g_object_unref(tool->GetControl()->m_widget);
+
+            // remember the container we're in so that we could remove
+            // ourselves from it when we're detached from the toolbar
+            tool->m_item = align;
             break;
     }
 
@@ -656,16 +664,29 @@ bool wxToolBar::DoDeleteTool(size_t pos, wxToolBarToolBase *toolBase)
     switch ( tool->GetStyle() )
     {
         case wxTOOL_STYLE_CONTROL:
-            tool->GetControl()->Destroy();
-            break;
+            // don't destroy the control here as we can be called from
+            // RemoveTool() and then we need to keep the control alive;
+            // while if we're called from DeleteTool() the control will
+            // be destroyed when wxToolBarToolBase itself is deleted
+            {
+                GtkWidget * const w = tool->GetControl()->m_widget;
+                g_object_ref(w);
+                gtk_container_remove(GTK_CONTAINER(tool->m_item), w);
+            }
+            // fall through
 
         case wxTOOL_STYLE_BUTTON:
             gtk_widget_destroy( tool->m_item );
+            tool->m_item = NULL;
             break;
 
         case wxTOOL_STYLE_SEPARATOR:
             gtk_toolbar_remove_space( m_toolbar, pos );
             break;
+
+        default:
+            wxFAIL_MSG( "unknown tool style" );
+            return false;
     }
 
     InvalidateBestSize();
index 6b5a785f2c5a776edd7e0068b79c699d817e5466..f45f4e9112e1ce23112001c72d4cdba8c1f4e92c 100644 (file)
@@ -489,12 +489,19 @@ bool wxToolBar::DoDeleteTool(size_t WXUNUSED(pos), wxToolBarToolBase *toolBase)
     switch ( tool->GetStyle() )
     {
         case wxTOOL_STYLE_CONTROL:
-            tool->GetControl()->Destroy();
+            // don't destroy the control here as we can be called from
+            // RemoveTool() and then we need to keep the control alive;
+            // while if we're called from DeleteTool() the control will
+            // be destroyed when wxToolBarToolBase itself is deleted
             break;
 
         case wxTOOL_STYLE_BUTTON:
             gtk_widget_destroy( tool->m_item );
             break;
+
+        default:
+            wxFAIL_MSG( "unknown tool style" );
+            return false;
     }
 
     InvalidateBestSize();
index 02778a1791c5dc59914f0436f535bbf336e38049..f0364473c9e9ec04616b203960a9a7802c7d9a1e 100644 (file)
@@ -113,7 +113,6 @@ public:
             }
             m_controlHandle = NULL ;
         }
-        m_control = NULL;
 
 #if wxMAC_USE_NATIVE_TOOLBAR
         if ( m_toolbarItemRef )
@@ -1461,7 +1460,6 @@ bool wxToolBar::DoInsertTool(size_t WXUNUSED(pos), wxToolBarToolBase *toolBase)
     Rect toolrect = { 0, 0, toolSize.y, toolSize.x };
     ControlRef controlHandle = NULL;
     OSStatus err = 0;
-    tool->Attach( this );
 
 #if wxMAC_USE_NATIVE_TOOLBAR
     wxString label = tool->GetLabel();
@@ -1653,8 +1651,6 @@ bool wxToolBar::DoDeleteTool(size_t WXUNUSED(pos), wxToolBarToolBase *toolbase)
 
     wxSize sz = ((wxToolBarTool*)tool)->GetSize();
 
-    tool->Detach();
-
 #if wxMAC_USE_NATIVE_TOOLBAR
     CFIndex removeIndex = tool->GetIndex();
 #endif
@@ -1669,21 +1665,7 @@ bool wxToolBar::DoDeleteTool(size_t WXUNUSED(pos), wxToolBarToolBase *toolbase)
         }
     }
 #endif
-    switch ( tool->GetStyle() )
-    {
-        case wxTOOL_STYLE_CONTROL:
-            if ( tool->GetControl() )
-                tool->GetControl()->Destroy();
-            break;
 
-        case wxTOOL_STYLE_BUTTON:
-        case wxTOOL_STYLE_SEPARATOR:
-            // nothing special
-            break;
-
-        default:
-            break;
-    }
     tool->ClearControl();
 
     // and finally reposition all the controls after this one
index 3bfec13c6487d4ff2d0a2db4c6b231cee58ccec6..7e0a93f4edeb8e535cbd286954356ef0ad79d484 100644 (file)
@@ -477,8 +477,6 @@ bool wxToolBar::DoInsertTool(size_t WXUNUSED(pos), wxToolBarToolBase *tool)
 {
     // nothing special to do here - we really create the toolbar buttons in
     // Realize() later
-    tool->Attach(this);
-
     InvalidateBestSize();
     return true;
 }
@@ -524,7 +522,6 @@ bool wxToolBar::DoDeleteTool(size_t pos, wxToolBarToolBase *tool)
     {
         nButtonsToDelete = ((wxToolBarTool *)tool)->GetSeparatorsCount();
         width *= nButtonsToDelete;
-        tool->GetControl()->Destroy();
     }
 
     // do delete all buttons
@@ -539,8 +536,6 @@ bool wxToolBar::DoDeleteTool(size_t pos, wxToolBarToolBase *tool)
         }
     }
 
-    tool->Detach();
-
     // and finally reposition all the controls after this button (the toolbar
     // takes care of all normal items)
     for ( /* node -> first after deleted */ ; node; node = node->GetNext() )