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
This commit is contained in:
Vadim Zeitlin 2007-04-03 18:04:44 +00:00
parent 05492dd1eb
commit 6d99eb3e37
4 changed files with 38 additions and 37 deletions

View File

@ -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:

View File

@ -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);

View File

@ -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);

View File

@ -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;
}