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
#if wxUSE_MENUS || wxUSE_TOOLBAR
// show help text for the currently selected menu or toolbar item
#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);
void wxFrameBase::OnMenuClose(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
}
#endif // wxUSE_MENUS && wxUSE_STATUSBAR
- DoGiveHelp(helpString);
+ DoGiveHelp(helpString, true);
return !helpString.empty();
#else // !wxUSE_MENUS
return !helpString.empty();
#else // !wxUSE_MENUS
#endif // wxUSE_STATUSBAR
#if wxUSE_MENUS || wxUSE_TOOLBAR
#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 )
{
#if wxUSE_STATUSBAR
if ( m_statusBarPane < 0 )
- // 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() )
{
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);
#else
wxUnusedVar(text);
wxUnusedVar(show);
event.SetInt(id);
wxFrame *frame = wxDynamicCast(GetParent(), wxFrame);
event.SetInt(id);
wxFrame *frame = wxDynamicCast(GetParent(), wxFrame);
{
wxString help;
if ( id != wxID_ANY )
{
wxString help;
if ( id != wxID_ANY )
help = tool->GetLongHelp();
}
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);
}
(void)GetEventHandler()->ProcessEvent(event);
// 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
// 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);