![]() |
API 0.9.5
|
00001 /* 00002 * CPKeyBinding.j 00003 * AppKit 00004 * 00005 * Created by Nicholas Small. 00006 * Copyright 2010, 280 North, Inc. 00007 * 00008 * This library is free software; you can redistribute it and/or 00009 * modify it under the terms of the GNU Lesser General Public 00010 * License as published by the Free Software Foundation; either 00011 * version 2.1 of the License, or (at your option) any later version. 00012 * 00013 * This library is distributed in the hope that it will be useful, 00014 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00015 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00016 * Lesser General Public License for more details. 00017 * 00018 * You should have received a copy of the GNU Lesser General Public 00019 * License along with this library; if not, write to the Free Software 00020 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 00021 */ 00022 00023 00024 00025 00026 CPStandardKeyBindings = { 00027 @"@.": @"cancelOperation:", 00028 00029 @"^a": @"moveToBeginningOfParagraph:", 00030 @"^$a": @"moveToBeginningOfParagraphAndModifySelection:", 00031 @"^b": @"moveBackward:", 00032 @"^$b": @"moveBackwardAndModifySelection:", 00033 @"^~b": @"moveWordBackward:", 00034 @"^~$b": @"moveWordBackwardAndModifySelection:", 00035 @"^d": @"deleteForward:", 00036 @"^e": @"moveToEndOfParagraph:", 00037 @"^$e": @"moveToEndOfParagraphAndModifySelection:", 00038 @"^f": @"moveForward:", 00039 @"^$f": @"moveForwardAndModifySelection:", 00040 @"^~f": @"moveWordForward:", 00041 @"^~$f": @"moveWordForwardAndModifySelection:", 00042 @"^h": @"deleteBackward:", 00043 @"^k": @"deleteToEndOfParagraph:", 00044 @"^l": @"centerSelectionInVisibleArea:", 00045 @"^n": @"moveDown:", 00046 @"^$n": @"moveDownAndModifySelection:", 00047 @"^o": [@"insertNewlineIgnoringFieldEditor:", @"moveBackward:"], 00048 @"^p": @"moveUp:", 00049 @"^$p": @"moveUpAndModifySelection:", 00050 @"^t": @"transpose:", 00051 @"^v": @"pageDown:", 00052 @"^$v": @"pageDownAndModifySelection:", 00053 @"^y": @"yank:" 00054 }; 00055 00056 CPStandardKeyBindings[CPNewlineCharacter] = @"insertNewline:"; 00057 CPStandardKeyBindings[CPCarriageReturnCharacter] = @"insertNewline:"; 00058 CPStandardKeyBindings[CPEnterCharacter] = @"insertNewline:"; 00059 CPStandardKeyBindings[@"~" + CPNewlineCharacter] = @"insertNewlineIgnoringFieldEditor:"; 00060 CPStandardKeyBindings[@"~" + CPCarriageReturnCharacter] = @"insertNewlineIgnoringFieldEditor:"; 00061 CPStandardKeyBindings[@"~" + CPEnterCharacter] = @"insertNewlineIgnoringFieldEditor:"; 00062 CPStandardKeyBindings[@"^" + CPNewlineCharacter] = @"insertLineBreak:"; 00063 CPStandardKeyBindings[@"^" + CPCarriageReturnCharacter] = @"insertLineBreak:"; 00064 CPStandardKeyBindings[@"^" + CPEnterCharacter] = @"insertLineBreak:"; 00065 00066 CPStandardKeyBindings[CPBackspaceCharacter] = @"deleteBackward:"; 00067 CPStandardKeyBindings[@"~" + CPBackspaceCharacter] = @"deleteWordBackward:"; 00068 CPStandardKeyBindings[CPDeleteCharacter] = @"deleteBackward:"; 00069 CPStandardKeyBindings[@"@" + CPDeleteCharacter] = @"deleteToBeginningOfLine:"; 00070 CPStandardKeyBindings[@"~" + CPDeleteCharacter] = @"deleteWordBackward:"; 00071 CPStandardKeyBindings[@"^" + CPDeleteCharacter] = @"deleteBackwardByDecomposingPreviousCharacter:"; 00072 CPStandardKeyBindings[@"^~" + CPDeleteCharacter] = @"deleteWordBackward:"; 00073 00074 CPStandardKeyBindings[CPDeleteFunctionKey] = @"deleteForward:"; 00075 CPStandardKeyBindings[@"~" + CPDeleteFunctionKey] = @"deleteWordForward:"; 00076 00077 CPStandardKeyBindings[CPTabCharacter] = @"insertTab:"; 00078 CPStandardKeyBindings[@"~" + CPTabCharacter] = @"insertTabIgnoringFieldEditor:"; 00079 CPStandardKeyBindings[@"^" + CPTabCharacter] = @"selectNextKeyView:"; 00080 CPStandardKeyBindings[CPBackTabCharacter] = @"insertBacktab:"; 00081 CPStandardKeyBindings[@"^" + CPBackTabCharacter] = @"selectPreviousKeyView:"; 00082 00083 CPStandardKeyBindings[CPEscapeFunctionKey] = @"cancelOperation:"; 00084 CPStandardKeyBindings[@"~" + CPEscapeFunctionKey] = @"complete:"; 00085 CPStandardKeyBindings[CPF5FunctionKey] = @"complete:"; 00086 00087 CPStandardKeyBindings[CPLeftArrowFunctionKey] = @"moveLeft:"; 00088 CPStandardKeyBindings[@"~" + CPLeftArrowFunctionKey] = @"moveWordLeft:"; 00089 CPStandardKeyBindings[@"^" + CPLeftArrowFunctionKey] = @"moveToLeftEndOfLine:"; 00090 CPStandardKeyBindings[@"@" + CPLeftArrowFunctionKey] = @"moveToLeftEndOfLine:"; 00091 CPStandardKeyBindings[@"$" + CPLeftArrowFunctionKey] = @"moveLeftAndModifySelection:"; 00092 CPStandardKeyBindings[@"$~" + CPLeftArrowFunctionKey] = @"moveWordLeftAndModifySelection:"; 00093 CPStandardKeyBindings[@"$^" + CPLeftArrowFunctionKey] = @"moveToLeftEndOfLineAndModifySelection:"; 00094 CPStandardKeyBindings[@"$@" + CPLeftArrowFunctionKey] = @"moveToLeftEndOfLineAndModifySelection:"; 00095 CPStandardKeyBindings[@"@^" + CPLeftArrowFunctionKey] = @"makeBaseWritingDirectionRightToLeft:"; 00096 CPStandardKeyBindings[@"@^~" + CPLeftArrowFunctionKey] = @"makeTextWritingDirectionRightToLeft:"; 00097 00098 CPStandardKeyBindings[CPRightArrowFunctionKey] = @"moveRight:"; 00099 CPStandardKeyBindings[@"~" + CPRightArrowFunctionKey] = @"moveWordRight:"; 00100 CPStandardKeyBindings[@"^" + CPRightArrowFunctionKey] = @"moveToRightEndOfLine:"; 00101 CPStandardKeyBindings[@"@" + CPRightArrowFunctionKey] = @"moveToRightEndOfLine:"; 00102 CPStandardKeyBindings[@"$" + CPRightArrowFunctionKey] = @"moveRightAndModifySelection:"; 00103 CPStandardKeyBindings[@"$~" + CPRightArrowFunctionKey] = @"moveWordRightAndModifySelection:"; 00104 CPStandardKeyBindings[@"$^" + CPRightArrowFunctionKey] = @"moveToRightEndOfLineAndModifySelection:"; 00105 CPStandardKeyBindings[@"$@" + CPRightArrowFunctionKey] = @"moveToRightEndOfLineAndModifySelection:"; 00106 CPStandardKeyBindings[@"@^" + CPRightArrowFunctionKey] = @"makeBaseWritingDirectionLeftToRight:"; 00107 CPStandardKeyBindings[@"@^~" + CPRightArrowFunctionKey] = @"makeTextWritingDirectionLeftToRight:"; 00108 00109 CPStandardKeyBindings[CPUpArrowFunctionKey] = @"moveUp:"; 00110 CPStandardKeyBindings[@"~" + CPUpArrowFunctionKey] = [@"moveBackward:", @"moveToBeginningOfParagraph:"]; 00111 CPStandardKeyBindings[@"^" + CPUpArrowFunctionKey] = @"scrollPageUp:"; 00112 CPStandardKeyBindings[@"@" + CPUpArrowFunctionKey] = @"moveToBeginningOfDocument:"; 00113 CPStandardKeyBindings[@"$" + CPUpArrowFunctionKey] = @"moveUpAndModifySelection:"; 00114 CPStandardKeyBindings[@"$~" + CPUpArrowFunctionKey] = @"moveParagraphBackwardAndModifySelection:"; 00115 CPStandardKeyBindings[@"$@" + CPUpArrowFunctionKey] = @"moveToBeginningOfDocumentAndModifySelection:"; 00116 00117 CPStandardKeyBindings[CPDownArrowFunctionKey] = @"moveDown:"; 00118 CPStandardKeyBindings[@"~" + CPDownArrowFunctionKey] = [@"moveForward:", @"moveToEndOfParagraph:"]; 00119 CPStandardKeyBindings[@"^" + CPDownArrowFunctionKey] = @"scrollPageDown:"; 00120 CPStandardKeyBindings[@"@" + CPDownArrowFunctionKey] = @"moveToEndOfDocument:"; 00121 CPStandardKeyBindings[@"$" + CPDownArrowFunctionKey] = @"moveDownAndModifySelection:"; 00122 CPStandardKeyBindings[@"$~" + CPDownArrowFunctionKey] = @"moveParagraphForwardAndModifySelection:"; 00123 CPStandardKeyBindings[@"$@" + CPDownArrowFunctionKey] = @"moveToEndOfDocumentAndModifySelection:"; 00124 CPStandardKeyBindings[@"@^" + CPDownArrowFunctionKey] = @"makeBaseWritingDirectionNatural:"; 00125 CPStandardKeyBindings[@"@^~" + CPDownArrowFunctionKey] = @"makeTextWritingDirectionNatural:"; 00126 00127 CPStandardKeyBindings[CPHomeFunctionKey] = @"scrollToBeginningOfDocument:"; 00128 CPStandardKeyBindings[@"$" + CPHomeFunctionKey] = @"moveToBeginningOfDocumentAndModifySelection:"; 00129 CPStandardKeyBindings[CPEndFunctionKey] = @"scrollToEndOfDocument:"; 00130 CPStandardKeyBindings[@"$" + CPEndFunctionKey] = @"moveToEndOfDocumentAndModifySelection:"; 00131 00132 CPStandardKeyBindings[CPPageUpFunctionKey] = @"scrollPageUp:"; 00133 CPStandardKeyBindings[@"~" + CPPageUpFunctionKey] = @"pageUp:"; 00134 CPStandardKeyBindings[@"$" + CPPageUpFunctionKey] = @"pageUpAndModifySelection:"; 00135 CPStandardKeyBindings[CPPageDownFunctionKey] = @"scrollPageDown:"; 00136 CPStandardKeyBindings[@"~" + CPPageDownFunctionKey] = @"pageDown:"; 00137 CPStandardKeyBindings[@"$" + CPPageDownFunctionKey] = @"pageDownAndModifySelection:"; 00138 00139 var CPKeyBindingCache = {}; 00140 00141 @implementation CPKeyBinding : CPObject 00142 { 00143 CPString _key; 00144 unsigned _modifierFlags; 00145 00146 CPArray _selectors; 00147 00148 CPString _cacheName; 00149 } 00150 00151 + (void)initialize 00152 { 00153 if ([self class] !== CPKeyBinding) 00154 return; 00155 00156 [self createKeyBindingsFromJSObject:CPStandardKeyBindings]; 00157 } 00158 00159 + (void)createKeyBindingsFromJSObject:(JSObject)anObject 00160 { 00161 var binding; 00162 for (binding in anObject) 00163 [self cacheKeyBinding:[[CPKeyBinding alloc] initWithPhysicalKeyString:binding selectors:anObject[binding]]]; 00164 } 00165 00166 + (void)cacheKeyBinding:(CPKeyBinding)aBinding 00167 { 00168 if (!aBinding) 00169 return; 00170 00171 CPKeyBindingCache[[aBinding _cacheName]] = aBinding; 00172 } 00173 00174 + (CPKeyBinding)keyBindingForKey:(CPString)aKey modifierFlags:(unsigned)aFlag 00175 { 00176 var tempBinding = [[self alloc] initWithKey:aKey modifierFlags:aFlag selectors:nil]; 00177 return CPKeyBindingCache[[tempBinding _cacheName]]; 00178 } 00179 00180 + (CPArray)selectorsForKey:(CPString)aKey modifierFlags:(unsigned)aFlag 00181 { 00182 return [[self keyBindingForKey:aKey modifierFlags:aFlag] selectors]; 00183 } 00184 00185 - (id)initWithPhysicalKeyString:(CPString)binding selectors:(CPArray)selectors 00186 { 00187 var components = binding.split(@""), 00188 modifierFlags = ([components containsObject:@"$"] ? CPShiftKeyMask : 0) | 00189 ([components containsObject:@"^"] ? CPControlKeyMask : 0) | 00190 ([components containsObject:@"~"] ? CPAlternateKeyMask : 0) | 00191 ([components containsObject:@"@"] ? CPCommandKeyMask : 0); 00192 00193 if (![selectors isKindOfClass:CPArray]) 00194 selectors = [selectors]; 00195 00196 return [self initWithKey:[components lastObject] modifierFlags:modifierFlags selectors:selectors]; 00197 } 00198 00199 - (id)initWithKey:(CPString)aKey modifierFlags:(unsigned)aFlag selectors:(CPArray)selectors 00200 { 00201 self = [super init]; 00202 00203 if (self) 00204 { 00205 _key = aKey; 00206 _modifierFlags = aFlag; 00207 00208 _selectors = selectors; 00209 00210 // We normalize our key binding string in order to properly cache it. 00211 // We want to ensure the modifiers are always in the same order. 00212 var cacheName = []; 00213 00214 if (_modifierFlags & CPCommandKeyMask) 00215 cacheName.push(@"@"); 00216 if (_modifierFlags & CPControlKeyMask) 00217 cacheName.push(@"^"); 00218 if (_modifierFlags & CPAlternateKeyMask) 00219 cacheName.push(@"~"); 00220 if (_modifierFlags & CPShiftKeyMask) 00221 cacheName.push(@"$"); 00222 00223 cacheName.push(_key); 00224 00225 _cacheName = cacheName.join(@""); 00226 } 00227 00228 return self; 00229 } 00230 00231 - (CPString)key 00232 { 00233 return _key; 00234 } 00235 00236 - (unsigned)modifierFlags 00237 { 00238 return _modifierFlags; 00239 } 00240 00241 - (CPArray)selectors 00242 { 00243 return _selectors; 00244 } 00245 00246 - (CPString)_cacheName 00247 { 00248 return _cacheName; 00249 } 00250 00251 - (BOOL)isEqual:(CPKeyBinding)rhs 00252 { 00253 return _key === [rhs key] && _modifierFlags === [rhs modifierFlags]; 00254 } 00255 00256 - (CPString)description 00257 { 00258 return [CPString stringWithFormat:@"<KeyBinding string: '%@' modifierFlags: 0x%lx selectors: %@>", _key, _modifierFlags, _selectors]; 00259 } 00260 00261 @end