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 20*546208a5SOliver Tappe #undef B_TRANSLATION_CONTEXT 21*546208a5SOliver 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 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"); 129518852fcSAdrien Destugues name << B_TRANSLATE("Modify Control Point"); 130128277c9SStephan Aßmus } 131