From 1ac76609146a74466b88e53b551e9ea01c5c8801 Mon Sep 17 00:00:00 2001
From: Vadim Zeitlin <vadim@wxwidgets.org>
Date: Mon, 23 Jan 2006 16:38:07 +0000
Subject: [PATCH] extracted wxFrame::MSWTranslateMessage() implementation into
 new MSWDoTranslateMessage so that it can be reused by wxMDIChildFrame; this
 allows to pass the correct window to ::TranslateAccelerator() and fix UI
 updating of the MDI child menu items (bug 1214439)

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@37081 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
---
 include/wx/msw/frame.h | 17 +++++++++++++----
 src/msw/frame.cpp      |  4 ++--
 src/msw/mdi.cpp        |  4 +++-
 3 files changed, 18 insertions(+), 7 deletions(-)

diff --git a/include/wx/msw/frame.h b/include/wx/msw/frame.h
index 10c17972d5..077e109202 100644
--- a/include/wx/msw/frame.h
+++ b/include/wx/msw/frame.h
@@ -122,13 +122,22 @@ protected:
     // propagate our state change to all child frames
     void IconizeChildFrames(bool bIconize);
 
-    // we add menu bar accel processing
-    bool MSWTranslateMessage(WXMSG* pMsg);
+    // override base class version to add menu bar accel processing
+    virtual bool MSWTranslateMessage(WXMSG *msg)
+    {
+        return MSWDoTranslateMessage(this, msg);
+    }
+
+    // the real implementation of MSWTranslateMessage(), also used by
+    // wxMDIChildFrame
+    bool MSWDoTranslateMessage(wxFrame *frame, WXMSG *msg);
 
     // window proc for the frames
-    WXLRESULT MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam);
+    virtual WXLRESULT MSWWindowProc(WXUINT message,
+                                    WXWPARAM wParam,
+                                    WXLPARAM lParam);
 
-    // handle WM_INITMENUPOPUP message
+    // handle WM_INITMENUPOPUP message to generate wxEVT_MENU_OPEN
     bool HandleInitMenuPopup(WXHMENU hMenu);
 
     virtual bool IsMDIChild() const { return false; }
diff --git a/src/msw/frame.cpp b/src/msw/frame.cpp
index b9c2e1c30d..4afd604737 100644
--- a/src/msw/frame.cpp
+++ b/src/msw/frame.cpp
@@ -726,7 +726,7 @@ WXHICON wxFrame::GetDefaultIcon() const
 // preprocessing
 // ---------------------------------------------------------------------------
 
-bool wxFrame::MSWTranslateMessage(WXMSG* pMsg)
+bool wxFrame::MSWDoTranslateMessage(wxFrame *frame, WXMSG *pMsg)
 {
     if ( wxWindow::MSWTranslateMessage(pMsg) )
         return true;
@@ -737,7 +737,7 @@ bool wxFrame::MSWTranslateMessage(WXMSG* pMsg)
     if ( menuBar )
     {
         const wxAcceleratorTable& acceleratorTable = menuBar->GetAccelTable();
-        return acceleratorTable.Translate(this, pMsg);
+        return acceleratorTable.Translate(frame, pMsg);
     }
 #endif // wxUSE_MENUS && wxUSE_ACCEL
 
diff --git a/src/msw/mdi.cpp b/src/msw/mdi.cpp
index bcb1467df6..c61e986fa4 100644
--- a/src/msw/mdi.cpp
+++ b/src/msw/mdi.cpp
@@ -1165,7 +1165,9 @@ WXLRESULT wxMDIChildFrame::MSWDefWindowProc(WXUINT message, WXWPARAM wParam, WXL
 
 bool wxMDIChildFrame::MSWTranslateMessage(WXMSG* msg)
 {
-    return wxFrame::MSWTranslateMessage(msg);
+    // we must pass the parent frame to ::TranslateAccelerator(), otherwise it
+    // doesn't do its job correctly for MDI child menus
+    return MSWDoTranslateMessage((wxMDIChildFrame *)GetParent(), msg);
 }
 
 // ---------------------------------------------------------------------------
-- 
2.47.2