X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/a9102b3671a45d116d781b0c8e90d2e9a84fbdcb..a43a9e5521440dbb28037646ed4a07125c8823a9:/src/common/framecmn.cpp diff --git a/src/common/framecmn.cpp b/src/common/framecmn.cpp index 6127486170..df7261eefc 100644 --- a/src/common/framecmn.cpp +++ b/src/common/framecmn.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: common/framecmn.cpp +// Name: src/common/framecmn.cpp // Purpose: common (for all platforms) wxFrame functions // Author: Julian Smart, Vadim Zeitlin // Created: 01/02/97 @@ -16,10 +16,6 @@ // headers // ---------------------------------------------------------------------------- -#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) - #pragma implementation "framebase.h" -#endif - // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" @@ -27,19 +23,15 @@ #pragma hdrstop #endif +#include "wx/frame.h" + #ifndef WX_PRECOMP - #include "wx/frame.h" #include "wx/menu.h" #include "wx/menuitem.h" #include "wx/dcclient.h" -#endif // WX_PRECOMP - -#if wxUSE_TOOLBAR #include "wx/toolbar.h" -#endif -#if wxUSE_STATUSBAR #include "wx/statusbr.h" -#endif +#endif // WX_PRECOMP // ---------------------------------------------------------------------------- // event table @@ -103,7 +95,7 @@ void wxFrameBase::DeleteAllBars() if ( m_frameMenuBar ) { delete m_frameMenuBar; - m_frameMenuBar = (wxMenuBar *) NULL; + m_frameMenuBar = NULL; } #endif // wxUSE_MENUS @@ -111,7 +103,7 @@ void wxFrameBase::DeleteAllBars() if ( m_frameStatusBar ) { delete m_frameStatusBar; - m_frameStatusBar = (wxStatusBar *) NULL; + m_frameStatusBar = NULL; } #endif // wxUSE_STATUSBAR @@ -119,7 +111,7 @@ void wxFrameBase::DeleteAllBars() if ( m_frameToolBar ) { delete m_frameToolBar; - m_frameToolBar = (wxToolBar *) NULL; + m_frameToolBar = NULL; } #endif // wxUSE_TOOLBAR } @@ -141,6 +133,8 @@ bool wxFrameBase::IsOneOfBars(const wxWindow *win) const return true; #endif // wxUSE_TOOLBAR + wxUnusedVar(win); + return false; } @@ -176,51 +170,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->IsCheckable()) - { - item->Toggle(); + if ((item->GetKind() == wxITEM_RADIO) && item->IsChecked() ) + return true; - // use the new value - commandEvent.SetInt(item->IsChecked()); - } + if (item->IsCheckable()) + { + item->Toggle(); + + // 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. @@ -236,14 +228,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 @@ -258,35 +248,23 @@ void wxFrameBase::UpdateWindowUI(long flags) void wxFrameBase::OnMenuHighlight(wxMenuEvent& event) { #if wxUSE_STATUSBAR - (void)ShowMenuHelp(GetStatusBar(), event.GetMenuId()); + (void)ShowMenuHelp(event.GetMenuId()); #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)) { - // do we have real status text to restore? - if ( !m_oldStatusText.empty() ) - { - if ( m_statusBarPane >= 0 ) - { - wxStatusBar *statbar = GetStatusBar(); - if ( statbar ) - statbar->SetStatusText(m_oldStatusText, m_statusBarPane); - } - - m_oldStatusText.clear(); - } + DoGiveHelp(wxEmptyString, false); } #endif // wxUSE_MENUS && wxUSE_STATUSBAR @@ -315,7 +293,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)); @@ -365,27 +343,22 @@ void wxFrameBase::PopStatusText(int number) m_frameStatusBar->PopStatusText(number); } -bool wxFrameBase::ShowMenuHelp(wxStatusBar *WXUNUSED(statbar), int menuId) +bool wxFrameBase::ShowMenuHelp(int menuId) { #if wxUSE_MENUS // if no help string found, we will clear the status bar text wxString helpString; - bool show = menuId != wxID_SEPARATOR && menuId != -2 /* wxID_TITLE */; - - if ( show ) + if ( menuId != wxID_SEPARATOR && menuId != -3 /* wxID_TITLE */ ) { - 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, show); + DoGiveHelp(helpString, true); return !helpString.empty(); #else // !wxUSE_MENUS @@ -408,7 +381,8 @@ void wxFrameBase::SetStatusBar(wxStatusBar *statBar) #endif // wxUSE_STATUSBAR -void wxFrameBase::DoGiveHelp(const wxString& text, bool show) +#if wxUSE_MENUS || wxUSE_TOOLBAR +void wxFrameBase::DoGiveHelp(const wxString& help, bool show) { #if wxUSE_STATUSBAR if ( m_statusBarPane < 0 ) @@ -421,36 +395,45 @@ void wxFrameBase::DoGiveHelp(const wxString& text, bool show) if ( !statbar ) return; - wxString help; + wxString text; if ( show ) - help = text; - - // remember the old status bar text if this is the first time we're called - // since the menu has been opened as we're going to overwrite it in our - // DoGiveHelp() and we want to restore it when the menu is closed - // - // note that it would be logical to do this in OnMenuOpen() but under MSW - // we get an EVT_MENU_HIGHLIGHT before EVT_MENU_OPEN, strangely enough, and - // so this doesn't work and instead we use the ugly trick with using - // special m_oldStatusText value as "menu opened" (but it is arguably - // better than adding yet another member variable to wxFrame on all - // platforms) - if ( m_oldStatusText.empty() ) { - m_oldStatusText = statbar->GetStatusText(m_statusBarPane); + // remember the old status bar text if this is the first time we're + // called since the menu has been opened as we're going to overwrite it + // in our DoGiveHelp() and we want to restore it when the menu is + // closed + // + // note that it would be logical to do this in OnMenuOpen() but under + // MSW we get an EVT_MENU_HIGHLIGHT before EVT_MENU_OPEN, strangely + // enough, and so this doesn't work and instead we use the ugly trick + // with using special m_oldStatusText value as "menu opened" (but it is + // arguably better than adding yet another member variable to wxFrame + // on all platforms) if ( m_oldStatusText.empty() ) { - // use special value to prevent us from doing this the next time - m_oldStatusText += _T('\0'); + m_oldStatusText = statbar->GetStatusText(m_statusBarPane); + if ( m_oldStatusText.empty() ) + { + // use special value to prevent us from doing this the next time + m_oldStatusText += _T('\0'); + } } + + text = help; + } + else // hide help, restore the original text + { + text = m_oldStatusText; + m_oldStatusText.clear(); } - statbar->SetStatusText(help, m_statusBarPane); + statbar->SetStatusText(text, m_statusBarPane); #else - wxUnusedVar(text); + wxUnusedVar(help); wxUnusedVar(show); #endif // wxUSE_STATUSBAR } +#endif // wxUSE_MENUS || wxUSE_TOOLBAR // ---------------------------------------------------------------------------- @@ -463,9 +446,9 @@ wxToolBar* wxFrameBase::CreateToolBar(long style, wxWindowID id, const wxString& name) { - // the main toolbar can't be recreated (unless it was explicitly deeleted + // 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 ) @@ -524,16 +507,16 @@ void wxFrameBase::SetToolBar(wxToolBar *toolbar) // update all menus void wxFrameBase::DoMenuUpdates(wxMenu* menu) { - wxEvtHandler* source = GetEventHandler(); - wxMenuBar* bar = GetMenuBar(); - if (menu) + { + wxEvtHandler* source = GetEventHandler(); menu->UpdateUI(source); - else if ( bar != NULL ) + } + else { - int nCount = bar->GetMenuCount(); - for (int n = 0; n < nCount; n++) - bar->GetMenu(n)->UpdateUI(source); + wxMenuBar* bar = GetMenuBar(); + if (bar != NULL) + bar->UpdateMenus(); } } @@ -568,13 +551,11 @@ void wxFrameBase::SetMenuBar(wxMenuBar *menubar) this->AttachMenuBar(menubar); } -#endif // wxUSE_MENUS - -#if WXWIN_COMPATIBILITY_2_2 - -bool wxFrameBase::Command(int winid) +wxMenuItem *wxFrameBase::FindItemInMenuBar(int menuId) const { - return ProcessCommand(winid); + const wxMenuBar * const menuBar = GetMenuBar(); + + return menuBar ? menuBar->FindItem(menuId) : NULL; } -#endif // WXWIN_COMPATIBILITY_2_2 +#endif // wxUSE_MENUS