diff --git a/include/wx/frame.h b/include/wx/frame.h index a9134b0a26..6740046652 100644 --- a/include/wx/frame.h +++ b/include/wx/frame.h @@ -170,8 +170,9 @@ public: #if wxUSE_MENUS || wxUSE_TOOLBAR // show help text for the currently selected menu or toolbar item - // (typically in the status bar) - virtual void DoGiveHelp(const wxString& text); + // (typically in the status bar) or hide it and restore the status bar text + // originally shown before the menu was opened if show == false + virtual void DoGiveHelp(const wxString& text, bool show); #endif protected: diff --git a/src/common/framecmn.cpp b/src/common/framecmn.cpp index 218239b815..300c0798d2 100644 --- a/src/common/framecmn.cpp +++ b/src/common/framecmn.cpp @@ -270,18 +270,7 @@ void wxFrameBase::OnMenuOpen(wxMenuEvent& WXUNUSED(event)) 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 @@ -378,7 +367,7 @@ bool wxFrameBase::ShowMenuHelp(wxStatusBar *WXUNUSED(statbar), int menuId) } } - DoGiveHelp(helpString); + DoGiveHelp(helpString, true); return !helpString.empty(); #else // !wxUSE_MENUS @@ -402,7 +391,7 @@ void wxFrameBase::SetStatusBar(wxStatusBar *statBar) #endif // wxUSE_STATUSBAR #if wxUSE_MENUS || wxUSE_TOOLBAR -void wxFrameBase::DoGiveHelp(const wxString& help) +void wxFrameBase::DoGiveHelp(const wxString& help, bool show) { #if wxUSE_STATUSBAR if ( m_statusBarPane < 0 ) @@ -415,28 +404,39 @@ void wxFrameBase::DoGiveHelp(const wxString& help) if ( !statbar ) return; - // 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() ) + wxString text; + if ( show ) { - 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(show); diff --git a/src/common/tbarbase.cpp b/src/common/tbarbase.cpp index 8a63d697a0..1e427b825f 100644 --- a/src/common/tbarbase.cpp +++ b/src/common/tbarbase.cpp @@ -628,7 +628,7 @@ void wxToolBarBase::OnMouseEnter(int id) event.SetInt(id); wxFrame *frame = wxDynamicCast(GetParent(), wxFrame); - if( frame ) + if ( frame ) { wxString help; if ( id != wxID_ANY ) @@ -638,9 +638,9 @@ void wxToolBarBase::OnMouseEnter(int id) help = tool->GetLongHelp(); } - // do it even if help string is empty to avoid showing the help for the - // previously selected tool when another one is selected - frame->DoGiveHelp(help); + // call DoGiveHelp() even if help string is empty to avoid showing the + // help for the previously selected tool when another one is selected + frame->DoGiveHelp(help, id != wxID_ANY); } (void)GetEventHandler()->ProcessEvent(event); diff --git a/src/msw/frame.cpp b/src/msw/frame.cpp index 300c0317ed..8f0ce449bc 100644 --- a/src/msw/frame.cpp +++ b/src/msw/frame.cpp @@ -1004,7 +1004,7 @@ bool wxFrame::HandleMenuSelect(WXWORD nItem, WXWORD flags, WXHMENU hMenu) // items opening popup menus (they don't have them anyhow) but do clear // the status line - otherwise, we would be left with the help message // for the previous item which doesn't apply any more - DoGiveHelp(wxEmptyString); + DoGiveHelp(wxEmptyString, true); return false; }