Pass menu events to the handler in the associated menu bar.

We handled the menu events in the menu itself and the associated window, but
not in the menu bar that the menu belonged to. This was unexpected, so allow
handling the events in the menu bar itself too.

Closes #15095.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@73922 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2013-05-04 23:59:32 +00:00
parent 3bad8c3926
commit 4ed3f4abd8
3 changed files with 21 additions and 6 deletions

View File

@@ -654,6 +654,7 @@ All (GUI):
- Add wxTextEntryDialog::SetMaxLength() (derEine). - Add wxTextEntryDialog::SetMaxLength() (derEine).
- Fix maximum width support in wxGridCellTextEditor (derEine). - Fix maximum width support in wxGridCellTextEditor (derEine).
- Add more convenient wxFont(wxFontInfo) ctor. - Add more convenient wxFont(wxFontInfo) ctor.
- Pass menu events to the handler in the associated wxMenuBar.
wxGTK: wxGTK:

View File

@@ -644,6 +644,7 @@ bool wxMenuBase::SendEvent(int itemid, int checked)
event.SetInt(checked); event.SetInt(checked);
wxWindow* const win = GetWindow(); wxWindow* const win = GetWindow();
wxMenuBar* const mb = GetMenuBar();
// Try the menu's event handler first // Try the menu's event handler first
wxEvtHandler *handler = GetEventHandler(); wxEvtHandler *handler = GetEventHandler();
@@ -653,16 +654,21 @@ bool wxMenuBase::SendEvent(int itemid, int checked)
// event to another handler if it's not processed here to prevent it // event to another handler if it's not processed here to prevent it
// from passing the event to wxTheApp: this will be done below if we do // from passing the event to wxTheApp: this will be done below if we do
// have the associated window. // have the associated window.
if ( win ) if ( win || mb )
event.SetWillBeProcessedAgain(); event.SetWillBeProcessedAgain();
if ( handler->SafelyProcessEvent(event) ) if ( handler->SafelyProcessEvent(event) )
return true; return true;
} }
// Try the window the menu was popped up from or its menu bar belongs to // If this menu is part of the menu bar, process the event there: this will
if ( win && win->HandleWindowEvent(event) ) // also propagate it upwards to the window containing the menu bar.
return true; if ( mb )
return mb->HandleWindowEvent(event);
// Try the window the menu was popped up from.
if ( win )
return win->HandleWindowEvent(event);
// Not processed. // Not processed.
return false; return false;

View File

@@ -400,10 +400,18 @@ void EventPropagationTestCase::MenuEvent()
CheckMenuEvent( menu, "aomA" ); CheckMenuEvent( menu, "aomA" );
// Test that the event handler associated with the menu bar gets the event.
TestMenuEvtHandler hb('b'); // 'b' for "menu Bar"
mb->PushEventHandler(&hb);
wxON_BLOCK_EXIT_OBJ1( *mb, wxWindow::PopEventHandler, false );
CheckMenuEvent( menu, "aomobA" );
// Also test that the window to which the menu belongs gets the event. // Also test that the window to which the menu belongs gets the event.
TestMenuEvtHandler hw('w'); // 'w' for "Window" TestMenuEvtHandler hw('w'); // 'w' for "Window"
frame->PushEventHandler(&hw); frame->PushEventHandler(&hw);
wxON_BLOCK_EXIT_OBJ1( *frame, wxWindow::PopEventHandler, false ); wxON_BLOCK_EXIT_OBJ1( *frame, wxWindow::PopEventHandler, false );
CheckMenuEvent( menu, "aomowA" ); CheckMenuEvent( menu, "aomobowA" );
} }