Several fixes for removing/readding controls to the toolbar:

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
This commit is contained in:
Vadim Zeitlin
2008-03-27 00:10:19 +00:00
parent aba6d9ffc6
commit 1be45608e7
6 changed files with 144 additions and 92 deletions

View File

@@ -33,7 +33,6 @@
#include "wx/image.h" #include "wx/image.h"
#include "wx/filedlg.h" #include "wx/filedlg.h"
#include "wx/colordlg.h" #include "wx/colordlg.h"
#include "wx/spinctrl.h"
#include "wx/srchctrl.h" #include "wx/srchctrl.h"
// define this to use XPMs everywhere (by default, BMPs are used under Win) // define this to use XPMs everywhere (by default, BMPs are used under Win)
@@ -54,6 +53,9 @@
// native, 'installed' toolbar. // native, 'installed' toolbar.
#define USE_UNMANAGED_TOOLBAR 0 #define USE_UNMANAGED_TOOLBAR 0
// Define this as 0 for the platforms not supporting controls in toolbars
#define USE_CONTROLS_IN_TOOLBAR 1
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// resources // resources
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
@@ -102,6 +104,7 @@ public:
const wxPoint& pos = wxDefaultPosition, const wxPoint& pos = wxDefaultPosition,
const wxSize& size = wxDefaultSize, const wxSize& size = wxDefaultSize,
long style = wxDEFAULT_FRAME_STYLE|wxCLIP_CHILDREN|wxNO_FULL_REPAINT_ON_RESIZE); long style = wxDEFAULT_FRAME_STYLE|wxCLIP_CHILDREN|wxNO_FULL_REPAINT_ON_RESIZE);
virtual ~MyFrame();
void PopulateToolbar(wxToolBarBase* toolBar); void PopulateToolbar(wxToolBarBase* toolBar);
void RecreateToolbar(); void RecreateToolbar();
@@ -126,6 +129,7 @@ public:
void OnInsertPrint(wxCommandEvent& event); void OnInsertPrint(wxCommandEvent& event);
void OnChangeToolTip(wxCommandEvent& event); void OnChangeToolTip(wxCommandEvent& event);
void OnToggleHelp(wxCommandEvent& WXUNUSED(event)) { DoToggleHelp(); } void OnToggleHelp(wxCommandEvent& WXUNUSED(event)) { DoToggleHelp(); }
void OnToggleSearch(wxCommandEvent& event);
void OnToggleRadioBtn(wxCommandEvent& event); void OnToggleRadioBtn(wxCommandEvent& event);
void OnToolbarStyle(wxCommandEvent& event); void OnToolbarStyle(wxCommandEvent& event);
@@ -165,13 +169,18 @@ private:
wxTextCtrl *m_textWindow; wxTextCtrl *m_textWindow;
wxPanel *m_panel; wxPanel *m_panel;
#if USE_UNMANAGED_TOOLBAR
wxToolBar *m_extraToolBar; wxToolBar *m_extraToolBar;
#endif
wxToolBar *m_tbar; wxToolBar *m_tbar;
// the path to the custom bitmap for the test toolbar tool // the path to the custom bitmap for the test toolbar tool
wxString m_pathBmp; wxString m_pathBmp;
// the search tool, initially NULL
wxToolBarToolBase *m_searchTool;
DECLARE_EVENT_TABLE() DECLARE_EVENT_TABLE()
}; };
@@ -185,21 +194,14 @@ static const long TOOLBAR_STYLE = wxTB_FLAT | wxTB_DOCKABLE | wxTB_TEXT;
enum 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_TOGGLETOOLBARROWS,
IDM_TOOLBAR_TOGGLETOOLTIPS, IDM_TOOLBAR_TOGGLETOOLTIPS,
IDM_TOOLBAR_TOGGLECUSTOMDISABLED, 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_TEXT,
IDM_TOOLBAR_SHOW_ICONS, IDM_TOOLBAR_SHOW_ICONS,
IDM_TOOLBAR_SHOW_BOTH, IDM_TOOLBAR_SHOW_BOTH,
@@ -213,8 +215,18 @@ enum
IDM_TOOLBAR_OTHER_2, IDM_TOOLBAR_OTHER_2,
IDM_TOOLBAR_OTHER_3, IDM_TOOLBAR_OTHER_3,
ID_COMBO = 1000, // tools menu items
ID_SPIN = 1001 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_DELETEPRINT, MyFrame::OnDeletePrint)
EVT_MENU(IDM_TOOLBAR_INSERTPRINT, MyFrame::OnInsertPrint) EVT_MENU(IDM_TOOLBAR_INSERTPRINT, MyFrame::OnInsertPrint)
EVT_MENU(IDM_TOOLBAR_TOGGLEHELP, MyFrame::OnToggleHelp) EVT_MENU(IDM_TOOLBAR_TOGGLEHELP, MyFrame::OnToggleHelp)
EVT_MENU(IDM_TOOLBAR_TOGGLESEARCH, MyFrame::OnToggleSearch)
EVT_MENU_RANGE(IDM_TOOLBAR_TOGGLERADIOBTN1, IDM_TOOLBAR_TOGGLERADIOBTN3, EVT_MENU_RANGE(IDM_TOOLBAR_TOGGLERADIOBTN1, IDM_TOOLBAR_TOGGLERADIOBTN3,
MyFrame::OnToggleRadioBtn) MyFrame::OnToggleRadioBtn)
EVT_MENU(IDM_TOOLBAR_CHANGE_TOOLTIP, MyFrame::OnChangeToolTip) EVT_MENU(IDM_TOOLBAR_CHANGE_TOOLTIP, MyFrame::OnChangeToolTip)
@@ -421,10 +434,9 @@ void MyFrame::PopulateToolbar(wxToolBarBase* toolBar)
toolBarBitmaps[Tool_open], wxNullBitmap, wxITEM_NORMAL, toolBarBitmaps[Tool_open], wxNullBitmap, wxITEM_NORMAL,
_T("Open file"), _T("This is help for open file tool")); _T("Open file"), _T("This is help for open file tool"));
// the generic toolbar doesn't really support this #if USE_CONTROLS_IN_TOOLBAR
#if wxUSE_TOOLBAR_NATIVE && !defined(__WXX11__) || defined(__WXUNIVERSAL__)
// adding a combo to a vertical toolbar is not very smart // 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) ); wxComboBox *combo = new wxComboBox(toolBar, ID_COMBO, wxEmptyString, wxDefaultPosition, wxSize(100,-1) );
combo->Append(_T("This")); combo->Append(_T("This"));
@@ -433,17 +445,8 @@ void MyFrame::PopulateToolbar(wxToolBarBase* toolBar)
combo->Append(_T("in a")); combo->Append(_T("in a"));
combo->Append(_T("toolbar")); combo->Append(_T("toolbar"));
toolBar->AddControl(combo, _T("Combo Label")); 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_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); 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")); _T("Set toolbar at the right edge of the window"));
tbarMenu->AppendSeparator(); 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_TEXT, _T("Show &text\tCtrl-Alt-T"));
tbarMenu->AppendRadioItem(IDM_TOOLBAR_SHOW_ICONS, _T("Show &icons\tCtrl-Alt-I")); tbarMenu->AppendRadioItem(IDM_TOOLBAR_SHOW_ICONS, _T("Show &icons\tCtrl-Alt-I"));
tbarMenu->AppendRadioItem(IDM_TOOLBAR_SHOW_BOTH, _T("Show &both\tCtrl-Alt-B")); 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_BG_COL, _T("Choose bac&kground colour..."));
tbarMenu->Append(IDM_TOOLBAR_CUSTOM_PATH, _T("Custom &bitmap...\tCtrl-B")); 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; wxMenu *fileMenu = new wxMenu;
fileMenu->Append(wxID_EXIT, _T("E&xit\tAlt-X"), _T("Quit toolbar sample") ); 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(fileMenu, _T("&File"));
menuBar->Append(tbarMenu, _T("&Toolbar")); menuBar->Append(tbarMenu, _T("&Toolbar"));
menuBar->Append(toolMenu, _T("Tool&s"));
menuBar->Append(helpMenu, _T("&Help")); menuBar->Append(helpMenu, _T("&Help"));
// Associate the menu bar with the frame // Associate the menu bar with the frame
@@ -619,19 +625,30 @@ MyFrame::MyFrame(wxFrame* parent,
#if USE_UNMANAGED_TOOLBAR #if USE_UNMANAGED_TOOLBAR
m_extraToolBar = new wxToolBar(m_panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTB_TEXT|wxTB_FLAT|wxTB_TOP); m_extraToolBar = new wxToolBar(m_panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTB_TEXT|wxTB_FLAT|wxTB_TOP);
PopulateToolbar(m_extraToolBar); PopulateToolbar(m_extraToolBar);
#else
m_extraToolBar = NULL;
#endif #endif
m_textWindow = new wxTextCtrl(m_panel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE); m_textWindow = new wxTextCtrl(m_panel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE);
wxBoxSizer* sizer = new wxBoxSizer(wxVERTICAL); wxBoxSizer* sizer = new wxBoxSizer(wxVERTICAL);
m_panel->SetSizer(sizer); m_panel->SetSizer(sizer);
#if USE_UNMANAGED_TOOLBAR
if (m_extraToolBar) if (m_extraToolBar)
sizer->Add(m_extraToolBar, 0, wxEXPAND, 0); sizer->Add(m_extraToolBar, 0, wxEXPAND, 0);
#endif
sizer->Add(m_textWindow, 1, wxEXPAND, 0); 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() void MyFrame::LayoutChildren()
{ {
wxSize size = GetClientSize(); wxSize size = GetClientSize();
@@ -844,6 +861,31 @@ void MyFrame::DoToggleHelp()
tb->ToggleTool( wxID_HELP, !tb->GetToolState( wxID_HELP ) ); 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) void MyFrame::OnUpdateCopyAndCut(wxUpdateUIEvent& event)
{ {
event.Enable( m_textWindow->CanCopy() ); event.Enable( m_textWindow->CanCopy() );

View File

@@ -62,6 +62,8 @@ IMPLEMENT_DYNAMIC_CLASS(wxToolBarToolBase, wxObject)
wxToolBarToolBase::~wxToolBarToolBase() wxToolBarToolBase::~wxToolBarToolBase()
{ {
delete m_dropdownMenu; delete m_dropdownMenu;
if ( IsControl() )
GetControl()->Destroy();
} }
@@ -208,6 +210,7 @@ wxToolBarBase::InsertTool(size_t pos, wxToolBarToolBase *tool)
} }
m_tools.Insert(pos, tool); m_tools.Insert(pos, tool);
tool->Attach(this);
return tool; return tool;
} }
@@ -314,17 +317,19 @@ wxToolBarToolBase *wxToolBarBase::RemoveTool(int id)
{ {
// don't give any error messages - sometimes we might call RemoveTool() // don't give any error messages - sometimes we might call RemoveTool()
// without knowing whether the tool is or not in the toolbar // without knowing whether the tool is or not in the toolbar
return (wxToolBarToolBase *)NULL; return NULL;
} }
wxToolBarToolBase *tool = node->GetData(); wxToolBarToolBase *tool = node->GetData();
wxCHECK_MSG( tool, NULL, "NULL tool in the tools list?" );
if ( !DoDeleteTool(pos, tool) ) if ( !DoDeleteTool(pos, tool) )
{ return NULL;
return (wxToolBarToolBase *)NULL;
}
m_tools.Erase(node); m_tools.Erase(node);
tool->Detach();
return tool; return tool;
} }

View File

@@ -103,6 +103,17 @@ public:
Init(); 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? // is this a radio button?
// //
// unlike GetKind(), can be called for any kind of tools, not just buttons // unlike GetKind(), can be called for any kind of tools, not just buttons
@@ -139,7 +150,11 @@ public:
} }
} }
// the toolbar element for button tools or a GtkAlignment containing the
// control for control tools
GtkWidget *m_item; GtkWidget *m_item;
// a GtkImage containing the image for a button-type tool, may be NULL
GtkWidget *m_image; GtkWidget *m_image;
protected: protected:
@@ -611,36 +626,29 @@ bool wxToolBar::DoInsertTool(size_t pos, wxToolBarToolBase *toolBase)
(tool->m_item, &req ); (tool->m_item, &req );
gtk_widget_set_size_request( dropdown, -1, req.height ); gtk_widget_set_size_request( dropdown, -1, req.height );
gtk_toolbar_insert_widget( gtk_toolbar_insert_widget(m_toolbar, dropdown, NULL, NULL,
m_toolbar, posGtk + 1);
dropdown,
(const char *) NULL,
(const char *) NULL,
posGtk+1
);
} }
} }
break; break;
case wxTOOL_STYLE_SEPARATOR: case wxTOOL_STYLE_SEPARATOR:
gtk_toolbar_insert_space( m_toolbar, posGtk ); gtk_toolbar_insert_space( m_toolbar, posGtk );
break;
// skip the rest
return true;
case wxTOOL_STYLE_CONTROL: 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_widget_show(align);
gtk_container_add((GtkContainer*)align, tool->GetControl()->m_widget); gtk_container_add(GTK_CONTAINER(align),
gtk_toolbar_insert_widget( tool->GetControl()->m_widget);
m_toolbar, gtk_toolbar_insert_widget(m_toolbar, align, NULL, NULL, posGtk);
align,
(const char *) NULL,
(const char *) NULL,
posGtk
);
// release reference obtained by wxInsertChildInToolBar // release reference obtained by wxInsertChildInToolBar
g_object_unref(tool->GetControl()->m_widget); 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; break;
} }
@@ -656,16 +664,29 @@ bool wxToolBar::DoDeleteTool(size_t pos, wxToolBarToolBase *toolBase)
switch ( tool->GetStyle() ) switch ( tool->GetStyle() )
{ {
case wxTOOL_STYLE_CONTROL: case wxTOOL_STYLE_CONTROL:
tool->GetControl()->Destroy(); // don't destroy the control here as we can be called from
break; // 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: case wxTOOL_STYLE_BUTTON:
gtk_widget_destroy( tool->m_item ); gtk_widget_destroy( tool->m_item );
tool->m_item = NULL;
break; break;
case wxTOOL_STYLE_SEPARATOR: case wxTOOL_STYLE_SEPARATOR:
gtk_toolbar_remove_space( m_toolbar, pos ); gtk_toolbar_remove_space( m_toolbar, pos );
break; break;
default:
wxFAIL_MSG( "unknown tool style" );
return false;
} }
InvalidateBestSize(); InvalidateBestSize();

View File

@@ -489,12 +489,19 @@ bool wxToolBar::DoDeleteTool(size_t WXUNUSED(pos), wxToolBarToolBase *toolBase)
switch ( tool->GetStyle() ) switch ( tool->GetStyle() )
{ {
case wxTOOL_STYLE_CONTROL: 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; break;
case wxTOOL_STYLE_BUTTON: case wxTOOL_STYLE_BUTTON:
gtk_widget_destroy( tool->m_item ); gtk_widget_destroy( tool->m_item );
break; break;
default:
wxFAIL_MSG( "unknown tool style" );
return false;
} }
InvalidateBestSize(); InvalidateBestSize();

View File

@@ -113,7 +113,6 @@ public:
} }
m_controlHandle = NULL ; m_controlHandle = NULL ;
} }
m_control = NULL;
#if wxMAC_USE_NATIVE_TOOLBAR #if wxMAC_USE_NATIVE_TOOLBAR
if ( m_toolbarItemRef ) if ( m_toolbarItemRef )
@@ -1461,7 +1460,6 @@ bool wxToolBar::DoInsertTool(size_t WXUNUSED(pos), wxToolBarToolBase *toolBase)
Rect toolrect = { 0, 0, toolSize.y, toolSize.x }; Rect toolrect = { 0, 0, toolSize.y, toolSize.x };
ControlRef controlHandle = NULL; ControlRef controlHandle = NULL;
OSStatus err = 0; OSStatus err = 0;
tool->Attach( this );
#if wxMAC_USE_NATIVE_TOOLBAR #if wxMAC_USE_NATIVE_TOOLBAR
wxString label = tool->GetLabel(); wxString label = tool->GetLabel();
@@ -1653,8 +1651,6 @@ bool wxToolBar::DoDeleteTool(size_t WXUNUSED(pos), wxToolBarToolBase *toolbase)
wxSize sz = ((wxToolBarTool*)tool)->GetSize(); wxSize sz = ((wxToolBarTool*)tool)->GetSize();
tool->Detach();
#if wxMAC_USE_NATIVE_TOOLBAR #if wxMAC_USE_NATIVE_TOOLBAR
CFIndex removeIndex = tool->GetIndex(); CFIndex removeIndex = tool->GetIndex();
#endif #endif
@@ -1669,21 +1665,7 @@ bool wxToolBar::DoDeleteTool(size_t WXUNUSED(pos), wxToolBarToolBase *toolbase)
} }
} }
#endif #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(); tool->ClearControl();
// and finally reposition all the controls after this one // and finally reposition all the controls after this one

View 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 // nothing special to do here - we really create the toolbar buttons in
// Realize() later // Realize() later
tool->Attach(this);
InvalidateBestSize(); InvalidateBestSize();
return true; return true;
} }
@@ -524,7 +522,6 @@ bool wxToolBar::DoDeleteTool(size_t pos, wxToolBarToolBase *tool)
{ {
nButtonsToDelete = ((wxToolBarTool *)tool)->GetSeparatorsCount(); nButtonsToDelete = ((wxToolBarTool *)tool)->GetSeparatorsCount();
width *= nButtonsToDelete; width *= nButtonsToDelete;
tool->GetControl()->Destroy();
} }
// do delete all buttons // 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 // and finally reposition all the controls after this button (the toolbar
// takes care of all normal items) // takes care of all normal items)
for ( /* node -> first after deleted */ ; node; node = node->GetNext() ) for ( /* node -> first after deleted */ ; node; node = node->GetNext() )