26 @"@.":
@"cancelOperation:",
29 @"^a":
@"moveToBeginningOfParagraph:",
30 @"^$a":
@"moveToBeginningOfParagraphAndModifySelection:",
31 @"^b":
@"moveBackward:",
32 @"^$b":
@"moveBackwardAndModifySelection:",
33 @"^~b":
@"moveWordBackward:",
34 @"^~$b":
@"moveWordBackwardAndModifySelection:",
35 @"^d":
@"deleteForward:",
36 @"^e":
@"moveToEndOfParagraph:",
37 @"^$e":
@"moveToEndOfParagraphAndModifySelection:",
38 @"^f":
@"moveForward:",
39 @"^$f":
@"moveForwardAndModifySelection:",
40 @"^~f":
@"moveWordForward:",
41 @"^~$f":
@"moveWordForwardAndModifySelection:",
42 @"^h":
@"deleteBackward:",
43 @"^k":
@"deleteToEndOfParagraph:",
44 @"^l":
@"centerSelectionInVisibleArea:",
46 @"^$n":
@"moveDownAndModifySelection:",
47 @"^o": [
@"insertNewlineIgnoringFieldEditor:",
@"moveBackward:"],
49 @"^$p":
@"moveUpAndModifySelection:",
52 @"^$v":
@"pageDownAndModifySelection:",
70 CPStandardKeyBindings[@"~" + CPDeleteCharacter] = @"deleteWordBackward:";
71 CPStandardKeyBindings[@"^" + CPDeleteCharacter] = @"deleteBackwardByDecomposingPreviousCharacter:";
72 CPStandardKeyBindings[@"^~" + CPDeleteCharacter] = @"deleteWordBackward:";
74 CPStandardKeyBindings[CPDeleteFunctionKey] = @"deleteForward:";
75 CPStandardKeyBindings[@"~" + CPDeleteFunctionKey] = @"deleteWordForward:";
77 CPStandardKeyBindings[CPTabCharacter] = @"insertTab:";
78 CPStandardKeyBindings[@"~" + CPTabCharacter] = @"insertTabIgnoringFieldEditor:";
79 CPStandardKeyBindings[@"^" + CPTabCharacter] = @"selectNextKeyView:";
80 CPStandardKeyBindings[CPBackTabCharacter] = @"insertBacktab:";
81 CPStandardKeyBindings[@"^" + CPBackTabCharacter] = @"selectPreviousKeyView:";
83 CPStandardKeyBindings[CPEscapeFunctionKey] = @"cancelOperation:";
84 CPStandardKeyBindings[@"~" + CPEscapeFunctionKey] = @"complete:";
85 CPStandardKeyBindings[CPF5FunctionKey] = @"complete:";
87 CPStandardKeyBindings[CPLeftArrowFunctionKey] = @"moveLeft:";
88 CPStandardKeyBindings[@"~" + CPLeftArrowFunctionKey] = @"moveWordLeft:";
89 CPStandardKeyBindings[@"^" + CPLeftArrowFunctionKey] = @"moveToLeftEndOfLine:";
90 CPStandardKeyBindings[@"
@" + CPLeftArrowFunctionKey] = @"moveToLeftEndOfLine:";
91 CPStandardKeyBindings[@"$" + CPLeftArrowFunctionKey] = @"moveLeftAndModifySelection:";
92 CPStandardKeyBindings[@"$~" + CPLeftArrowFunctionKey] = @"moveWordLeftAndModifySelection:";
93 CPStandardKeyBindings[@"$^" + CPLeftArrowFunctionKey] = @"moveToLeftEndOfLineAndModifySelection:";
94 CPStandardKeyBindings[@"$@" + CPLeftArrowFunctionKey] = @"moveToLeftEndOfLineAndModifySelection:";
95 CPStandardKeyBindings[@"@^" + CPLeftArrowFunctionKey] = @"makeBaseWritingDirectionRightToLeft:";
96 CPStandardKeyBindings[@"@^~" + CPLeftArrowFunctionKey] = @"makeTextWritingDirectionRightToLeft:";
98 CPStandardKeyBindings[CPRightArrowFunctionKey] = @"moveRight:";
99 CPStandardKeyBindings[@"~" + CPRightArrowFunctionKey] = @"moveWordRight:";
100 CPStandardKeyBindings[@"^" + CPRightArrowFunctionKey] = @"moveToRightEndOfLine:";
101 CPStandardKeyBindings[@"
@" + CPRightArrowFunctionKey] = @"moveToRightEndOfLine:";
102 CPStandardKeyBindings[@"$" + CPRightArrowFunctionKey] = @"moveRightAndModifySelection:";
103 CPStandardKeyBindings[@"$~" + CPRightArrowFunctionKey] = @"moveWordRightAndModifySelection:";
104 CPStandardKeyBindings[@"$^" + CPRightArrowFunctionKey] = @"moveToRightEndOfLineAndModifySelection:";
105 CPStandardKeyBindings[@"$@" + CPRightArrowFunctionKey] = @"moveToRightEndOfLineAndModifySelection:";
106 CPStandardKeyBindings[@"@^" + CPRightArrowFunctionKey] = @"makeBaseWritingDirectionLeftToRight:";
107 CPStandardKeyBindings[@"@^~" + CPRightArrowFunctionKey] = @"makeTextWritingDirectionLeftToRight:";
109 CPStandardKeyBindings[CPUpArrowFunctionKey] = @"moveUp:";
110 CPStandardKeyBindings[@"~" + CPUpArrowFunctionKey] = [@"moveBackward:", @"moveToBeginningOfParagraph:"];
111 CPStandardKeyBindings[@"^" + CPUpArrowFunctionKey] = @"scrollPageUp:";
112 CPStandardKeyBindings[@"
@" + CPUpArrowFunctionKey] = @"moveToBeginningOfDocument:";
113 CPStandardKeyBindings[@"$" + CPUpArrowFunctionKey] = @"moveUpAndModifySelection:";
114 CPStandardKeyBindings[@"$~" + CPUpArrowFunctionKey] = @"moveParagraphBackwardAndModifySelection:";
115 CPStandardKeyBindings[@"$@" + CPUpArrowFunctionKey] = @"moveToBeginningOfDocumentAndModifySelection:";
117 CPStandardKeyBindings[CPDownArrowFunctionKey] = @"moveDown:";
118 CPStandardKeyBindings[@"~" + CPDownArrowFunctionKey] = [@"moveForward:", @"moveToEndOfParagraph:"];
119 CPStandardKeyBindings[@"^" + CPDownArrowFunctionKey] = @"scrollPageDown:";
120 CPStandardKeyBindings[@"
@" + CPDownArrowFunctionKey] = @"moveToEndOfDocument:";
121 CPStandardKeyBindings[@"$" + CPDownArrowFunctionKey] = @"moveDownAndModifySelection:";
122 CPStandardKeyBindings[@"$~" + CPDownArrowFunctionKey] = @"moveParagraphForwardAndModifySelection:";
123 CPStandardKeyBindings[@"$@" + CPDownArrowFunctionKey] = @"moveToEndOfDocumentAndModifySelection:";
124 CPStandardKeyBindings[@"@^" + CPDownArrowFunctionKey] = @"makeBaseWritingDirectionNatural:";
125 CPStandardKeyBindings[@"@^~" + CPDownArrowFunctionKey] = @"makeTextWritingDirectionNatural:";
127 CPStandardKeyBindings[CPHomeFunctionKey] = @"scrollToBeginningOfDocument:";
128 CPStandardKeyBindings[@"$" + CPHomeFunctionKey] = @"moveToBeginningOfDocumentAndModifySelection:";
129 CPStandardKeyBindings[CPEndFunctionKey] = @"scrollToEndOfDocument:";
130 CPStandardKeyBindings[@"$" + CPEndFunctionKey] = @"moveToEndOfDocumentAndModifySelection:";
132 CPStandardKeyBindings[CPPageUpFunctionKey] = @"scrollPageUp:";
133 CPStandardKeyBindings[@"~" + CPPageUpFunctionKey] = @"pageUp:";
134 CPStandardKeyBindings[@"$" + CPPageUpFunctionKey] = @"pageUpAndModifySelection:";
135 CPStandardKeyBindings[CPPageDownFunctionKey] = @"scrollPageDown:";
136 CPStandardKeyBindings[@"~" + CPPageDownFunctionKey] = @"pageDown:";
137 CPStandardKeyBindings[@"$" + CPPageDownFunctionKey] = @"pageDownAndModifySelection:";
139 var CPKeyBindingCache = {};
141 @implementation CPKeyBinding : CPObject
144 unsigned _modifierFlags;
153 if (self !== [CPKeyBinding class])
156 [self createKeyBindingsFromJSObject:CPStandardKeyBindings];
159 + (void)createKeyBindingsFromJSObject:(JSObject)anObject
162 for (binding in anObject)
163 [self cacheKeyBinding:[[CPKeyBinding alloc] initWithPhysicalKeyString:binding selectors:anObject[binding]]];
166 + (void)cacheKeyBinding:(CPKeyBinding)aBinding
171 CPKeyBindingCache[[aBinding _cacheName]] = aBinding;
174 + (CPKeyBinding)keyBindingForKey:(CPString)aKey modifierFlags:(unsigned)aFlag
176 var tempBinding = [[self alloc] initWithKey:aKey modifierFlags:aFlag selectors:nil];
177 return CPKeyBindingCache[[tempBinding _cacheName]];
180 + (CPArray)selectorsForKey:(CPString)aKey modifierFlags:(unsigned)aFlag
182 return [[self keyBindingForKey:aKey modifierFlags:aFlag] selectors];
185 - (id)initWithPhysicalKeyString:(CPString)binding selectors:(CPArray)selectors
187 var components = binding.split(@""),
188 modifierFlags = ([components containsObject:@"$"] ? CPShiftKeyMask : 0) |
189 ([components containsObject:@"^"] ? CPControlKeyMask : 0) |
190 ([components containsObject:@"~"] ? CPAlternateKeyMask : 0) |
191 ([components containsObject:@"
@"] ? CPCommandKeyMask : 0);
193 if (![selectors isKindOfClass:CPArray])
194 selectors = [selectors];
196 return [self initWithKey:[components lastObject] modifierFlags:modifierFlags selectors:selectors];
199 - (id)initWithKey:(CPString)aKey modifierFlags:(unsigned)aFlag selectors:(CPArray)selectors
206 _modifierFlags = aFlag;
208 _selectors = selectors;
210 // We normalize our key binding string in order to properly cache it.
211 // We want to ensure the modifiers are always in the same order.
214 if (_modifierFlags & CPCommandKeyMask)
215 cacheName.push(@"@");
216 if (_modifierFlags & CPControlKeyMask)
217 cacheName.push(@"^");
218 if (_modifierFlags & CPAlternateKeyMask)
219 cacheName.push(@"~");
220 if (_modifierFlags & CPShiftKeyMask)
221 cacheName.push(@"$");
223 cacheName.push(_key);
225 _cacheName = cacheName.join(@"");
236 - (unsigned)modifierFlags
238 return _modifierFlags;
246 - (CPString)_cacheName
251 - (BOOL)isEqual:(CPKeyBinding)rhs
253 return _key === [rhs key] && _modifierFlags === [rhs modifierFlags];
256 - (CPString)description
258 return [CPString stringWithFormat:@"<KeyBinding string: '%@' modifierFlags: 0x%lx selectors: %@>", _key, _modifierFlags, _selectors];