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 CPUpArrowKeyCode = 63232;
00028 CPDownArrowKeyCode = 63233;
00029 CPLeftArrowKeyCode = 63234;
00030 CPRightArrowKeyCode = 63235;
00031
00037 @implementation CPResponder : CPObject
00038 {
00039 CPMenu _menu;
00040 CPResponder _nextResponder;
00041 }
00042
00043
00047 - (BOOL)acceptsFirstResponder
00048 {
00049 return NO;
00050 }
00051
00057 - (BOOL)becomeFirstResponder
00058 {
00059 return YES;
00060 }
00061
00066 - (BOOL)resignFirstResponder
00067 {
00068 return YES;
00069 }
00070
00071
00076 - (void)setNextResponder:(CPResponder)aResponder
00077 {
00078 _nextResponder = aResponder;
00079 }
00080
00084 - (CPResponder)nextResponder
00085 {
00086 return _nextResponder;
00087 }
00088
00093 - (void)interpretKeyEvents:(CPArray)events
00094 {
00095 var event,
00096 index = 0;
00097
00098 while(event = events[index++])
00099 {
00100 switch([event keyCode])
00101 {
00102 case CPLeftArrowKeyCode: [self moveBackward:self];
00103 break;
00104 case CPRightArrowKeyCode: [self moveForward:self];
00105 break;
00106 case CPUpArrowKeyCode: [self moveUp:self];
00107 break;
00108 case CPDownArrowKeyCode: [self moveDown:self];
00109 break;
00110 case CPDeleteKeyCode: [self deleteBackward:self];
00111 break;
00112 case 3:
00113 case 13: [self insertLineBreak:self];
00114 break;
00115 default: [self insertText:[event characters]];
00116 }
00117 }
00118 }
00119
00124 - (void)mouseDown:(CPEvent)anEvent
00125 {
00126 [_nextResponder performSelector:_cmd withObject:anEvent];
00127 }
00128
00134 - (void)mouseDragged:(CPEvent)anEvent
00135 {
00136 [_nextResponder performSelector:_cmd withObject:anEvent];
00137 }
00138
00143 - (void)mouseUp:(CPEvent)anEvent
00144 {
00145 [_nextResponder performSelector:_cmd withObject:anEvent];
00146 }
00147
00152 - (void)mouseMoved:(CPEvent)anEvent
00153 {
00154 [_nextResponder performSelector:_cmd withObject:anEvent];
00155 }
00156
00157 - (void)mouseEntered:(CPEvent)anEvent
00158 {
00159 [_nextResponder performSelector:_cmd withObject:anEvent];
00160 }
00161
00166 - (void)mouseExited:(CPEvent)anEvent
00167 {
00168 [_nextResponder performSelector:_cmd withObject:anEvent];
00169 }
00170
00175 - (void)scrollWheel:(CPEvent)anEvent
00176 {
00177 [_nextResponder performSelector:_cmd withObject:anEvent];
00178 }
00179
00184 - (void)keyDown:(CPEvent)anEvent
00185 {
00186 [_nextResponder performSelector:_cmd withObject:anEvent];
00187 }
00188
00193 - (void)keyUp:(CPEvent)anEvent
00194 {
00195 [_nextResponder performSelector:_cmd withObject:anEvent];
00196 }
00197
00198
00199
00200
00201
00202
00203
00204 - (BOOL)performKeyEquivalent:(CPEvent)anEvent
00205 {
00206 return NO;
00207 }
00208
00209
00214 - (void)deleteBackward:(id)aSender
00215 {
00216 }
00217
00222 - (void)insertLineBreak:(id)aSender
00223 {
00224 }
00225
00230 - (void)insertText:(CPString)aString
00231 {
00232 }
00233
00234
00240 - (void)doCommandBySelector:(SEL)aSelector
00241 {
00242 if([self respondsToSelector:aSelector])
00243 [self performSelector:aSelector];
00244 else
00245 [_nextResponder doCommandBySelector:aSelector];
00246 }
00247
00255 - (BOOL)tryToPerform:(SEL)aSelector with:(id)anObject
00256 {
00257 if([self respondsToSelector:aSelector])
00258 {
00259 [self performSelector:aSelector withObject:anObject];
00260
00261 return YES;
00262 }
00263
00264 return [_nextResponder tryToPerform:aSelector with:anObject];
00265 }
00266
00267
00268
00269 - (void)setMenu:(CPMenu)aMenu
00270 {
00271 _menu = aMenu;
00272 }
00273
00274 - (CPMenu)menu
00275 {
00276 return _menu;
00277 }
00278
00279
00283 - (CPUndoManager)undoManager
00284 {
00285 return [_nextResponder performSelector:_cmd];
00286 }
00287
00288
00293 - (void)noResponderFor:(SEL)anEventSelector
00294 {
00295 }
00296
00297 @end
00298
00299 var CPResponderNextResponderKey = @"CPResponderNextResponderKey";
00300
00301 @implementation CPResponder (CPCoding)
00302
00308 - (id)initWithCoder:(CPCoder)aCoder
00309 {
00310 self = [super init];
00311
00312 if (self)
00313 _nextResponder = [aCoder decodeObjectForKey:CPResponderNextResponderKey];
00314
00315 return self;
00316 }
00317
00322 - (void)encodeWithCoder:(CPCoder)aCoder
00323 {
00324 [aCoder encodeConditionalObject:_nextResponder forKey:CPResponderNextResponderKey];
00325 }
00326
00327 @end