API 0.9.5
AppKit/CPKeyBinding.j
Go to the documentation of this file.
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
 All Classes Files Functions Variables Defines