home *** CD-ROM | disk | FTP | other *** search
/ OpenStep 4.2J (Developer) / os42jdev.iso / NextDeveloper / Examples / AppKit / Draw / undo.subproj / Change.m < prev    next >
Text File  |  1995-08-04  |  3KB  |  189 lines

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