xref: /haiku/src/apps/icon-o-matic/style/RemoveStylesCommand.cpp (revision c237c4ce593ee823d9867fd997e51e4c447f5623)
1 /*
2  * Copyright 2006, 2023, Haiku. All rights reserved.
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 "RemoveStylesCommand.h"
11 
12 #include <new>
13 
14 #include <Catalog.h>
15 #include <Locale.h>
16 #include <StringFormat.h>
17 
18 #include "PathSourceShape.h"
19 #include "Style.h"
20 
21 
22 #undef B_TRANSLATION_CONTEXT
23 #define B_TRANSLATION_CONTEXT "Icon-O-Matic-RemoveStylesCmd"
24 
25 
26 using std::nothrow;
27 
28 
29 RemoveStylesCommand::RemoveStylesCommand(Container<Style>* container,
30 		int32* const indices, int32 count)
31 	: RemoveCommand<Style>(container, indices, count),
32 	  fShapes(indices && count > 0 ? new (nothrow) BList[count] : NULL)
33 {
34 	if (!fShapes)
35 		return;
36 
37 	// get the shapes associated with each style
38 	for (int32 i = 0; i < fCount; i++) {
39 		if (fItems[i]) {
40 			int32 listenerCount = fItems[i]->CountObservers();
41 			for (int32 j = 0; j < listenerCount; j++) {
42 				PathSourceShape* shape
43 					= dynamic_cast<PathSourceShape*>(fItems[i]->ObserverAtFast(j));
44 				if (shape != NULL)
45 					fShapes[i].AddItem((void*)shape);
46 			}
47 		}
48 	}
49 }
50 
51 
52 RemoveStylesCommand::~RemoveStylesCommand()
53 {
54 	delete[] fShapes;
55 }
56 
57 
58 status_t
59 RemoveStylesCommand::InitCheck()
60 {
61 	return fShapes ? B_OK : B_NO_INIT;
62 }
63 
64 
65 status_t
66 RemoveStylesCommand::Perform()
67 {
68 	// remove styles from the container
69 	status_t ret = RemoveCommand<Style>::Perform();
70 	if (ret != B_OK)
71 		return ret;
72 	fItemsRemoved = false; // We're not done yet!
73 
74 	// remove styles from shapes that reference them
75 	for (int32 i = 0; i < fCount; i++) {
76 		if (!fItems[i])
77 			continue;
78 		int32 shapeCount = fShapes[i].CountItems();
79 		for (int32 j = 0; j < shapeCount; j++) {
80 			PathSourceShape* shape = (PathSourceShape*)fShapes[i].ItemAtFast(j);
81 			shape->SetStyle(fContainer->ItemAt(0));
82 		}
83 	}
84 
85 	fItemsRemoved = true;
86 
87 	return B_OK;
88 }
89 
90 
91 status_t
92 RemoveStylesCommand::Undo()
93 {
94 	// add styles to the container
95 	status_t ret = RemoveCommand<Style>::Undo();
96 	if (ret != B_OK)
97 		return ret;
98 	fItemsRemoved = true; // We're not done yet!
99 
100 	// add styles to the shapes which previously referenced them
101 	for (int32 i = 0; i < fCount; i++) {
102 		if (!fItems[i])
103 			continue;
104 		int32 shapeCount = fShapes[i].CountItems();
105 		for (int32 j = 0; j < shapeCount; j++) {
106 			PathSourceShape* shape = (PathSourceShape*)fShapes[i].ItemAtFast(j);
107 			shape->SetStyle(fItems[i]);
108 		}
109 	}
110 
111 	fItemsRemoved = false;
112 
113 	return ret;
114 }
115 
116 
117 void
118 RemoveStylesCommand::GetName(BString& name)
119 {
120 	static BStringFormat format(B_TRANSLATE("Remove {0, plural, "
121 		"one{style} other{styles}}"));
122 	format.Format(name, fCount);
123 }
124