home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1996 April: Mac OS SDK / Dev.CD Apr 96 SDK / Dev.CD Apr 96 SDK1.toast / Development Kits (Disc 1) / OpenDoc Development Framework / ODFDev / ODF / Examples / Draw / Sources / DrawCmds.cpp < prev    next >
Encoding:
Text File  |  1995-11-08  |  21.0 KB  |  609 lines  |  [TEXT/MPS ]

  1. //========================================================================================
  2. //
  3. //    File:                DrawCmds.cpp
  4. //    Release Version:    $ 1.0d11 $
  5. //
  6. //    Author:                Mary Boetcher
  7. //
  8. //    Copyright:    © 1993, 1995 by Apple Computer, Inc., all rights reserved.
  9. //
  10. //========================================================================================
  11.  
  12. #include "ODFDraw.hpp"
  13.  
  14. #ifndef DRAWCMDS_H
  15. #include "DrawCmds.h"
  16. #endif
  17.  
  18. #ifndef DRAWPART_H
  19. #include "DrawPart.h"
  20. #endif
  21.  
  22. #ifndef DRAWSEL_H
  23. #include "DrawSel.h"
  24. #endif
  25.  
  26. #ifndef DRAWCLIP_H
  27. #include "DrawClip.h"
  28. #endif
  29.  
  30. #ifndef BASESHP_H
  31. #include "BaseShp.h"
  32. #endif
  33.  
  34. #ifndef DRAWFRM_H
  35. #include "DrawFrm.h"
  36. #endif
  37.  
  38. // ----- FrameWork Includes -----
  39.  
  40. #ifndef FWPRESEN_H
  41. #include "FWPresen.h"
  42. #endif
  43.  
  44. #ifndef FWMEMMGR_H
  45. #include "FWMemMgr.h"
  46. #endif
  47.  
  48. #ifndef SOM_ODShape_xh
  49. #include <Shape.xh>
  50. #endif
  51.  
  52.  
  53. //========================================================================================
  54. // RunTime Info
  55. //========================================================================================
  56.  
  57. #ifdef FW_BUILD_MAC
  58. #pragma segment odfdrawcommand
  59. #endif
  60.  
  61. //========================================================================================
  62. // CDrawShapeCommand
  63. //========================================================================================
  64.  
  65. //----------------------------------------------------------------------------------------
  66. //    CDrawShapeCommand constructor
  67. //----------------------------------------------------------------------------------------
  68. CDrawShapeCommand::CDrawShapeCommand(Environment* ev,
  69.                                     CDrawPart* part, 
  70.                                     FW_CFrame* frame,
  71.                                      CDrawSelection* selection,
  72.                                      CBaseShape* newShape) :
  73. #if defined(FW_BUILD_WIN) && FW_OPENDOC_VERSION == FW_OPENDOC_DR1
  74.     FW_CCommand(ev, cDrawShapeCommand, frame, FW_kCantUndo),
  75. #else
  76.     FW_CCommand(ev, cDrawShapeCommand, frame, FW_kCanUndo),
  77. #endif
  78.         fDrawPart(part),
  79.         fDrawSelection(selection),
  80.         fNewShape(newShape)
  81. {
  82.     this->SetMenuStrings(ev, "Undo Drawing", "Redo Drawing");
  83. }
  84.  
  85. //----------------------------------------------------------------------------------------
  86. //    CDrawShapeCommand destructor
  87. //----------------------------------------------------------------------------------------
  88. CDrawShapeCommand::~CDrawShapeCommand()
  89. {
  90. }
  91.  
  92. //----------------------------------------------------------------------------------------
  93. //    CDrawShapeCommand::CommitUndone
  94. //----------------------------------------------------------------------------------------
  95. void CDrawShapeCommand::CommitUndone(Environment* ev)
  96. {
  97.     // Delete the new shape only if the drawing was undone
  98.     delete fNewShape;
  99. }
  100.  
  101. //----------------------------------------------------------------------------------------
  102. //    CDrawShapeCommand::DoIt
  103. //----------------------------------------------------------------------------------------
  104. void CDrawShapeCommand::DoIt(Environment* ev)    // Override
  105. {
  106.     fDrawPart->AddShape(ev, fNewShape);
  107. }
  108.  
  109. //----------------------------------------------------------------------------------------
  110. //    CDrawShapeCommand::UndoIt
  111. //----------------------------------------------------------------------------------------
  112. void CDrawShapeCommand::UndoIt(Environment* ev)    // Override
  113. {
  114.     // First select the shape
  115.     this->SelectSavedShape(ev);
  116.     
  117.     // Now remove the selected shape
  118.     fDrawSelection->ClearSelection(ev);
  119. }
  120.  
  121. //----------------------------------------------------------------------------------------
  122. //    CDrawShapeCommand::RedoIt
  123. //----------------------------------------------------------------------------------------
  124. void CDrawShapeCommand::RedoIt(Environment* ev)    // Override
  125. {
  126.     fDrawPart->AddShape(ev, fNewShape);
  127.     this->SelectSavedShape(ev);    // select and redraw the shape
  128. }
  129.  
  130. //----------------------------------------------------------------------------------------
  131. //    CDrawShapeCommand::SelectSavedShape
  132. //----------------------------------------------------------------------------------------
  133. void CDrawShapeCommand::SelectSavedShape(Environment* ev)
  134. {
  135.     // Add the saved shape to the selection
  136.     fDrawSelection->CloseSelection(ev);    // first make sure selection is empty
  137.     fDrawSelection->AddToSelection(ev, fNewShape, FALSE);
  138.     fDrawSelection->RedrawShape(ev, fNewShape);
  139. }
  140.  
  141. //========================================================================================
  142. // CResizeShapeCommand
  143. //========================================================================================
  144.  
  145. //----------------------------------------------------------------------------------------
  146. //    CResizeShapeCommand constructor
  147. //----------------------------------------------------------------------------------------
  148. CResizeShapeCommand::CResizeShapeCommand(Environment* ev, 
  149.                                         CDrawPart* part, 
  150.                                          FW_CFrame* frame,
  151.                                          CDrawSelection* selection,
  152.                                          const FW_CRect& srcRect,
  153.                                          const FW_CRect& dstRect) :
  154. #if defined(FW_BUILD_WIN) && FW_OPENDOC_VERSION == FW_OPENDOC_DR1
  155.     FW_CCommand(ev, cResizeCommand, frame, FW_kCantUndo),
  156. #else
  157.     FW_CCommand(ev, cResizeCommand, frame, FW_kCanUndo),
  158. #endif
  159.         fDrawPart(part),
  160.         fFrame(frame),
  161.         fDrawSelection(selection),
  162.         fSourceRect(srcRect),
  163.         fDestRect(dstRect),
  164.         fUpdateShape(NULL)
  165. {
  166.     fChangedShapeList = new FW_CPrivOrderedCollection;
  167.  
  168.     this->SetMenuStrings(ev, "Undo Resize", "Redo Resize");
  169. }
  170.  
  171. //----------------------------------------------------------------------------------------
  172. //    CResizeShapeCommand destructor
  173. //----------------------------------------------------------------------------------------
  174. CResizeShapeCommand::~CResizeShapeCommand()
  175. {
  176.     delete fChangedShapeList;
  177. }
  178.  
  179. //----------------------------------------------------------------------------------------
  180. //    CResizeShapeCommand::DoIt
  181. //----------------------------------------------------------------------------------------
  182. void CResizeShapeCommand::DoIt(Environment* ev)    // Override
  183. {
  184.     this->SaveUndoState(ev);
  185.  
  186.     fDrawSelection->MapSelection(ev, fSourceRect, fDestRect);
  187.     this->Redraw(ev);
  188. }
  189.  
  190. //----------------------------------------------------------------------------------------
  191. //    CResizeShapeCommand::UndoIt
  192. //----------------------------------------------------------------------------------------
  193. void CResizeShapeCommand::UndoIt(Environment* ev)    // Override
  194. {
  195.     // First select the changed shapes
  196.     this->SelectChangedShapes(ev);
  197.     
  198.     fDrawSelection->MapSelection(ev, fDestRect, fSourceRect);    // ???
  199.     this->Redraw(ev);
  200. }
  201.  
  202. //----------------------------------------------------------------------------------------
  203. //    CResizeShapeCommand::RedoIt
  204. //----------------------------------------------------------------------------------------
  205. void CResizeShapeCommand::RedoIt(Environment* ev)    // Override
  206. {
  207.     // First select the changed shapes
  208.     this->SelectChangedShapes(ev);
  209.     
  210.     fDrawSelection->MapSelection(ev, fSourceRect, fDestRect);
  211.     this->Redraw(ev);
  212. }
  213.  
  214. //----------------------------------------------------------------------------------------
  215. //    CResizeShapeCommand::SaveUndoState
  216. //----------------------------------------------------------------------------------------
  217.  
  218. void CResizeShapeCommand::SaveUndoState(Environment* ev)    // Override
  219. {
  220.     // Copy selected shape pointers to fChangedShapeList
  221.     FW_COrderedCollectionIterator ite(fDrawSelection->GetSelectionCollection());
  222.     for (CBaseShape* shape = (CBaseShape*)ite.First(); ite.IsNotComplete(); shape = (CBaseShape*)ite.Next())
  223.     {
  224.         fChangedShapeList->AddLast(shape);
  225.     }
  226. }
  227.  
  228. //----------------------------------------------------------------------------------------
  229. //    CResizeShapeCommand::Redraw
  230. //----------------------------------------------------------------------------------------
  231. void CResizeShapeCommand::Redraw(Environment* ev)
  232. {
  233.     FW_CPresentation* presentation = fFrame->GetPresentation(ev);
  234.     CDrawFacetClipper facetClipper(ev, fDrawPart);
  235.     
  236.     if (fUpdateShape)    // UndoIt, RedoIt
  237.     {
  238.         fUpdateShape->Union(ev, fDrawSelection->GetUpdateShape());
  239.         presentation->Invalidate(ev, fUpdateShape);
  240.         
  241.         facetClipper.Clip(ev, presentation, fUpdateShape);
  242.         
  243.         fUpdateShape->Release(ev);
  244.         fUpdateShape = NULL;
  245.     }
  246.     else                // DoIt
  247.     {
  248.         presentation->Invalidate(ev, fDrawSelection->GetUpdateShape());
  249.         
  250.         facetClipper.Clip(ev, presentation, fDrawSelection->GetUpdateShape());
  251.     }
  252.  
  253.     fDrawSelection->SelectionChanged(ev);
  254. }
  255.  
  256. //----------------------------------------------------------------------------------------
  257. //    CResizeShapeCommand::SelectChangedShapes
  258. //----------------------------------------------------------------------------------------
  259. void CResizeShapeCommand::SelectChangedShapes(Environment* ev)
  260. {
  261.     // First, empty the selection
  262.     fDrawSelection->CloseSelection(ev);
  263.  
  264.     // Add the shapes in fChangedShapeList to fDrawSelection
  265.     FW_COrderedCollectionIterator ite(fChangedShapeList);
  266.     for (CBaseShape* shape = (CBaseShape*)ite.First(); ite.IsNotComplete(); shape = (CBaseShape*)ite.Next())
  267.     {
  268.         fDrawSelection->AddToSelection(ev, shape, FALSE);
  269.     }
  270.  
  271.     // Save update shape for Redraw
  272.     fUpdateShape = fDrawSelection->GetUpdateShape()->Copy(ev);
  273. }
  274.  
  275. //========================================================================================
  276. // CChangeShapeCommand
  277. //========================================================================================
  278.  
  279. //----------------------------------------------------------------------------------------
  280. //    CChangeShapeCommand constructor
  281. //----------------------------------------------------------------------------------------
  282.  
  283. CChangeShapeCommand::CChangeShapeCommand(Environment* ev,
  284.                                         ODCommandID id,
  285.                                          CDrawPart* part, 
  286.                                          FW_CFrame* frame,
  287.                                          CDrawSelection* selection)
  288. #if defined(FW_BUILD_WIN) && FW_OPENDOC_VERSION == FW_OPENDOC_DR1
  289.     : FW_CCommand(ev, id, frame, FW_kCantUndo),
  290. #else
  291.     : FW_CCommand(ev, id, frame, FW_kCanUndo),
  292. #endif
  293.         fDrawPart(part),
  294.         fDrawSelection(selection)
  295. {
  296.     fChangedShapeList = new FW_CPrivOrderedCollection;
  297. }
  298.  
  299. //----------------------------------------------------------------------------------------
  300. //    CChangeShapeCommand destructor
  301. //----------------------------------------------------------------------------------------
  302.  
  303. CChangeShapeCommand::~CChangeShapeCommand()
  304. {
  305.     delete fChangedShapeList;
  306. }
  307.  
  308. //----------------------------------------------------------------------------------------
  309. //    CChangeShapeCommand::SelectChangedShapes
  310. //----------------------------------------------------------------------------------------
  311.  
  312. void CChangeShapeCommand::SelectChangedShapes(Environment* ev)
  313. {
  314.     // First, empty the selection
  315.     fDrawSelection->CloseSelection(ev);
  316.  
  317.     // Add the shapes in fChangedShapeList to fDrawSelection
  318.     FW_COrderedCollectionIterator ite(fChangedShapeList);
  319.     for (CBaseShape* shape = (CBaseShape*)ite.First(); ite.IsNotComplete(); shape = (CBaseShape*)ite.Next())
  320.     {
  321.         fDrawSelection->AddToSelection(ev, shape, FALSE);
  322.     }
  323. }
  324.  
  325. //----------------------------------------------------------------------------------------
  326. //    CChangeShapeCommand::DoIt
  327. //----------------------------------------------------------------------------------------
  328.  
  329. void CChangeShapeCommand::DoIt(Environment* ev)            // Override
  330. {
  331.     this->SaveUndoState(ev);
  332.     this->DoChange(ev);
  333. }
  334.  
  335. //----------------------------------------------------------------------------------------
  336. //    CChangeShapeCommand::UndoIt
  337. //----------------------------------------------------------------------------------------
  338.  
  339. void CChangeShapeCommand::UndoIt(Environment* ev)            // Override
  340. {
  341.     this->SelectChangedShapes(ev);
  342.  
  343.     // Iterate through shapes in fChangedShapeList, undoing each change
  344.     FW_COrderedCollectionIterator ite(fChangedShapeList);
  345.     unsigned long index = 0;
  346.     for (CBaseShape* shape = (CBaseShape*)ite.First(); ite.IsNotComplete(); shape = (CBaseShape*)ite.Next())
  347.     {
  348.         this->UndoShape(ev, shape, index);
  349.         fDrawSelection->RedrawShape(ev, shape);
  350.         index++;
  351.     }
  352.  
  353.     fDrawSelection->SelectionChanged(ev);
  354. }
  355.  
  356. //----------------------------------------------------------------------------------------
  357. //    CChangeShapeCommand::RedoIt
  358. //----------------------------------------------------------------------------------------
  359.  
  360. void CChangeShapeCommand::RedoIt(Environment* ev)            // Override
  361. {
  362.     this->SelectChangedShapes(ev);
  363.     this->DoChange(ev);
  364.     fDrawSelection->SelectionChanged(ev);
  365. }
  366.  
  367. //----------------------------------------------------------------------------------------
  368. //    CChangeShapeCommand::SaveUndoState
  369. //----------------------------------------------------------------------------------------
  370.  
  371. void CChangeShapeCommand::SaveUndoState(Environment* ev)    // Override
  372. {
  373.     // Copy selected shape pointers to fChangedShapeList
  374.     FW_COrderedCollectionIterator ite(fDrawSelection->GetSelectionCollection());
  375.     for (CBaseShape* shape = (CBaseShape*)ite.First(); ite.IsNotComplete(); shape = (CBaseShape*)ite.Next())
  376.     {
  377.         fChangedShapeList->AddLast(shape);
  378.     }
  379. }
  380.  
  381. //========================================================================================
  382. // CChangeColorCommand
  383. //========================================================================================
  384.  
  385. //----------------------------------------------------------------------------------------
  386. //    CChangeColorCommand constructor
  387. //----------------------------------------------------------------------------------------
  388.  
  389. CChangeColorCommand::CChangeColorCommand(Environment* ev,
  390.                                         ODCommandID commandID,
  391.                                         CDrawPart* part, 
  392.                                         FW_CFrame* frame,
  393.                                         CDrawSelection* selection,
  394.                                         const FW_CColor& newColor)
  395.     : CChangeShapeCommand(ev, commandID, part, frame, selection),
  396.         fNewColor(newColor),
  397.         fOldColors(NULL),
  398.         fIsFill(commandID == cChangeFillColor)
  399. {
  400.     if (fIsFill)
  401.         this->SetMenuStrings(ev, "Undo Fill Color Change", "Redo Fill Color Change");
  402.     else
  403.         this->SetMenuStrings(ev, "Undo Frame Color Change", "Redo Frame Color Change");
  404. }
  405.  
  406. //----------------------------------------------------------------------------------------
  407. //    CChangeColorCommand destructor
  408. //----------------------------------------------------------------------------------------
  409.  
  410. CChangeColorCommand::~CChangeColorCommand()
  411. {
  412.     FW_CMemoryManager::FreeBlock(fOldColors);
  413. }
  414.  
  415. //----------------------------------------------------------------------------------------
  416. //    CChangeColorCommand::DoChange
  417. //----------------------------------------------------------------------------------------
  418.  
  419. void CChangeColorCommand::DoChange(Environment* ev)            // Override
  420. {
  421.     fDrawSelection->ChangeSelectionColor(ev, fNewColor, fIsFill);
  422. }
  423.  
  424. //----------------------------------------------------------------------------------------
  425. //    CChangeColorCommand::UndoShape
  426. //----------------------------------------------------------------------------------------
  427.  
  428. void CChangeColorCommand::UndoShape(Environment* ev, CBaseShape* shape, unsigned long index)    // Override
  429. {
  430.     if (fIsFill)
  431.         shape->ChangeFillColor(ev, fDrawPart, fOldColors[index]);
  432.     else
  433.         shape->ChangeFrameColor(ev, fDrawPart, fOldColors[index]);        
  434. }
  435.  
  436. //----------------------------------------------------------------------------------------
  437. //    CChangeColorCommand::SaveUndoState
  438. //----------------------------------------------------------------------------------------
  439.  
  440. void CChangeColorCommand::SaveUndoState(Environment* ev)    // Override
  441. {
  442.     CChangeShapeCommand::SaveUndoState(ev);    // sets up fChangedShapeList
  443.  
  444.     // Create array to hold colors
  445.     unsigned long shapeCount = fChangedShapeList->Count();
  446.     fOldColors = (FW_CColor*)FW_CMemoryManager::AllocateBlock(sizeof(FW_CColor) * shapeCount);
  447.  
  448.     // Save shapes' colors
  449.     FW_CColor color;
  450.     short index = 0;
  451.     FW_COrderedCollectionIterator ite(fChangedShapeList);
  452.     for (CBaseShape* shape = (CBaseShape*)ite.First(); ite.IsNotComplete(); shape = (CBaseShape*)ite.Next())
  453.     {
  454.         shape->GetColor(fIsFill, color);
  455.         fOldColors[index] = color;
  456.         index++;
  457.     }    
  458. }
  459.  
  460. //========================================================================================
  461. // class CChangePatternCommand
  462. //========================================================================================
  463.  
  464. //----------------------------------------------------------------------------------------
  465. //    CChangePatternCommand constructor
  466. //----------------------------------------------------------------------------------------
  467.  
  468. CChangePatternCommand::CChangePatternCommand(Environment* ev,
  469.                                             ODCommandID commandID,
  470.                                             CDrawPart* part,
  471.                                             FW_CFrame* frame,
  472.                                             CDrawSelection* selection,
  473.                                             const FW_PPattern& newPattern)
  474.     : CChangeShapeCommand(ev, commandID, part, frame, selection),
  475.         fNewPattern(newPattern),
  476.         fOldPatterns(NULL),
  477.         fCount(0),
  478.         fIsFill(commandID == cChangeFillPattern)
  479. {
  480.     if (fIsFill)
  481.         this->SetMenuStrings(ev, "Undo Fill Pattern Change", "Redo Fill Pattern Change");
  482.     else
  483.         this->SetMenuStrings(ev, "Undo Frame Pattern Change", "Redo Frame Pattern Change");    
  484.     
  485.     FW_END_CONSTRUCTOR    
  486. }
  487.  
  488. //----------------------------------------------------------------------------------------
  489. //    CChangePatternCommand destructor
  490. //----------------------------------------------------------------------------------------
  491.  
  492. CChangePatternCommand::~CChangePatternCommand()
  493. {
  494.     FW_START_DESTRUCTOR
  495.     
  496.     delete [] fOldPatterns;
  497. }
  498.  
  499. //----------------------------------------------------------------------------------------
  500. //    CChangePatternCommand::DoChange
  501. //----------------------------------------------------------------------------------------
  502.  
  503. void CChangePatternCommand::DoChange(Environment* ev)    // Override
  504. {
  505.     fDrawSelection->ChangeSelectionPattern(ev, fNewPattern, fIsFill);
  506. }
  507.  
  508. //----------------------------------------------------------------------------------------
  509. //    CChangePatternCommand::UndoShape
  510. //----------------------------------------------------------------------------------------
  511.  
  512. void CChangePatternCommand::UndoShape(Environment* ev, CBaseShape* shape, unsigned long index)    // Override
  513. {
  514.     if (fIsFill)
  515.         shape->ChangeFillPattern(ev, fDrawPart, fOldPatterns[index]);
  516.     else
  517.         shape->ChangeFramePattern(ev, fDrawPart, fOldPatterns[index]);
  518. }
  519.  
  520. //----------------------------------------------------------------------------------------
  521. //    CChangePatternCommand::SaveUndoState
  522. //----------------------------------------------------------------------------------------
  523.  
  524. void CChangePatternCommand::SaveUndoState(Environment* ev)    // Override
  525. {
  526.     CChangeShapeCommand::SaveUndoState(ev);    // sets up fChangedShapeList
  527.  
  528.     // Create array to hold patterns
  529.     fOldPatterns = new FW_PPattern[fChangedShapeList->Count()];
  530.  
  531.     // Save shapes' patterns
  532.     FW_COrderedCollectionIterator ite(fChangedShapeList);
  533.     for (CBaseShape* shape = (CBaseShape*)ite.First(); ite.IsNotComplete(); shape = (CBaseShape*)ite.Next())
  534.     {
  535.         fOldPatterns[fCount] = shape->GetPattern(fIsFill)->Copy();
  536.         fCount++;
  537.     }    
  538. }
  539.  
  540. //========================================================================================
  541. // class CChangeRenderVerbCommand
  542. //========================================================================================
  543.  
  544. //----------------------------------------------------------------------------------------
  545. //    CChangeRenderVerbCommand constructor
  546. //----------------------------------------------------------------------------------------
  547.  
  548. CChangeRenderVerbCommand::CChangeRenderVerbCommand(Environment* ev,
  549.                                                     CDrawPart* part, 
  550.                                                     FW_CFrame* frame,
  551.                                                    CDrawSelection* selection,
  552.                                                    unsigned short newRenderVerb)
  553.     : CChangeShapeCommand(ev, cChangeRenderVerb, part, frame, selection),
  554.         fNewRenderVerb(newRenderVerb),
  555.         fOldRenderVerbs(NULL)
  556. {
  557.     this->SetMenuStrings(ev, "Undo Render Verb Change", "Redo Render Verb Change");
  558. }
  559.  
  560. //----------------------------------------------------------------------------------------
  561. //    CChangeRenderVerbCommand destructor
  562. //----------------------------------------------------------------------------------------
  563.  
  564. CChangeRenderVerbCommand::~CChangeRenderVerbCommand()
  565. {
  566.     delete [] fOldRenderVerbs;
  567. }
  568.  
  569. //----------------------------------------------------------------------------------------
  570. //    CChangeRenderVerbCommand::DoChange
  571. //----------------------------------------------------------------------------------------
  572.  
  573. void CChangeRenderVerbCommand::DoChange(Environment* ev)    // Override
  574. {
  575.     fDrawSelection->ChangeSelectionRenderVerb(ev, fNewRenderVerb);
  576. }
  577.  
  578. //----------------------------------------------------------------------------------------
  579. //    CChangeRenderVerbCommand::UndoShape
  580. //----------------------------------------------------------------------------------------
  581.  
  582. void CChangeRenderVerbCommand::UndoShape(Environment* ev, CBaseShape* shape, unsigned long index)    // Override
  583. {
  584.     shape->ChangeRenderVerb(ev, fDrawPart, fOldRenderVerbs[index]);
  585. }
  586.  
  587. //----------------------------------------------------------------------------------------
  588. //    CChangeRenderVerbCommand::SaveUndoState
  589. //----------------------------------------------------------------------------------------
  590.  
  591. void CChangeRenderVerbCommand::SaveUndoState(Environment* ev)    // Override
  592. {
  593.     CChangeShapeCommand::SaveUndoState(ev);    // sets up fChangedShapeList
  594.  
  595.     // Create array to hold render verbs
  596.     unsigned long shapeCount = fChangedShapeList->Count();
  597.     fOldRenderVerbs = new unsigned short[shapeCount];
  598.  
  599.     // Finally, save shapes' render verbs
  600.     unsigned short verb;
  601.     short index = 0;
  602.     FW_COrderedCollectionIterator ite(fChangedShapeList);
  603.     for (CBaseShape* shape = (CBaseShape*)ite.First(); ite.IsNotComplete(); shape = (CBaseShape*)ite.Next())
  604.     {
  605.         verb = shape->GetRenderVerb();
  606.         fOldRenderVerbs[index] = verb;
  607.     }    
  608. }
  609.