home *** CD-ROM | disk | FTP | other *** search
/ NeXTSTEP 3.0 / NeXTSTEP3.0.iso / NextDeveloper / Examples / AppKit / Draw / graphicsUndo.subproj / UngroupGraphicsChange.m < prev    next >
Text File  |  1992-02-09  |  3KB  |  140 lines

  1. #import "drawundo.h"
  2.  
  3. @interface UngroupGraphicsChange(PrivateMethods)
  4.  
  5. @end
  6.  
  7. @implementation UngroupGraphicsChange
  8.  
  9. - initGraphicView:aGraphicView
  10. {
  11.     [super init];
  12.     graphicView = aGraphicView;
  13.     changeDetails = @
  14.     groups = nil;
  15.  
  16.     return self;
  17. }
  18.  
  19. - free
  20. {
  21.     int i, count;
  22.     id group;
  23.  
  24.     if ([self hasBeenDone]) {
  25.     count = [groups count];
  26.     for (i = 0; i < count; i++) {
  27.         group = [groups objectAt:i];
  28.         [[group subGraphics] empty];
  29.         [group free];
  30.     }
  31.     }
  32.     [groups free];
  33.     if (changeDetails != nil) {
  34.     [changeDetails freeObjects];
  35.     [changeDetails free];
  36.     }
  37.     return [super free];
  38. }
  39.  
  40. - (const char *)changeName
  41. {
  42.     return NXLocalStringFromTable("Operations", "Ungroup", NULL, "The operation of ungroup a bunch of graphical entities that are grouped together into a single graphical entity.");
  43. }
  44.  
  45. - saveBeforeChange
  46. {
  47.     List *selectedGraphics;
  48.     int i, count;
  49.     id g;
  50.     id changeDetailClass;
  51.  
  52.     groups = [[List alloc] init];
  53.     changeDetailClass = [self changeDetailClass];
  54.     changeDetails = [[List alloc] init];
  55.  
  56.     selectedGraphics = [graphicView selectedGraphics];
  57.     count = [selectedGraphics count];
  58.     for (i = 0; i < count; i++) {
  59.     g = [selectedGraphics objectAt:i];
  60.     if ([g isKindOf:[Group class]]) {
  61.         [groups addObject:g];
  62.         [changeDetails addObject:[[changeDetailClass alloc] initGraphic:g change:self]];
  63.     }
  64.     }
  65.     [changeDetails makeObjectsPerform:@selector(recordGraphicPositionIn:) with:[graphicView graphics]];
  66.  
  67.     count = [groups count];
  68.     if (count == 0)
  69.         [self disable];
  70.     
  71.     return self;
  72. }
  73.  
  74. - undoChange
  75. {
  76.     List *allGraphics, *graphics;
  77.     int i, j, count, graphicCount;
  78.     NXRect affectedBounds;
  79.     id group, graphic, detail;
  80.  
  81.     allGraphics = [graphicView graphics];
  82.     count = [changeDetails count];
  83.     for (i = 0; i < count; i++) {
  84.         detail = [changeDetails objectAt:i];
  85.     group = [detail graphic];
  86.     graphics = [group subGraphics];
  87.     graphicCount = [graphics count];
  88.     for (j = 0; j < graphicCount; j++) {
  89.         graphic = [graphics objectAt:j];
  90.         [graphic setCacheable:NO];
  91.         [allGraphics removeObject:graphic];
  92.     }
  93.     [allGraphics insertObject:group at:[detail graphicPosition]];
  94.     }
  95.     
  96.     [graphicView getSelection];
  97.     [graphicView setGroupInSlist:YES];
  98.     [graphicView getBBox:&affectedBounds of:groups];
  99.     [graphicView cache:&affectedBounds];
  100.     [[graphicView window] flushWindow];
  101.     [[[NXApp inspectorPanel] delegate] loadGraphic:[graphicView selectedGraphic]]; 
  102.  
  103.     return [super undoChange];
  104. }
  105.  
  106. - redoChange
  107. {
  108.     List *allGraphics;
  109.   At k;
  110.     int i, count;
  111.     NXRect affectedBounds;
  112.     id group;
  113.  
  114.     [graphicView getBBox:&affectedBounds of:groups];
  115.  
  116.     allGraphics = [graphicView graphics];
  117.     count = [groups count];
  118.     for (i = 0; i < count; i++) {
  119.         group = [groups objectAt:i];
  120.     k = [allGraphics indexOf:group];
  121.     [allGraphics removeObjectAt:k];
  122.     [group transferSubGraphicsTo:allGraphics at:k];
  123.     }
  124.  
  125.     [graphicView getSelection];
  126.     [graphicView resetGroupInSlist];
  127.     [graphicView cache:&affectedBounds];
  128.     [[graphicView window] flushWindow];
  129.     [[[NXApp inspectorPanel] delegate] loadGraphic:[graphicView selectedGraphic]]; 
  130.  
  131.  
  132.     return [super redoChange];
  133. }
  134.  
  135. - changeDetailClass
  136. {
  137.     return [OrderChangeDetail class];
  138. }
  139.  
  140. @end