X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/22e90769f8da73d398bd7da83f185263a292972f..92749d6a371775580dde81fb6144f61f84a046d1:/src/os2/menuitem.cpp?ds=inline diff --git a/src/os2/menuitem.cpp b/src/os2/menuitem.cpp index da529a5633..6b4c37c65a 100644 --- a/src/os2/menuitem.cpp +++ b/src/os2/menuitem.cpp @@ -54,6 +54,40 @@ #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 // ============================================================================ @@ -84,7 +118,7 @@ wxMenuItem::wxMenuItem( , wxMenu* pSubMenu ) #if wxUSE_OWNER_DRAWN -: wxOwnerDrawn( rText +: wxOwnerDrawn( TextToLabel(rText) ,bCheckable ) #endif // owner drawn @@ -114,9 +148,11 @@ wxMenuItem::wxMenuItem( m_isEnabled = TRUE; m_isChecked = FALSE; m_id = nId; - m_text = rText; + m_text = TextToLabel(rText); m_isCheckable = bCheckable; m_help = rStrHelp; + memset(&m_vMenuData, '\0', sizeof(m_vMenuData)); + m_vMenuData.id= nId; } // end of wxMenuItem::wxMenuItem wxMenuItem::~wxMenuItem() @@ -153,21 +189,21 @@ wxString wxMenuItemBase::GetLabelFromText( const wxString& rText ) { - return wxStripMenuCodes(rText); -} - -// accelerators -// ------------ - -#if wxUSE_ACCEL + wxString label; + for ( const wxChar *pc = rText.c_str(); *pc; pc++ ) + { + if ( *pc == wxT('~') || *pc == wxT('&') ) + { + // '~' is the escape character for GTK+ and '&' is the one for + // wxWindows - skip both of them + continue; + } -wxAcceleratorEntry *wxMenuItem::GetAccel() const -{ - return wxGetAccelFromString(GetText()); + label += *pc; + } + return label; } -#endif // wxUSE_ACCEL - // change item state // ----------------- @@ -180,17 +216,17 @@ void wxMenuItem::Enable( if (m_isEnabled == bEnable) return; if (bEnable) - bOk = ::WinSendMsg( GetHMenuOf(m_parentMenu) - ,MM_SETITEMATTR - ,MPFROM2SHORT(GetRealId(), TRUE) - ,MPFROM2SHORT(MIA_DISABLED, MIA_DISABLED) - ); + bOk = (bool)::WinSendMsg( GetHMenuOf(m_parentMenu) + ,MM_SETITEMATTR + ,MPFROM2SHORT(GetRealId(), TRUE) + ,MPFROM2SHORT(MIA_DISABLED, FALSE) + ); else - bOk = ::WinSendMsg( GetHMenuOf(m_parentMenu) - ,MM_SETITEMATTR - ,MPFROM2SHORT(GetRealId(), TRUE) - ,MPFROM2SHORT(MIA_DISABLED, FALSE) - ); + bOk = (bool)::WinSendMsg( GetHMenuOf(m_parentMenu) + ,MM_SETITEMATTR + ,MPFROM2SHORT(GetRealId(), TRUE) + ,MPFROM2SHORT(MIA_DISABLED, MIA_DISABLED) + ); if (!bOk) { wxLogLastError("EnableMenuItem"); @@ -208,20 +244,20 @@ void wxMenuItem::Check( if (m_isChecked == bCheck) return; if (bCheck) - bOk = ::WinSendMsg( GetHMenuOf(m_parentMenu) - ,MM_SETITEMATTR - ,MPFROM2SHORT(GetRealId(), TRUE) - ,MPFROM2SHORT(MIA_CHECKED, MIA_CHECKED) - ); + bOk = (bool)::WinSendMsg( GetHMenuOf(m_parentMenu) + ,MM_SETITEMATTR + ,MPFROM2SHORT(GetRealId(), TRUE) + ,MPFROM2SHORT(MIA_CHECKED, MIA_CHECKED) + ); else - bOk = ::WinSendMsg( GetHMenuOf(m_parentMenu) - ,MM_SETITEMATTR - ,MPFROM2SHORT(GetRealId(), TRUE) - ,MPFROM2SHORT(MIA_CHECKED, FALSE) - ); + bOk = (bool)::WinSendMsg( GetHMenuOf(m_parentMenu) + ,MM_SETITEMATTR + ,MPFROM2SHORT(GetRealId(), TRUE) + ,MPFROM2SHORT(MIA_CHECKED, FALSE) + ); if (!bOk) { - wxLogLastError("EnableMenuItem"); + wxLogLastError("CheckMenuItem"); } wxMenuItemBase::Check(bCheck); } // end of wxMenuItem::Check @@ -233,11 +269,13 @@ void wxMenuItem::SetText( // // Don't do anything if label didn't change // - if (m_text == rText) + + wxString Text = TextToLabel(rText); + if (m_text == Text) return; - wxMenuItemBase::SetText(rText); - OWNER_DRAWN_ONLY(wxOwnerDrawn::SetName(rText)); + wxMenuItemBase::SetText(Text); + OWNER_DRAWN_ONLY(wxOwnerDrawn::SetName(Text)); HWND hMenu = GetHMenuOf(m_parentMenu); @@ -250,7 +288,7 @@ void wxMenuItem::SetText( USHORT uId = GetRealId(); MENUITEM vItem; USHORT uFlagsOld; - + if (!::WinSendMsg( hMenu ,MM_QUERYITEM ,MPFROM2SHORT(uId, TRUE) @@ -279,7 +317,7 @@ void wxMenuItem::SetText( #endif //owner drawn { uFlagsOld |= MIS_TEXT; - pData = (BYTE*)rText.c_str(); + pData = (BYTE*)Text.c_str(); } //