]> git.saurik.com Git - wxWidgets.git/blobdiff - src/os2/menuitem.cpp
Don't crash in wxControl::GetLabel when getting the label
[wxWidgets.git] / src / os2 / menuitem.cpp
index 3e0f891a09bc8022a9a2739544eaf981511e2e1f..91c6e9d975be069bbc0a1a3b04e653796c569ca9 100644 (file)
 // static function for translating menu labels
 // ----------------------------------------------------------------------------
 
-static wxString TextToLabel(const wxString& rTitle)
+static wxString TextToLabel(
+  const wxString&                   rsTitle
+)
 {
-    wxString Title;
-    const wxChar *pc;
-    for (pc = rTitle.c_str(); *pc != wxT('\0'); pc++ )
+    wxString                        sTitle;
+    const wxChar*                   zPc;
+
+    if (rsTitle.IsEmpty())
+        return(sTitle);
+
+    for (zPc = rsTitle.c_str(); *zPc != wxT('\0'); zPc++)
     {
-        if (*pc == wxT('&') )
+        if (*zPc == wxT('&'))
         {
-            if (*(pc+1) == wxT('&'))
+            if (*(zPc + 1) == wxT('&'))
             {
-                pc++;
-                Title << wxT('&');
+                zPc++;
+                sTitle << wxT('&');
             }
             else
-                Title << wxT('~');
+                sTitle << wxT('~');
         }
         else
         {
-            if ( *pc == wxT('~') )
+            if ( *zPc == wxT('~'))
             {
-                // tildes must be doubled to prevent them from being
+                //
+                // Tildes must be doubled to prevent them from being
                 // interpreted as accelerator character prefix by PM ???
-                Title << *pc;
+                //
+                sTitle << *zPc;
             }
-            Title << *pc;
+            sTitle << *zPc;
         }
     }
-    return Title;
-}
+    return(sTitle);
+} // end of TextToLabel
 
 // ============================================================================
 // implementation
@@ -127,6 +135,8 @@ wxMenuItem::wxMenuItem(
 #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
@@ -153,6 +163,8 @@ wxMenuItem::wxMenuItem(
 #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
@@ -171,12 +183,11 @@ void wxMenuItem::Init()
     SetTextColour(SYS_COLOR(MENUTEXT));
     SetBackgroundColour(SYS_COLOR(MENU));
 
-    #undef  SYS_COLOR
-
     //
     // 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
@@ -216,27 +227,30 @@ bool wxMenuItem::IsChecked() const
 } // end of wxMenuItem::IsChecked
 
 wxString wxMenuItemBase::GetLabelFromText(
-  const wxString&                   rText
+  const wxString&                   rsText
 )
 {
-    wxString label;
-    for ( const wxChar *pc = rText.c_str(); *pc; pc++ )
+    wxString                        sLabel;
+
+    for (const char* 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
+            //
+            // '~' is the escape character for OS/2PM and '&' is the one for
             // wxWindows - skip both of them
+            //
             continue;
         }
-
-        label += *pc;
+        sLabel += *zPc;
     }
-    return label;
-}
+    return sLabel;
+} // end of wxMenuItemBase::GetLabelFromText
 
-// radio group stuff
+//
+// Radio group stuff
 // -----------------
-
+//
 void wxMenuItem::SetAsRadioGroupStart()
 {
     m_bIsRadioGroupStart = TRUE;
@@ -246,19 +260,20 @@ 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;
-} // end of wxMenuItem::SetRadioGroupStart
+} // wxMenuItem::SetRadioGroupStart
 
 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
 
@@ -304,7 +319,7 @@ void wxMenuItem::Check(
 
     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?
@@ -317,23 +332,26 @@ void wxMenuItem::Check(
         //
         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
         //
+        int                         nStart;
+        int                         nEnd;
 
         if (m_bIsRadioGroupStart)
         {
-            // we already have all information we need
+            //
+            // We already have all information we need
+            //
             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
@@ -349,26 +367,22 @@ void wxMenuItem::Check(
 
         for (int n = nStart; n <= nEnd && pNode; n++)
         {
-            if (n != nPos)
-            {
-                pNode->GetData()->m_isChecked = FALSE;
-            }
-
             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)
-                                        );
+                pNode->GetData()->m_isChecked = FALSE;
+                ::WinSendMsg( hMenu
+                             ,MM_SETITEMATTR
+                             ,MPFROM2SHORT(n, TRUE)
+                             ,MPFROM2SHORT(MIA_CHECKED, FALSE)
+                            );
             }
             pNode = pNode->GetNext();
         }
@@ -409,6 +423,9 @@ void wxMenuItem::SetText(
 
     wxMenuItemBase::SetText(sText);
     OWNER_DRAWN_ONLY(wxOwnerDrawn::SetName(sText));
+#if  wxUSE_OWNER_DRAWN
+    SetAccelString(rText.AfterFirst(_T('\t')));
+#endif // wxUSE_OWNER_DRAWN
 
     HWND                            hMenu = GetHmenuOf(m_parentMenu);