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
14518852fcSAdrien Destugues #include <Catalog.h>
15518852fcSAdrien Destugues #include <Locale.h>
16518852fcSAdrien Destugues
17128277c9SStephan Aßmus #include "VectorPath.h"
18128277c9SStephan Aßmus
19518852fcSAdrien Destugues
20546208a5SOliver Tappe #undef B_TRANSLATION_CONTEXT
21546208a5SOliver Tappe #define B_TRANSLATION_CONTEXT "Icon-O-Matic-ChangePointCmd"
22518852fcSAdrien Destugues
23518852fcSAdrien Destugues
24128277c9SStephan Aßmus using std::nothrow;
25128277c9SStephan Aßmus
26128277c9SStephan Aßmus // constructor
ChangePointCommand(VectorPath * path,int32 index,const int32 * selected,int32 count)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
~ChangePointCommand()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
InitCheck()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
Perform()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
Undo()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
Redo()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
GetName(BString & name)126128277c9SStephan Aßmus ChangePointCommand::GetName(BString& name)
127128277c9SStephan Aßmus {
128*a4e4beafSHumdinger name << B_TRANSLATE("Modify vertex");
129128277c9SStephan Aßmus }
130