Fix wxEVT_UPDATE_UI propagation for popup menus in MDI windows too

This is similar to f74379c751 but specific to
wxMSW MDI code: also call wxMenu::UpdateUI() without any parameters from it
instead of overriding its logic for determining where to send the events.

Add code to the mdi sample demonstrating that the event handlers in the window
itself and its MDI frame parent get the events they're supposed to get.

See #17352.
This commit is contained in:
Vadim Zeitlin
2016-01-30 21:33:38 +01:00
parent e89fc9c152
commit c618c0b620
3 changed files with 16 additions and 3 deletions

View File

@@ -112,10 +112,14 @@ wxBEGIN_EVENT_TABLE(MyCanvas, wxScrolledWindow)
EVT_MENU_HIGHLIGHT(wxID_ABOUT, MyCanvas::OnMenuHighlight)
EVT_MENU_HIGHLIGHT(MDI_REFRESH, MyCanvas::OnMenuHighlight)
EVT_MENU_CLOSE(MyCanvas::OnMenuClose)
EVT_UPDATE_UI(MDI_DISABLED_FROM_CANVAS, MyCanvas::OnUpdateUIDisable)
wxEND_EVENT_TABLE()
wxBEGIN_EVENT_TABLE(MyChild::EventHandler, wxEvtHandler)
EVT_MENU(MDI_REFRESH, MyChild::EventHandler::OnRefresh)
EVT_UPDATE_UI(MDI_DISABLED_FROM_CHILD, MyChild::OnUpdateUIDisable)
wxEND_EVENT_TABLE()
// ===========================================================================
@@ -436,6 +440,8 @@ void MyCanvas::OnMenu(wxContextMenuEvent& event)
{
wxMenu menu;
menu.Append(MDI_REFRESH, "&Refresh picture");
menu.Append(MDI_DISABLED_FROM_CANVAS, "Item disabled by canvas");
menu.Append(MDI_DISABLED_FROM_CHILD, "Item disabled by child");
PopupMenu(&menu, ScreenToClient(event.GetPosition()));
}
@@ -478,6 +484,9 @@ MyChild::MyChild(wxMDIParentFrame *parent)
menuChild->Append(MDI_CHANGE_SIZE, "Resize frame\tCtrl-S");
}
#if wxUSE_CLIPBOARD
menuChild->AppendSeparator();
menuChild->Append(MDI_DISABLED_FROM_CANVAS, "Item not disabled by canvas");
menuChild->Append(MDI_DISABLED_FROM_CHILD, "Item disabled by child");
menuChild->AppendSeparator();
menuChild->Append(wxID_PASTE, "Copy text from clipboard\tCtrl-V");
#endif // wxUSE_CLIPBOARD

View File

@@ -73,6 +73,8 @@ private:
void OnMenuHighlight(wxMenuEvent& event) { LogMenuHighlight(event); }
void OnMenuClose(wxMenuEvent& event) { LogMenuOpenClose(event, "closed"); }
void OnUpdateUIDisable(wxUpdateUIEvent& event) { event.Enable(false); }
void OnMenu(wxContextMenuEvent& event);
void OnEvent(wxMouseEvent& event);
@@ -137,6 +139,7 @@ private:
void OnMenuOpen(wxMenuEvent& event) { LogMenuOpenClose(event, "opened"); }
void OnMenuHighlight(wxMenuEvent& event) { LogMenuHighlight(event); }
void OnMenuClose(wxMenuEvent& event) { LogMenuOpenClose(event, "closed"); }
void OnUpdateUIDisable(wxUpdateUIEvent& event) { event.Enable(false); }
void OnCloseWindow(wxCloseEvent& event);
#if wxUSE_CLIPBOARD
@@ -176,6 +179,8 @@ enum
{
MDI_FULLSCREEN = 100,
MDI_REFRESH,
MDI_DISABLED_FROM_CANVAS,
MDI_DISABLED_FROM_CHILD,
MDI_CHANGE_TITLE,
MDI_CHANGE_POSITION,
MDI_CHANGE_SIZE

View File

@@ -410,12 +410,11 @@ void wxMDIParentFrame::DoMenuUpdates(wxMenu* menu)
wxMDIChildFrame *child = GetActiveChild();
if ( child )
{
wxEvtHandler* source = child->GetEventHandler();
wxMenuBar* bar = child->GetMenuBar();
if (menu)
{
menu->UpdateUI(source);
menu->UpdateUI();
}
else
{
@@ -423,7 +422,7 @@ void wxMDIParentFrame::DoMenuUpdates(wxMenu* menu)
{
int nCount = bar->GetMenuCount();
for (int n = 0; n < nCount; n++)
bar->GetMenu(n)->UpdateUI(source);
bar->GetMenu(n)->UpdateUI();
}
}
}