xref: /haiku/src/apps/icon-o-matic/shape/commands/ChangePointCommand.cpp (revision 518852fca73d16198413de528219fcdfa6b04647)
1128277c9SStephan Aßmus /*
2128277c9SStephan Aßmus  * Copyright 2006, Haiku.
3128277c9SStephan Aßmus  * Distributed under the terms of the MIT License.
4128277c9SStephan Aßmus  *
5128277c9SStephan Aßmus  * Authors:
6128277c9SStephan Aßmus  *		Stephan Aßmus <superstippi@gmx.de>
7128277c9SStephan Aßmus  */
8128277c9SStephan Aßmus 
9128277c9SStephan Aßmus #include "ChangePointCommand.h"
10128277c9SStephan Aßmus 
11128277c9SStephan Aßmus #include <new>
12128277c9SStephan Aßmus #include <stdio.h>
13128277c9SStephan Aßmus 
14*518852fcSAdrien Destugues #include <Catalog.h>
15*518852fcSAdrien Destugues #include <Locale.h>
16*518852fcSAdrien Destugues 
17128277c9SStephan Aßmus #include "VectorPath.h"
18128277c9SStephan Aßmus 
19*518852fcSAdrien Destugues 
20*518852fcSAdrien Destugues #undef B_TRANSLATE_CONTEXT
21*518852fcSAdrien Destugues #define B_TRANSLATE_CONTEXT "Icon-O-Matic-ChangePointCmd"
22*518852fcSAdrien Destugues 
23*518852fcSAdrien Destugues 
24128277c9SStephan Aßmus using std::nothrow;
25128277c9SStephan Aßmus 
26128277c9SStephan Aßmus // constructor
27128277c9SStephan Aßmus ChangePointCommand::ChangePointCommand(VectorPath* path,
28128277c9SStephan Aßmus 									  int32 index,
29128277c9SStephan Aßmus  									  const int32* selected,
30128277c9SStephan Aßmus 									  int32 count)
31128277c9SStephan Aßmus 	: PathCommand(path),
32128277c9SStephan Aßmus 	  fIndex(index),
33128277c9SStephan Aßmus 	  fOldSelection(NULL),
34128277c9SStephan Aßmus 	  fOldSelectionCount(count)
35128277c9SStephan Aßmus {
36128277c9SStephan Aßmus 	if (fPath && !fPath->GetPointsAt(fIndex, fPoint, fPointIn, fPointOut, &fConnected))
37128277c9SStephan Aßmus 		fPath = NULL;
38128277c9SStephan Aßmus 	if (fOldSelectionCount > 0 && selected) {
39128277c9SStephan Aßmus 		fOldSelection = new (nothrow) int32[fOldSelectionCount];
40128277c9SStephan Aßmus 		memcpy(fOldSelection, selected, fOldSelectionCount * sizeof(int32));
41128277c9SStephan Aßmus 	}
42128277c9SStephan Aßmus }
43128277c9SStephan Aßmus 
44128277c9SStephan Aßmus // destructor
45128277c9SStephan Aßmus ChangePointCommand::~ChangePointCommand()
46128277c9SStephan Aßmus {
47128277c9SStephan Aßmus 	delete[] fOldSelection;
48128277c9SStephan Aßmus }
49128277c9SStephan Aßmus 
507c4b3726SStephan Aßmus // InitCheck
517c4b3726SStephan Aßmus status_t
527c4b3726SStephan Aßmus ChangePointCommand::InitCheck()
537c4b3726SStephan Aßmus {
547c4b3726SStephan Aßmus 	// TODO: figure out if selection changed!!!
557c4b3726SStephan Aßmus 	// (this command is also used to undo changes to the selection)
567c4b3726SStephan Aßmus 	// (but tracking the selection does not yet work in Icon-O-Matic)
577c4b3726SStephan Aßmus 
587c4b3726SStephan Aßmus 	status_t ret = PathCommand::InitCheck();
597c4b3726SStephan Aßmus 	if (ret < B_OK)
607c4b3726SStephan Aßmus 		return ret;
617c4b3726SStephan Aßmus 
627c4b3726SStephan Aßmus 	BPoint point;
637c4b3726SStephan Aßmus 	BPoint pointIn;
647c4b3726SStephan Aßmus 	BPoint pointOut;
657c4b3726SStephan Aßmus 	bool connected;
667c4b3726SStephan Aßmus 	if (!fPath->GetPointsAt(fIndex, point, pointIn, pointOut, &connected))
677c4b3726SStephan Aßmus 		return B_ERROR;
687c4b3726SStephan Aßmus 
697c4b3726SStephan Aßmus 	if (point != fPoint || pointIn != fPointIn
707c4b3726SStephan Aßmus 		|| pointOut != fPointOut || connected != fConnected)
717c4b3726SStephan Aßmus 		return B_OK;
727c4b3726SStephan Aßmus 
737c4b3726SStephan Aßmus 	return B_ERROR;
747c4b3726SStephan Aßmus }
757c4b3726SStephan Aßmus 
76128277c9SStephan Aßmus // Perform
77128277c9SStephan Aßmus status_t
78128277c9SStephan Aßmus ChangePointCommand::Perform()
79128277c9SStephan Aßmus {
80128277c9SStephan Aßmus 	// path point is already changed
81128277c9SStephan Aßmus 	return B_OK;
82128277c9SStephan Aßmus }
83128277c9SStephan Aßmus 
84128277c9SStephan Aßmus // Undo
85128277c9SStephan Aßmus status_t
86128277c9SStephan Aßmus ChangePointCommand::Undo()
87128277c9SStephan Aßmus {
88128277c9SStephan Aßmus 	status_t status = InitCheck();
89128277c9SStephan Aßmus 	if (status < B_OK)
90128277c9SStephan Aßmus 		return status;
91128277c9SStephan Aßmus 
92128277c9SStephan Aßmus 	// set the point to the remembered state and
93128277c9SStephan Aßmus 	// save the previous state of the point
94128277c9SStephan Aßmus 	BPoint point;
95128277c9SStephan Aßmus 	BPoint pointIn;
96128277c9SStephan Aßmus 	BPoint pointOut;
97128277c9SStephan Aßmus 	bool connected;
98128277c9SStephan Aßmus 	if (fPath->GetPointsAt(fIndex, point, pointIn, pointOut, &connected)
99128277c9SStephan Aßmus 		&& fPath->SetPoint(fIndex, fPoint, fPointIn, fPointOut, fConnected)) {
100128277c9SStephan Aßmus 		// toggle the remembered settings
101128277c9SStephan Aßmus 		fPoint = point;
102128277c9SStephan Aßmus 		fPointIn = pointIn;
103128277c9SStephan Aßmus 		fPointOut = pointOut;
104128277c9SStephan Aßmus 		fConnected = connected;
105128277c9SStephan Aßmus 		// restore old selection
106128277c9SStephan Aßmus 		_Select(fOldSelection, fOldSelectionCount);
107128277c9SStephan Aßmus 	} else {
108128277c9SStephan Aßmus 		status = B_ERROR;
109128277c9SStephan Aßmus 	}
110128277c9SStephan Aßmus 
111128277c9SStephan Aßmus 	return status;
112128277c9SStephan Aßmus }
113128277c9SStephan Aßmus 
114128277c9SStephan Aßmus // Redo
115128277c9SStephan Aßmus status_t
116128277c9SStephan Aßmus ChangePointCommand::Redo()
117128277c9SStephan Aßmus {
118128277c9SStephan Aßmus 	status_t status = Undo();
119128277c9SStephan Aßmus 	if (status >= B_OK)
120128277c9SStephan Aßmus 		_Select(&fIndex, 1);
121128277c9SStephan Aßmus 	return status;
122128277c9SStephan Aßmus }
123128277c9SStephan Aßmus 
124128277c9SStephan Aßmus // GetName
125128277c9SStephan Aßmus void
126128277c9SStephan Aßmus ChangePointCommand::GetName(BString& name)
127128277c9SStephan Aßmus {
128128277c9SStephan Aßmus //	name << _GetString(MODIFY_CONTROL_POINT, "Modify Control Point");
129*518852fcSAdrien Destugues 	name << B_TRANSLATE("Modify Control Point");
130128277c9SStephan Aßmus }
131