X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/722ed5bed5c8816c57b8c90471ce423548c34151..133506215101bd8cffbf81e6c36944f7d5e2f8db:/src/common/framecmn.cpp diff --git a/src/common/framecmn.cpp b/src/common/framecmn.cpp index 0c964bb6f4..e888407f92 100644 --- a/src/common/framecmn.cpp +++ b/src/common/framecmn.cpp @@ -92,27 +92,15 @@ wxFrame *wxFrameBase::New(wxWindow *parent, void wxFrameBase::DeleteAllBars() { #if wxUSE_MENUS - if ( m_frameMenuBar ) - { - delete m_frameMenuBar; - m_frameMenuBar = (wxMenuBar *) NULL; - } + wxDELETE(m_frameMenuBar); #endif // wxUSE_MENUS #if wxUSE_STATUSBAR - if ( m_frameStatusBar ) - { - delete m_frameStatusBar; - m_frameStatusBar = (wxStatusBar *) NULL; - } + wxDELETE(m_frameStatusBar); #endif // wxUSE_STATUSBAR #if wxUSE_TOOLBAR - if ( m_frameToolBar ) - { - delete m_frameToolBar; - m_frameToolBar = (wxToolBar *) NULL; - } + wxDELETE(m_frameToolBar); #endif // wxUSE_TOOLBAR } @@ -133,6 +121,8 @@ bool wxFrameBase::IsOneOfBars(const wxWindow *win) const return true; #endif // wxUSE_TOOLBAR + wxUnusedVar(win); + return false; } @@ -168,54 +158,49 @@ wxPoint wxFrameBase::GetClientAreaOrigin() const return pt; } - -void wxFrameBase::SendSizeEvent() -{ - wxSizeEvent event( GetSize(), GetId() ); - event.SetEventObject( this ); - GetEventHandler()->AddPendingEvent( event ); -} - - // ---------------------------------------------------------------------------- // misc // ---------------------------------------------------------------------------- +#if wxUSE_MENUS + bool wxFrameBase::ProcessCommand(int id) { -#if wxUSE_MENUS wxMenuBar *bar = GetMenuBar(); if ( !bar ) return false; - wxCommandEvent commandEvent(wxEVT_COMMAND_MENU_SELECTED, id); + wxMenuItem *item = bar->FindItem(id); + if ( !item ) + return false; + + return ProcessCommand(item); +} + +bool wxFrameBase::ProcessCommand(wxMenuItem *item) +{ + wxCommandEvent commandEvent(wxEVT_COMMAND_MENU_SELECTED, item->GetId()); commandEvent.SetEventObject(this); - wxMenuItem *item = bar->FindItem(id); - if (item) - { - if (!item->IsEnabled()) - return true; + if (!item->IsEnabled()) + return true; - if ((item->GetKind() == wxITEM_RADIO) && item->IsChecked() ) - return true; + if ((item->GetKind() == wxITEM_RADIO) && item->IsChecked() ) + return true; - if (item->IsCheckable()) - { - item->Toggle(); + if (item->IsCheckable()) + { + item->Toggle(); - // use the new value - commandEvent.SetInt(item->IsChecked()); - } + // use the new value + commandEvent.SetInt(item->IsChecked()); } - GetEventHandler()->ProcessEvent(commandEvent); - return true; -#else // !wxUSE_MENUS - return false; -#endif // wxUSE_MENUS/!wxUSE_MENUS + return HandleWindowEvent(commandEvent); } +#endif // wxUSE_MENUS + // Do the UI update processing for this window. This is // provided for the application to call if it wants to // force a UI update, particularly for the menus and toolbar. @@ -231,14 +216,12 @@ void wxFrameBase::UpdateWindowUI(long flags) #if wxUSE_MENUS if (GetMenuBar()) { - if ((flags & wxUPDATE_UI_FROMIDLE) && !wxUSE_IDLEMENUUPDATES) - { - // If coming from an idle event, we only - // want to update the menus if we're - // in the wxUSE_IDLEMENUUPDATES configuration: - // so if we're not, do nothing - } - else + // If coming from an idle event, we only want to update the menus if + // we're in the wxUSE_IDLEMENUUPDATES configuration, otherwise they + // will be update when the menu is opened later +#if !wxUSE_IDLEMENUUPDATES + if ( !(flags & wxUPDATE_UI_FROMIDLE) ) +#endif // wxUSE_IDLEMENUUPDATES DoMenuUpdates(); } #endif // wxUSE_MENUS @@ -257,15 +240,14 @@ void wxFrameBase::OnMenuHighlight(wxMenuEvent& event) #endif // wxUSE_STATUSBAR } -#if !wxUSE_IDLEMENUUPDATES void wxFrameBase::OnMenuOpen(wxMenuEvent& event) -#else -void wxFrameBase::OnMenuOpen(wxMenuEvent& WXUNUSED(event)) -#endif { -#if !wxUSE_IDLEMENUUPDATES +#if wxUSE_IDLEMENUUPDATES + wxUnusedVar(event); +#else // !wxUSE_IDLEMENUUPDATES + // as we didn't update the menus from idle time, do it now DoMenuUpdates(event.GetMenu()); -#endif // !wxUSE_IDLEMENUUPDATES +#endif // wxUSE_IDLEMENUUPDATES/!wxUSE_IDLEMENUUPDATES } void wxFrameBase::OnMenuClose(wxMenuEvent& WXUNUSED(event)) @@ -299,7 +281,7 @@ wxStatusBar* wxFrameBase::CreateStatusBar(int number, { // the main status bar can only be created once (or else it should be // deleted before calling CreateStatusBar() again) - wxCHECK_MSG( !m_frameStatusBar, (wxStatusBar *)NULL, + wxCHECK_MSG( !m_frameStatusBar, NULL, wxT("recreating status bar in wxFrame") ); SetStatusBar(OnCreateStatusBar(number, style, id, name)); @@ -353,18 +335,17 @@ bool wxFrameBase::ShowMenuHelp(int menuId) { #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 ) { - wxMenuBar *menuBar = GetMenuBar(); - if ( menuBar ) - { - // it's ok if we don't find the item because it might belong - // to the popup menu - wxMenuItem *item = menuBar->FindItem(menuId); - if ( item ) - helpString = item->GetHelp(); - } + const wxMenuItem * const item = FindItemInMenuBar(menuId); + if ( item && !item->IsSeparator() ) + helpString = item->GetHelp(); + + // notice that it's ok if we don't find the item because it might + // belong to the popup menu, so don't assert here } DoGiveHelp(helpString, true); @@ -424,21 +405,36 @@ void wxFrameBase::DoGiveHelp(const wxString& help, bool show) if ( m_oldStatusText.empty() ) { // use special value to prevent us from doing this the next time - m_oldStatusText += _T('\0'); + m_oldStatusText += wxT('\0'); } } + m_lastHelpShown = text = help; } else // hide help, restore the original text { - text = m_oldStatusText; - m_oldStatusText.clear(); + // clear the last shown help string but remember its value + wxString lastHelpShown; + lastHelpShown.swap(m_lastHelpShown); + + // also clear the old status text but remember it too to restore it + // below + text.swap(m_oldStatusText); + + if ( statbar->GetStatusText(m_statusBarPane) != lastHelpShown ) + { + // if the text was changed with an explicit SetStatusText() call + // from the user code in the meanwhile, do not overwrite it with + // the old status bar contents -- this is almost certainly not what + // the user expects and would be very hard to avoid from user code + return; + } } statbar->SetStatusText(text, m_statusBarPane); #else - wxUnusedVar(text); + wxUnusedVar(help); wxUnusedVar(show); #endif // wxUSE_STATUSBAR } @@ -457,7 +453,7 @@ wxToolBar* wxFrameBase::CreateToolBar(long style, { // the main toolbar can't be recreated (unless it was explicitly deleted // before) - wxCHECK_MSG( !m_frameToolBar, (wxToolBar *)NULL, + wxCHECK_MSG( !m_frameToolBar, NULL, wxT("recreating toolbar in wxFrame") ); if ( style == -1 ) @@ -494,15 +490,40 @@ wxToolBar* wxFrameBase::OnCreateToolBar(long style, 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 @@ -560,4 +581,11 @@ void wxFrameBase::SetMenuBar(wxMenuBar *menubar) this->AttachMenuBar(menubar); } +wxMenuItem *wxFrameBase::FindItemInMenuBar(int menuId) const +{ + const wxMenuBar * const menuBar = GetMenuBar(); + + return menuBar ? menuBar->FindItem(menuId) : NULL; +} + #endif // wxUSE_MENUS