]> git.saurik.com Git - wxWidgets.git/blobdiff - src/os2/menu.cpp
capture mouse to be notified when it exists the popup rect (bug 1372228)
[wxWidgets.git] / src / os2 / menu.cpp
index ae9fb9d429af3a20db19015707764b59699c1797..ae8c5db5fcf6b0c68ad8748887d3d3c5e85ca380 100644 (file)
@@ -1,5 +1,5 @@
 /////////////////////////////////////////////////////////////////////////////
-// Name:        menu.cpp
+// Name:        src/os2/menu.cpp
 // Purpose:     wxMenu, wxMenuBar, wxMenuItem
 // Author:      David Webster
 // Modified by:
@@ -9,17 +9,14 @@
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
-#ifdef __GNUG__
-    #pragma implementation "menu.h"
-#endif
-
 // For compilers that support precompilation, includes "wx.h".
 #include "wx/wxprec.h"
 
+#include "wx/menu.h"
+
 #ifndef WX_PRECOMP
     #include "wx/app.h"
     #include "wx/frame.h"
-    #include "wx/menu.h"
     #include "wx/utils.h"
     #include "wx/intl.h"
     #include "wx/log.h"
@@ -74,7 +71,7 @@ USHORT                              wxMenu::m_nextMenuId = 0;
 //
 void wxMenu::Init()
 {
-    m_bDoBreak = FALSE;
+    m_bDoBreak = false;
     m_nStartRadioGroup = -1;
 
     //
@@ -95,7 +92,7 @@ void wxMenu::Init()
                                       ,NULL
                                      )) == 0)
     {
-        wxLogLastError("WinLoadMenu");
+        wxLogLastError(wxT("WinLoadMenu"));
     }
     m_vMenuData.iPosition   = 0;
     m_vMenuData.afStyle     = MIS_SUBMENU | MIS_TEXT;
@@ -107,7 +104,7 @@ void wxMenu::Init()
     //
     // If we have a title, insert it in the beginning of the menu
     //
-    if (!m_title.IsEmpty())
+    if (!m_title.empty())
     {
         Append( idMenuTitle
                ,m_title
@@ -131,7 +128,7 @@ wxMenu::~wxMenu()
     {
         if (!::WinDestroyWindow((HWND)GetHmenu()) )
         {
-            wxLogLastError("WinDestroyWindow");
+            wxLogLastError(wxT("WinDestroyWindow"));
         }
     }
 
@@ -146,7 +143,7 @@ wxMenu::~wxMenu()
 void wxMenu::Break()
 {
     // this will take effect during the next call to Append()
-    m_bDoBreak = TRUE;
+    m_bDoBreak = true;
 } // end of wxMenu::Break
 
 void wxMenu::Attach(
@@ -189,10 +186,22 @@ void wxMenu::UpdateAccel(
     }
     else if (!pItem->IsSeparator())
     {
+        //
+        // Recurse upwards: we should only modify m_accels of the top level
+        // menus, not of the submenus as wxMenuBar doesn't look at them
+        // (alternative and arguable cleaner solution would be to recurse
+        // downwards in GetAccelCount() and CopyAccels())
+        //
+        if (GetParent())
+        {
+            GetParent()->UpdateAccel(pItem);
+            return;
+        }
+
         //
         // Find the (new) accel for this item
         //
-        wxAcceleratorEntry*         pAccel = wxGetAccelFromString(pItem->GetText());
+        wxAcceleratorEntry*         pAccel = wxAcceleratorEntry::Create(pItem->GetText());
 
         if (pAccel)
             pAccel->m_command = pItem->GetId();
@@ -236,17 +245,15 @@ void wxMenu::UpdateAccel(
 //
 // Append a new item or submenu to the menu
 //
-bool wxMenu::DoInsertOrAppend(
-  wxMenuItem*                       pItem
-, size_t                            nPos
-)
+bool wxMenu::DoInsertOrAppend( wxMenuItem* pItem,
+                               size_t      nPos )
 {
-    wxMenu*                         pSubmenu = pItem->GetSubMenu();
-    MENUITEM&                       rItem = (pSubmenu != NULL)?pSubmenu->m_vMenuData:
-                                            pItem->m_vMenuData;
+    wxMenu*    pSubmenu = pItem->GetSubMenu();
+    MENUITEM&  rItem = (pSubmenu != NULL)?pSubmenu->m_vMenuData:
+                       pItem->m_vMenuData;
 
-    ERRORID                         vError;
-    wxString                        sError;
+    ERRORID    vError;
+    wxString   sError;
 
 #if wxUSE_ACCEL
     UpdateAccel(pItem);
@@ -259,7 +266,7 @@ bool wxMenu::DoInsertOrAppend(
     if (m_bDoBreak)
     {
         rItem.afStyle |= MIS_BREAK;
-        m_bDoBreak = FALSE;
+        m_bDoBreak = false;
     }
 
     //
@@ -277,7 +284,7 @@ bool wxMenu::DoInsertOrAppend(
     }
     else
     {
-        rItem.id = pItem->GetId();
+        rItem.id = (USHORT)pItem->GetId();
     }
 
     BYTE*                           pData=NULL;
@@ -325,7 +332,7 @@ bool wxMenu::DoInsertOrAppend(
     }
     else
     {
-        rItem.iPosition = nPos;
+        rItem.iPosition = (SHORT)nPos;
     }
 
     APIRET                          rc;
@@ -349,26 +356,25 @@ bool wxMenu::DoInsertOrAppend(
                     );
     }
 #endif
+
     if (rc == (APIRET)MIT_MEMERROR || rc == (APIRET)MIT_ERROR)
     {
         vError = ::WinGetLastError(vHabmain);
         sError = wxPMErrorToStr(vError);
         wxLogError(wxT("Error inserting or appending a menuitem. Error: %s\n"), sError.c_str());
-        wxLogLastError("Insert or AppendMenu");
-        return FALSE;
+        wxLogLastError(wxT("Insert or AppendMenu"));
+        return false;
     }
-    else
+
+    //
+    // If we're already attached to the menubar, we must update it
+    //
+    if (IsAttached() && GetMenuBar()->IsAttached())
     {
-        //
-        // If we're already attached to the menubar, we must update it
-        //
-        if (IsAttached() && GetMenuBar()->IsAttached())
-        {
-            GetMenuBar()->Refresh();
-        }
-        return TRUE;
+        GetMenuBar()->Refresh();
     }
-    return FALSE;
+
+    return true;
 } // end of wxMenu::DoInsertOrAppend
 
 void wxMenu::EndRadioGroup()
@@ -379,13 +385,11 @@ void wxMenu::EndRadioGroup()
     m_nStartRadioGroup = -1;
 } // end of wxMenu::EndRadioGroup
 
-wxMenuItem* wxMenu::DoAppend(
-  wxMenuItem*                       pItem
-)
+wxMenuItem* wxMenu::DoAppend( wxMenuItem* pItem )
 {
     wxCHECK_MSG( pItem, NULL, _T("NULL item in wxMenu::DoAppend") );
 
-    bool                            bCheck = FALSE;
+    bool bCheck = false;
 
     if (pItem->GetKind() == wxITEM_RADIO)
     {
@@ -407,7 +411,7 @@ wxMenuItem* wxMenu::DoAppend(
             //
             // Ensure that we have a checked item in the radio group
             //
-            bCheck = TRUE;
+            bCheck = true;
         }
         else // extend the current radio group
         {
@@ -442,7 +446,7 @@ wxMenuItem* wxMenu::DoAppend(
         //
         // Check the item initially
         //
-        pItem->Check(TRUE);
+        pItem->Check(true);
     }
     return pItem;
 } // end of wxMenu::DoAppend
@@ -548,27 +552,25 @@ size_t wxMenu::CopyAccels(
 // set wxMenu title
 // ---------------------------------------------------------------------------
 
-void wxMenu::SetTitle(
-  const wxString&                   rLabel
-)
+void wxMenu::SetTitle( const wxString& rLabel )
 {
-    bool                            bHasNoTitle = m_title.IsEmpty();
-    HWND                            hMenu = GetHmenu();
+    bool bHasNoTitle = m_title.empty();
+    HWND hMenu = GetHmenu();
 
     m_title = rLabel;
     if (bHasNoTitle)
     {
-        if (!rLabel.IsEmpty())
+        if (!rLabel.empty())
         {
             if (!::WinSetWindowText(hMenu, (PSZ)rLabel.c_str()))
             {
-                wxLogLastError("SetMenuTitle");
+                wxLogLastError(wxT("SetMenuTitle"));
             }
         }
     }
     else
     {
-        if (rLabel.IsEmpty() )
+        if (rLabel.empty() )
         {
             ::WinSendMsg( GetHmenu()
                          ,MM_REMOVEITEM
@@ -583,7 +585,7 @@ void wxMenu::SetTitle(
             //
             if (!::WinSetWindowText(hMenu, (PSZ)rLabel.c_str()))
             {
-                wxLogLastError("SetMenuTitle");
+                wxLogLastError(wxT("SetMenuTitle"));
             }
         }
     }
@@ -593,10 +595,8 @@ void wxMenu::SetTitle(
 // event processing
 // ---------------------------------------------------------------------------
 
-bool wxMenu::OS2Command(
-  WXUINT                            WXUNUSED(uParam)
-, WXWORD                            vId
-)
+bool wxMenu::OS2Command( WXUINT WXUNUSED(uParam),
+                         WXWORD vId )
 {
     //
     // Ignore commands from the menu title
@@ -612,7 +612,7 @@ bool wxMenu::OS2Command(
                                     )
                  );
     }
-    return TRUE;
+    return true;
 } // end of wxMenu::OS2Command
 
 // ---------------------------------------------------------------------------
@@ -737,7 +737,7 @@ void wxMenuBar::Refresh()
 
 WXHMENU wxMenuBar::Create()
 {
-    HWND                            hFrame;
+    HWND hFrame;
 
     if (m_hMenu != 0 )
         return m_hMenu;
@@ -769,18 +769,18 @@ WXHMENU wxMenuBar::Create()
                                       ,NULL
                                      )) == 0)
     {
-        wxLogLastError("WinLoadMenu");
+        wxLogLastError(wxT("WinLoadMenu"));
     }
     else
     {
-        size_t                      nCount = GetMenuCount(), i;
-       wxMenuList::iterator it;
+        size_t nCount = GetMenuCount(), i;
+        wxMenuList::iterator it;
         for (i = 0, it = m_menus.begin(); i < nCount; i++, it++)
         {
-            APIRET                  rc;
-            ERRORID                 vError;
-            wxString                sError;
-            HWND                    hSubMenu;
+            APIRET   rc;
+            ERRORID  vError;
+            wxString sError;
+            HWND     hSubMenu;
 
             //
             // Set the parent and owner of the submenues to be the menubar, not the desktop
@@ -802,7 +802,7 @@ WXHMENU wxMenuBar::Create()
                 return NULLHANDLE;
             }
 
-            (*it)->m_vMenuData.iPosition = i;
+            (*it)->m_vMenuData.iPosition = (SHORT)i;
 
             rc = (APIRET)::WinSendMsg(m_hMenu, MM_INSERTITEM, (MPARAM)&(*it)->m_vMenuData, (MPARAM)m_titles[i].c_str());
             if (rc == (APIRET)MIT_MEMERROR || rc == (APIRET)MIT_ERROR)
@@ -840,7 +840,7 @@ void wxMenuBar::EnableTop(
     nId = SHORT1FROMMR(::WinSendMsg((HWND)m_hMenu, MM_ITEMIDFROMPOSITION, MPFROMSHORT(nPos), (MPARAM)0));
     if (nId == MIT_ERROR)
     {
-        wxLogLastError("LogLastError");
+        wxLogLastError(wxT("LogLastError"));
         return;
     }
     ::WinSendMsg((HWND)m_hMenu, MM_SETITEMATTR, MPFROM2SHORT(nId, TRUE), MPFROM2SHORT(MIA_DISABLED, uFlag));
@@ -866,7 +866,7 @@ void wxMenuBar::SetLabelTop(
     nId = SHORT1FROMMR(::WinSendMsg((HWND)m_hMenu, MM_ITEMIDFROMPOSITION, MPFROMSHORT(nPos), (MPARAM)0));
     if (nId == MIT_ERROR)
     {
-        wxLogLastError("LogLastError");
+        wxLogLastError(wxT("LogLastError"));
         return;
     }
     if(!::WinSendMsg( (HWND)m_hMenu
@@ -875,13 +875,13 @@ void wxMenuBar::SetLabelTop(
                      ,MPARAM(&vItem)
                     ))
     {
-        wxLogLastError("QueryItem");
+        wxLogLastError(wxT("QueryItem"));
     }
     nId = vItem.id;
 
     if (::WinSendMsg(GetHmenu(), MM_SETITEMTEXT, MPFROMSHORT(nId), (MPARAM)rLabel.c_str()));
     {
-        wxLogLastError("ModifyMenu");
+        wxLogLastError(wxT("ModifyMenu"));
     }
     Refresh();
 } // end of wxMenuBar::SetLabelTop
@@ -916,7 +916,7 @@ wxMenu* wxMenuBar::Replace(
     nId = SHORT1FROMMR(::WinSendMsg((HWND)m_hMenu, MM_ITEMIDFROMPOSITION, MPFROMSHORT(nPos), (MPARAM)0));
     if (nId == MIT_ERROR)
     {
-        wxLogLastError("LogLastError");
+        wxLogLastError(wxT("LogLastError"));
         return NULL;
     }
     if (!pMenuOld)
@@ -941,27 +941,20 @@ wxMenu* wxMenuBar::Replace(
     return pMenuOld;
 } // end of wxMenuBar::Replace
 
-bool wxMenuBar::Insert(
-  size_t                            nPos
-, wxMenu*                           pMenu
-, const wxString&                   rTitle
-)
+bool wxMenuBar::Insert( size_t          nPos,
+                        wxMenu*         pMenu,
+                        const wxString& rTitle )
 {
-    wxString                        sTitle = wxPMTextToLabel(rTitle);
+    wxString sTitle = wxPMTextToLabel(rTitle);
 
-    if (!wxMenuBarBase::Insert( nPos
-                               ,pMenu
-                               ,sTitle
-                              ))
-        return FALSE;
+    if (!wxMenuBarBase::Insert( nPos, pMenu, sTitle ))
+        return false;
 
-    m_titles.Insert( sTitle
-                    ,nPos
-                   );
+    m_titles.Insert( sTitle, nPos );
 
     if (IsAttached())
     {
-        pMenu->m_vMenuData.iPosition = nPos;
+        pMenu->m_vMenuData.iPosition = (SHORT)nPos;
         ::WinSendMsg( (HWND)m_hMenu
                      ,MM_INSERTITEM
                      ,(MPARAM)&pMenu->m_vMenuData
@@ -976,22 +969,21 @@ bool wxMenuBar::Insert(
 #endif // wxUSE_ACCEL
         Refresh();
     }
-    return TRUE;
+
+    return true;
 } // end of wxMenuBar::Insert
 
-bool wxMenuBar::Append(
-  wxMenu*                           pMenu
-, const wxString&                   rsTitle
-)
+bool wxMenuBar::Append( wxMenu* pMenu,
+                        const wxString& rsTitle )
 {
-    WXHMENU                         hSubmenu = pMenu ? pMenu->GetHMenu() : 0;
+    WXHMENU hSubmenu = pMenu ? pMenu->GetHMenu() : 0;
 
-    wxCHECK_MSG(hSubmenu, FALSE, wxT("can't append invalid menu to menubar"));
+    wxCHECK_MSG(hSubmenu, false, wxT("can't append invalid menu to menubar"));
 
-    wxString                        sTitle = wxPMTextToLabel(rsTitle);
+    wxString sTitle = wxPMTextToLabel(rsTitle);
 
     if (!wxMenuBarBase::Append(pMenu, sTitle))
-        return FALSE;
+        return false;
 
     m_titles.Add(sTitle);
 
@@ -1010,7 +1002,7 @@ bool wxMenuBar::Append(
 #endif // wxUSE_ACCEL
         Refresh();
     }
-    return TRUE;
+    return true;
 } // end of wxMenuBar::Append
 
 wxMenu* wxMenuBar::Remove(
@@ -1030,7 +1022,7 @@ wxMenu* wxMenuBar::Remove(
                                    );
     if (nId == MIT_ERROR)
     {
-        wxLogLastError("LogLastError");
+        wxLogLastError(wxT("LogLastError"));
         return NULL;
     }
     if (IsAttached())
@@ -1105,7 +1097,7 @@ void wxMenuBar::Attach(
                             ,m_vAccelTable.GetHACCEL()
                             ,(HWND)pFrame->GetFrame()
                            ))
-        wxLogLastError("WinSetAccelTable");
+        wxLogLastError(wxT("WinSetAccelTable"));
 #endif // wxUSE_ACCEL
 } // end of wxMenuBar::Attach
 
@@ -1182,4 +1174,3 @@ wxMenuItem* wxMenuBar::FindItem(
     }
     return pItem;
 } // end of wxMenuBar::FindItem
-