diff --git a/include/wx/osx/menu.h b/include/wx/osx/menu.h index f503a86011..009efb04a4 100644 --- a/include/wx/osx/menu.h +++ b/include/wx/osx/menu.h @@ -44,8 +44,8 @@ public: // implementation only from now on // ------------------------------- - bool HandleCommandUpdateStatus( wxMenuItem* menuItem, wxWindow* senderWindow = NULL); - bool HandleCommandProcess( wxMenuItem* menuItem, wxWindow* senderWindow = NULL); + bool HandleCommandUpdateStatus( wxMenuItem* menuItem ); + bool HandleCommandProcess( wxMenuItem* menuItem ); void HandleMenuItemHighlighted( wxMenuItem* menuItem ); void HandleMenuOpened(); void HandleMenuClosed(); diff --git a/include/wx/osx/srchctrl.h b/include/wx/osx/srchctrl.h index 1fdc12cd4a..62cea42955 100644 --- a/include/wx/osx/srchctrl.h +++ b/include/wx/osx/srchctrl.h @@ -62,6 +62,10 @@ public: wxSearchWidgetImpl * GetSearchPeer() const; +#if wxUSE_MENUS + virtual void OSXAfterMenuEvent() wxOVERRIDE; +#endif // wxUSE_MENUS + protected: wxSize DoGetBestSize() const wxOVERRIDE; diff --git a/include/wx/osx/window.h b/include/wx/osx/window.h index c19e5d1b9f..4e8cdf60e5 100644 --- a/include/wx/osx/window.h +++ b/include/wx/osx/window.h @@ -299,6 +299,11 @@ public: // Return the DPI corresponding to the given scale factor. static wxSize OSXMakeDPIFromScaleFactor(double scaleFactor); +#if wxUSE_MENUS + // Called on the invoking window after handling the menu event. + virtual void OSXAfterMenuEvent() { } +#endif // wxUSE_MENUS + protected: // For controls like radio buttons which are genuinely composite wxList m_subControls; diff --git a/samples/widgets/searchctrl.cpp b/samples/widgets/searchctrl.cpp index 567f5c5563..1e8d3683d3 100644 --- a/samples/widgets/searchctrl.cpp +++ b/samples/widgets/searchctrl.cpp @@ -53,7 +53,8 @@ enum ID_CANCEL_CB, ID_MENU_CB, - ID_SEARCHMENU + ID_SEARCHMENU, + ID_SEARCHMENU_LAST = ID_SEARCHMENU + 5 }; @@ -82,6 +83,8 @@ protected: void OnText(wxCommandEvent& event); void OnTextEnter(wxCommandEvent& event); + void OnSearchMenu(wxCommandEvent& event); + void OnSearch(wxCommandEvent& event); void OnSearchCancel(wxCommandEvent& event); @@ -113,6 +116,9 @@ wxBEGIN_EVENT_TABLE(SearchCtrlWidgetsPage, WidgetsPage) EVT_TEXT(wxID_ANY, SearchCtrlWidgetsPage::OnText) EVT_TEXT_ENTER(wxID_ANY, SearchCtrlWidgetsPage::OnTextEnter) + EVT_MENU_RANGE(ID_SEARCHMENU, ID_SEARCHMENU_LAST, + SearchCtrlWidgetsPage::OnSearchMenu) + EVT_SEARCH(wxID_ANY, SearchCtrlWidgetsPage::OnSearch) EVT_SEARCH_CANCEL(wxID_ANY, SearchCtrlWidgetsPage::OnSearchCancel) wxEND_EVENT_TABLE() @@ -187,14 +193,13 @@ void SearchCtrlWidgetsPage::RecreateWidget() wxMenu* SearchCtrlWidgetsPage::CreateTestMenu() { wxMenu* menu = new wxMenu; - const int SEARCH_MENU_SIZE = 5; wxMenuItem* menuItem = menu->Append(wxID_ANY, "Recent Searches", "", wxITEM_NORMAL); menuItem->Enable(false); - for ( int i = 0; i < SEARCH_MENU_SIZE; i++ ) + for ( int i = 0; i < ID_SEARCHMENU_LAST - ID_SEARCHMENU; i++ ) { wxString itemText = wxString::Format("item %i",i); wxString tipText = wxString::Format("tip %i",i); - menu->Append(ID_SEARCHMENU+i, itemText, tipText, wxITEM_NORMAL); + menu->Append(ID_SEARCHMENU+i, itemText, tipText, wxITEM_CHECK); } return menu; } @@ -235,6 +240,13 @@ void SearchCtrlWidgetsPage::OnTextEnter(wxCommandEvent& event) event.GetString()); } +void SearchCtrlWidgetsPage::OnSearchMenu(wxCommandEvent& event) +{ + int id = event.GetId() - ID_SEARCHMENU; + wxLogMessage("Search menu: \"item %i\" selected (%s).", + id, event.IsChecked() ? "checked" : "unchecked"); +} + void SearchCtrlWidgetsPage::OnSearch(wxCommandEvent& event) { wxLogMessage("Search button: search for \"%s\".", event.GetString()); diff --git a/src/osx/menu_osx.cpp b/src/osx/menu_osx.cpp index df85dc2c89..e70899b881 100644 --- a/src/osx/menu_osx.cpp +++ b/src/osx/menu_osx.cpp @@ -318,7 +318,7 @@ void wxMenu::DoRearrange() } -bool wxMenu::HandleCommandUpdateStatus( wxMenuItem* item, wxWindow* senderWindow ) +bool wxMenu::HandleCommandUpdateStatus( wxMenuItem* item ) { int menuid = item ? item->GetId() : 0; wxUpdateUIEvent event(menuid); @@ -329,11 +329,6 @@ bool wxMenu::HandleCommandUpdateStatus( wxMenuItem* item, wxWindow* senderWindow bool processed = DoProcessEvent(this, event, GetWindow()); - if ( !processed && senderWindow != NULL) - { - processed = senderWindow->HandleWindowEvent(event); - } - if ( processed ) { // if anything changed, update the changed attribute @@ -348,7 +343,7 @@ bool wxMenu::HandleCommandUpdateStatus( wxMenuItem* item, wxWindow* senderWindow return processed; } -bool wxMenu::HandleCommandProcess( wxMenuItem* item, wxWindow* senderWindow ) +bool wxMenu::HandleCommandProcess( wxMenuItem* item ) { int menuid = item ? item->GetId() : 0; bool processed = false; @@ -357,24 +352,18 @@ bool wxMenu::HandleCommandProcess( wxMenuItem* item, wxWindow* senderWindow ) if ( SendEvent( menuid , item->IsCheckable() ? item->IsChecked() : -1 ) ) processed = true ; - else - { - if ( senderWindow != NULL ) - { - wxCommandEvent event(wxEVT_MENU , menuid); - event.SetEventObject(this); - event.SetInt(item->IsCheckable() ? item->IsChecked() : -1); - - if ( senderWindow->HandleWindowEvent(event) ) - processed = true ; - } - } if(!processed && item) { processed = item->GetPeer()->DoDefault(); } + if (wxWindow* const w = GetInvokingWindow()) + { + // Let the invoking window update itself if necessary. + w->OSXAfterMenuEvent(); + } + return processed; } diff --git a/src/osx/srchctrl_osx.cpp b/src/osx/srchctrl_osx.cpp index 9b48e7c0e7..0fb0c0e5fc 100644 --- a/src/osx/srchctrl_osx.cpp +++ b/src/osx/srchctrl_osx.cpp @@ -119,6 +119,14 @@ wxMenu* wxSearchCtrl::GetMenu() return m_menu; } +void wxSearchCtrl::OSXAfterMenuEvent() +{ + // The menu is used as a template for creating the actual menu shown by the + // control, so update this template with the latest menu state after a menu + // command as the state of check/radio items could have changed after it. + GetSearchPeer()->SetSearchMenu( m_menu ); +} + #endif // wxUSE_MENUS void wxSearchCtrl::ShowSearchButton( bool show )