home *** CD-ROM | disk | FTP | other *** search
Text File | 1996-09-17 | 25.4 KB | 788 lines | [TEXT/MPS ] |
- //========================================================================================
- //
- // File: DrawCmds.cpp
- // Release Version: $ ODF 2 $
- //
- // Author: Mary Boetcher
- //
- // Copyright: (c) 1993 - 1996 by Apple Computer, Inc., all rights reserved.
- //
- //========================================================================================
-
- #include "ODFDraw.hpp"
-
- #ifndef DRAWCMDS_H
- #include "DrawCmds.h"
- #endif
-
- #ifndef DRAWCONT_H
- #include "DrawCont.h"
- #endif
-
- #ifndef DRAWPART_H
- #include "DrawPart.h"
- #endif
-
- #ifndef DRAWSEL_H
- #include "DrawSel.h"
- #endif
-
- #ifndef DRAWCLIP_H
- #include "DrawClip.h"
- #endif
-
- #ifndef BASESHP_H
- #include "BaseShp.h"
- #endif
-
- #ifndef DRAWFRM_H
- #include "DrawFrm.h"
- #endif
-
- #ifndef GROUPSHP_H
- #include "GroupShp.h"
- #endif
-
- #ifndef DEFINES_K
- #include "Defines.k"
- #endif
-
- // ----- FrameWork Includes -----
-
- #ifndef FWPRESEN_H
- #include "FWPresen.h"
- #endif
-
- #ifndef FWMEMMGR_H
- #include "FWMemMgr.h"
- #endif
-
- #ifndef FWSOMENV_H
- #include "FWSOMEnv.h"
- #endif
-
- #ifndef SOM_ODShape_xh
- #include <Shape.xh>
- #endif
-
- #ifndef FWSESION_H
- #include "FWSesion.h"
- #endif
-
- //========================================================================================
- // RunTime Info
- //========================================================================================
-
- #ifdef FW_BUILD_MAC
- #pragma segment odfdrawcommand
- #endif
-
- FW_DEFINE_AUTO(CDrawShapeCommand)
- FW_DEFINE_AUTO(CResizeShapeCommand)
- FW_DEFINE_AUTO(CChangeShapeCommand)
- FW_DEFINE_AUTO(CChangeColorCommand)
- FW_DEFINE_AUTO(CChangePatternCommand)
- FW_DEFINE_AUTO(CChangeRenderVerbCommand)
- FW_DEFINE_AUTO(CChangePenSizeCommand)
-
- //========================================================================================
- // CDrawShapeCommand
- //========================================================================================
-
- //----------------------------------------------------------------------------------------
- // CDrawShapeCommand constructor
- //----------------------------------------------------------------------------------------
- CDrawShapeCommand::CDrawShapeCommand(Environment* ev,
- CDrawPart* part,
- FW_CFrame* frame,
- CDrawSelection* selection,
- CBaseShape* newShape) :
- #if defined(FW_BUILD_WIN) && FW_OPENDOC_VERSION == FW_OPENDOC_DR1
- FW_CCommand(ev, cDrawShapeCommand, frame, FW_kCantUndo),
- #else
- FW_CCommand(ev, cDrawShapeCommand, frame, FW_kCanUndo),
- #endif
- fDrawPart(part),
- fDrawSelection(selection),
- fNewContent(NULL)
- {
- SetMenuStringsFromResource(ev, kDrawUndoStrings, kUndoDrawingMsg, kRedoDrawingMsg);
-
- fNewContent = FW_NEW(CDrawContent, (ev, part, fDrawSelection->GetDragRect()));
- fNewContent->AddShape(ev, newShape);
-
- FW_END_CONSTRUCTOR
- }
-
- //----------------------------------------------------------------------------------------
- // CDrawShapeCommand destructor
- //----------------------------------------------------------------------------------------
- CDrawShapeCommand::~CDrawShapeCommand()
- {
- FW_START_DESTRUCTOR
- delete fNewContent;
- }
-
- //----------------------------------------------------------------------------------------
- // CDrawShapeCommand::FreeRedoState
- //----------------------------------------------------------------------------------------
- void CDrawShapeCommand::FreeRedoState(Environment* ev)
- {
- // Delete the new shape
- CBaseShape* newShape = fNewContent->GetFirstShape();
- fNewContent->EmptyShapes(ev);
- delete newShape;
- }
-
- //----------------------------------------------------------------------------------------
- // CDrawShapeCommand::DoIt
- //----------------------------------------------------------------------------------------
- void CDrawShapeCommand::DoIt(Environment* ev) // Override
- {
- if (this->IsOKtoEdit(ev))
- {
- fDrawPart->AddShapeToPart(ev, fNewContent->GetFirstShape());
- // fDrawSelection->SelectContent(ev, fNewContent);
- }
- else
- {
- this->SetCausesChange(ev, false);
- this->SetCanUndo(ev, false);
- }
- }
-
- //----------------------------------------------------------------------------------------
- // CDrawShapeCommand::UndoIt
- //----------------------------------------------------------------------------------------
- void CDrawShapeCommand::UndoIt(Environment* ev) // Override
- {
- // Unselect everything
- fDrawSelection->CloseSelection(ev);
-
- // Remove the shape from the part
- fDrawPart->RemoveShapeFromPart(ev, fNewContent->GetFirstShape());
- fNewContent->RedrawShapes(ev); // force redraw
- }
-
- //----------------------------------------------------------------------------------------
- // CDrawShapeCommand::RedoIt
- //----------------------------------------------------------------------------------------
- void CDrawShapeCommand::RedoIt(Environment* ev) // Override
- {
- // Add the shape back into the part
- fDrawPart->AddShapeToPart(ev, fNewContent->GetFirstShape());
- fNewContent->RedrawShapes(ev); // force redraw
-
- // Select the shape
- fDrawSelection->SelectContent(ev, fNewContent);
- }
-
- //========================================================================================
- // CResizeShapeCommand
- //========================================================================================
-
- //----------------------------------------------------------------------------------------
- // CResizeShapeCommand constructor
- //----------------------------------------------------------------------------------------
- CResizeShapeCommand::CResizeShapeCommand(Environment* ev,
- CDrawPart* part,
- FW_CFrame* frame,
- CDrawSelection* selection,
- const FW_CRect& srcRect,
- const FW_CRect& dstRect) :
- #if defined(FW_BUILD_WIN) && FW_OPENDOC_VERSION == FW_OPENDOC_DR1
- FW_CCommand(ev, cResizeCommand, frame, FW_kCantUndo),
- #else
- FW_CCommand(ev, cResizeCommand, frame, FW_kCanUndo),
- #endif
- fDrawPart(part),
- fDrawSelection(selection),
- fSourceRect(srcRect),
- fDestRect(dstRect),
- fUpdateShape(NULL),
- fChangedContent(NULL)
- {
- SetMenuStringsFromResource(ev, kDrawUndoStrings, kUndoResizeMsg, kRedoResizeMsg);
- FW_END_CONSTRUCTOR
- }
-
- //----------------------------------------------------------------------------------------
- // CResizeShapeCommand destructor
- //----------------------------------------------------------------------------------------
- CResizeShapeCommand::~CResizeShapeCommand()
- {
- FW_START_DESTRUCTOR
- delete fChangedContent;
-
- if (fUpdateShape)
- {
- FW_SOMEnvironment ev;
- fUpdateShape->Release(ev);
- }
- fUpdateShape = NULL;
- }
-
- //----------------------------------------------------------------------------------------
- // CResizeShapeCommand::DoIt
- //----------------------------------------------------------------------------------------
- void CResizeShapeCommand::DoIt(Environment* ev) // Override
- {
- if (!this->IsOKtoEdit(ev))
- {
- SetCanUndo(ev, false);
- SetCausesChange(ev, false);
- return;
- }
-
- // Copy selected shape pointers to our content object
- FW_ASSERT(fChangedContent == NULL);
- fChangedContent = FW_NEW(CDrawContent, (ev, fDrawPart, fDrawSelection->GetDrawContent(ev)));
-
- FW_ASSERT(fUpdateShape == NULL);
- fUpdateShape = fChangedContent->CalcUpdateShape(ev);
-
- this->MapShapes(ev, fSourceRect, fDestRect);
-
- {
- FW_CAcquiredODShape tempShape = fChangedContent->CalcUpdateShape(ev);
- fUpdateShape->Union(ev, tempShape);
- }
-
- this->Redraw(ev, kODDone);
- }
-
- //----------------------------------------------------------------------------------------
- // CResizeShapeCommand::UndoIt
- //----------------------------------------------------------------------------------------
- void CResizeShapeCommand::UndoIt(Environment* ev) // Override
- {
- this->MapShapes(ev, fDestRect, fSourceRect);
- this->Redraw(ev, kODUndone);
- }
-
- //----------------------------------------------------------------------------------------
- // CResizeShapeCommand::RedoIt
- //----------------------------------------------------------------------------------------
- void CResizeShapeCommand::RedoIt(Environment* ev) // Override
- {
- this->MapShapes(ev, fSourceRect, fDestRect);
- this->Redraw(ev, kODRedone);
- }
-
- //----------------------------------------------------------------------------------------
- // CResizeShapeCommand::MapShapes
- //----------------------------------------------------------------------------------------
- void CResizeShapeCommand::MapShapes(Environment* ev, const FW_CRect& srcRect, const FW_CRect& dstRect)
- {
- //--- Resize each shape ---
- CDrawContentShapeIterator it(fChangedContent);
- for (CBaseShape* shape = it.First(); it.IsNotComplete(); shape = it.Next())
- {
- shape->MapShape(ev, srcRect, dstRect);
- }
- }
-
- //----------------------------------------------------------------------------------------
- // CResizeShapeCommand::Redraw
- //----------------------------------------------------------------------------------------
- void CResizeShapeCommand::Redraw(Environment* ev, ODDoneState doneState)
- {
- FW_UNUSED(doneState);
- FW_CPresentation* presentation = fDrawPart->GetMainPresentation();
- presentation->Invalidate(ev, fUpdateShape);
-
- CDrawFacetClipper facetClipper(fDrawPart);
- facetClipper.Clip(ev, presentation, fUpdateShape);
-
- // Select the resized shapes
- fDrawSelection->SelectContent(ev, fChangedContent);
- }
-
- //----------------------------------------------------------------------------------------
- // CResizeShapeCommand::IsOKtoEdit
- //----------------------------------------------------------------------------------------
- FW_Boolean CResizeShapeCommand::IsOKtoEdit(Environment* ev)
- {
- FW_Boolean result = FW_CCommand::IsOKtoEdit(ev);
-
- if (result)
- result = fDrawSelection->CanEditSelection(ev, GetFrame(ev));
-
- return result;
- }
-
- //----------------------------------------------------------------------------------------
- // CResizeShapeCommand::PropagateChanges
- //----------------------------------------------------------------------------------------
- void CResizeShapeCommand::PropagateChanges(Environment* ev, ODUpdateID id )
- {
- if (id == kODUnknownUpdate)
- id = FW_CSession::UniqueUpdateID(ev);
-
- fDrawSelection->SelectionChanged(ev, id);
- FW_CCommand::PropagateChanges(ev, id);
- }
-
-
-
- //========================================================================================
- // CChangeShapeCommand
- //========================================================================================
-
- //----------------------------------------------------------------------------------------
- // CChangeShapeCommand constructor
- //----------------------------------------------------------------------------------------
-
- CChangeShapeCommand::CChangeShapeCommand(Environment* ev,
- ODCommandID id,
- CDrawPart* part,
- FW_CFrame* frame,
- CDrawSelection* selection) :
- FW_CCommand(ev, id, frame, FW_kCanUndo),
- fDrawPart(part),
- fDrawSelection(selection),
- fChangedContent(NULL)
- {
- FW_END_CONSTRUCTOR
- }
-
- //----------------------------------------------------------------------------------------
- // CChangeShapeCommand destructor
- //----------------------------------------------------------------------------------------
-
- CChangeShapeCommand::~CChangeShapeCommand()
- {
- FW_START_DESTRUCTOR
- delete fChangedContent;
- }
-
- //----------------------------------------------------------------------------------------
- // CChangeShapeCommand::DoIt
- //----------------------------------------------------------------------------------------
-
- void CChangeShapeCommand::DoIt(Environment* ev) // Override
- {
- if (!this->IsOKtoEdit(ev))
- {
- SetCanUndo(ev, false);
- SetCausesChange(ev, false);
- return;
- }
-
- // Copy selected shape pointers to our content object
- FW_ASSERT(fChangedContent == NULL);
- fChangedContent = FW_NEW(CDrawContent, (ev, fDrawPart, fDrawSelection->GetDrawContent(ev)));
-
- this->SaveUndoState(ev); // Save command-specific data
- this->DoChange(ev); // perform command-specific tasks
-
- this->UpdateDisplay(ev);
- }
-
- //----------------------------------------------------------------------------------------
- // CChangeShapeCommand::UndoIt
- //----------------------------------------------------------------------------------------
-
- void CChangeShapeCommand::UndoIt(Environment* ev) // Override
- {
- // Iterate through the shape list, undoing each change
- CAllShapeIterator it(fChangedContent);
- unsigned long index = 0;
- for (CBaseShape* shape = it.First(); it.IsNotComplete(); shape = it.Next())
- {
- this->UndoShape(ev, shape, index);
- index++;
- }
-
- this->UpdateDisplay(ev);
- }
-
- //----------------------------------------------------------------------------------------
- // CChangeShapeCommand::RedoIt
- //----------------------------------------------------------------------------------------
-
- void CChangeShapeCommand::RedoIt(Environment* ev) // Override
- {
- this->DoChange(ev);
- this->UpdateDisplay(ev);
- }
-
- //----------------------------------------------------------------------------------------
- // CChangeShapeCommand::UpdateDisplay
- //----------------------------------------------------------------------------------------
-
- void CChangeShapeCommand::UpdateDisplay(Environment* ev)
- {
- // Redraw the changed shapes
- fChangedContent->RedrawShapes(ev);
-
- // Select the changed shapes
- fDrawSelection->SelectContent(ev, fChangedContent);
- }
-
- //----------------------------------------------------------------------------------------
- // CChangeShapeCommand::IsOKtoEdit
- //----------------------------------------------------------------------------------------
-
- FW_Boolean CChangeShapeCommand::IsOKtoEdit(Environment* ev)
- {
- FW_Boolean result = FW_CCommand::IsOKtoEdit(ev);
-
- if (result)
- result = fDrawSelection->CanEditSelection(ev, GetFrame(ev));
-
- return result;
- }
-
- //----------------------------------------------------------------------------------------
- // CChangeShapeCommand::PropagateChanges
- //----------------------------------------------------------------------------------------
-
- void CChangeShapeCommand::PropagateChanges(Environment* ev, ODUpdateID id)
- {
-
- if (id == kODUnknownUpdate)
- id = FW_CSession::UniqueUpdateID(ev);
-
- fDrawSelection->SelectionChanged(ev, id);
-
- FW_CCommand::PropagateChanges(ev, id);
- }
-
-
-
- //========================================================================================
- // CChangeColorCommand
- //========================================================================================
-
- //----------------------------------------------------------------------------------------
- // CChangeColorCommand constructor
- //----------------------------------------------------------------------------------------
-
- CChangeColorCommand::CChangeColorCommand(Environment* ev,
- ODCommandID commandID,
- CDrawPart* part,
- FW_CFrame* frame,
- CDrawSelection* selection,
- const FW_CColor& newColor)
- : CChangeShapeCommand(ev, commandID, part, frame, selection),
- fNewColor(newColor),
- fOldColors(NULL),
- fIsFill(commandID == cChangeFillColor)
- {
- if (fIsFill)
- SetMenuStringsFromResource(ev, kDrawUndoStrings, kUndoFillColorMsg, kRedoFillColorMsg);
- else
- SetMenuStringsFromResource(ev, kDrawUndoStrings, kUndoFrameColorMsg, kRedoFrameColorMsg);
-
- FW_END_CONSTRUCTOR
- }
-
- //----------------------------------------------------------------------------------------
- // CChangeColorCommand destructor
- //----------------------------------------------------------------------------------------
-
- CChangeColorCommand::~CChangeColorCommand()
- {
- FW_START_DESTRUCTOR
- FW_CMemoryManager::FreeBlock(fOldColors);
- }
-
- //----------------------------------------------------------------------------------------
- // CChangeColorCommand::DoChange
- //----------------------------------------------------------------------------------------
-
- void CChangeColorCommand::DoChange(Environment* ev) // Override
- {
- CAllShapeIterator it(fChangedContent);
- for (CBaseShape* shape = it.First(); it.IsNotComplete(); shape = it.Next())
- {
- if (fIsFill)
- shape->ChangeFillColor(ev, fNewColor);
- else
- shape->ChangeFrameColor(ev, fNewColor);
- }
- }
-
- //----------------------------------------------------------------------------------------
- // CChangeColorCommand::UndoShape
- //----------------------------------------------------------------------------------------
-
- void CChangeColorCommand::UndoShape(Environment* ev, CBaseShape* shape, unsigned long index) // Override
- {
- if (fIsFill)
- shape->ChangeFillColor(ev, fOldColors[index]);
- else
- shape->ChangeFrameColor(ev, fOldColors[index]);
- }
-
- //----------------------------------------------------------------------------------------
- // CChangeColorCommand::SaveUndoState
- //----------------------------------------------------------------------------------------
-
- void CChangeColorCommand::SaveUndoState(Environment* ev) // Override
- {
- FW_UNUSED(ev);
- CAllShapeIterator it(fChangedContent);
-
- // Create array to hold colors
- unsigned long shapeCount = it.CountShapes(); // count shapes, including grouped ones
- fOldColors = (FW_CColor*)FW_CMemoryManager::AllocateBlock(sizeof(FW_CColor) * shapeCount);
-
- // Save shapes' colors
- FW_CColor color;
- short index = 0;
- for (CBaseShape* shape = it.First(); it.IsNotComplete(); shape = it.Next())
- {
- shape->GetColor(fIsFill, color);
- fOldColors[index] = color;
- index++;
- }
- }
-
- //========================================================================================
- // class CChangePatternCommand
- //========================================================================================
-
- //----------------------------------------------------------------------------------------
- // CChangePatternCommand constructor
- //----------------------------------------------------------------------------------------
-
- CChangePatternCommand::CChangePatternCommand(Environment* ev,
- ODCommandID commandID,
- CDrawPart* part,
- FW_CFrame* frame,
- CDrawSelection* selection,
- const FW_CPattern& newPattern)
- : CChangeShapeCommand(ev, commandID, part, frame, selection),
- fNewPattern(newPattern),
- fOldPatterns(NULL),
- fCount(0),
- fIsFill(commandID == cChangeFillPattern)
- {
- if (fIsFill)
- SetMenuStringsFromResource(ev, kDrawUndoStrings, kUndoFillPatternMsg, kRedoFillPatternMsg);
- else
- SetMenuStringsFromResource(ev, kDrawUndoStrings, kUndoFramePatternMsg, kRedoFramePatternMsg);
-
- FW_END_CONSTRUCTOR
- }
-
- //----------------------------------------------------------------------------------------
- // CChangePatternCommand destructor
- //----------------------------------------------------------------------------------------
-
- CChangePatternCommand::~CChangePatternCommand()
- {
- FW_START_DESTRUCTOR
-
- if (fOldPatterns)
- {
- for (unsigned short i = 0; i < fCount; i++)
- delete fOldPatterns[i];
- FW_CMemoryManager::FreeBlock(fOldPatterns);
- }
- }
-
- //----------------------------------------------------------------------------------------
- // CChangePatternCommand::DoChange
- //----------------------------------------------------------------------------------------
-
- void CChangePatternCommand::DoChange(Environment* ev) // Override
- {
- CAllShapeIterator it(fChangedContent);
- for (CBaseShape* shape = it.First(); it.IsNotComplete(); shape = it.Next())
- {
- if (fIsFill)
- shape->ChangeFillPattern(ev, fNewPattern);
- else
- shape->ChangeFramePattern(ev, fNewPattern);
- }
- }
-
- //----------------------------------------------------------------------------------------
- // CChangePatternCommand::UndoShape
- //----------------------------------------------------------------------------------------
-
- void CChangePatternCommand::UndoShape(Environment* ev, CBaseShape* shape, unsigned long index) // Override
- {
- if (fIsFill)
- shape->ChangeFillPattern(ev, *(fOldPatterns[index]));
- else
- shape->ChangeFramePattern(ev, *(fOldPatterns[index]));
- }
-
- //----------------------------------------------------------------------------------------
- // CChangePatternCommand::SaveUndoState
- //----------------------------------------------------------------------------------------
-
- void CChangePatternCommand::SaveUndoState(Environment* ev) // Override
- {
- FW_UNUSED(ev);
- CAllShapeIterator it(fChangedContent);
-
- // Create array to hold patterns
- unsigned long shapeCount = it.CountShapes(); // count shapes, including grouped ones
- fOldPatterns = (FW_CPattern**)FW_CMemoryManager::AllocateBlock(sizeof(FW_CPattern*) * shapeCount);
- // fOldPatterns = new FW_CPattern*[shapeCount];
-
- // Save shapes' patterns
- for (CBaseShape* shape = it.First(); it.IsNotComplete(); shape = it.Next())
- {
- fOldPatterns[fCount] = FW_NEW(FW_CPattern, (shape->GetPattern(fIsFill)));
- fCount++;
- }
- }
-
- //========================================================================================
- // class CChangeRenderVerbCommand
- //========================================================================================
-
- //----------------------------------------------------------------------------------------
- // CChangeRenderVerbCommand constructor
- //----------------------------------------------------------------------------------------
-
- CChangeRenderVerbCommand::CChangeRenderVerbCommand(Environment* ev,
- CDrawPart* part,
- FW_CFrame* frame,
- CDrawSelection* selection,
- unsigned short newRenderVerb)
- : CChangeShapeCommand(ev, cChangeRenderVerb, part, frame, selection),
- fNewRenderVerb(newRenderVerb),
- fOldRenderVerbs(NULL)
- {
- SetMenuStringsFromResource(ev, kDrawUndoStrings, kUndoRenderVerbMsg, kRedoRenderVerbMsg);
- FW_END_CONSTRUCTOR
- }
-
- //----------------------------------------------------------------------------------------
- // CChangeRenderVerbCommand destructor
- //----------------------------------------------------------------------------------------
-
- CChangeRenderVerbCommand::~CChangeRenderVerbCommand()
- {
- FW_START_DESTRUCTOR
- delete [] fOldRenderVerbs;
- }
-
- //----------------------------------------------------------------------------------------
- // CChangeRenderVerbCommand::DoChange
- //----------------------------------------------------------------------------------------
-
- void CChangeRenderVerbCommand::DoChange(Environment* ev) // Override
- {
- CAllShapeIterator it(fChangedContent);
- for (CBaseShape* shape = it.First(); it.IsNotComplete(); shape = it.Next())
- {
- shape->ChangeRenderVerb(ev, fNewRenderVerb);
- }
- }
-
- //----------------------------------------------------------------------------------------
- // CChangeRenderVerbCommand::UndoShape
- //----------------------------------------------------------------------------------------
-
- void CChangeRenderVerbCommand::UndoShape(Environment* ev, CBaseShape* shape, unsigned long index) // Override
- {
- shape->ChangeRenderVerb(ev, fOldRenderVerbs[index]);
- }
-
- //----------------------------------------------------------------------------------------
- // CChangeRenderVerbCommand::SaveUndoState
- //----------------------------------------------------------------------------------------
-
- void CChangeRenderVerbCommand::SaveUndoState(Environment* ev) // Override
- {
- FW_UNUSED(ev);
- CAllShapeIterator it(fChangedContent);
-
- // Create array to hold render verbs
- unsigned long shapeCount = it.CountShapes(); // count shapes, including grouped ones
- fOldRenderVerbs = new unsigned short[shapeCount];
-
- // Finally, save shapes' render verbs
- unsigned short verb;
- short index = 0;
- for (CBaseShape* shape = it.First(); it.IsNotComplete(); shape = it.Next())
- {
- verb = shape->GetRenderVerb();
- fOldRenderVerbs[index] = verb;
- }
- }
-
- //========================================================================================
- // class CChangePenSizeCommand
- //========================================================================================
-
- //----------------------------------------------------------------------------------------
- // CChangePenSizeCommand constructor
- //----------------------------------------------------------------------------------------
-
- CChangePenSizeCommand::CChangePenSizeCommand(Environment* ev,
- CDrawPart* part,
- FW_CFrame* frame,
- CDrawSelection* selection,
- FW_Fixed newPenSize)
- : CChangeShapeCommand(ev, cChangePenSize, part, frame, selection),
- fNewPenSize(newPenSize),
- fOldPenSizes(NULL)
- {
- SetMenuStringsFromResource(ev, kDrawUndoStrings, kUndoPenSizeMsg, kRedoPenSizeMsg);
- FW_END_CONSTRUCTOR
- }
-
- //----------------------------------------------------------------------------------------
- // CChangePenSizeCommand destructor
- //----------------------------------------------------------------------------------------
-
- CChangePenSizeCommand::~CChangePenSizeCommand()
- {
- FW_START_DESTRUCTOR
- delete [] fOldPenSizes;
- }
-
- //----------------------------------------------------------------------------------------
- // CChangePenSizeCommand::DoChange
- //----------------------------------------------------------------------------------------
-
- void CChangePenSizeCommand::DoChange(Environment* ev) // Override
- {
- CAllShapeIterator it(fChangedContent);
- for (CBaseShape* shape = it.First(); it.IsNotComplete(); shape = it.Next())
- {
- shape->ChangePenSize(ev, fNewPenSize);
- }
- }
-
- //----------------------------------------------------------------------------------------
- // CChangePenSizeCommand::UndoShape
- //----------------------------------------------------------------------------------------
-
- void CChangePenSizeCommand::UndoShape(Environment* ev, CBaseShape* shape, unsigned long index) // Override
- {
- shape->ChangePenSize(ev, fOldPenSizes[index]);
- }
-
- //----------------------------------------------------------------------------------------
- // CChangePenSizeCommand::SaveUndoState
- //----------------------------------------------------------------------------------------
-
- void CChangePenSizeCommand::SaveUndoState(Environment* ev) // Override
- {
- FW_UNUSED(ev);
- CAllShapeIterator it(fChangedContent);
-
- // Create array to hold pen sizes
- unsigned long shapeCount = it.CountShapes(); // count shapes, including grouped ones
- fOldPenSizes = new FW_Fixed[shapeCount];
-
- // Finally, save shapes' pen sizes
- FW_Fixed penSize;
- short index = 0;
- for (CBaseShape* shape = it.First(); it.IsNotComplete(); shape = it.Next())
- {
- penSize = shape->GetPenSize();
- fOldPenSizes[index] = penSize;
- }
- }
-