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:
@@ -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() );
|
||||
|
Reference in New Issue
Block a user