83 unsigned _keyEquivalentModifierMask;
85 int _mnemonicLocation;
88 int _indentationLevel;
91 id _representedObject;
96 _CPMenuItemView _menuItemView;
99 + (Class)_binderClassForBinding:(
CPString)aBinding
101 if ([aBinding hasPrefix:CPEnabledBinding])
103 else if (aBinding === CPTargetBinding || [aBinding hasPrefix:CPArgumentBinding])
106 return [
super _binderClassForBinding:aBinding];
121 - (id)initWithTitle:(
CPString)aTitle action:(
SEL)anAction keyEquivalent:(
CPString)aKeyEquivalent
139 _keyEquivalent = aKeyEquivalent ||
@"";
142 _indentationLevel = 0;
155 - (void)setEnabled:(BOOL)isEnabled
157 if (_isEnabled === isEnabled)
160 if (!isEnabled && [
self isHighlighted])
161 [_menu _highlightItemAtIndex:CPNotFound];
163 _isEnabled = !!isEnabled;
165 [_menuItemView setDirty];
166 [_menu itemChanged:self];
182 - (void)setHidden:(BOOL)isHidden
189 [_menu itemChanged:self];
203 - (BOOL)isHiddenOrHasHiddenAncestor
208 var supermenu = [_menu supermenu];
210 if ([[supermenu itemAtIndex:[supermenu indexOfItemWithSubmenu:_menu]] isHiddenOrHasHiddenAncestor])
221 - (void)setTarget:(
id)aTarget
238 - (void)setAction:(
SEL)anAction
260 if (_title == aTitle)
265 [_menuItemView setDirty];
267 [_menu itemChanged:self];
297 [_menu itemChanged:self];
299 [_menuItemView setDirty];
325 - (void)setTag:(
int)aTag
346 - (void)setState:(
int)aState
348 if (_state == aState)
353 [_menu itemChanged:self];
355 [_menuItemView setDirty];
378 if (_image == anImage)
383 [_menuItemView setDirty];
385 [_menu itemChanged:self];
402 _alternateImage = anImage;
410 return _alternateImage;
420 if (_onStateImage == anImage)
423 _onStateImage = anImage;
424 [_menu itemChanged:self];
432 return _onStateImage;
441 if (_offStateImage == anImage)
444 _offStateImage = anImage;
445 [_menu itemChanged:self];
453 return _offStateImage;
462 if (_mixedStateImage == anImage)
465 _mixedStateImage = anImage;
466 [_menu itemChanged:self];
475 return _mixedStateImage;
485 if (_submenu === aMenu)
488 var supermenu = [_submenu supermenu];
492 reason: @"Can't add submenu \"" + [aMenu
title] + "\" to item \"" + [
self title] + "\", because it is already submenu of \"" + [[aMenu
supermenu]
title] + "\""];
498 [_submenu setSupermenu:_menu];
499 [_submenu setTitle:[
self title]];
510 [_menuItemView setDirty];
512 [_menu itemChanged:self];
528 return _submenu ? YES : NO;
540 separatorItem._isSeparator = YES;
542 return separatorItem;
548 - (BOOL)isSeparatorItem
579 _keyEquivalent = aString ||
@"";
587 return _keyEquivalent;
600 - (void)setKeyEquivalentModifierMask:(
unsigned)aMask
602 _keyEquivalentModifierMask = aMask;
615 - (unsigned)keyEquivalentModifierMask
617 return _keyEquivalentModifierMask;
622 if (![_keyEquivalent length])
625 var
string = _keyEquivalent.toUpperCase(),
627 (
string === _keyEquivalent && _keyEquivalent.toLowerCase() !== _keyEquivalent.toUpperCase());
630 string = [CPMenuItemStringRepresentationDictionary objectForKey:string];
635 string =
"\u2318" + string;
638 string =
"\u21E7" + string;
641 string =
"\u2325" + string;
644 string =
"\u2303" + string;
649 string =
"Shift-" + string;
652 string =
"Alt-" + string;
655 string =
"Ctrl-" + string;
667 - (void)setMnemonicLocation:(
unsigned)aLocation
669 _mnemonicLocation = aLocation;
675 - (unsigned)mnemonicLocation
677 return _mnemonicLocation;
684 - (void)setTitleWithMnemonicLocation:(
CPString)aTitle
702 return _mnemonicLocation ==
CPNotFound ?
@"" : [_title characterAtIndex:_mnemonicLocation];
711 - (void)setAlternate:(BOOL)isAlternate
713 _isAlternate = isAlternate;
731 - (void)setIndentationLevel:(
unsigned)aLevel
734 [
CPException raise:CPInvalidArgumentException
reason:"setIndentationLevel: argument must be greater than or equal to 0."];
736 _indentationLevel = MIN(15, aLevel);
742 - (unsigned)indentationLevel
744 return _indentationLevel;
771 - (void)setRepresentedObject:(
id)anObject
773 _representedObject = anObject;
779 - (id)representedObject
781 return _representedObject;
797 [_menuItemView setDirty];
799 [_menu itemChanged:self];
815 - (BOOL)isHighlighted
820 #pragma mark CPObject Overrides 830 item._isSeparator = _isSeparator;
832 [item setTitle:_title];
833 [item setFont:_font];
834 [item setTarget:_target];
835 [item setAction:_action];
836 [item setEnabled:_isEnabled];
837 [item setHidden:_isHidden];
839 [item setState:_state];
840 [item setImage:_image];
841 [item setAlternateImage:_alternateImage];
842 [item setOnStateImage:_onStateImage];
843 [item setOffStateImage:_offStateImage];
844 [item setMixedStateImage:_mixedStateImage];
845 [item setKeyEquivalent:_keyEquivalent];
846 [item setKeyEquivalentModifierMask:_keyEquivalentModifierMask];
847 [item setMnemonicLocation:_mnemonicLocation];
848 [item setAlternate:_isAlternate];
849 [item setIndentationLevel:_indentationLevel];
850 [item setToolTip:_toolTip];
851 [item setRepresentedObject:_representedObject];
861 #pragma mark Internal 869 _menuItemView = [[_CPMenuItemView alloc] initWithFrame:CGRectMakeZero() forMenuItem:self];
871 return _menuItemView;
874 - (BOOL)_isSelectable
876 return ![
self submenu] || [
self action] !==
@selector(submenuAction:) || [
self target] !== [
self menu];
879 - (BOOL)_isMenuBarButton
881 return ![
self submenu] && [
self menu] === [CPApp mainMenu];
917 #define DEFAULT_VALUE(aKey, aDefaultValue) [aCoder containsValueForKey:(aKey)] ? [aCoder decodeObjectForKey:(aKey)] : (aDefaultValue) 918 #define ENCODE_IFNOT(aKey, aValue, aDefaultValue) if ((aValue) !== (aDefaultValue)) [aCoder encodeObject:(aValue) forKey:(aKey)]; 933 _isSeparator = [aCoder containsValueForKey:CPMenuItemIsSeparatorKey] && [aCoder decodeBoolForKey:CPMenuItemIsSeparatorKey];
935 _title = [aCoder decodeObjectForKey:CPMenuItemTitleKey];
939 _target = [aCoder decodeObjectForKey:CPMenuItemTargetKey];
940 _action = [aCoder decodeObjectForKey:CPMenuItemActionKey];
943 _isHidden = [aCoder decodeBoolForKey:CPMenuItemIsHiddenKey];
944 _tag = [aCoder decodeIntForKey:CPMenuItemTagKey];
945 _state = [aCoder decodeIntForKey:CPMenuItemStateKey];
947 _image = [aCoder decodeObjectForKey:CPMenuItemImageKey];
948 _alternateImage = [aCoder decodeObjectForKey:CPMenuItemAlternateImageKey];
954 _menu = [aCoder decodeObjectForKey:CPMenuItemMenuKey];
955 [
self setSubmenu:[aCoder decodeObjectForKey:CPMenuItemSubmenuKey]];
957 _keyEquivalent = [aCoder decodeObjectForKey:CPMenuItemKeyEquivalentKey] ||
@"";
958 _keyEquivalentModifierMask = [aCoder decodeIntForKey:CPMenuItemKeyEquivalentModifierMaskKey];
968 _representedObject = [aCoder decodeObjectForKey:CPMenuItemRepresentedObjectKey];
969 _view = [aCoder decodeObjectForKey:CPMenuItemViewKey];
982 [aCoder encodeBool:_isSeparator forKey:CPMenuItemIsSeparatorKey];
984 [aCoder encodeObject:_title forKey:CPMenuItemTitleKey];
986 [aCoder encodeObject:_target forKey:CPMenuItemTargetKey];
987 [aCoder encodeObject:_action forKey:CPMenuItemActionKey];
1001 if (_keyEquivalent && _keyEquivalent.
length)
1002 [aCoder encodeObject:_keyEquivalent forKey:CPMenuItemKeyEquivalentKey];
1004 if (_keyEquivalentModifierMask)
1005 [aCoder encodeObject:_keyEquivalentModifierMask forKey:CPMenuItemKeyEquivalentModifierMaskKey];
1007 if (_indentationLevel > 0)
1008 [aCoder encodeInt:_indentationLevel forKey:CPMenuItemIndentationLevelKey];
Used to implement exception handling (creating & raising).
void raise:reason:(CPString aName, [reason] CPString aReason)
An immutable string (collection of characters).
CPString substringToIndex:(unsigned anIndex)
function CPBrowserIsOperatingSystem(anOperatingSystem)
CPClearDisplayFunctionKey
CPString substringFromIndex:(unsigned anIndex)
Defines methods for use when archiving & restoring (enc/decoding).
CPCarriageReturnCharacter
function CPStringFromSelector(aSelector)
CPRange rangeOfString:(CPString aString)
FrameUpdater prototype description