home *** CD-ROM | disk | FTP | other *** search
/ NeXTSTEP 3.0 / NeXTSTEP3.0.iso / NextDeveloper / Examples / AppKit / Draw / graphicsUndo.subproj / ChangeDetail.m < prev    next >
Text File  |  1992-03-15  |  6KB  |  376 lines

  1. #import "drawundo.h"
  2.  
  3. /*
  4.  * Please refer to external documentation about Draw
  5.  * with Undo for information about what ChangeDetails 
  6.  * are and where they fit in.
  7.  *
  8.  * The ChangeDetail.h and ChangeDetail.m files contain
  9.  * the @interfaces and @implementations for the 11 
  10.  * subclasses of ChangeDetail, as well as for ChangeDetail
  11.  * itself. We grouped all the classes into one pair of 
  12.  * files because the classes are so tiny and their behavior
  13.  * is so similar.
  14.  *
  15.  * ChangeDetail
  16.  *     ArrowChangeDetail
  17.  *     DimensionsChangeDetail
  18.  *     FillColorChangeDetail
  19.  *     FillModeChangeDetail
  20.  *     LineCapChangeDetail
  21.  *     LineColorChangeDetail
  22.  *     LineJoinChangeDetail
  23.  *     LineWidthChangeDetail
  24.  *     MoveChangeDetail
  25.  *     OrderChangeDetail
  26.  * 
  27.  */
  28.  
  29. @interface ChangeDetail(PrivateMethods)
  30.  
  31. - (BOOL)personalChangeExpected;
  32.  
  33. @end
  34.  
  35. @implementation ChangeDetail
  36.  
  37. - initGraphic:aGraphic change:aChange
  38. {
  39.     List *subGraphics;
  40.     int count, i;
  41.     id changeDetail;
  42.     
  43.     graphic = aGraphic;
  44.     change = aChange;
  45.     if ([graphic isKindOf:[Group class]] && [self useNestedDetails]) {
  46.         detailails = [[List alloc] init];
  47.     subGraphics = [(Group *)graphic subGraphics];
  48.     count = [subGraphics count];
  49.     changeExpected = NO;
  50.     for (i = 0; i < count; i++) {
  51.         changeDetail = [[[aChange changeDetailClass] alloc] initGraphic:[subGraphics objectAt:i] change:aChange];
  52.         changeExpected = changeExpected || [changeDetail changeExpected];
  53.         [detailsDetails addObject:changeDetail];
  54.     }
  55.     } else {
  56.         detailsDetails = nil;
  57.     changeExpected = [self personalChangeExpected];
  58.     }
  59.     return self;
  60. }
  61.  
  62. - free
  63. {
  64.     [detailsDetails freeObjects];
  65.     [detailsDetails free];
  66.     return [super free];
  67. }
  68.  
  69. - graphic
  70. {
  71.     return graphic;
  72. }
  73.  
  74. - (BOOL)useNestedDetails
  75. {
  76.     return YES;
  77. }
  78.  
  79. - (BOOL)changeExpected
  80. {
  81.     return changeExpected;
  82. }
  83.  
  84. - recordDetail
  85. {
  86.     if(detailsDetails)
  87.         [detailsDetails makeObjectsPerform:@selector(recordDetail)];
  88.     else
  89.       [self recordIt];
  90.     return self;
  91. }
  92.  
  93. - undoDetail
  94. {
  95.     if (detailsDetails)
  96.         [detailsDetails makeObjectsPerform:@selector(undoDetail)];
  97.     else
  98.       [self undoIt];
  99.     return self;
  100. }
  101.  
  102. - redoDetail
  103. {
  104.     if (detailsDetails)
  105.         [detailsDetails makeObjectsPerform:@selector(redoDetail)];
  106.     else
  107.       [self redoIt];
  108.     return self;
  109. }
  110.  
  111. - recordIt
  112. {
  113.     /* Implemented by subclasses */
  114.     return self;
  115. }
  116.  
  117. - undoIt
  118. {
  119.     /* Implemented by subclasses */
  120.     return self;
  121. }
  122.  
  123. - redoIt
  124. {
  125.     /* Implemented by subclasses */
  126.     return self;
  127. }
  128.  
  129. - (BOOL)personalChangeExpected
  130. {
  131.     return YES;
  132. }
  133.  
  134. @end
  135.  
  136. @implementation ArrowChangeDetail
  137.  
  138. - recordIt
  139. {
  140.     oldLineArrow = [graphic lineArrow];
  141.     return self;
  142. }
  143.  
  144. - undoIt
  145. {
  146.     [graphic setLineArrow:oldLineArrow];
  147.     return self;
  148. }
  149.  
  150. - redoIt
  151. {
  152.     [graphic setLineArrow:[change lineArrow]];
  153.     return self;
  154. }
  155.  
  156. - (BOOL)personalChangeExpected
  157. {
  158.     return ([graphic lineArrow] != [change lineArrow]);
  159. }
  160.  
  161. @end
  162.  
  163. @implementation DimensionsChangeDetail
  164.  
  165. - (BOOL)useNestedDetails
  166. {
  167.     return NO;
  168. }
  169.  
  170. - recordDetail
  171. {
  172.     [graphic getBounds:&oldBounds];
  173.     return self;
  174. }
  175.  
  176. - undoDetail
  177. {
  178.     [graphic getBounds:&newBounds];
  179.     [graphic setBounds:&oldBounds];
  180.     return self;
  181. }
  182.  
  183. - redoDetail
  184. {
  185.     [graphic setBounds:&newBounds];
  186.     return self;
  187. }
  188.  
  189. @end
  190.  
  191. @implementation FillChangeDetail
  192.  
  193. - recordIt
  194. {
  195.     oldFillColor = [graphic fillColor];
  196.     oldFillMode = [graphic fill];
  197.     return self;
  198. }
  199.  
  200. - undoIt
  201. {
  202.     newFillColor = [gra fillColor];
  203.     newFillMode = [graphic fill];
  204.     [graphic setFillColor:&oldFillColor];
  205.     [graphic setFill:oldFillMode];
  206.     return self;
  207. }
  208.  
  209. - redoIt
  210. {
  211.     [graphic setFillColor:&newFillColor];
  212.     [graphic setFill:newFillMode];
  213.     return self;
  214. }
  215.  
  216. - (BOOL)personalChangeExpected
  217. {
  218.     return ([graphic fill] != [change fill]);
  219. }
  220.  
  221. @end
  222.  
  223. @implementation LineCapChangeDetail
  224.  
  225. - recordIt
  226. {
  227.     oldLineCap = [graphic lineCap];
  228.     return self;
  229. }
  230.  
  231. - undoIt
  232. {
  233.     [graphic setLineCap:oldLineCap];
  234.     return self;
  235. }
  236.  
  237. - redoIt
  238. {
  239.     [graphic setLineCap:[change lineCap]];
  240.     return self;
  241. }
  242.  
  243. - (BOOL)personalChangeExpected
  244. {
  245.     return ([graphic lineCap] != [change lineCap]);
  246. }
  247.  
  248. @end
  249.  
  250. @implementation LineColorChangeDetail
  251.  
  252. - recordIt
  253. {
  254.     oldColor = [graphic lineColor];
  255.     oldIsOutlined = [graphic isOutlined];
  256.     return self;
  257. }
  258.  
  259. - undoIt
  260. {
  261.     [graphic setLineColor:&oldColor];
  262.     [graphic setOutlined:oldIsOutlined];
  263.     return self;
  264. }
  265.  
  266. - redoIt
  267. {
  268.     NXColor color = [change lineColor];
  269.     [graphic setLineColor:&color];
  270.     [graphic setOutlined:YES];
  271.     return self;
  272. }
  273.  
  274. - (BOOL)personalChangeExpected
  275. {
  276.     return (!NXEqualColor([graphic lineColor], [change lineColor]));
  277. }
  278.  
  279. @end
  280.  
  281. @implementation LineJoinChangeDetail
  282.  
  283. - recordIt
  284. {
  285.     oldLineJoin = [graphic lineJoin];
  286.     return self;
  287. }
  288.  
  289. - undoIt
  290. {
  291.     [graphic setLineJoin:oldLineJoin];
  292.     return self;
  293. }
  294.  
  295. - redoIt
  296. {
  297.     [graphic setLineJoin:[change lineJoin]];
  298.     return self;
  299. }
  300.  
  301. - (BOOL)personalChangeExpected
  302. {
  303.     return ([graphic lineJoin] != [change lineJoin]);
  304. }
  305.  
  306. @end
  307.  
  308. @implementation LineWidthChangeDetail
  309.  
  310. - recordIt
  311. {
  312.     oldLineWidth = [graphic lineWidth];
  313.     return self;
  314. }
  315.  
  316. - undoIt
  317. {
  318.     [graphic setLineWidth:&oldLineWidth];
  319.     return self;
  320. }
  321.  
  322. - redoIt
  323. {
  324.     float lineWidth = [change lineWidth];
  325.     [graphic setLineWidth:&lineWidth];
  326.     return self;
  327. }
  328.  
  329. - (BOOL)personalChangeExpected
  330. {
  331.     return ([graphic lineWidth] != [change lineWidth]);
  332. }
  333.  
  334. @end
  335.  
  336. @implementation MoveChangeDetail
  337.  
  338. - (BOOL)useNestedDetails
  339. {
  340.     return NO;
  341. }
  342.  
  343. - undoDetail
  344. {
  345.     [graphic moveBy:[change undoVector]];
  346.     return self;
  347. }
  348.  
  349. - redoDetail
  350. {
  351.     [graphic moveBy:[change redoVector]];
  352.     return self;
  353. }
  354.  
  355. @end
  356.  
  357. @implementation OrderChangeDetail
  358.  
  359. - (BOOL)useNestedDetails
  360. {
  361.     return NO;
  362. }
  363.  
  364. - recordGraphicPositionIn:graphicList
  365. {
  366.     graphicPosition = [graphicList indexOf:graphic];
  367. return self;
  368. }
  369.  
  370. - (unsigned)graphicPosition
  371. {
  372.     return graphicPosition;
  373. }
  374.  
  375. @end
  376.