home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1996 October: Mac OS SDK / Dev.CD Oct 96 SDK / Dev.CD Oct 96 SDK2.toast / Development Kits (Disc 2) / OpenDoc Development Framework / ODFDev / Draw / Sources / DrawCmds.cpp < prev    next >
Encoding:
Text File  |  1996-08-16  |  23.5 KB  |  699 lines  |  [TEXT/MPS ]

  1. //========================================================================================
  2. //
  3. //    File:                DrawCmds.cpp
  4. //    Release Version:    $ ODF 1 $
  5. //
  6. //    Author:                Mary Boetcher
  7. //
  8. //    Copyright:            (c) 1993 - 1996 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 DRAWCONT_H
  19. #include "DrawCont.h"
  20. #endif
  21.  
  22. #ifndef DRAWPART_H
  23. #include "DrawPart.h"
  24. #endif
  25.  
  26. #ifndef DRAWSEL_H
  27. #include "DrawSel.h"
  28. #endif
  29.  
  30. #ifndef DRAWCLIP_H
  31. #include "DrawClip.h"
  32. #endif
  33.  
  34. #ifndef BASESHP_H
  35. #include "BaseShp.h"
  36. #endif
  37.  
  38. #ifndef DRAWFRM_H
  39. #include "DrawFrm.h"
  40. #endif
  41.  
  42. #ifndef GROUPSHP_H
  43. #include "GroupShp.h"
  44. #endif
  45.  
  46. #ifndef DEFINES_K
  47. #include "Defines.k"
  48. #endif
  49.  
  50. // ----- FrameWork Includes -----
  51.  
  52. #ifndef FWPRESEN_H
  53. #include "FWPresen.h"
  54. #endif
  55.  
  56. #ifndef FWMEMMGR_H
  57. #include "FWMemMgr.h"
  58. #endif
  59.  
  60. #ifndef SOM_ODShape_xh
  61. #include <Shape.xh>
  62. #endif
  63.  
  64. #if defined(__MWERKS__) && GENERATING68K
  65. // A hack to work around a bug
  66. #pragma import list somGetGlobalEnvironment
  67. #endif
  68.  
  69. //========================================================================================
  70. // RunTime Info
  71. //========================================================================================
  72.  
  73. #ifdef FW_BUILD_MAC
  74. #pragma segment odfdrawcommand
  75. #endif
  76.  
  77. FW_DEFINE_AUTO(CDrawShapeCommand)
  78. FW_DEFINE_AUTO(CResizeShapeCommand)
  79. FW_DEFINE_AUTO(CChangeShapeCommand)
  80. FW_DEFINE_AUTO(CChangeColorCommand)
  81. FW_DEFINE_AUTO(CChangePatternCommand)
  82. FW_DEFINE_AUTO(CChangeRenderVerbCommand)
  83. FW_DEFINE_AUTO(CChangePenSizeCommand)
  84.     
  85. //========================================================================================
  86. // CDrawShapeCommand
  87. //========================================================================================
  88.  
  89. //----------------------------------------------------------------------------------------
  90. //    CDrawShapeCommand constructor
  91. //----------------------------------------------------------------------------------------
  92. CDrawShapeCommand::CDrawShapeCommand(Environment* ev,
  93.                                     CDrawPart* part, 
  94.                                     FW_CFrame* frame,
  95.                                      CDrawSelection* selection,
  96.                                      CBaseShape* newShape) :
  97. #if defined(FW_BUILD_WIN) && FW_OPENDOC_VERSION == FW_OPENDOC_DR1
  98.     FW_CCommand(ev, cDrawShapeCommand, frame, FW_kCantUndo),
  99. #else
  100.     FW_CCommand(ev, cDrawShapeCommand, frame, FW_kCanUndo),
  101. #endif
  102.         fDrawPart(part),
  103.         fDrawSelection(selection),
  104.         fNewContent(NULL)
  105. {
  106.     SetMenuStringsFromResource(ev, kDrawUndoStrings, kUndoDrawingMsg, kRedoDrawingMsg);
  107.  
  108.     fNewContent = FW_NEW(CDrawContent, (ev, part));
  109.     fNewContent->AddShape(ev, newShape);
  110.  
  111.     FW_END_CONSTRUCTOR    
  112. }
  113.  
  114. //----------------------------------------------------------------------------------------
  115. //    CDrawShapeCommand destructor
  116. //----------------------------------------------------------------------------------------
  117. CDrawShapeCommand::~CDrawShapeCommand()
  118. {
  119.     FW_START_DESTRUCTOR
  120.     delete fNewContent;
  121. }
  122.  
  123. //----------------------------------------------------------------------------------------
  124. //    CDrawShapeCommand::CommitUndone
  125. //----------------------------------------------------------------------------------------
  126. void CDrawShapeCommand::CommitUndone(Environment* ev)
  127. {
  128.     // Delete the new shape only if the drawing was undone
  129.     CBaseShape* newShape = fNewContent->GetFirstShape();
  130.     fNewContent->EmptyShapes(ev);
  131.     delete newShape;
  132. }
  133.  
  134. //----------------------------------------------------------------------------------------
  135. //    CDrawShapeCommand::DoIt
  136. //----------------------------------------------------------------------------------------
  137. void CDrawShapeCommand::DoIt(Environment* ev)    // Override
  138. {
  139.     fDrawPart->AddShapeToPart(ev, fNewContent->GetFirstShape());
  140. //    fDrawSelection->SelectContent(ev, fNewContent);
  141. }
  142.  
  143. //----------------------------------------------------------------------------------------
  144. //    CDrawShapeCommand::UndoIt
  145. //----------------------------------------------------------------------------------------
  146. void CDrawShapeCommand::UndoIt(Environment* ev)    // Override
  147. {
  148.     // Unselect everything
  149.     fDrawSelection->CloseSelection(ev);
  150.  
  151.     // Remove the shape from the part
  152.     fDrawPart->RemoveShapeFromPart(ev, fNewContent->GetFirstShape());
  153.     fNewContent->RedrawShapes(ev);    // force redraw
  154. }
  155.  
  156. //----------------------------------------------------------------------------------------
  157. //    CDrawShapeCommand::RedoIt
  158. //----------------------------------------------------------------------------------------
  159. void CDrawShapeCommand::RedoIt(Environment* ev)    // Override
  160. {
  161.     // Add the shape back into the part
  162.     fDrawPart->AddShapeToPart(ev, fNewContent->GetFirstShape());
  163.     fNewContent->RedrawShapes(ev);    // force redraw
  164.  
  165.     // Select the shape
  166.     fDrawSelection->SelectContent(ev, fNewContent);
  167. }
  168.  
  169. //========================================================================================
  170. // CResizeShapeCommand
  171. //========================================================================================
  172.  
  173. //----------------------------------------------------------------------------------------
  174. //    CResizeShapeCommand constructor
  175. //----------------------------------------------------------------------------------------
  176. CResizeShapeCommand::CResizeShapeCommand(Environment* ev, 
  177.                                         CDrawPart* part, 
  178.                                          FW_CFrame* frame,
  179.                                          CDrawSelection* selection,
  180.                                          const FW_CRect& srcRect,
  181.                                          const FW_CRect& dstRect) :
  182. #if defined(FW_BUILD_WIN) && FW_OPENDOC_VERSION == FW_OPENDOC_DR1
  183.     FW_CCommand(ev, cResizeCommand, frame, FW_kCantUndo),
  184. #else
  185.     FW_CCommand(ev, cResizeCommand, frame, FW_kCanUndo),
  186. #endif
  187.         fDrawPart(part),
  188.         fDrawSelection(selection),
  189.         fSourceRect(srcRect),
  190.         fDestRect(dstRect),
  191.         fUpdateShape(NULL),
  192.         fChangedContent(NULL)
  193. {
  194.     SetMenuStringsFromResource(ev, kDrawUndoStrings, kUndoResizeMsg, kRedoResizeMsg);
  195.     FW_END_CONSTRUCTOR    
  196. }
  197.  
  198. //----------------------------------------------------------------------------------------
  199. //    CResizeShapeCommand destructor
  200. //----------------------------------------------------------------------------------------
  201. CResizeShapeCommand::~CResizeShapeCommand()
  202. {
  203.     FW_START_DESTRUCTOR
  204.     delete fChangedContent;
  205.     
  206.     if (fUpdateShape)
  207.         fUpdateShape->Release(somGetGlobalEnvironment());
  208.     fUpdateShape = NULL;
  209. }
  210.  
  211. //----------------------------------------------------------------------------------------
  212. //    CResizeShapeCommand::DoIt
  213. //----------------------------------------------------------------------------------------
  214. void CResizeShapeCommand::DoIt(Environment* ev)    // Override
  215. {
  216.     // Copy selected shape pointers to our content object
  217.     FW_ASSERT(fChangedContent == NULL);
  218.     fChangedContent = FW_NEW(CDrawContent, (ev, fDrawSelection->GetDrawContent(ev)));
  219.  
  220.     FW_ASSERT(fUpdateShape == NULL);
  221.     fUpdateShape = fChangedContent->CalcUpdateShape(ev);
  222.  
  223.     this->MapShapes(ev, fSourceRect, fDestRect);
  224.  
  225.     {
  226.         FW_CAcquiredODShape tempShape = fChangedContent->CalcUpdateShape(ev);
  227.         fUpdateShape->Union(ev, tempShape);
  228.     }
  229.     
  230.     this->Redraw(ev, kODDone);
  231. }
  232.  
  233. //----------------------------------------------------------------------------------------
  234. //    CResizeShapeCommand::UndoIt
  235. //----------------------------------------------------------------------------------------
  236. void CResizeShapeCommand::UndoIt(Environment* ev)    // Override
  237. {
  238.     this->MapShapes(ev, fDestRect, fSourceRect);
  239.     this->Redraw(ev, kODUndone);
  240. }
  241.  
  242. //----------------------------------------------------------------------------------------
  243. //    CResizeShapeCommand::RedoIt
  244. //----------------------------------------------------------------------------------------
  245. void CResizeShapeCommand::RedoIt(Environment* ev)    // Override
  246. {
  247.     this->MapShapes(ev, fSourceRect, fDestRect);
  248.     this->Redraw(ev, kODRedone);
  249. }
  250.  
  251. //----------------------------------------------------------------------------------------
  252. //    CResizeShapeCommand::MapShapes
  253. //----------------------------------------------------------------------------------------
  254. void CResizeShapeCommand::MapShapes(Environment* ev, const FW_CRect& srcRect, const FW_CRect& dstRect)
  255. {
  256.     //--- Resize each shape ---
  257.     CDrawContentShapeIterator it(fChangedContent);
  258.     for (CBaseShape* shape = it.First(); it.IsNotComplete(); shape = it.Next())
  259.     {
  260.         shape->MapShape(ev, fDrawPart, srcRect, dstRect);
  261.     }
  262. }
  263.  
  264. //----------------------------------------------------------------------------------------
  265. //    CResizeShapeCommand::Redraw
  266. //----------------------------------------------------------------------------------------
  267. void CResizeShapeCommand::Redraw(Environment* ev, ODDoneState doneState)
  268. {
  269.     FW_CPresentation* presentation = fDrawPart->GetMainPresentation();
  270.     presentation->Invalidate(ev, fUpdateShape);
  271.     
  272.     CDrawFacetClipper facetClipper(ev, fDrawPart);
  273.     facetClipper.Clip(ev, presentation, fUpdateShape);
  274.  
  275.     // Select the resized shapes
  276.     fDrawSelection->SelectContent(ev, fChangedContent);
  277.     fDrawSelection->SelectionChanged(ev);    // Notify everybody
  278. }
  279.  
  280. //========================================================================================
  281. // CChangeShapeCommand
  282. //========================================================================================
  283.  
  284. //----------------------------------------------------------------------------------------
  285. //    CChangeShapeCommand constructor
  286. //----------------------------------------------------------------------------------------
  287.  
  288. CChangeShapeCommand::CChangeShapeCommand(Environment* ev,
  289.                                         ODCommandID id,
  290.                                          CDrawPart* part, 
  291.                                          FW_CFrame* frame,
  292.                                          CDrawSelection* selection) :
  293.     FW_CCommand(ev, id, frame, FW_kCanUndo),
  294.     fDrawPart(part),
  295.     fDrawSelection(selection),
  296.     fChangedContent(NULL)
  297. {
  298.     FW_END_CONSTRUCTOR    
  299. }
  300.  
  301. //----------------------------------------------------------------------------------------
  302. //    CChangeShapeCommand destructor
  303. //----------------------------------------------------------------------------------------
  304.  
  305. CChangeShapeCommand::~CChangeShapeCommand()
  306. {
  307.     FW_START_DESTRUCTOR
  308.     delete fChangedContent;
  309. }
  310.  
  311. //----------------------------------------------------------------------------------------
  312. //    CChangeShapeCommand::DoIt
  313. //----------------------------------------------------------------------------------------
  314.  
  315. void CChangeShapeCommand::DoIt(Environment* ev)            // Override
  316. {
  317.     // Copy selected shape pointers to our content object
  318.     FW_ASSERT(fChangedContent == NULL);
  319.     fChangedContent = FW_NEW(CDrawContent, (ev, fDrawSelection->GetDrawContent(ev)));
  320.  
  321.     this->SaveUndoState(ev);    // Save command-specific data
  322.     this->DoChange(ev);            // perform command-specific tasks
  323.  
  324.     this->UpdateDisplay(ev);
  325. }
  326.  
  327. //----------------------------------------------------------------------------------------
  328. //    CChangeShapeCommand::UndoIt
  329. //----------------------------------------------------------------------------------------
  330.  
  331. void CChangeShapeCommand::UndoIt(Environment* ev)            // Override
  332. {
  333.     // Iterate through the shape list, undoing each change
  334.     CAllShapeIterator it(fChangedContent);
  335.     unsigned long index = 0;
  336.     for (CBaseShape* shape = it.First(); it.IsNotComplete(); shape = it.Next())
  337.     {
  338.         this->UndoShape(ev, shape, index);
  339.         index++;
  340.     }
  341.  
  342.     this->UpdateDisplay(ev);
  343. }
  344.  
  345. //----------------------------------------------------------------------------------------
  346. //    CChangeShapeCommand::RedoIt
  347. //----------------------------------------------------------------------------------------
  348.  
  349. void CChangeShapeCommand::RedoIt(Environment* ev)            // Override
  350. {
  351.     this->DoChange(ev);
  352.     this->UpdateDisplay(ev);
  353. }
  354.  
  355. //----------------------------------------------------------------------------------------
  356. //    CChangeShapeCommand::UpdateDisplay
  357. //----------------------------------------------------------------------------------------
  358.  
  359. void CChangeShapeCommand::UpdateDisplay(Environment* ev)
  360. {
  361.     // Redraw the changed shapes
  362.     fChangedContent->RedrawShapes(ev);
  363.  
  364.     // Select the changed shapes
  365.     fDrawSelection->SelectContent(ev, fChangedContent);
  366.     fDrawSelection->SelectionChanged(ev);    // Notify everybody
  367. }
  368.  
  369. //========================================================================================
  370. // CChangeColorCommand
  371. //========================================================================================
  372.  
  373. //----------------------------------------------------------------------------------------
  374. //    CChangeColorCommand constructor
  375. //----------------------------------------------------------------------------------------
  376.  
  377. CChangeColorCommand::CChangeColorCommand(Environment* ev,
  378.                                         ODCommandID commandID,
  379.                                         CDrawPart* part, 
  380.                                         FW_CFrame* frame,
  381.                                         CDrawSelection* selection,
  382.                                         const FW_CColor& newColor)
  383.     : CChangeShapeCommand(ev, commandID, part, frame, selection),
  384.         fNewColor(newColor),
  385.         fOldColors(NULL),
  386.         fIsFill(commandID == cChangeFillColor)
  387. {
  388.     if (fIsFill)
  389.         SetMenuStringsFromResource(ev, kDrawUndoStrings, kUndoFillColorMsg, kRedoFillColorMsg);
  390.     else
  391.         SetMenuStringsFromResource(ev, kDrawUndoStrings, kUndoFrameColorMsg, kRedoFrameColorMsg);
  392.  
  393.     FW_END_CONSTRUCTOR    
  394. }
  395.  
  396. //----------------------------------------------------------------------------------------
  397. //    CChangeColorCommand destructor
  398. //----------------------------------------------------------------------------------------
  399.  
  400. CChangeColorCommand::~CChangeColorCommand()
  401. {
  402.     FW_START_DESTRUCTOR
  403.     FW_CMemoryManager::FreeBlock(fOldColors);
  404. }
  405.  
  406. //----------------------------------------------------------------------------------------
  407. //    CChangeColorCommand::DoChange
  408. //----------------------------------------------------------------------------------------
  409.  
  410. void CChangeColorCommand::DoChange(Environment* ev)            // Override
  411. {
  412.     CAllShapeIterator it(fChangedContent);
  413.     for (CBaseShape* shape = it.First(); it.IsNotComplete(); shape = it.Next())
  414.     {
  415.         if (fIsFill)
  416.             shape->ChangeFillColor(ev, fDrawPart, fNewColor);
  417.         else
  418.             shape->ChangeFrameColor(ev, fDrawPart, fNewColor);
  419.     }
  420. }
  421.  
  422. //----------------------------------------------------------------------------------------
  423. //    CChangeColorCommand::UndoShape
  424. //----------------------------------------------------------------------------------------
  425.  
  426. void CChangeColorCommand::UndoShape(Environment* ev, CBaseShape* shape, unsigned long index)    // Override
  427. {
  428.     if (fIsFill)
  429.         shape->ChangeFillColor(ev, fDrawPart, fOldColors[index]);
  430.     else
  431.         shape->ChangeFrameColor(ev, fDrawPart, fOldColors[index]);        
  432. }
  433.  
  434. //----------------------------------------------------------------------------------------
  435. //    CChangeColorCommand::SaveUndoState
  436. //----------------------------------------------------------------------------------------
  437.  
  438. void CChangeColorCommand::SaveUndoState(Environment* ev)    // Override
  439. {
  440.     CAllShapeIterator it(fChangedContent);
  441.  
  442.     // Create array to hold colors
  443.     unsigned long shapeCount = it.CountShapes();    // count shapes, including grouped ones
  444.     fOldColors = (FW_CColor*)FW_CMemoryManager::AllocateBlock(sizeof(FW_CColor) * shapeCount);
  445.  
  446.     // Save shapes' colors
  447.     FW_CColor color;
  448.     short index = 0;
  449.     for (CBaseShape* shape = it.First(); it.IsNotComplete(); shape = it.Next())
  450.     {
  451.         shape->GetColor(fIsFill, color);
  452.         fOldColors[index] = color;
  453.         index++;
  454.     }    
  455. }
  456.  
  457. //========================================================================================
  458. // class CChangePatternCommand
  459. //========================================================================================
  460.  
  461. //----------------------------------------------------------------------------------------
  462. //    CChangePatternCommand constructor
  463. //----------------------------------------------------------------------------------------
  464.  
  465. CChangePatternCommand::CChangePatternCommand(Environment* ev,
  466.                                             ODCommandID commandID,
  467.                                             CDrawPart* part,
  468.                                             FW_CFrame* frame,
  469.                                             CDrawSelection* selection,
  470.                                             const FW_CPattern& newPattern)
  471.     : CChangeShapeCommand(ev, commandID, part, frame, selection),
  472.         fNewPattern(newPattern),
  473.         fOldPatterns(NULL),
  474.         fCount(0),
  475.         fIsFill(commandID == cChangeFillPattern)
  476. {
  477.     if (fIsFill)
  478.         SetMenuStringsFromResource(ev, kDrawUndoStrings, kUndoFillPatternMsg, kRedoFillPatternMsg);
  479.     else
  480.         SetMenuStringsFromResource(ev, kDrawUndoStrings, kUndoFramePatternMsg, kRedoFramePatternMsg);
  481.     
  482.     FW_END_CONSTRUCTOR    
  483. }
  484.  
  485. //----------------------------------------------------------------------------------------
  486. //    CChangePatternCommand destructor
  487. //----------------------------------------------------------------------------------------
  488.  
  489. CChangePatternCommand::~CChangePatternCommand()
  490. {
  491.     FW_START_DESTRUCTOR
  492.     
  493.     if (fOldPatterns)
  494.     {
  495.         for (unsigned short i = 0; i < fCount; i++)
  496.             delete fOldPatterns[i];
  497.         FW_CMemoryManager::FreeBlock(fOldPatterns);
  498.     }
  499. }
  500.  
  501. //----------------------------------------------------------------------------------------
  502. //    CChangePatternCommand::DoChange
  503. //----------------------------------------------------------------------------------------
  504.  
  505. void CChangePatternCommand::DoChange(Environment* ev)    // Override
  506. {
  507.     CAllShapeIterator it(fChangedContent);
  508.     for (CBaseShape* shape = it.First(); it.IsNotComplete(); shape = it.Next())
  509.     {
  510.         if (fIsFill)
  511.             shape->ChangeFillPattern(ev, fDrawPart, fNewPattern);
  512.         else 
  513.             shape->ChangeFramePattern(ev, fDrawPart, fNewPattern);
  514.     }
  515. }
  516.  
  517. //----------------------------------------------------------------------------------------
  518. //    CChangePatternCommand::UndoShape
  519. //----------------------------------------------------------------------------------------
  520.  
  521. void CChangePatternCommand::UndoShape(Environment* ev, CBaseShape* shape, unsigned long index)    // Override
  522. {
  523.     if (fIsFill)
  524.         shape->ChangeFillPattern(ev, fDrawPart, *(fOldPatterns[index]));
  525.     else
  526.         shape->ChangeFramePattern(ev, fDrawPart, *(fOldPatterns[index]));
  527. }
  528.  
  529. //----------------------------------------------------------------------------------------
  530. //    CChangePatternCommand::SaveUndoState
  531. //----------------------------------------------------------------------------------------
  532.  
  533. void CChangePatternCommand::SaveUndoState(Environment* ev)    // Override
  534. {
  535.     CAllShapeIterator it(fChangedContent);
  536.  
  537.     // Create array to hold patterns
  538.     unsigned long shapeCount = it.CountShapes();    // count shapes, including grouped ones
  539.     fOldPatterns = (FW_CPattern**)FW_CMemoryManager::AllocateBlock(sizeof(FW_CPattern*) * shapeCount);
  540. //    fOldPatterns = new FW_CPattern*[shapeCount];
  541.  
  542.     // Save shapes' patterns
  543.     for (CBaseShape* shape = it.First(); it.IsNotComplete(); shape = it.Next())
  544.     {
  545.         fOldPatterns[fCount] = FW_NEW(FW_CPattern, (shape->GetPattern(fIsFill)));
  546.         fCount++;
  547.     }    
  548. }
  549.  
  550. //========================================================================================
  551. // class CChangeRenderVerbCommand
  552. //========================================================================================
  553.  
  554. //----------------------------------------------------------------------------------------
  555. //    CChangeRenderVerbCommand constructor
  556. //----------------------------------------------------------------------------------------
  557.  
  558. CChangeRenderVerbCommand::CChangeRenderVerbCommand(Environment* ev,
  559.                                                     CDrawPart* part, 
  560.                                                     FW_CFrame* frame,
  561.                                                    CDrawSelection* selection,
  562.                                                    unsigned short newRenderVerb)
  563.     : CChangeShapeCommand(ev, cChangeRenderVerb, part, frame, selection),
  564.         fNewRenderVerb(newRenderVerb),
  565.         fOldRenderVerbs(NULL)
  566. {
  567.     SetMenuStringsFromResource(ev, kDrawUndoStrings, kUndoRenderVerbMsg, kRedoRenderVerbMsg);
  568.     FW_END_CONSTRUCTOR    
  569. }
  570.  
  571. //----------------------------------------------------------------------------------------
  572. //    CChangeRenderVerbCommand destructor
  573. //----------------------------------------------------------------------------------------
  574.  
  575. CChangeRenderVerbCommand::~CChangeRenderVerbCommand()
  576. {
  577.     FW_START_DESTRUCTOR
  578.     delete [] fOldRenderVerbs;
  579. }
  580.  
  581. //----------------------------------------------------------------------------------------
  582. //    CChangeRenderVerbCommand::DoChange
  583. //----------------------------------------------------------------------------------------
  584.  
  585. void CChangeRenderVerbCommand::DoChange(Environment* ev)    // Override
  586. {
  587.     CAllShapeIterator it(fChangedContent);
  588.     for (CBaseShape* shape = it.First(); it.IsNotComplete(); shape = it.Next())
  589.     {
  590.         shape->ChangeRenderVerb(ev, fDrawPart, fNewRenderVerb);
  591.     }
  592. }
  593.  
  594. //----------------------------------------------------------------------------------------
  595. //    CChangeRenderVerbCommand::UndoShape
  596. //----------------------------------------------------------------------------------------
  597.  
  598. void CChangeRenderVerbCommand::UndoShape(Environment* ev, CBaseShape* shape, unsigned long index)    // Override
  599. {
  600.     shape->ChangeRenderVerb(ev, fDrawPart, fOldRenderVerbs[index]);
  601. }
  602.  
  603. //----------------------------------------------------------------------------------------
  604. //    CChangeRenderVerbCommand::SaveUndoState
  605. //----------------------------------------------------------------------------------------
  606.  
  607. void CChangeRenderVerbCommand::SaveUndoState(Environment* ev)    // Override
  608. {
  609.     CAllShapeIterator it(fChangedContent);
  610.  
  611.     // Create array to hold render verbs
  612.     unsigned long shapeCount = it.CountShapes();    // count shapes, including grouped ones
  613.     fOldRenderVerbs = new unsigned short[shapeCount];
  614.  
  615.     // Finally, save shapes' render verbs
  616.     unsigned short verb;
  617.     short index = 0;
  618.     for (CBaseShape* shape = it.First(); it.IsNotComplete(); shape = it.Next())
  619.     {
  620.         verb = shape->GetRenderVerb();
  621.         fOldRenderVerbs[index] = verb;
  622.     }    
  623. }
  624.  
  625. //========================================================================================
  626. // class CChangePenSizeCommand
  627. //========================================================================================
  628.  
  629. //----------------------------------------------------------------------------------------
  630. //    CChangePenSizeCommand constructor
  631. //----------------------------------------------------------------------------------------
  632.  
  633. CChangePenSizeCommand::CChangePenSizeCommand(Environment* ev,
  634.                                              CDrawPart* part, 
  635.                                              FW_CFrame* frame,
  636.                                              CDrawSelection* selection,
  637.                                              FW_Fixed newPenSize)
  638.     : CChangeShapeCommand(ev, cChangePenSize, part, frame, selection),
  639.         fNewPenSize(newPenSize),
  640.         fOldPenSizes(NULL)
  641. {
  642.     SetMenuStringsFromResource(ev, kDrawUndoStrings, kUndoPenSizeMsg, kRedoPenSizeMsg);
  643.     FW_END_CONSTRUCTOR    
  644. }
  645.  
  646. //----------------------------------------------------------------------------------------
  647. //    CChangePenSizeCommand destructor
  648. //----------------------------------------------------------------------------------------
  649.  
  650. CChangePenSizeCommand::~CChangePenSizeCommand()
  651. {
  652.     FW_START_DESTRUCTOR
  653.     delete [] fOldPenSizes;
  654. }
  655.  
  656. //----------------------------------------------------------------------------------------
  657. //    CChangePenSizeCommand::DoChange
  658. //----------------------------------------------------------------------------------------
  659.  
  660. void CChangePenSizeCommand::DoChange(Environment* ev)    // Override
  661. {
  662.     CAllShapeIterator it(fChangedContent);
  663.     for (CBaseShape* shape = it.First(); it.IsNotComplete(); shape = it.Next())
  664.     {
  665.         shape->ChangePenSize(ev, fDrawPart, fNewPenSize);
  666.     }
  667. }
  668.  
  669. //----------------------------------------------------------------------------------------
  670. //    CChangePenSizeCommand::UndoShape
  671. //----------------------------------------------------------------------------------------
  672.  
  673. void CChangePenSizeCommand::UndoShape(Environment* ev, CBaseShape* shape, unsigned long index)    // Override
  674. {
  675.     shape->ChangePenSize(ev, fDrawPart, fOldPenSizes[index]);
  676. }
  677.  
  678. //----------------------------------------------------------------------------------------
  679. //    CChangePenSizeCommand::SaveUndoState
  680. //----------------------------------------------------------------------------------------
  681.  
  682. void CChangePenSizeCommand::SaveUndoState(Environment* ev)    // Override
  683. {
  684.     CAllShapeIterator it(fChangedContent);
  685.  
  686.     // Create array to hold pen sizes
  687.     unsigned long shapeCount = it.CountShapes();    // count shapes, including grouped ones
  688.     fOldPenSizes = new FW_Fixed[shapeCount];
  689.  
  690.     // Finally, save shapes' pen sizes
  691.     FW_Fixed penSize;
  692.     short index = 0;
  693.     for (CBaseShape* shape = it.First(); it.IsNotComplete(); shape = it.Next())
  694.     {
  695.         penSize = shape->GetPenSize();
  696.         fOldPenSizes[index] = penSize;
  697.     }    
  698. }
  699.