|
|
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.