]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/mdi.cpp
implement deprecated wxStripExtension() in terms of new wxFileName::StripExtension...
[wxWidgets.git] / src / msw / mdi.cpp
index af398a3de6ce0e1e2652c855ee4861af3ed25635..1e9255d92d7cb72ecc33e4351d537d2be0aa37ad 100644 (file)
@@ -406,14 +406,17 @@ void wxMDIParentFrame::DoMenuUpdates(wxMenu* menu)
     }
 }
 
-const wxMenuItem *wxMDIParentFrame::FindItemInMenuBar(int menuId) const
+wxMenuItem *wxMDIParentFrame::FindItemInMenuBar(int menuId) const
 {
-    const wxMenuItem *item = wxFrame::FindItemInMenuBar(menuId);
+    wxMenuItem *item = wxFrame::FindItemInMenuBar(menuId);
     if ( !item && GetActiveChild() )
     {
         item = GetActiveChild()->FindItemInMenuBar(menuId);
     }
 
+    if ( !item && m_windowMenu )
+        item = m_windowMenu->FindItem(menuId);
+
     return item;
 }
 
@@ -519,8 +522,8 @@ void wxMDIParentFrame::ActivatePrevious()
 // ---------------------------------------------------------------------------
 
 WXLRESULT wxMDIParentFrame::MSWWindowProc(WXUINT message,
-                                     WXWPARAM wParam,
-                                     WXLPARAM lParam)
+                                          WXWPARAM wParam,
+                                          WXLPARAM lParam)
 {
     WXLRESULT rc = 0;
     bool processed = false;
@@ -538,22 +541,22 @@ WXLRESULT wxMDIParentFrame::MSWWindowProc(WXUINT message,
             break;
 
         case WM_COMMAND:
+            // system messages such as SC_CLOSE are sent as WM_COMMANDs to the
+            // parent MDI frame and we must let the DefFrameProc() have them
+            // for these commands to work (without it, closing the maximized
+            // MDI children doesn't work, for example)
             {
                 WXWORD id, cmd;
                 WXHWND hwnd;
                 UnpackCommand(wParam, lParam, &id, &hwnd, &cmd);
 
-                (void)HandleCommand(id, cmd, hwnd);
-
-                // even if the frame didn't process it, there is no need to try it
-                // once again (i.e. call wxFrame::HandleCommand()) - we just did it,
-                // so pretend we processed the message anyhow
-                processed = true;
+                if ( cmd == 0 /* menu */ &&
+                        id >= SC_SIZE /* first system menu command */ )
+                {
+                    MSWDefWindowProc(message, wParam, lParam);
+                    processed = true;
+                }
             }
-
-            // always pass this message DefFrameProc(), otherwise MDI menu
-            // commands (and sys commands - more surprisingly!) won't work
-            MSWDefWindowProc(message, wParam, lParam);
             break;
 
         case WM_CREATE:
@@ -577,8 +580,9 @@ WXLRESULT wxMDIParentFrame::MSWWindowProc(WXUINT message,
             break;
 
         case WM_SIZE:
-            // though we don't (usually) resize the MDI client to exactly fit the
-            // client area we need to pass this one to DefFrameProc to allow the children to show
+            // though we don't (usually) resize the MDI client to exactly fit
+            // the client area we need to pass this one to DefFrameProc to
+            // allow the children to show
             break;
     }
 
@@ -683,24 +687,20 @@ void wxMDIParentFrame::OnMDICommand(wxCommandEvent& event)
     ::SendMessage(GetWinHwnd(GetClientWindow()), msg, wParam, lParam);
 }
 
-wxMenuItem *wxMDIParentFrame::MSWFindMenuBarItem(WXWORD id)
-{
-    wxMenuItem *mitem = wxFrame::MSWFindMenuBarItem(id);
-    if ( !mitem && m_windowMenu )
-        mitem = m_windowMenu->FindItem((signed short)id);
-
-    return mitem;
-}
-
 #endif // wxUSE_MENUS
 
-bool wxMDIParentFrame::HandleCommand(WXWORD id, WXWORD cmd, WXHWND hwnd)
+bool wxMDIParentFrame::TryBefore(wxEvent& event)
 {
-    wxMDIChildFrame * const child = GetActiveChild();
-    if ( child && child->HandleCommand(id, cmd, hwnd) )
-        return true;
+    // menu (and toolbar) events should be sent to the active child frame
+    // first, if any
+    if ( event.GetEventType() == wxEVT_COMMAND_MENU_SELECTED )
+    {
+        wxMDIChildFrame * const child = GetActiveChild();
+        if ( child && child->ProcessEventHere(event) )
+            return true;
+    }
 
-    return wxFrame::HandleCommand(id, cmd, hwnd);
+    return wxMDIParentFrameBase::TryBefore(event);
 }
 
 WXLRESULT wxMDIParentFrame::MSWDefWindowProc(WXUINT message,
@@ -738,7 +738,7 @@ bool wxMDIParentFrame::MSWTranslateMessage(WXMSG* msg)
     // but it doesn't check for the (custom) accelerators of the window menu
     // items as it's not part of the menu bar as it's handled by Windows itself
     // so we need to do this explicitly
-    if ( m_accelWindowMenu->Translate(this, msg) )
+    if ( m_accelWindowMenu && m_accelWindowMenu->Translate(this, msg) )
         return true;
 #endif // wxUSE_MENUS && wxUSE_ACCEL
 
@@ -1040,8 +1040,8 @@ void wxMDIChildFrame::Activate()
 // ---------------------------------------------------------------------------
 
 WXLRESULT wxMDIChildFrame::MSWWindowProc(WXUINT message,
-                                    WXWPARAM wParam,
-                                    WXLPARAM lParam)
+                                         WXWPARAM wParam,
+                                         WXLPARAM lParam)
 {
     WXLRESULT rc = 0;
     bool processed = false;
@@ -1074,11 +1074,6 @@ WXLRESULT wxMDIChildFrame::MSWWindowProc(WXUINT message,
             MSWDefWindowProc(message, wParam, lParam);
             break;
 
-        case WM_SYSCOMMAND:
-            // DefMDIChildProc handles SC_{NEXT/PREV}WINDOW here, so pass it
-            // the message (the base class version does not)
-            return MSWDefWindowProc(message, wParam, lParam);
-
         case WM_WINDOWPOSCHANGING:
             processed = HandleWindowPosChanging((LPWINDOWPOS)lParam);
             break;
@@ -1429,11 +1424,9 @@ void MDISetMenu(wxWindow *win, HMENU hmenuFrame, HMENU hmenuWindow)
                             (WPARAM)hmenuFrame,
                             (LPARAM)hmenuWindow) )
         {
-#ifdef __WXDEBUG__
             DWORD err = ::GetLastError();
             if ( err )
                 wxLogApiError(_T("SendMessage(WM_MDISETMENU)"), err);
-#endif // __WXDEBUG__
         }
     }