From c618c0b6202cce5efd5ba5eecb8cfa820ca760cf Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sat, 30 Jan 2016 21:33:38 +0100 Subject: [PATCH] Fix wxEVT_UPDATE_UI propagation for popup menus in MDI windows too This is similar to f74379c751255666cb5fc9b98639cceb252b5fee 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. --- samples/mdi/mdi.cpp | 9 +++++++++ samples/mdi/mdi.h | 5 +++++ src/msw/mdi.cpp | 5 ++--- 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/samples/mdi/mdi.cpp b/samples/mdi/mdi.cpp index 726bc8f18f..657ac0b338 100644 --- a/samples/mdi/mdi.cpp +++ b/samples/mdi/mdi.cpp @@ -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 diff --git a/samples/mdi/mdi.h b/samples/mdi/mdi.h index 6c86e2bdf7..e9887164e8 100644 --- a/samples/mdi/mdi.h +++ b/samples/mdi/mdi.h @@ -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 diff --git a/src/msw/mdi.cpp b/src/msw/mdi.cpp index 2588499bed..0793cd2ad1 100644 --- a/src/msw/mdi.cpp +++ b/src/msw/mdi.cpp @@ -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(); } } }