]> git.saurik.com Git - wxWidgets.git/blobdiff - src/os2/menuitem.cpp
fix focus problems in picker controls under MSW which were due to not letting the...
[wxWidgets.git] / src / os2 / menuitem.cpp
index b54fd5783c8329d79c117e38cb2d4d269c47ee20..193a679348df0e0fa44aff4b27ff0dff7e314989 100644 (file)
@@ -1,5 +1,5 @@
 ///////////////////////////////////////////////////////////////////////////////
 ///////////////////////////////////////////////////////////////////////////////
-// Name:        menuitem.cpp
+// Name:        src/os2/menuitem.cpp
 // Purpose:     wxMenuItem implementation
 // Author:      David Webster
 // Modified by:
 // Purpose:     wxMenuItem implementation
 // Author:      David Webster
 // Modified by:
 // headers & declarations
 // ============================================================================
 
 // headers & declarations
 // ============================================================================
 
-#ifdef __GNUG__
-    #pragma implementation "menuitem.h"
-#endif
-
 // For compilers that support precompilation, includes "wx.h".
 #include "wx/wxprec.h"
 
 // For compilers that support precompilation, includes "wx.h".
 #include "wx/wxprec.h"
 
+#include "wx/menuitem.h"
+#include "wx/stockitem.h"
+
 #ifndef WX_PRECOMP
     #include "wx/font.h"
     #include "wx/bitmap.h"
     #include "wx/settings.h"
 #ifndef WX_PRECOMP
     #include "wx/font.h"
     #include "wx/bitmap.h"
     #include "wx/settings.h"
-    #include "wx/font.h"
     #include "wx/window.h"
     #include "wx/accel.h"
     #include "wx/menu.h"
     #include "wx/string.h"
     #include "wx/window.h"
     #include "wx/accel.h"
     #include "wx/menu.h"
     #include "wx/string.h"
+    #include "wx/log.h"
 #endif
 
 #endif
 
-#include "wx/menuitem.h"
-#include "wx/log.h"
-
 #if wxUSE_ACCEL
     #include "wx/accel.h"
 #endif // wxUSE_ACCEL
 #if wxUSE_ACCEL
     #include "wx/accel.h"
 #endif // wxUSE_ACCEL
     #define OWNER_DRAWN_ONLY( code )
 #endif // wxUSE_OWNER_DRAWN/!wxUSE_OWNER_DRAWN
 
     #define OWNER_DRAWN_ONLY( code )
 #endif // wxUSE_OWNER_DRAWN/!wxUSE_OWNER_DRAWN
 
-// ----------------------------------------------------------------------------
-// static function for translating menu labels
-// ----------------------------------------------------------------------------
-
-static wxString TextToLabel(const wxString& rTitle)
-{
-    wxString Title;
-    const wxChar *pc;
-    for (pc = rTitle.c_str(); *pc != wxT('\0'); pc++ )
-    {
-        if (*pc == wxT('&') )
-        {
-            if (*(pc+1) == wxT('&'))
-            {
-                pc++;
-                Title << wxT('&');
-            }
-            else
-                Title << wxT('~');
-        }
-        else
-        {
-            if ( *pc == wxT('~') )
-            {
-                // tildes must be doubled to prevent them from being
-                // interpreted as accelerator character prefix by PM ???
-                Title << *pc;
-            }
-            Title << *pc;
-        }
-    }
-    return Title;
-}
-
 // ============================================================================
 // implementation
 // ============================================================================
 // ============================================================================
 // implementation
 // ============================================================================
@@ -115,18 +77,20 @@ wxMenuItem::wxMenuItem(
 )
 : wxMenuItemBase( pParentMenu
                  ,nId
 )
 : wxMenuItemBase( pParentMenu
                  ,nId
-                 ,rsText
+                 ,wxPMTextToLabel(rsText)
                  ,rsHelp
                  ,eKind
                  ,pSubMenu
                 )
 #if wxUSE_OWNER_DRAWN
                  ,rsHelp
                  ,eKind
                  ,pSubMenu
                 )
 #if wxUSE_OWNER_DRAWN
-,  wxOwnerDrawn( TextToLabel(rsText)
+,  wxOwnerDrawn( wxPMTextToLabel(rsText)
                 ,eKind == wxITEM_CHECK
                )
 #endif // owner drawn
 {
     wxASSERT_MSG(pParentMenu != NULL, wxT("a menu item should have a parent"));
                 ,eKind == wxITEM_CHECK
                )
 #endif // owner drawn
 {
     wxASSERT_MSG(pParentMenu != NULL, wxT("a menu item should have a parent"));
+    memset(&m_vMenuData, '\0', sizeof(m_vMenuData));
+    m_vMenuData.id = (USHORT)nId;
 
     Init();
 } // end of wxMenuItem::wxMenuItem
 
     Init();
 } // end of wxMenuItem::wxMenuItem
@@ -141,18 +105,20 @@ wxMenuItem::wxMenuItem(
 )
 : wxMenuItemBase( pParentMenu
                  ,nId
 )
 : wxMenuItemBase( pParentMenu
                  ,nId
-                 ,rsText
+                 ,wxPMTextToLabel(rsText)
                  ,rsHelp
                  ,bIsCheckable ? wxITEM_CHECK : wxITEM_NORMAL
                  ,pSubMenu
                 )
 #if wxUSE_OWNER_DRAWN
                  ,rsHelp
                  ,bIsCheckable ? wxITEM_CHECK : wxITEM_NORMAL
                  ,pSubMenu
                 )
 #if wxUSE_OWNER_DRAWN
-,  wxOwnerDrawn( TextToLabel(rsText)
+,  wxOwnerDrawn( wxPMTextToLabel(rsText)
                 ,bIsCheckable
                )
 #endif // owner drawn
 {
     wxASSERT_MSG(pParentMenu != NULL, wxT("a menu item should have a parent"));
                 ,bIsCheckable
                )
 #endif // owner drawn
 {
     wxASSERT_MSG(pParentMenu != NULL, wxT("a menu item should have a parent"));
+    memset(&m_vMenuData, '\0', sizeof(m_vMenuData));
+    m_vMenuData.id = (USHORT)nId;
 
     Init();
 } // end of wxMenuItem::wxMenuItem
 
     Init();
 } // end of wxMenuItem::wxMenuItem
@@ -171,12 +137,11 @@ void wxMenuItem::Init()
     SetTextColour(SYS_COLOR(MENUTEXT));
     SetBackgroundColour(SYS_COLOR(MENU));
 
     SetTextColour(SYS_COLOR(MENUTEXT));
     SetBackgroundColour(SYS_COLOR(MENU));
 
-    #undef  SYS_COLOR
-
     //
     // We don't want normal items be owner-drawn
     //
     ResetOwnerDrawn();
     //
     // We don't want normal items be owner-drawn
     //
     ResetOwnerDrawn();
+    #undef  SYS_COLOR
 
     //
     // Tell the owner drawing code to to show the accel string as well
 
     //
     // Tell the owner drawing code to to show the accel string as well
@@ -206,59 +171,63 @@ int wxMenuItem::GetRealId() const
 // --------------
 bool wxMenuItem::IsChecked() const
 {
 // --------------
 bool wxMenuItem::IsChecked() const
 {
-    USHORT                          uFlag = SHORT1FROMMR(::WinSendMsg( GetHMenuOf(m_parentMenu)
-                                                                      ,MM_QUERYITEMATTR
-                                                                      ,MPFROM2SHORT(GetId(), TRUE)
-                                                                      ,MPFROMSHORT(MIA_CHECKED)
-                                                                     ));
+    USHORT uFlag = SHORT1FROMMR(::WinSendMsg( GetHMenuOf(m_parentMenu)
+                                             ,MM_QUERYITEMATTR
+                                             ,MPFROM2SHORT(GetId(), TRUE)
+                                             ,MPFROMSHORT(MIA_CHECKED)
+                                            ));
 
 
-    return (uFlag & MIA_CHECKED);
+    return (uFlag & MIA_CHECKED) == MIA_CHECKED ;
 } // end of wxMenuItem::IsChecked
 
 } // end of wxMenuItem::IsChecked
 
-wxString wxMenuItemBase::GetLabelFromText(
-  const wxString&                   rText
+wxString wxMenuItemBase::GetLabelText(
+  const wxString&                   rsText
 )
 {
 )
 {
-    wxString label;
-    for ( const wxChar *pc = rText.c_str(); *pc; pc++ )
+    wxString                        sLabel;
+
+    for (const wxChar* zPc = rsText.c_str(); *zPc; zPc++)
     {
     {
-        if ( *pc == wxT('~') || *pc == wxT('&') )
+        if (*zPc == wxT('~') || *zPc == wxT('&'))
         {
         {
-            // '~' is the escape character for GTK+ and '&' is the one for
-            // wxWindows - skip both of them
+            //
+            // '~' is the escape character for OS/2PM and '&' is the one for
+            // wxWidgets - skip both of them
+            //
             continue;
         }
             continue;
         }
-
-        label += *pc;
+        sLabel += *zPc;
     }
     }
-    return label;
-}
+    return sLabel;
+} // end of wxMenuItemBase::GetLabelText
 
 
-// radio group stuff
+//
+// Radio group stuff
 // -----------------
 // -----------------
-
+//
 void wxMenuItem::SetAsRadioGroupStart()
 {
 void wxMenuItem::SetAsRadioGroupStart()
 {
-    m_bIsRadioGroupStart = TRUE;
+    m_bIsRadioGroupStart = true;
 } // end of wxMenuItem::SetAsRadioGroupStart
 
 void wxMenuItem::SetRadioGroupStart(
   int                               nStart
 )
 {
 } // end of wxMenuItem::SetAsRadioGroupStart
 
 void wxMenuItem::SetRadioGroupStart(
   int                               nStart
 )
 {
-    wxASSERT_MSG( !m_bIsRadioGroupStart,
-                  _T("should only be called for the next radio items") );
+    wxASSERT_MSG( !m_bIsRadioGroupStart
+                 ,_T("should only be called for the next radio items")
+                );
 
     m_vRadioGroup.m_nStart = nStart;
 
     m_vRadioGroup.m_nStart = nStart;
-} // end of wxMenuItem::SetRadioGroupStart
+} // wxMenuItem::SetRadioGroupStart
 
 void wxMenuItem::SetRadioGroupEnd(
   int                               nEnd
 )
 {
 
 void wxMenuItem::SetRadioGroupEnd(
   int                               nEnd
 )
 {
-    wxASSERT_MSG( m_bIsRadioGroupStart,
-                  _T("should only be called for the first radio item") );
-
+    wxASSERT_MSG( m_bIsRadioGroupStart
+                 ,_T("should only be called for the first radio item")
+                );
     m_vRadioGroup.m_nEnd = nEnd;
 } // end of wxMenuItem::SetRadioGroupEnd
 
     m_vRadioGroup.m_nEnd = nEnd;
 } // end of wxMenuItem::SetRadioGroupEnd
 
@@ -287,7 +256,7 @@ void wxMenuItem::Enable(
                                 );
     if (!bOk)
     {
                                 );
     if (!bOk)
     {
-        wxLogLastError("EnableMenuItem");
+        wxLogLastError(wxT("EnableMenuItem"));
     }
     wxMenuItemBase::Enable(bEnable);
 } // end of wxMenuItem::Enable
     }
     wxMenuItemBase::Enable(bEnable);
 } // end of wxMenuItem::Enable
@@ -302,9 +271,9 @@ void wxMenuItem::Check(
     if (m_isChecked == bCheck)
         return;
 
     if (m_isChecked == bCheck)
         return;
 
-    HMENU                           hMenu = GetHMenuOf(m_parentMenu);
+    HMENU                           hMenu = GetHmenuOf(m_parentMenu);
 
 
-    if ( GetKind() == wxITEM_RADIO )
+    if (GetKind() == wxITEM_RADIO)
     {
         //
         // It doesn't make sense to uncheck a radio item - what would this do?
     {
         //
         // It doesn't make sense to uncheck a radio item - what would this do?
@@ -317,23 +286,26 @@ void wxMenuItem::Check(
         //
         const wxMenuItemList&       rItems = m_parentMenu->GetMenuItems();
         int                         nPos = rItems.IndexOf(this);
         //
         const wxMenuItemList&       rItems = m_parentMenu->GetMenuItems();
         int                         nPos = rItems.IndexOf(this);
-        int                         nStart;
-        int                         nEnd;
 
 
-        wxCHECK_RET( nPos != wxNOT_FOUND,
-                     _T("menuitem not found in the menu items list?") );
+        wxCHECK_RET( nPos != wxNOT_FOUND
+                    ,_T("menuitem not found in the menu items list?")
+                   );
 
         //
         // Get the radio group range
         //
 
         //
         // Get the radio group range
         //
+        int                         nStart;
+        int                         nEnd;
 
         if (m_bIsRadioGroupStart)
         {
 
         if (m_bIsRadioGroupStart)
         {
-            // we already have all information we need
+            //
+            // We already have all information we need
+            //
             nStart = nPos;
             nStart = nPos;
-            nEnd = m_vRadioGroup.m_nEnd;
+            nEnd   = m_vRadioGroup.m_nEnd;
         }
         }
-        else // Next radio group item
+        else // next radio group item
         {
             //
             // Get the radio group end from the start item
         {
             //
             // Get the radio group end from the start item
@@ -345,44 +317,40 @@ void wxMenuItem::Check(
         //
         // Also uncheck all the other items in this radio group
         //
         //
         // Also uncheck all the other items in this radio group
         //
-        wxMenuItemList::Node*       pNode = rItems.Item(nStart);
+        wxMenuItemList::compatibility_iterator node = rItems.Item(nStart);
 
 
-        for (int n = nStart; n <= nEnd && pNode; n++)
+        for (int n = nStart; n <= nEnd && node; n++)
         {
         {
-            if (n != nPos)
-            {
-                pNode->GetData()->m_isChecked = FALSE;
-            }
-
             if (n == nPos)
             {
             if (n == nPos)
             {
-                bOk = (bool)::WinSendMsg( hMenu
-                                         ,MM_SETITEMATTR
-                                         ,MPFROM2SHORT(n, TRUE)
-                                         ,MPFROM2SHORT(MIA_CHECKED, MIA_CHECKED)
-                                        );
+                ::WinSendMsg( hMenu
+                             ,MM_SETITEMATTR
+                             ,MPFROM2SHORT(n, TRUE)
+                             ,MPFROM2SHORT(MIA_CHECKED, MIA_CHECKED)
+                            );
             }
             }
-            else
+            if (n != nPos)
             {
             {
-                bOk = (bool)::WinSendMsg( hMenu
-                                         ,MM_SETITEMATTR
-                                         ,MPFROM2SHORT(n, TRUE)
-                                         ,MPFROM2SHORT(MIA_CHECKED, FALSE)
-                                        );
+                node->GetData()->m_isChecked = FALSE;
+                ::WinSendMsg( hMenu
+                             ,MM_SETITEMATTR
+                             ,MPFROM2SHORT(n, TRUE)
+                             ,MPFROM2SHORT(MIA_CHECKED, FALSE)
+                            );
             }
             }
-            pNode = pNode->GetNext();
+            node = node->GetNext();
         }
     }
     else // check item
     {
         if (bCheck)
         }
     }
     else // check item
     {
         if (bCheck)
-            bOk = (bool)::WinSendMsg( GetHMenuOf(m_parentMenu)
+            bOk = (bool)::WinSendMsg( hMenu
                                      ,MM_SETITEMATTR
                                      ,MPFROM2SHORT(GetRealId(), TRUE)
                                      ,MPFROM2SHORT(MIA_CHECKED, MIA_CHECKED)
                                     );
         else
                                      ,MM_SETITEMATTR
                                      ,MPFROM2SHORT(GetRealId(), TRUE)
                                      ,MPFROM2SHORT(MIA_CHECKED, MIA_CHECKED)
                                     );
         else
-            bOk = (bool)::WinSendMsg( GetHMenuOf(m_parentMenu)
+            bOk = (bool)::WinSendMsg( hMenu
                                      ,MM_SETITEMATTR
                                      ,MPFROM2SHORT(GetRealId(), TRUE)
                                      ,MPFROM2SHORT(MIA_CHECKED, FALSE)
                                      ,MM_SETITEMATTR
                                      ,MPFROM2SHORT(GetRealId(), TRUE)
                                      ,MPFROM2SHORT(MIA_CHECKED, FALSE)
@@ -390,27 +358,36 @@ void wxMenuItem::Check(
     }
     if (!bOk)
     {
     }
     if (!bOk)
     {
-        wxLogLastError("CheckMenuItem");
+        wxLogLastError(wxT("CheckMenuItem"));
     }
     wxMenuItemBase::Check(bCheck);
 } // end of wxMenuItem::Check
 
     }
     wxMenuItemBase::Check(bCheck);
 } // end of wxMenuItem::Check
 
-void wxMenuItem::SetText(
-  const wxString&                   rText
-)
+void wxMenuItem::SetItemLabel( const wxString& rText )
 {
     //
     // Don't do anything if label didn't change
     //
 
 {
     //
     // Don't do anything if label didn't change
     //
 
-    wxString Text = TextToLabel(rText);
-    if (m_text == Text)
+    wxString                        sText = wxPMTextToLabel(rText);
+    if (m_text == sText)
         return;
 
         return;
 
-    wxMenuItemBase::SetText(Text);
-    OWNER_DRAWN_ONLY(wxOwnerDrawn::SetName(Text));
+    // wxMenuItemBase will do stock ID checks
+    wxMenuItemBase::SetItemLabel(sText);
 
 
-    HWND                            hMenu = GetHMenuOf(m_parentMenu);
+    // m_text could now be different from 'text' if we are a stock menu item,
+    // so use only m_text below
+
+    OWNER_DRAWN_ONLY(wxOwnerDrawn::SetName(m_text));
+#if  wxUSE_OWNER_DRAWN
+    if (rText.IsEmpty())
+        SetAccelString(m_text.AfterFirst(_T('\t')));
+    else
+        SetAccelString(rText.AfterFirst(_T('\t')));
+#endif // wxUSE_OWNER_DRAWN
+
+    HWND                            hMenu = GetHmenuOf(m_parentMenu);
 
     wxCHECK_RET(hMenu, wxT("menuitem without menu"));
 
 
     wxCHECK_RET(hMenu, wxT("menuitem without menu"));
 
@@ -418,9 +395,9 @@ void wxMenuItem::SetText(
     m_parentMenu->UpdateAccel(this);
 #endif // wxUSE_ACCEL
 
     m_parentMenu->UpdateAccel(this);
 #endif // wxUSE_ACCEL
 
-    USHORT                          uId = GetRealId();
-    MENUITEM                        vItem;
-    USHORT                          uFlagsOld;
+    USHORT   uId = (USHORT)GetRealId();
+    MENUITEM vItem;
+    USHORT   uFlagsOld;
 
     if (!::WinSendMsg( hMenu
                       ,MM_QUERYITEM
 
     if (!::WinSendMsg( hMenu
                       ,MM_QUERYITEM
@@ -428,7 +405,7 @@ void wxMenuItem::SetText(
                       ,(MPARAM)&vItem
                      ))
     {
                       ,(MPARAM)&vItem
                      ))
     {
-        wxLogLastError("GetMenuState");
+        wxLogLastError(wxT("GetMenuState"));
     }
     else
     {
     }
     else
     {
@@ -438,19 +415,19 @@ void wxMenuItem::SetText(
             uFlagsOld |= MIS_SUBMENU;
         }
 
             uFlagsOld |= MIS_SUBMENU;
         }
 
-        BYTE*                       pData;
+        char*                       pData;
 
 #if wxUSE_OWNER_DRAWN
         if (IsOwnerDrawn())
         {
             uFlagsOld |= MIS_OWNERDRAW;
 
 #if wxUSE_OWNER_DRAWN
         if (IsOwnerDrawn())
         {
             uFlagsOld |= MIS_OWNERDRAW;
-            pData = (BYTE*)this;
+            pData = (char*)this;
         }
         else
 #endif  //owner drawn
         {
             uFlagsOld |= MIS_TEXT;
         }
         else
 #endif  //owner drawn
         {
             uFlagsOld |= MIS_TEXT;
-            pData = (BYTE*)Text.c_str();
+            pData = (char*) m_text.wx_str();
         }
 
         //
         }
 
         //
@@ -508,4 +485,3 @@ wxMenuItem* wxMenuItemBase::New(
                           ,pSubMenu
                          );
 } // end of wxMenuItemBase::New
                           ,pSubMenu
                          );
 } // end of wxMenuItemBase::New
-