We didn't find the menus corresponding to the submenu handles. This resulted
in incorrect processing of EVT_UPDATE_UI events for the submenus and probably
other problems.
Fix this by searching for the HMENU recursively in all menus.
Closes #13080.
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@67355
c3d73ce0-8a6f-49c7-b76d-
6d57e0e08775
- Fix wxBitmapButton best size determination broken in 2.9.1.
- Center task dialog-based wxProgressDialog on the parent (John Roberts).
- wxAutomationObject::GetInstance() creates objects on demand (Kolya Kosenko).
+- Fix EVT_UPDATE_UI generation for items in submenus (wsu).
OSX:
m_maxAccelWidth = -1;
}
+ // get the menu with given handle (recursively)
+ wxMenu* MSWGetMenu(WXHMENU hMenu);
+
private:
void CalculateMaxAccelWidth();
void Refresh( bool eraseBackground,
const wxRect *rect = (const wxRect *) NULL ) { wxWindow::Refresh(eraseBackground, rect); }
+ // get the menu with given handle (recursively)
+ wxMenu* MSWGetMenu(WXHMENU hMenu);
+
protected:
// common part of all ctors
void Init();
wxMenu* menu = NULL;
if (GetMenuBar())
{
- int nCount = GetMenuBar()->GetMenuCount();
- for (int n = 0; n < nCount; n++)
- {
- if (GetMenuBar()->GetMenu(n)->GetHMenu() == hMenu)
- {
- menu = GetMenuBar()->GetMenu(n);
- break;
- }
- }
+ menu = GetMenuBar()->MSWGetMenu(hMenu);
}
wxMenuEvent event(wxEVT_MENU_OPEN, 0, menu);
return true;
}
+// get the menu with given handle (recursively)
+wxMenu* wxMenu::MSWGetMenu(WXHMENU hMenu)
+{
+ // check self
+ if ( GetHMenu() == hMenu )
+ return this;
+
+ // recursively query submenus
+ for ( size_t n = 0 ; n < GetMenuItemCount(); ++n )
+ {
+ wxMenuItem* item = FindItemByPosition(n);
+ wxMenu* submenu = item->GetSubMenu();
+ if ( submenu )
+ {
+ submenu = submenu->MSWGetMenu(hMenu);
+ if (submenu)
+ return submenu;
+ }
+ }
+
+ // unknown hMenu
+ return NULL;
+}
+
// ---------------------------------------------------------------------------
// Menu Bar
// ---------------------------------------------------------------------------
wxMenuBarBase::Detach();
}
+// get the menu with given handle (recursively)
+wxMenu* wxMenuBar::MSWGetMenu(WXHMENU hMenu)
+{
+ wxCHECK_MSG( GetHMenu() != hMenu, NULL,
+ wxT("wxMenuBar::MSWGetMenu(): menu handle is wxMenuBar, not wxMenu") );
+
+ // query all menus
+ for ( size_t n = 0 ; n < GetMenuCount(); ++n )
+ {
+ wxMenu* menu = GetMenu(n)->MSWGetMenu(hMenu);
+ if ( menu )
+ return menu;
+ }
+
+ // unknown hMenu
+ return NULL;
+}
+
#endif // wxUSE_MENUS