restore status bar text after a menu has been shown

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@24120 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2003-10-07 22:55:06 +00:00
parent e1a098d1ec
commit 96ac065f9e
2 changed files with 88 additions and 24 deletions

View File

@@ -81,11 +81,6 @@ public:
virtual wxMenuBar *GetMenuBar() const { return m_frameMenuBar; } virtual wxMenuBar *GetMenuBar() const { return m_frameMenuBar; }
#endif // wxUSE_MENUS #endif // wxUSE_MENUS
#ifdef WXWIN_COMPATIBILITY_2_2
// call this to simulate a menu command
bool Command(int winid) { return ProcessCommand(winid); }
#endif // WXWIN_COMPATIBILITY_2_2
// process menu command: returns TRUE if processed // process menu command: returns TRUE if processed
bool ProcessCommand(int winid); bool ProcessCommand(int winid);
@@ -142,10 +137,13 @@ public:
// ------------------------------- // -------------------------------
// event handlers // event handlers
void OnMenuOpen(wxMenuEvent& event);
void OnMenuHighlight(wxMenuEvent& event);
#if wxUSE_MENUS #if wxUSE_MENUS
#if wxUSE_STATUSBAR
void OnMenuOpen(wxMenuEvent& event);
void OnMenuClose(wxMenuEvent& event);
void OnMenuHighlight(wxMenuEvent& event);
#endif // wxUSE_STATUSBAR
// send wxUpdateUIEvents for all menu items in the menubar, // send wxUpdateUIEvents for all menu items in the menubar,
// or just for menu if non-NULL // or just for menu if non-NULL
void DoMenuUpdates(wxMenu* menu = NULL); void DoMenuUpdates(wxMenu* menu = NULL);
@@ -172,6 +170,11 @@ public:
// if you are hiding the help, TRUE otherwise // if you are hiding the help, TRUE otherwise
virtual void DoGiveHelp(const wxString& text, bool show); virtual void DoGiveHelp(const wxString& text, bool show);
#ifdef WXWIN_COMPATIBILITY_2_2
// call this to simulate a menu command
bool Command(int winid) { return ProcessCommand(winid); }
#endif // WXWIN_COMPATIBILITY_2_2
protected: protected:
// the frame main menu/status/tool bars // the frame main menu/status/tool bars
// ------------------------------------ // ------------------------------------
@@ -196,6 +199,11 @@ protected:
virtual void AttachMenuBar(wxMenuBar *menubar); virtual void AttachMenuBar(wxMenuBar *menubar);
wxMenuBar *m_frameMenuBar; wxMenuBar *m_frameMenuBar;
#if wxUSE_STATUSBAR
// the saved status bar text overwritten by DoGiveHelp()
wxString m_oldStatusText;
#endif // wxUSE_STATUSBAR
#endif // wxUSE_MENUS #endif // wxUSE_MENUS
#if wxUSE_STATUSBAR #if wxUSE_STATUSBAR
@@ -221,7 +229,10 @@ protected:
wxToolBar *m_frameToolBar; wxToolBar *m_frameToolBar;
#endif // wxUSE_TOOLBAR #endif // wxUSE_TOOLBAR
#if wxUSE_MENUS && wxUSE_STATUSBAR
DECLARE_EVENT_TABLE() DECLARE_EVENT_TABLE()
#endif // wxUSE_MENUS && wxUSE_STATUSBAR
DECLARE_NO_COPY_CLASS(wxFrameBase) DECLARE_NO_COPY_CLASS(wxFrameBase)
}; };

View File

@@ -45,13 +45,17 @@
// event table // event table
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
#if wxUSE_MENUS && wxUSE_STATUSBAR
BEGIN_EVENT_TABLE(wxFrameBase, wxTopLevelWindow) BEGIN_EVENT_TABLE(wxFrameBase, wxTopLevelWindow)
#if wxUSE_MENUS && !wxUSE_IDLEMENUUPDATES
EVT_MENU_OPEN(wxFrameBase::OnMenuOpen) EVT_MENU_OPEN(wxFrameBase::OnMenuOpen)
#endif EVT_MENU_CLOSE(wxFrameBase::OnMenuClose)
EVT_MENU_HIGHLIGHT_ALL(wxFrameBase::OnMenuHighlight) EVT_MENU_HIGHLIGHT_ALL(wxFrameBase::OnMenuHighlight)
END_EVENT_TABLE() END_EVENT_TABLE()
#endif // wxUSE_MENUS && wxUSE_STATUSBAR
// ============================================================================ // ============================================================================
// implementation // implementation
// ============================================================================ // ============================================================================
@@ -233,13 +237,15 @@ void wxFrameBase::UpdateWindowUI(long flags)
else else
DoMenuUpdates(); DoMenuUpdates();
} }
#endif #endif // wxUSE_MENUS
} }
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// event handlers // event handlers for status bar updates from menus
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
#if wxUSE_MENUS && wxUSE_STATUSBAR
void wxFrameBase::OnMenuHighlight(wxMenuEvent& event) void wxFrameBase::OnMenuHighlight(wxMenuEvent& event)
{ {
#if wxUSE_STATUSBAR #if wxUSE_STATUSBAR
@@ -247,6 +253,31 @@ void wxFrameBase::OnMenuHighlight(wxMenuEvent& event)
#endif // wxUSE_STATUSBAR #endif // wxUSE_STATUSBAR
} }
void wxFrameBase::OnMenuOpen(wxMenuEvent& event)
{
#if !wxUSE_IDLEMENUUPDATES
DoMenuUpdates(event.GetMenu());
#endif // !wxUSE_IDLEMENUUPDATES
}
void wxFrameBase::OnMenuClose(wxMenuEvent& WXUNUSED(event))
{
// do we have real status text to restore?
if ( m_oldStatusText.length() > 1 || m_oldStatusText[0u] )
{
if ( m_statusBarPane >= 0 )
{
wxStatusBar *statbar = GetStatusBar();
if ( statbar )
statbar->SetStatusText(m_oldStatusText, m_statusBarPane);
}
m_oldStatusText.clear();
}
}
#endif // wxUSE_MENUS && wxUSE_STATUSBAR
// Implement internal behaviour (menu updating on some platforms) // Implement internal behaviour (menu updating on some platforms)
void wxFrameBase::OnInternalIdle() void wxFrameBase::OnInternalIdle()
{ {
@@ -258,13 +289,6 @@ void wxFrameBase::OnInternalIdle()
#endif #endif
} }
void wxFrameBase::OnMenuOpen(wxMenuEvent& event)
{
#if wxUSE_MENUS && !wxUSE_IDLEMENUUPDATES
DoMenuUpdates(event.GetMenu());
#endif
}
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// status bar stuff // status bar stuff
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
@@ -363,12 +387,41 @@ bool wxFrameBase::ShowMenuHelp(wxStatusBar *WXUNUSED(statbar), int menuId)
void wxFrameBase::DoGiveHelp(const wxString& text, bool show) void wxFrameBase::DoGiveHelp(const wxString& text, bool show)
{ {
#if wxUSE_STATUSBAR #if wxUSE_STATUSBAR
if ( m_statusBarPane < 0 ) return; if ( m_statusBarPane < 0 )
wxStatusBar* statbar = GetStatusBar(); {
if ( !statbar ) return; // status bar messages disabled
return;
}
wxString help = show ? text : wxString(); wxStatusBar *statbar = GetStatusBar();
statbar->SetStatusText( help, m_statusBarPane ); if ( !statbar )
return;
wxString help;
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);
if ( m_oldStatusText.empty() )
{
// use special value to prevent us from doing this the next time
m_oldStatusText += _T('\0');
}
}
statbar->SetStatusText(help, m_statusBarPane);
#endif // wxUSE_STATUSBAR #endif // wxUSE_STATUSBAR
} }