X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/51abe921b849be69f02c174365c9a7bc8b46bd08..6d9022fe3bb50a75b9b5eaf5cf32558e518ba310:/src/mac/carbon/menuitem.cpp?ds=sidebyside diff --git a/src/mac/carbon/menuitem.cpp b/src/mac/carbon/menuitem.cpp index fc8d7885af..544bfd6004 100644 --- a/src/mac/carbon/menuitem.cpp +++ b/src/mac/carbon/menuitem.cpp @@ -13,10 +13,11 @@ // headers & declarations // ============================================================================ +#include "wx/app.h" #include "wx/menu.h" #include "wx/menuitem.h" -#include +#include "wx/mac/uma.h" // ============================================================================ // implementation // ============================================================================ @@ -29,32 +30,161 @@ IMPLEMENT_DYNAMIC_CLASS(wxMenuItem, wxObject) #endif //USE_SHARED_LIBRARY -void wxMacBuildMenuString(StringPtr outMacItemText, char *outMacShortcutChar , short *outMacModifiers , const char *inItemName , bool useShortcuts ) ; // ---------------------------------------------------------------------------- // wxMenuItem // ---------------------------------------------------------------------------- +// +// Helper Functions to get Mac Menus the way they should be ;-) +// + +void wxMacCtoPString(const char* theCString, Str255 thePString); + +// remove inappropriate characters, if useShortcuts is false, the ampersand will not auto-generate a mac menu-shortcut + +int wxMenuItem::MacBuildMenuString(StringPtr outMacItemText, SInt16 *outMacShortcutChar , UInt8 *outMacModifiers , const char *inItemText , bool useShortcuts ) +{ + char *p = (char *) &outMacItemText[1] ; + short macModifiers = 0 ; + char macShortCut = 0 ; + const char *inItemName ; + wxString inItemTextMac ; + + if (wxApp::s_macDefaultEncodingIsPC) + { + inItemTextMac = wxMacMakeMacStringFromPC( inItemText ) ; + inItemName = inItemTextMac ; + } + else + { + inItemName = inItemText ; + } + + if ( useShortcuts && !wxApp::s_macSupportPCMenuShortcuts ) + useShortcuts = false ; + + // we have problems with a leading hypen - it will be taken as a separator + + while ( *inItemName == '-' ) + inItemName++ ; + + while( *inItemName ) + { + switch ( *inItemName ) + { + // special characters for macintosh menus -> use some replacement + case ';' : + *p++ = ',' ; + break ; + case '^' : + *p++ = ' ' ; + break ; + case '!' : + *p++ = ' ' ; + break ; + case '<' : + *p++ = '[' ; + break ; + case '>' : + *p++ = ']' ; + break ; + case '/' : + *p++ = '|' ; + break ; + case '(' : + *p++ = '[' ; + break ; + case ')' : + *p++ = ']' ; + break ; + // shortcuts + case '&' : + { + ++inItemName ; + if ( *inItemName ) + { + *p++ = *inItemName ; + if ( useShortcuts ) + macShortCut = *inItemName ; + } + else + --inItemName ; + } + break ; + // win-like accelerators + case '\t' : + { + ++inItemName ; + while( *inItemName ) + { + if (strncmp("Ctrl", inItemName, 4) == 0) + { + inItemName = inItemName + 5; + macShortCut = *inItemName; + } + else if (strncmp("Cntrl", inItemName, 5) == 0) + { + inItemName = inItemName + 6; + macShortCut = *inItemName; + } + else if (strncmp("Alt", inItemName, 3) == 0) + { + inItemName = inItemName + 4; + macModifiers |= kMenuOptionModifier ; + macShortCut = *inItemName ; + } + else if (strncmp("Shift", inItemName, 5) == 0) + { + inItemName = inItemName + 6; + macModifiers |= kMenuShiftModifier ; + macShortCut = *inItemName ; + } + else if (strncmp("F", inItemName, 1) == 0) + { + inItemName += strlen( inItemName ) ; + // no function keys at the moment + // macModifiers |= kMenuShiftModifier ; + // macShortCut = *inItemName ; + } + else + { + break ; + } + } + + if ( *inItemName == 0 ) + --inItemName ; + + } + break ; + default : + *p++ = *inItemName ; + } + ++inItemName ; + } + + outMacItemText[0] = (p - (char *)outMacItemText) - 1; + if ( outMacShortcutChar ) + *outMacShortcutChar = macShortCut ; + if ( outMacModifiers ) + *outMacModifiers = macModifiers ; + + return 0 ; +} + // ctor & dtor // ----------- -wxMenuItem::wxMenuItem(wxMenu *pParentMenu, int id, - const wxString& text, const wxString& strHelp, - bool bCheckable, +wxMenuItem::wxMenuItem(wxMenu *pParentMenu, + int id, + const wxString& text, + const wxString& strHelp, + wxItemKind kind, wxMenu *pSubMenu) + : wxMenuItemBase(pParentMenu, id, text, strHelp, kind, pSubMenu) { - wxASSERT( pParentMenu != NULL ); - - m_parentMenu = pParentMenu; - m_subMenu = pSubMenu; - m_isEnabled = TRUE; - m_isChecked = FALSE; - m_id = id; - m_text = text; - m_isCheckable = bCheckable; - m_help = strHelp; - - - if ( m_text == "E&xit" ||m_text == "Exit" ) + // VZ: what about translations?? (FIXME) + if ( m_text == "E&xit" ||m_text == "Exit" ||m_text.Left(5) == "Exit\t" || m_text.Left(6) == "E&xit\t" ) { m_text = "Quit\tCtrl+Q" ; } @@ -111,30 +241,30 @@ void wxMenuItem::Enable(bool bDoEnable) if ( m_subMenu == NULL ) { // normal menu item - if ( m_parentMenu->GetHMenu() ) + if ( MAC_WXHMENU(m_parentMenu->GetHMenu()) ) { int index = m_parentMenu->MacGetIndexFromItem( this ) ; if ( index >= 1 ) { if ( bDoEnable ) - UMAEnableMenuItem( m_parentMenu->GetHMenu() , index ) ; + UMAEnableMenuItem( MAC_WXHMENU(m_parentMenu->GetHMenu()) , index ) ; else - UMADisableMenuItem( m_parentMenu->GetHMenu() , index ) ; + UMADisableMenuItem( MAC_WXHMENU(m_parentMenu->GetHMenu()) , index ) ; } } } else { // submenu - if ( m_parentMenu->GetHMenu() ) + if ( MAC_WXHMENU(m_parentMenu->GetHMenu()) ) { int index = m_parentMenu->MacGetIndexFromItem( this ) ; if ( index >= 1 ) { if ( bDoEnable ) - UMAEnableMenuItem( m_parentMenu->GetHMenu() , index ) ; + UMAEnableMenuItem( MAC_WXHMENU(m_parentMenu->GetHMenu()) , index ) ; else - UMADisableMenuItem( m_parentMenu->GetHMenu() , index ) ; + UMADisableMenuItem( MAC_WXHMENU(m_parentMenu->GetHMenu()) , index ) ; } } } @@ -150,15 +280,15 @@ void wxMenuItem::Check(bool bDoCheck) if ( m_isChecked != bDoCheck ) { m_isChecked = bDoCheck; - if ( m_parentMenu->GetHMenu() ) + if ( MAC_WXHMENU(m_parentMenu->GetHMenu()) ) { int index = m_parentMenu->MacGetIndexFromItem( this ) ; if ( index >= 1 ) { if ( bDoCheck ) - ::SetItemMark( m_parentMenu->GetHMenu() , index , 0x12 ) ; // checkmark + ::SetItemMark( MAC_WXHMENU(m_parentMenu->GetHMenu()) , index , 0x12 ) ; // checkmark else - ::SetItemMark( m_parentMenu->GetHMenu() , index , 0 ) ; // no mark + ::SetItemMark( MAC_WXHMENU(m_parentMenu->GetHMenu()) , index , 0 ) ; // no mark } } } @@ -174,14 +304,14 @@ void wxMenuItem::SetText(const wxString& text) // OWNER_DRAWN_ONLY( wxOwnerDrawn::SetName(text) ); wxCHECK_RET( m_parentMenu && m_parentMenu->GetHMenu(), wxT("menuitem without menu") ); - if ( m_parentMenu->GetHMenu() ) + if ( MAC_WXHMENU(m_parentMenu->GetHMenu()) ) { int index = m_parentMenu->MacGetIndexFromItem( this ) ; if ( index >= 1 ) { Str255 label; - wxMacBuildMenuString( label , NULL , NULL , text ,false); - ::SetMenuItemText( m_parentMenu->GetHMenu() , index , label ) ; // checkmark + MacBuildMenuString( label , NULL , NULL , text ,false); + ::SetMenuItemText( MAC_WXHMENU(m_parentMenu->GetHMenu()) , index , label ) ; // checkmark } } @@ -200,12 +330,18 @@ void wxMenuItem::SetCheckable(bool checkable) // wxMenuItemBase // ---------------------------------------------------------------------------- +/* static */ +wxString wxMenuItemBase::GetLabelFromText(const wxString& text) +{ + return wxStripMenuCodes(text); +} + wxMenuItem *wxMenuItemBase::New(wxMenu *parentMenu, int id, const wxString& name, const wxString& help, - bool isCheckable, + wxItemKind kind, wxMenu *subMenu) { - return new wxMenuItem(parentMenu, id, name, help, isCheckable, subMenu); + return new wxMenuItem(parentMenu, id, name, help, kind, subMenu); }