home *** CD-ROM | disk | FTP | other *** search
/ NeXTSTEP 3.0 / NeXTSTEP3.0.iso / NextDeveloper / Examples / AppKit / Draw / undo.subproj / Change.m < prev    next >
Encoding:
Text File  |  1992-02-10  |  3.2 KB  |  192 lines

  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)@    Y  return self;
  43.     else
  44.         return nil;
  45.     }
  46.  
  47.     return self;
  48. }
  49.  
  50. - endChange
  51. {
  52.     if (_changeManager == nil || _changeFlags.disabled) {
  53.     [self free];
  54.     return nil;
  55.     } else {
  56.     _changeFlags.hasBeenDone = YES;
  57.     _changeFlags.changeInProgress = NO;
  58.     if ([_changeManager changeComplete:self])
  59.         return self;
  60.     else
  61.         return nil;
  62.     }
  63. }
  64.  
  65. - changeManager
  66. {
  67.     return _changeManager;
  68. }
  69.  
  70. /* Methods called by ChangeManager or by your code */
  71.  
  72. - disable
  73. {
  74.     _changeFlags.disabled = YES;
  75.     return self;
  76. }
  77.  
  78. - (BOOL)disabled
  79. {
  80.     return _changeFlags.disabled;
  81. }
  82.  
  83. - (BOOL)hasBeenDone
  84. {
  85.     return _changeFlags.hasBeenDone;
  86. }
  87.  
  88. - (BOOL)changeInProgress
  89. {
  90.     return _changeFlags.changeInProgress;
  91. }
  92.  
  93. - (const char *)changeName
  94. /*
  95.  * To be overridden 
  96.  */
  97. {
  98.     return "";
  99. }
  100.  
  101. /* Methods called by ChangeManager */
  102. /* DO NOT call directly */
  103.  
  104. - saveBeforeChange
  105. /*
  106.  * To be overridden 
  107.  */
  108. {
  109.     return self;
  110. }
  111.  
  112. - saveAfterChange
  113. /*
  114.  * To be overridden 
  115.  */
  116. {
  117.     return self;
  118. }
  119.  
  120. - undoChange
  121. /*
  122.  * To be overridden. End with:
  123.  * return [super undoChange];
  124.  */
  125. {
  126.     _changeFlags.hasBeenDone = NO;
  127.     return self;
  128. }
  129.  
  130. - redoChange
  131. /*
  132.  * To be overridden. End with:
  133.  * return [super redoChange];
  134.  */
  135. {
  136.     _changeFlags.hasBeenDone = YES;
  137.     return self;
  138. }
  139.  
  140. - (BOOL)subsumeChange:change
  141. /*
  142.  * To be overridden 
  143.  */
  144. {
  145.     return NO;
  146. }
  147.  
  148. - (BOOL)incorporateChange:change
  149. /*
  150.  * To be overridden 
  151.  */
  152. {
  153.     return NO;
  154. }
  155.  
  156. - finishChange
  157. /*
  158.  * To be overridden 
  159.  */
  160. {
  161.     return self;
  162. }
  163.  
  164. /* Private Methods */
  165.  
  166. - calcTargetForAction:(SEL)theAction in:aView
  167. /*
  168.  * This method is intended to behave exactly like the Application
  169.  * method calcTargetForAction:, except that that method always returns
  170.  * nil if the application is not active, where we do our best to come
  171.  * up with a target anyway.
  172.  */
  173. {
  174.     id responder, nextResponder;
  175.  
  176.     responder = [[aView window] firstResponder];
  177.     while (![responder respondsTo:theAction]) {
  178.         nextResponder = nil;
  179.         if ([responder respondsTo:@selector(nextResponder)])
  180.             nextResponder = [responder nextResponder];
  181.     if (nextResponder == nil && [responder isKindOf:[Window class]])
  182.         nextResponder = [responder delegate];
  183.     if (nextResponder == nil)
  184.         nextResponder = NXApp;
  185.     if (nextResponder == nil && responder == NXApp)
  186.         nextResponder = [responder delegate];
  187.     responder = nextResponder;@    ` }
  188.     return responder;
  189. }
  190.  
  191. @end
  192.