2 * Copyright 2006, Haiku. All rights reserved.
3 * Distributed under the terms of the MIT License.
6 * Stephan Aßmus <superstippi@gmx.de>
9 #include "MoveStylesCommand.h"
17 #include "StyleContainer.h"
21 #undef B_TRANSLATION_CONTEXT
22 #define B_TRANSLATION_CONTEXT "Icon-O-Matic-MoveStylesCmd"
28 MoveStylesCommand::MoveStylesCommand(StyleContainer
* container
,
33 fContainer(container
),
35 fIndices(count
> 0 ? new (nothrow
) int32
[count
] : NULL
),
39 if (!fContainer
|| !fStyles
|| !fIndices
)
42 // init original style 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(fStyles
[i
]);
48 if (fIndices
[i
] >= 0 && fIndices
[i
] < fToIndex
)
51 fToIndex
-= itemsBeforeIndex
;
55 MoveStylesCommand::~MoveStylesCommand()
63 MoveStylesCommand::InitCheck()
65 if (!fContainer
|| !fStyles
|| !fIndices
)
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
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) {
91 // the container state will not change because of the move
100 MoveStylesCommand::Perform()
104 // remove styles from container
105 for (int32 i
= 0; i
< fCount
; i
++) {
106 if (fStyles
[i
] && !fContainer
->RemoveStyle(fStyles
[i
])) {
114 // add styles to container at the insertion index
115 int32 index
= fToIndex
;
116 for (int32 i
= 0; i
< fCount
; i
++) {
117 if (fStyles
[i
] && !fContainer
->AddStyle(fStyles
[i
], index
++)) {
128 MoveStylesCommand::Undo()
132 // remove styles from container
133 for (int32 i
= 0; i
< fCount
; i
++) {
134 if (fStyles
[i
] && !fContainer
->RemoveStyle(fStyles
[i
])) {
142 // add styles to container at remembered indices
143 for (int32 i
= 0; i
< fCount
; i
++) {
144 if (fStyles
[i
] && !fContainer
->AddStyle(fStyles
[i
], fIndices
[i
])) {
155 MoveStylesCommand::GetName(BString
& name
)
158 name
<< B_TRANSLATE("Move Styles");
160 name
<< B_TRANSLATE("Move Style");