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
29using std::nothrow;
30
31
32RemovePathsCommand::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
55RemovePathsCommand::~RemovePathsCommand()
56{
57	delete[] fShapes;
58}
59
60
61status_t
62RemovePathsCommand::InitCheck()
63{
64	return fShapes ? B_OK : B_NO_INIT;
65}
66
67
68status_t
69RemovePathsCommand::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
93status_t
94RemovePathsCommand::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
119void
120RemovePathsCommand::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