00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 @import <Foundation/CPObject.j>
00024
00025
00026 CPDeleteKeyCode = 8;
00027 CPTabKeyCode = 9;
00028 CPReturnKeyCode = 13;
00029 CPEscapeKeyCode = 27;
00030 CPLeftArrowKeyCode = 37;
00031 CPUpArrowKeyCode = 38;
00032 CPRightArrowKeyCode = 39;
00033 CPDownArrowKeyCode = 40;
00034
00041 @implementation CPResponder : CPObject
00042 {
00043 CPMenu _menu;
00044 CPResponder _nextResponder;
00045 }
00046
00047
00051 - (BOOL)acceptsFirstResponder
00052 {
00053 return NO;
00054 }
00055
00061 - (BOOL)becomeFirstResponder
00062 {
00063 return YES;
00064 }
00065
00070 - (BOOL)resignFirstResponder
00071 {
00072 return YES;
00073 }
00074
00075
00080 - (void)setNextResponder:(CPResponder)aResponder
00081 {
00082 _nextResponder = aResponder;
00083 }
00084
00088 - (CPResponder)nextResponder
00089 {
00090 return _nextResponder;
00091 }
00092
00097 - (void)interpretKeyEvents:(CPArray)events
00098 {
00099 var event,
00100 index = 0;
00101
00102 while(event = events[index++])
00103 {
00104 switch([event keyCode])
00105 {
00106 case CPLeftArrowKeyCode: [self moveBackward:self];
00107 break;
00108 case CPRightArrowKeyCode: [self moveForward:self];
00109 break;
00110 case CPUpArrowKeyCode: [self moveUp:self];
00111 break;
00112 case CPDownArrowKeyCode: [self moveDown:self];
00113 break;
00114 case CPDeleteKeyCode: [self deleteBackward:self];
00115 break;
00116 case CPReturnKeyCode:
00117 case 3: [self insertLineBreak:self];
00118 break;
00119
00120 case CPEscapeKeyCode: [self cancel:self];
00121 break;
00122
00123 case CPTabKeyCode: var shift = [event modifierFlags] & CPShiftKeyMask;
00124
00125 if (!shift)
00126 [self insertTab:self];
00127 else
00128 [self insertBackTab:self];
00129
00130 break;
00131
00132 default: [self insertText:[event characters]];
00133 }
00134 }
00135 }
00136
00141 - (void)mouseDown:(CPEvent)anEvent
00142 {
00143 [_nextResponder performSelector:_cmd withObject:anEvent];
00144 }
00145
00151 - (void)mouseDragged:(CPEvent)anEvent
00152 {
00153 [_nextResponder performSelector:_cmd withObject:anEvent];
00154 }
00155
00160 - (void)mouseUp:(CPEvent)anEvent
00161 {
00162 [_nextResponder performSelector:_cmd withObject:anEvent];
00163 }
00164
00169 - (void)mouseMoved:(CPEvent)anEvent
00170 {
00171 [_nextResponder performSelector:_cmd withObject:anEvent];
00172 }
00173
00174 - (void)mouseEntered:(CPEvent)anEvent
00175 {
00176 [_nextResponder performSelector:_cmd withObject:anEvent];
00177 }
00178
00183 - (void)mouseExited:(CPEvent)anEvent
00184 {
00185 [_nextResponder performSelector:_cmd withObject:anEvent];
00186 }
00187
00192 - (void)scrollWheel:(CPEvent)anEvent
00193 {
00194 [_nextResponder performSelector:_cmd withObject:anEvent];
00195 }
00196
00201 - (void)keyDown:(CPEvent)anEvent
00202 {
00203 [_nextResponder performSelector:_cmd withObject:anEvent];
00204 }
00205
00210 - (void)keyUp:(CPEvent)anEvent
00211 {
00212 [_nextResponder performSelector:_cmd withObject:anEvent];
00213 }
00214
00215
00216
00217
00218
00219
00220
00221 - (BOOL)performKeyEquivalent:(CPEvent)anEvent
00222 {
00223 return NO;
00224 }
00225
00226
00231 - (void)deleteBackward:(id)aSender
00232 {
00233 }
00234
00239 - (void)insertLineBreak:(id)aSender
00240 {
00241 [self insertNewline:aSender];
00242 }
00243
00248 - (void)insertNewline:(id)aSender
00249 {
00250 [self insertNewline:aSender];
00251 }
00252
00253 - (void)cancel:(id)sender
00254 {
00255 }
00256
00257 - (void)insertTab:(id)sender
00258 {
00259 }
00260
00261 - (void)insertBackTab:(id)sender
00262 {
00263 }
00264
00269 - (void)insertText:(CPString)aString
00270 {
00271 }
00272
00273
00279 - (void)doCommandBySelector:(SEL)aSelector
00280 {
00281 if([self respondsToSelector:aSelector])
00282 [self performSelector:aSelector];
00283 else
00284 [_nextResponder doCommandBySelector:aSelector];
00285 }
00286
00294 - (BOOL)tryToPerform:(SEL)aSelector with:(id)anObject
00295 {
00296 if([self respondsToSelector:aSelector])
00297 {
00298 [self performSelector:aSelector withObject:anObject];
00299
00300 return YES;
00301 }
00302
00303 return [_nextResponder tryToPerform:aSelector with:anObject];
00304 }
00305
00306
00307
00308 - (void)setMenu:(CPMenu)aMenu
00309 {
00310 _menu = aMenu;
00311 }
00312
00313 - (CPMenu)menu
00314 {
00315 return _menu;
00316 }
00317
00318
00322 - (CPUndoManager)undoManager
00323 {
00324 return [_nextResponder performSelector:_cmd];
00325 }
00326
00327
00332 - (void)noResponderFor:(SEL)anEventSelector
00333 {
00334 }
00335
00336 @end
00337
00338 var CPResponderNextResponderKey = @"CPResponderNextResponderKey";
00339
00340 @implementation CPResponder (CPCoding)
00341
00347 - (id)initWithCoder:(CPCoder)aCoder
00348 {
00349 self = [super init];
00350
00351 if (self)
00352 _nextResponder = [aCoder decodeObjectForKey:CPResponderNextResponderKey];
00353
00354 return self;
00355 }
00356
00361 - (void)encodeWithCoder:(CPCoder)aCoder
00362 {
00363
00364 if (_nextResponder !== nil)
00365 [aCoder encodeConditionalObject:_nextResponder forKey:CPResponderNextResponderKey];
00366 }
00367
00368 @end