This is Change.m in view mode; [Download] [Up]
#import "change.h" /* * Please refer to external reference pages for complete * documentation on using the Change class. */ @interface Change(PrivateMethods) - calcTargetForAction:(SEL)theAction in:aView; @end @implementation Change /* Methods called directly by your code */ - init { [super init]; _changeFlags.disabled = NO; _changeFlags.hasBeenDone = NO; _changeFlags.changeInProgress = NO; _changeManager = nil; return self; } - startChange { return [self startChangeIn:nil]; } - startChangeIn:aView { _changeFlags.changeInProgress = YES; _changeManager = [NXApp calcTargetForAction:@selector(changeInProgress:)]; if (_changeManager == nil && aView != nil) _changeManager = [self calcTargetForAction:@selector(changeInProgress:) in:aView]; if(_changeManager != nil) { if ([_changeManager changeInProgress:self] && !_changeFlags.disabled) return self; else return nil; } return self; } - endChange { if (_changeManager == nil || _changeFlags.disabled) { [self free]; return nil; } else { _changeFlags.hasBeenDone = YES; _changeFlags.changeInProgress = NO; if ([_changeManager changeComplete:self]) return self; else return nil; } } - changeManager { return _changeManager; } /* Methods called by ChangeManager or by your code */ - disable { _changeFlags.disabled = YES; return self; } - (BOOL)disabled { return _changeFlags.disabled; } - (BOOL)hasBeenDone { return _changeFlags.hasBeenDone; } - (BOOL)changeInProgress { return _changeFlags.changeInProgress; } - (const char *)changeName /* * To be overridden */ { return ""; } /* Methods called by ChangeManager */ /* DO NOT call directly */ - saveBeforeChange /* * To be overridden */ { return self; } - saveAfterChange /* * To be overridden */ { return self; } - undoChange /* * To be overridden. End with: * return [super undoChange]; */ { _changeFlags.hasBeenDone = NO; return self; } - redoChange /* * To be overridden. End with: * return [super redoChange]; */ { _changeFlags.hasBeenDone = YES; return self; } - (BOOL)subsumeChange:change /* * To be overridden */ { return NO; } - (BOOL)incorporateChange:change /* * To be overridden */ { return NO; } - finishChange /* * To be overridden */ { return self; } /* Private Methods */ - calcTargetForAction:(SEL)theAction in:aView /* * This method is intended to behave exactly like the Application * method calcTargetForAction:, except that that method always returns * nil if the application is not active, where we do our best to come * up with a target anyway. */ { id responder, nextResponder; responder = [[aView window] firstResponder]; while (![responder respondsTo:theAction]) { nextResponder = nil; if ([responder respondsTo:@selector(nextResponder)]) nextResponder = [responder nextResponder]; if (nextResponder == nil && [responder isKindOf:[Window class]]) nextResponder = [responder delegate]; if (nextResponder == nil) nextResponder = NXApp; if (nextResponder == nil && responder == NXApp) nextResponder = [responder delegate]; responder = nextResponder; } return responder; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.