// headers & declarations
// ============================================================================
+#include "wx/app.h"
#include "wx/menu.h"
#include "wx/menuitem.h"
-#include <wx/mac/uma.h>
+#include "wx/mac/uma.h"
// ============================================================================
// implementation
// ============================================================================
// dynamic classes implementation
// ----------------------------------------------------------------------------
+#if !USE_SHARED_LIBRARY
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" ;
}
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 ) ;
}
}
}
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
}
}
}
// 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
}
}
// 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);
}