1/*
2 * Copyright 2006-2010, Stephan A��mus <superstippi@gmx.de>.
3 * Copyright 2006-2009, 2023, Haiku.
4 * All rights reserved. Distributed under the terms of the MIT License.
5 *
6 * Authors:
7 *		Stephan A��mus <superstippi@gmx.de>
8 *		Zardshard
9 */
10
11
12#include "PerspectiveCommand.h"
13
14#include <Catalog.h>
15#include <Locale.h>
16
17#include "PerspectiveTransformer.h"
18
19
20#undef B_TRANSLATION_CONTEXT
21#define B_TRANSLATION_CONTEXT "Icon-O-Matic-PerspectiveCommand"
22
23
24PerspectiveCommand::PerspectiveCommand(PerspectiveBox* box,
25	PerspectiveTransformer* transformer, BPoint leftTop, BPoint rightTop
26	, BPoint leftBottom, BPoint rightBottom)
27	: fTransformBox(box),
28	  fTransformer(transformer),
29	  fOldLeftTop(leftTop),
30	  fOldRightTop(rightTop),
31	  fOldLeftBottom(leftBottom),
32	  fOldRightBottom(rightBottom),
33	  fNewLeftTop(leftTop),
34	  fNewRightTop(rightTop),
35	  fNewLeftBottom(leftBottom),
36	  fNewRightBottom(rightBottom)
37{
38	if (fTransformer == NULL)
39		return;
40
41	fTransformer->AcquireReference();
42
43	if (fTransformBox != NULL)
44		fTransformBox->AddListener(this);
45}
46
47
48PerspectiveCommand::~PerspectiveCommand()
49{
50	if (fTransformer != NULL)
51		fTransformer->ReleaseReference();
52
53	if (fTransformBox != NULL)
54		fTransformBox->RemoveListener(this);
55}
56
57
58// pragma mark -
59
60
61status_t
62PerspectiveCommand::InitCheck()
63{
64	if (fTransformer != NULL
65		&& (fOldLeftTop != fNewLeftTop
66			|| fOldRightTop != fNewRightTop
67			|| fOldLeftBottom != fNewLeftBottom
68			|| fOldRightBottom != fNewRightBottom))
69		return B_OK;
70
71	return B_NO_INIT;
72}
73
74
75status_t
76PerspectiveCommand::Perform()
77{
78	// objects are already transformed
79	return B_OK;
80}
81
82
83status_t
84PerspectiveCommand::Undo()
85{
86	if (fTransformBox != NULL) {
87		fTransformBox->TransformTo(fOldLeftTop, fOldRightTop, fOldLeftBottom, fOldRightBottom);
88		return B_OK;
89	}
90
91	fTransformer->TransformTo(fOldLeftTop, fOldRightTop, fOldLeftBottom, fOldRightBottom);
92	return B_OK;
93}
94
95
96status_t
97PerspectiveCommand::Redo()
98{
99	if (fTransformBox != NULL) {
100		fTransformBox->TransformTo(fNewLeftTop, fNewRightTop, fNewLeftBottom, fNewRightBottom);
101		return B_OK;
102	}
103
104	fTransformer->TransformTo(fNewLeftTop, fNewRightTop, fNewLeftBottom, fNewRightBottom);
105	return B_OK;
106}
107
108
109void
110PerspectiveCommand::GetName(BString& name)
111{
112	name << B_TRANSLATE("Change perspective");
113}
114
115
116// pragma mark -
117
118
119void
120PerspectiveCommand::PerspectiveBoxDeleted(const PerspectiveBox* box)
121{
122	if (fTransformBox == box) {
123		if (fTransformBox != NULL)
124			fTransformBox->RemoveListener(this);
125		fTransformBox = NULL;
126	}
127}
128
129
130// #pragma mark -
131
132
133void
134PerspectiveCommand::SetNewPerspective(
135	BPoint leftTop, BPoint rightTop, BPoint leftBottom, BPoint rightBottom)
136{
137	fNewLeftTop = leftTop;
138	fNewRightTop = rightTop;
139	fNewLeftBottom = leftBottom;
140	fNewRightBottom = rightBottom;
141}
142