void wxFrameBase::DeleteAllBars()
{
#if wxUSE_MENUS
- if ( m_frameMenuBar )
- {
- delete m_frameMenuBar;
- m_frameMenuBar = NULL;
- }
+ wxDELETE(m_frameMenuBar);
#endif // wxUSE_MENUS
#if wxUSE_STATUSBAR
- if ( m_frameStatusBar )
- {
- delete m_frameStatusBar;
- m_frameStatusBar = NULL;
- }
+ wxDELETE(m_frameStatusBar);
#endif // wxUSE_STATUSBAR
#if wxUSE_TOOLBAR
- if ( m_frameToolBar )
- {
- delete m_frameToolBar;
- m_frameToolBar = NULL;
- }
+ wxDELETE(m_frameToolBar);
#endif // wxUSE_TOOLBAR
}
{
#if wxUSE_MENUS
// if no help string found, we will clear the status bar text
+ //
+ // NB: wxID_NONE is used for (sub)menus themselves by wxMSW
wxString helpString;
- if ( menuId != wxID_SEPARATOR && menuId != -3 /* wxID_TITLE */ )
+ if ( menuId != wxID_SEPARATOR && menuId != wxID_NONE )
{
const wxMenuItem * const item = FindItemInMenuBar(menuId);
if ( item && !item->IsSeparator() )
void wxFrameBase::SetToolBar(wxToolBar *toolbar)
{
- bool hadBar = m_frameToolBar != NULL;
- m_frameToolBar = toolbar;
-
- if ( (m_frameToolBar != NULL) != hadBar )
+ if ( (toolbar != NULL) != (m_frameToolBar != NULL) )
{
- PositionToolBar();
+ // the toolbar visibility must have changed so we need to both position
+ // the toolbar itself (if it appeared) and to relayout the frame
+ // contents in any case
+
+ if ( toolbar )
+ {
+ // we need to assign it to m_frameToolBar for PositionToolBar() to
+ // do anything
+ m_frameToolBar = toolbar;
+ PositionToolBar();
+ }
+ //else: tricky: do not reset m_frameToolBar yet as otherwise DoLayout()
+ // wouldn't recognize the (still existing) toolbar as one of our
+ // bars and wouldn't layout the single child of the frame correctly
+
+
+ // and this is even more tricky: we want DoLayout() to recognize the
+ // old toolbar for the purpose of not counting it among our non-bar
+ // children but we don't want to reserve any more space for it so we
+ // temporarily hide it
+ if ( m_frameToolBar )
+ m_frameToolBar->Hide();
DoLayout();
+
+ if ( m_frameToolBar )
+ m_frameToolBar->Show();
}
+
+ // this might have been already done above but it's simpler to just always
+ // do it unconditionally instead of testing for whether we already did it
+ m_frameToolBar = toolbar;
}
#endif // wxUSE_TOOLBAR