home *** CD-ROM | disk | FTP | other *** search
/ NeXTSTEP 3.3 (Developer) / NeXT_Developer-3.3.iso / NextDeveloper / Examples / AppKit / Draw / undo.subproj / Change.m < prev    next >
Encoding:
Text File  |  1992-02-10  |  3.2 KB  |  194 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)
  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
  194.