|
|
1.1 ! root 1: #import "change.h" ! 2: ! 3: /* ! 4: * Please refer to external reference pages for complete ! 5: * documentation on using the Change class. ! 6: */ ! 7: ! 8: @interface Change(PrivateMethods) ! 9: ! 10: - calcTargetForAction:(SEL)theAction in:aView; ! 11: ! 12: @end ! 13: ! 14: @implementation Change ! 15: ! 16: /* Methods called directly by your code */ ! 17: ! 18: - init ! 19: { ! 20: [super init]; ! 21: _changeFlags.disabled = NO; ! 22: _changeFlags.hasBeenDone = NO; ! 23: _changeFlags.changeInProgress = NO; ! 24: _changeManager = nil; ! 25: return self; ! 26: } ! 27: ! 28: - startChange ! 29: { ! 30: return [self startChangeIn:nil]; ! 31: } ! 32: ! 33: - startChangeIn:aView ! 34: { ! 35: _changeFlags.changeInProgress = YES; ! 36: _changeManager = [NXApp calcTargetForAction:@selector(changeInProgress:)]; ! 37: ! 38: if (_changeManager == nil && aView != nil) ! 39: _changeManager = [self calcTargetForAction:@selector(changeInProgress:) in:aView]; ! 40: ! 41: if(_changeManager != nil) { ! 42: if ([_changeManager changeInProgress:self] && !_changeFlags.disabled) ! 43: return self; ! 44: else ! 45: return nil; ! 46: } ! 47: ! 48: return self; ! 49: } ! 50: ! 51: - endChange ! 52: { ! 53: if (_changeManager == nil || _changeFlags.disabled) { ! 54: [self free]; ! 55: return nil; ! 56: } else { ! 57: _changeFlags.hasBeenDone = YES; ! 58: _changeFlags.changeInProgress = NO; ! 59: if ([_changeManager changeComplete:self]) ! 60: return self; ! 61: else ! 62: return nil; ! 63: } ! 64: } ! 65: ! 66: - changeManager ! 67: { ! 68: return _changeManager; ! 69: } ! 70: ! 71: /* Methods called by ChangeManager or by your code */ ! 72: ! 73: - disable ! 74: { ! 75: _changeFlags.disabled = YES; ! 76: return self; ! 77: } ! 78: ! 79: - (BOOL)disabled ! 80: { ! 81: return _changeFlags.disabled; ! 82: } ! 83: ! 84: - (BOOL)hasBeenDone ! 85: { ! 86: return _changeFlags.hasBeenDone; ! 87: } ! 88: ! 89: - (BOOL)changeInProgress ! 90: { ! 91: return _changeFlags.changeInProgress; ! 92: } ! 93: ! 94: - (const char *)changeName ! 95: /* ! 96: * To be overridden ! 97: */ ! 98: { ! 99: return ""; ! 100: } ! 101: ! 102: /* Methods called by ChangeManager */ ! 103: /* DO NOT call directly */ ! 104: ! 105: - saveBeforeChange ! 106: /* ! 107: * To be overridden ! 108: */ ! 109: { ! 110: return self; ! 111: } ! 112: ! 113: - saveAfterChange ! 114: /* ! 115: * To be overridden ! 116: */ ! 117: { ! 118: return self; ! 119: } ! 120: ! 121: - undoChange ! 122: /* ! 123: * To be overridden. End with: ! 124: * return [super undoChange]; ! 125: */ ! 126: { ! 127: _changeFlags.hasBeenDone = NO; ! 128: return self; ! 129: } ! 130: ! 131: - redoChange ! 132: /* ! 133: * To be overridden. End with: ! 134: * return [super redoChange]; ! 135: */ ! 136: { ! 137: _changeFlags.hasBeenDone = YES; ! 138: return self; ! 139: } ! 140: ! 141: - (BOOL)subsumeChange:change ! 142: /* ! 143: * To be overridden ! 144: */ ! 145: { ! 146: return NO; ! 147: } ! 148: ! 149: - (BOOL)incorporateChange:change ! 150: /* ! 151: * To be overridden ! 152: */ ! 153: { ! 154: return NO; ! 155: } ! 156: ! 157: - finishChange ! 158: /* ! 159: * To be overridden ! 160: */ ! 161: { ! 162: return self; ! 163: } ! 164: ! 165: /* Private Methods */ ! 166: ! 167: - calcTargetForAction:(SEL)theAction in:aView ! 168: /* ! 169: * This method is intended to behave exactly like the Application ! 170: * method calcTargetForAction:, except that that method always returns ! 171: * nil if the application is not active, where we do our best to come ! 172: * up with a target anyway. ! 173: */ ! 174: { ! 175: id responder, nextResponder; ! 176: ! 177: responder = [[aView window] firstResponder]; ! 178: while (![responder respondsTo:theAction]) { ! 179: nextResponder = nil; ! 180: if ([responder respondsTo:@selector(nextResponder)]) ! 181: nextResponder = [responder nextResponder]; ! 182: if (nextResponder == nil && [responder isKindOf:[Window class]]) ! 183: nextResponder = [responder delegate]; ! 184: if (nextResponder == nil) ! 185: nextResponder = NXApp; ! 186: if (nextResponder == nil && responder == NXApp) ! 187: nextResponder = [responder delegate]; ! 188: responder = nextResponder; ! 189: } ! 190: return responder; ! 191: } ! 192: ! 193: @end
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.