1/* 2 * Copyright 2006, Haiku. 3 * Distributed under the terms of the MIT License. 4 * 5 * Authors: 6 * Stephan A��mus <superstippi@gmx.de> 7 */ 8 9#include "RemoveShapesCommand.h" 10 11#include <new> 12#include <stdio.h> 13#include <string.h> 14 15#include <Catalog.h> 16#include <Locale.h> 17 18#include "ShapeContainer.h" 19#include "Shape.h" 20 21 22#undef B_TRANSLATION_CONTEXT 23#define B_TRANSLATION_CONTEXT "Icon-O-Matic-RemoveShapesCmd" 24 25 26using std::nothrow; 27 28// constructor 29RemoveShapesCommand::RemoveShapesCommand(ShapeContainer* container, 30 int32* const indices, 31 int32 count) 32 : Command(), 33 fContainer(container), 34 fShapes(count > 0 ? new (nothrow) Shape*[count] : NULL), 35 fIndices(count > 0 ? new (nothrow) int32[count] : NULL), 36 fCount(count), 37 fShapesRemoved(false) 38{ 39 if (!fContainer || !fShapes || !fIndices) 40 return; 41 42 memcpy(fIndices, indices, sizeof(int32) * fCount); 43 for (int32 i = 0; i < fCount; i++) 44 fShapes[i] = fContainer->ShapeAt(fIndices[i]); 45} 46 47// destructor 48RemoveShapesCommand::~RemoveShapesCommand() 49{ 50 if (fShapesRemoved && fShapes) { 51 for (int32 i = 0; i < fCount; i++) 52 fShapes[i]->Release(); 53 } 54 delete[] fShapes; 55 delete[] fIndices; 56} 57 58// InitCheck 59status_t 60RemoveShapesCommand::InitCheck() 61{ 62 return fContainer && fShapes && fIndices ? B_OK : B_NO_INIT; 63} 64 65// Perform 66status_t 67RemoveShapesCommand::Perform() 68{ 69 status_t ret = B_OK; 70 71 // remove shapes from container 72 for (int32 i = 0; i < fCount; i++) { 73 if (fShapes[i] && !fContainer->RemoveShape(fShapes[i])) { 74 ret = B_ERROR; 75 break; 76 } 77 } 78 fShapesRemoved = true; 79 80 return ret; 81} 82 83// Undo 84status_t 85RemoveShapesCommand::Undo() 86{ 87 status_t ret = B_OK; 88 89 // add shapes to container at remembered indices 90 for (int32 i = 0; i < fCount; i++) { 91 if (fShapes[i] && !fContainer->AddShape(fShapes[i], fIndices[i])) { 92 ret = B_ERROR; 93 break; 94 } 95 } 96 fShapesRemoved = false; 97 98 return ret; 99} 100 101// GetName 102void 103RemoveShapesCommand::GetName(BString& name) 104{ 105// if (fCount > 1) 106// name << _GetString(MOVE_MODIFIERS, "Move Shapes"); 107// else 108// name << _GetString(MOVE_MODIFIER, "Move Shape"); 109 if (fCount > 1) 110 name << B_TRANSLATE("Remove Shapes"); 111 else 112 name << B_TRANSLATE("Remove Shape"); 113} 114