1 /*
2 * Copyright 2006, 2023, Haiku.
3 * Distributed under the terms of the MIT License.
4 *
5 * Authors:
6 * Stephan Aßmus <superstippi@gmx.de>
7 * Zardshard
8 */
9
10 #include "RemovePathsCommand.h"
11
12 #include <new>
13
14 #include <Catalog.h>
15 #include <List.h>
16 #include <Locale.h>
17 #include <StringFormat.h>
18
19 #include "Container.h"
20 #include "PathSourceShape.h"
21 #include "Shape.h"
22 #include "VectorPath.h"
23
24
25 #undef B_TRANSLATION_CONTEXT
26 #define B_TRANSLATION_CONTEXT "Icon-O-Matic-RemovePathsCmd"
27
28
29 using std::nothrow;
30
31
RemovePathsCommand(Container<VectorPath> * container,const int32 * indices,int32 count)32 RemovePathsCommand::RemovePathsCommand(
33 Container<VectorPath>* container, const int32* indices, int32 count)
34 : RemoveCommand<VectorPath>(container, indices, count),
35 fShapes(indices && count > 0 ? new (nothrow) BList[count] : NULL)
36 {
37 if (!fShapes)
38 return;
39
40 // get the shapes associated with each path
41 for (int32 i = 0; i < fCount; i++) {
42 if (fItems[i]) {
43 int32 listenerCount = fItems[i]->CountListeners();
44 for (int32 j = 0; j < listenerCount; j++) {
45 PathSourceShape* shape
46 = dynamic_cast<PathSourceShape*>(fItems[i]->ListenerAtFast(j));
47 if (shape)
48 fShapes[i].AddItem((void*)shape);
49 }
50 }
51 }
52 }
53
54
~RemovePathsCommand()55 RemovePathsCommand::~RemovePathsCommand()
56 {
57 delete[] fShapes;
58 }
59
60
61 status_t
InitCheck()62 RemovePathsCommand::InitCheck()
63 {
64 return fShapes ? B_OK : B_NO_INIT;
65 }
66
67
68 status_t
Perform()69 RemovePathsCommand::Perform()
70 {
71 // remove paths from the container
72 status_t ret = RemoveCommand<VectorPath>::Perform();
73 if (ret != B_OK)
74 return ret;
75 fItemsRemoved = false; // We're not done yet!
76
77 // remove paths from shapes that reference them
78 for (int32 i = 0; i < fCount; i++) {
79 if (!fItems[i])
80 continue;
81 int32 shapeCount = fShapes[i].CountItems();
82 for (int32 j = 0; j < shapeCount; j++) {
83 PathSourceShape* shape = (PathSourceShape*)fShapes[i].ItemAtFast(j);
84 shape->Paths()->RemoveItem(fItems[i]);
85 }
86 }
87 fItemsRemoved = true;
88
89 return ret;
90 }
91
92
93 status_t
Undo()94 RemovePathsCommand::Undo()
95 {
96 // add paths to the container
97 status_t ret = RemoveCommand<VectorPath>::Undo();
98 if (ret != B_OK)
99 return ret;
100 fItemsRemoved = true; // We're not done yet!
101
102 // add paths to shapes which previously referenced them
103 for (int32 i = 0; i < fCount; i++) {
104 if (!fItems[i])
105 continue;
106 int32 shapeCount = fShapes[i].CountItems();
107 for (int32 j = 0; j < shapeCount; j++) {
108 PathSourceShape* shape = (PathSourceShape*)fShapes[i].ItemAtFast(j);
109 shape->Paths()->AddItem(fItems[i]);
110 }
111 }
112
113 fItemsRemoved = false;
114
115 return ret;
116 }
117
118
119 void
GetName(BString & name)120 RemovePathsCommand::GetName(BString& name)
121 {
122 static BStringFormat format(B_TRANSLATE("Remove {0, plural, "
123 "one{path} other{paths}}"));
124 format.Format(name, fCount);
125 }
126