btrfs: Attempt to fix GCC2 build.
[haiku.git] / src / apps / icon-o-matic / shape / commands / MoveTransformersCommand.cpp
blob4cb02c68d52e174544bd883d6e9d9886d92fd712
1 /*
2 * Copyright 2006, Haiku.
3 * Distributed under the terms of the MIT License.
5 * Authors:
6 * Stephan Aßmus <superstippi@gmx.de>
7 */
9 #include "MoveTransformersCommand.h"
11 #include <new>
12 #include <stdio.h>
14 #include <Catalog.h>
15 #include <Locale.h>
17 #include "Shape.h"
18 #include "Transformer.h"
21 #undef B_TRANSLATION_CONTEXT
22 #define B_TRANSLATION_CONTEXT "Icon-O-Matic-MoveTransformersCmd"
25 using std::nothrow;
27 // constructor
28 MoveTransformersCommand::MoveTransformersCommand(Shape* container,
29 Transformer** transformers,
30 int32 count,
31 int32 toIndex)
32 : Command(),
33 fContainer(container),
34 fTransformers(transformers),
35 fIndices(count > 0 ? new (nothrow) int32[count] : NULL),
36 fToIndex(toIndex),
37 fCount(count)
39 if (!fContainer || !fTransformers || !fIndices)
40 return;
42 // init original shape indices and
43 // adjust toIndex compensating for items that
44 // are removed before that index
45 int32 itemsBeforeIndex = 0;
46 for (int32 i = 0; i < fCount; i++) {
47 fIndices[i] = fContainer->IndexOf(fTransformers[i]);
48 if (fIndices[i] >= 0 && fIndices[i] < fToIndex)
49 itemsBeforeIndex++;
51 fToIndex -= itemsBeforeIndex;
54 // destructor
55 MoveTransformersCommand::~MoveTransformersCommand()
57 delete[] fTransformers;
58 delete[] fIndices;
61 // InitCheck
62 status_t
63 MoveTransformersCommand::InitCheck()
65 if (!fContainer || !fTransformers || !fIndices)
66 return B_NO_INIT;
68 // analyse the move, don't return B_OK in case
69 // the container state does not change...
71 int32 index = fIndices[0];
72 // NOTE: fIndices == NULL if fCount < 1
74 if (index != fToIndex) {
75 // a change is guaranteed
76 return B_OK;
79 // the insertion index is the same as the index of the first
80 // moved item, a change only occures if the indices of the
81 // moved items is not contiguous
82 bool isContiguous = true;
83 for (int32 i = 1; i < fCount; i++) {
84 if (fIndices[i] != index + 1) {
85 isContiguous = false;
86 break;
88 index = fIndices[i];
90 if (isContiguous) {
91 // the container state will not change because of the move
92 return B_ERROR;
95 return B_OK;
98 // Perform
99 status_t
100 MoveTransformersCommand::Perform()
102 status_t ret = B_OK;
104 // remove shapes from container
105 for (int32 i = 0; i < fCount; i++) {
106 if (fTransformers[i]
107 && !fContainer->RemoveTransformer(fTransformers[i])) {
108 ret = B_ERROR;
109 break;
112 if (ret < B_OK)
113 return ret;
115 // add shapes to container at the insertion index
116 int32 index = fToIndex;
117 for (int32 i = 0; i < fCount; i++) {
118 if (fTransformers[i]
119 && !fContainer->AddTransformer(fTransformers[i], index++)) {
120 ret = B_ERROR;
121 break;
125 return ret;
128 // Undo
129 status_t
130 MoveTransformersCommand::Undo()
132 status_t ret = B_OK;
134 // remove shapes from container
135 for (int32 i = 0; i < fCount; i++) {
136 if (fTransformers[i]
137 && !fContainer->RemoveTransformer(fTransformers[i])) {
138 ret = B_ERROR;
139 break;
142 if (ret < B_OK)
143 return ret;
145 // add shapes to container at remembered indices
146 for (int32 i = 0; i < fCount; i++) {
147 if (fTransformers[i]
148 && !fContainer->AddTransformer(fTransformers[i], fIndices[i])) {
149 ret = B_ERROR;
150 break;
154 return ret;
157 // GetName
158 void
159 MoveTransformersCommand::GetName(BString& name)
161 // if (fCount > 1)
162 // name << _GetString(MOVE_TRANSFORMERS, "Move Transformers");
163 // else
164 // name << _GetString(MOVE_TRANSFORMER, "Move Transformer");
165 if (fCount > 1)
166 name << B_TRANSLATE("Move Transformers");
167 else
168 name << B_TRANSLATE("Move Transformer");