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