1/* 2 * Copyright 2006, Haiku. 3 * Distributed under the terms of the MIT License. 4 * 5 * Authors: 6 * Stephan A��mus <superstippi@gmx.de> 7 */ 8 9#include "ChangePointCommand.h" 10 11#include <new> 12#include <stdio.h> 13 14#include <Catalog.h> 15#include <Locale.h> 16 17#include "VectorPath.h" 18 19 20#undef B_TRANSLATION_CONTEXT 21#define B_TRANSLATION_CONTEXT "Icon-O-Matic-ChangePointCmd" 22 23 24using std::nothrow; 25 26// constructor 27ChangePointCommand::ChangePointCommand(VectorPath* path, 28 int32 index, 29 const int32* selected, 30 int32 count) 31 : PathCommand(path), 32 fIndex(index), 33 fOldSelection(NULL), 34 fOldSelectionCount(count) 35{ 36 if (fPath && !fPath->GetPointsAt(fIndex, fPoint, fPointIn, fPointOut, &fConnected)) 37 fPath = NULL; 38 if (fOldSelectionCount > 0 && selected) { 39 fOldSelection = new (nothrow) int32[fOldSelectionCount]; 40 memcpy(fOldSelection, selected, fOldSelectionCount * sizeof(int32)); 41 } 42} 43 44// destructor 45ChangePointCommand::~ChangePointCommand() 46{ 47 delete[] fOldSelection; 48} 49 50// InitCheck 51status_t 52ChangePointCommand::InitCheck() 53{ 54 // TODO: figure out if selection changed!!! 55 // (this command is also used to undo changes to the selection) 56 // (but tracking the selection does not yet work in Icon-O-Matic) 57 58 status_t ret = PathCommand::InitCheck(); 59 if (ret < B_OK) 60 return ret; 61 62 BPoint point; 63 BPoint pointIn; 64 BPoint pointOut; 65 bool connected; 66 if (!fPath->GetPointsAt(fIndex, point, pointIn, pointOut, &connected)) 67 return B_ERROR; 68 69 if (point != fPoint || pointIn != fPointIn 70 || pointOut != fPointOut || connected != fConnected) 71 return B_OK; 72 73 return B_ERROR; 74} 75 76// Perform 77status_t 78ChangePointCommand::Perform() 79{ 80 // path point is already changed 81 return B_OK; 82} 83 84// Undo 85status_t 86ChangePointCommand::Undo() 87{ 88 status_t status = InitCheck(); 89 if (status < B_OK) 90 return status; 91 92 // set the point to the remembered state and 93 // save the previous state of the point 94 BPoint point; 95 BPoint pointIn; 96 BPoint pointOut; 97 bool connected; 98 if (fPath->GetPointsAt(fIndex, point, pointIn, pointOut, &connected) 99 && fPath->SetPoint(fIndex, fPoint, fPointIn, fPointOut, fConnected)) { 100 // toggle the remembered settings 101 fPoint = point; 102 fPointIn = pointIn; 103 fPointOut = pointOut; 104 fConnected = connected; 105 // restore old selection 106 _Select(fOldSelection, fOldSelectionCount); 107 } else { 108 status = B_ERROR; 109 } 110 111 return status; 112} 113 114// Redo 115status_t 116ChangePointCommand::Redo() 117{ 118 status_t status = Undo(); 119 if (status >= B_OK) 120 _Select(&fIndex, 1); 121 return status; 122} 123 124// GetName 125void 126ChangePointCommand::GetName(BString& name) 127{ 128 name << B_TRANSLATE("Modify vertex"); 129} 130