]> git.saurik.com Git - wxWidgets.git/commitdiff
Fix HMENU to wxMenu translation in wxMSW code.
authorVadim Zeitlin <vadim@wxwidgets.org>
Thu, 31 Mar 2011 09:28:38 +0000 (09:28 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Thu, 31 Mar 2011 09:28:38 +0000 (09:28 +0000)
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

docs/changes.txt
include/wx/msw/menu.h
src/msw/frame.cpp
src/msw/menu.cpp

index b1aac62be28ab3a2a3385db9ea3b07cc27e30100..3d187934912074e83e2628c07c1b44d7b5800113 100644 (file)
@@ -516,6 +516,7 @@ MSW:
 - 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:
 
index 84c36316208bfd3a6a6662b1d061f97ceca79c9d..d80e85cca199ec093f25bb51f3ff6d478404dc58 100644 (file)
@@ -102,6 +102,9 @@ public:
         m_maxAccelWidth = -1;
     }
 
+    // get the menu with given handle (recursively)
+    wxMenu* MSWGetMenu(WXHMENU hMenu);
+
 private:
     void CalculateMaxAccelWidth();
 
@@ -208,6 +211,9 @@ public:
     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();
index c1c96bb1cebe37bda4113bd13f61ee023db7d4d2..25cfa7eb306368f375eb1a4694ca6220a68aa58e 100644 (file)
@@ -864,15 +864,7 @@ bool wxFrame::HandleInitMenuPopup(WXHMENU hMenu)
     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);
index afb0df14e95fdb445dfa8e5e84e75fa6b161f69f..4769e1b00b9a57002c063b4cc14b4746a786821c 100644 (file)
@@ -885,6 +885,30 @@ bool wxMenu::MSWCommand(WXUINT WXUNUSED(param), WXWORD id_)
     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
 // ---------------------------------------------------------------------------
@@ -1467,4 +1491,22 @@ void wxMenuBar::Detach()
     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