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 "AddPointCommand.h" 10 11 #include <stdio.h> 12 13 #include <Catalog.h> 14 #include <Locale.h> 15 16 #include "VectorPath.h" 17 18 19 #undef B_TRANSLATION_CONTEXT 20 #define B_TRANSLATION_CONTEXT "Icon-O-Matic-AddPointCmd" 21 22 23 // constructor 24 AddPointCommand::AddPointCommand(VectorPath* path, 25 int32 index, 26 const int32* selected, 27 int32 count) 28 : PathCommand(path), 29 fIndex(index), 30 fOldSelection(NULL), 31 fOldSelectionCount(count) 32 { 33 if (fOldSelectionCount > 0 && selected) { 34 fOldSelection = new int32[fOldSelectionCount]; 35 memcpy(fOldSelection, selected, fOldSelectionCount * sizeof(int32)); 36 } 37 } 38 39 // destructor 40 AddPointCommand::~AddPointCommand() 41 { 42 delete[] fOldSelection; 43 } 44 45 // Perform 46 status_t 47 AddPointCommand::Perform() 48 { 49 status_t status = InitCheck(); 50 if (status < B_OK) 51 return status; 52 53 // path point is already added, 54 // but we don't know the parameters yet 55 if (!fPath->GetPointsAt(fIndex, fPoint, fPointIn, fPointOut)) 56 status = B_NO_INIT; 57 58 return status; 59 } 60 61 // Undo 62 status_t 63 AddPointCommand::Undo() 64 { 65 status_t status = InitCheck(); 66 if (status < B_OK) 67 return status; 68 69 // remove point 70 if (fPath->RemovePoint(fIndex)) { 71 // restore selection before adding point 72 _Select(fOldSelection, fOldSelectionCount); 73 } else { 74 status = B_ERROR; 75 } 76 77 return status; 78 } 79 80 // Redo 81 status_t 82 AddPointCommand::Redo() 83 { 84 status_t status = InitCheck(); 85 if (status < B_OK) 86 return status; 87 88 AutoNotificationSuspender _(fPath); 89 90 // add point again 91 if (fPath->AddPoint(fPoint, fIndex)) { 92 fPath->SetPoint(fIndex, fPoint, fPointIn, fPointOut, true); 93 // select added point 94 _Select(&fIndex, 1); 95 } else { 96 status = B_ERROR; 97 } 98 99 return status; 100 } 101 102 // GetName 103 void 104 AddPointCommand::GetName(BString& name) 105 { 106 // name << _GetString(ADD_CONTROL_POINT, "Add Control Point"); 107 name << B_TRANSLATE("Add Control Point"); 108 } 109