4 // Created by Quentin D. Carnicelli on Tue Jun 18 2002.
5 // Copyright (c) 2001 Subband inc.. All rights reserved.
10 #import <AppKit/NSEvent.h>
11 #import <Carbon/Carbon.h>
13 @interface KeyCombo (Private)
14 + (NSString*)_stringForModifiers:(long)modifiers;
15 + (NSString*)_stringForKeyCode:(short)keyCode;
19 @implementation KeyCombo
23 return [[[self alloc] init] autorelease];
28 return [self keyComboWithKeyCode:-1 andModifiers:-1];
31 + (id)keyComboWithKeyCode: (short)keycode andModifiers: (long)modifiers
33 return [[[self alloc] initWithKeyCode:keycode andModifiers:modifiers] autorelease];
36 - (id)initWithKeyCode: (short)keycode andModifiers: (long)modifiers
38 if ( (self = [super init]) )
41 mModifiers = modifiers;
48 return [self initWithKeyCode: -1 andModifiers: -1];
51 - (id)copyWithZone:(NSZone *)zone;
56 - (id)initWithCoder:(NSCoder *)aDecoder
58 if ( (self = [super init]) ) {
59 [aDecoder decodeValueOfObjCType: @encode(short) at: &mKeyCode];
60 [aDecoder decodeValueOfObjCType: @encode(long) at: &mModifiers];
66 - (void)encodeWithCoder:(NSCoder *)aCoder
68 [aCoder encodeValueOfObjCType:@encode(short) at:&mKeyCode];
69 [aCoder encodeValueOfObjCType:@encode(long) at:&mModifiers];
72 - (BOOL)isEqual:(KeyCombo *)object
74 return ( ([object isKindOfClass:[KeyCombo class]]) &&
75 ([object keyCode] == [self keyCode]) &&
76 ([object modifiers] == [self modifiers]) );
79 - (NSString *)description
81 return [self userDisplayRep];
96 return ((mKeyCode >= 0) && (mModifiers >= 0));
99 - (NSString *)userDisplayRep
101 if ( ! [self isValid] ) {
104 return [NSString stringWithFormat: @"%@%@",
105 [KeyCombo _stringForModifiers: mModifiers],
106 [KeyCombo _stringForKeyCode: mKeyCode]];
110 + (NSString *)_stringForModifiers: (long)modifiers
112 static long modToChar[4][2] = {
113 { cmdKey, 0x23180000 },
114 { optionKey, 0x23250000 },
115 { controlKey, 0x005E0000 },
116 { shiftKey, 0x21e70000 }
119 NSString *str = [NSString string];
123 for (i = 0; i < 4; i++) {
124 if (modifiers & modToChar[i][0]) {
125 charStr = [NSString stringWithCharacters:(const unichar *)&modToChar[i][1] length:1];
126 str = [str stringByAppendingString:charStr];
133 + (NSString *)_stringForKeyCode:(short)keyCode
139 dict = [self keyCodesDictionary];
140 key = [NSString stringWithFormat: @"%d", keyCode];
141 str = [dict objectForKey: key];
144 str = [NSString stringWithFormat: @"%X", keyCode];
150 + (NSDictionary *)keyCodesDictionary
152 static NSDictionary *keyCodes = nil;
154 if (keyCodes == nil) {
158 path = [[NSBundle bundleForClass: [KeyCombo class]] pathForResource: @"KeyCodes" ofType: @"plist"];
160 contents = [NSString stringWithContentsOfFile: path];
161 keyCodes = [[contents propertyList] retain];
169 @implementation NSUserDefaults (KeyComboAdditions)
171 - (void)setKeyCombo:(KeyCombo *)combo forKey:(NSString *)key
175 data = [NSArchiver archivedDataWithRootObject:combo];
179 [self setObject:data forKey:key];
182 - (KeyCombo *)keyComboForKey:(NSString *)key
184 NSData *data = [self objectForKey:key];
188 combo = [[NSUnarchiver unarchiveObjectWithData:data] retain];