// 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
// ============================================================================
// remove inappropriate characters, if useShortcuts is false, the ampersand will not auto-generate a mac menu-shortcut
-wxMenuItem::MacBuildMenuString(StringPtr outMacItemText, SInt16 *outMacShortcutChar , UInt8 *outMacModifiers , const char *inItemText , bool useShortcuts )
+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 ;
+ SInt16 macShortCut = 0 ;
const char *inItemName ;
wxString inItemTextMac ;
{
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 '&' :
{
case '\t' :
{
++inItemName ;
- while( *inItemName )
+ bool skip = false ;
+ bool explicitCommandKey = false ;
+ while( *inItemName && !skip )
{
- if (strncmp("Ctrl", inItemName, 4) == 0)
+ if (wxStrnicmp("Ctrl", inItemName, 4) == 0)
{
inItemName = inItemName + 5;
- macShortCut = *inItemName;
+ explicitCommandKey = true ;
}
- else if (strncmp("Cntrl", inItemName, 5) == 0)
+ else if (wxStrnicmp("Cntrl", inItemName, 5) == 0)
{
inItemName = inItemName + 6;
- macShortCut = *inItemName;
+ explicitCommandKey = true ;
}
- else if (strncmp("Alt", inItemName, 3) == 0)
+ else if (wxStrnicmp("Alt", inItemName, 3) == 0)
{
inItemName = inItemName + 4;
macModifiers |= kMenuOptionModifier ;
- macShortCut = *inItemName ;
}
- else if (strncmp("Shift", inItemName, 5) == 0)
+ else if (wxStrnicmp("Shift", inItemName, 5) == 0)
{
inItemName = inItemName + 6;
macModifiers |= kMenuShiftModifier ;
- macShortCut = *inItemName ;
}
- else if (strncmp("F", inItemName, 1) == 0)
+ else
{
- inItemName += strlen( inItemName ) ;
- // no function keys at the moment
- // macModifiers |= kMenuShiftModifier ;
- // macShortCut = *inItemName ;
+ skip = true ;
}
- else
+ }
+ if ( *inItemName )
+ {
+ if ( strlen(inItemName) == 1 )
+ {
+ macShortCut = *inItemName;
+ }
+ else if ( !wxStricmp( inItemName , "Delete" ) || !wxStricmp( inItemName , "Del" ) )
+ {
+ macShortCut = WXK_DELETE ;
+ }
+ else if ( !wxStricmp( inItemName , "Back" ) || !wxStricmp( inItemName , "Backspace" ) )
+ {
+ macShortCut = WXK_BACK ;
+ }
+ else if ( !wxStricmp( inItemName , "Return" ) )
+ {
+ macShortCut = WXK_RETURN ;
+ }
+ else if ( !wxStricmp( inItemName , "Enter" ) )
{
- break ;
+ macShortCut = kEnterCharCode ;
+ }
+ else if ( *inItemName == 'F' )
+ {
+ int fkey = atol(inItemName+1) ;
+ if (fkey >= 1 && fkey < 15 )
+ {
+ macShortCut = WXK_F1 + fkey - 1 ;
+ }
+ if ( !explicitCommandKey )
+ macModifiers |= kMenuNoCommandModifier ;
}
}
-
+
+ inItemName += strlen( inItemName ) ;
+
if ( *inItemName == 0 )
--inItemName ;
// 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;
MacBuildMenuString( label , NULL , NULL , text ,false);
- UMASetMenuItemText( m_parentMenu->GetHMenu() , index , label ) ; // checkmark
+ ::SetMenuItemText( MAC_WXHMENU(m_parentMenu->GetHMenu()) , index , label ) ; // checkmark
}
}
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);
}