From 6d99eb3e379fc5cdb835f9a87f92b612ec58dd1c Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Tue, 3 Apr 2007 18:04:44 +0000 Subject: [PATCH 1/1] Undid last commit and restored bool argument to wxFrame::DoGiveHelp() as removing it could silently break existing user code overriding this function. Fix the problem with not restoring the original status bar text when the mouse pointer left the toolbar by simply calling DoGiveHelp() with false as second parameter only if there was no valid tool under mouse, not if the help string (for a valid tool) was empty. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@45240 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/frame.h | 5 ++-- src/common/framecmn.cpp | 60 ++++++++++++++++++++--------------------- src/common/tbarbase.cpp | 8 +++--- src/msw/frame.cpp | 2 +- 4 files changed, 38 insertions(+), 37 deletions(-) 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; } -- 2.45.2