root/src/apps/icon-o-matic/shape/commands/RotatePathIndicesCommand.cpp
/*
 * Copyright 2009, Stephan Aßmus <superstippi@gmx.de>. All rights reserved.
 * Distributed under the terms of the MIT License.
 */

#include "RotatePathIndicesCommand.h"

#include <stdio.h>

#include <Catalog.h>
#include <Locale.h>

#include "VectorPath.h"


#undef B_TRANSLATION_CONTEXT
#define B_TRANSLATION_CONTEXT "Icon-O-Matic-RotatePathIndiciesCmd"


RotatePathIndicesCommand::RotatePathIndicesCommand(VectorPath* path,
                bool clockWise)
        :
        PathCommand(path),
        fClockWise(clockWise)
{
}


RotatePathIndicesCommand::~RotatePathIndicesCommand()
{
}


status_t
RotatePathIndicesCommand::InitCheck()
{
        status_t ret = PathCommand::InitCheck();
        if (ret == B_OK && fPath->CountPoints() < 2)
                return B_NOT_SUPPORTED;
        return ret;
}


status_t
RotatePathIndicesCommand::Perform()
{
        return _Rotate(fClockWise);
}


status_t
RotatePathIndicesCommand::Undo()
{
        return _Rotate(!fClockWise);
}


void
RotatePathIndicesCommand::GetName(BString& name)
{
        name << B_TRANSLATE("Rotate path indices");
}


status_t
RotatePathIndicesCommand::_Rotate(bool clockWise)
{
        BPoint point;
        BPoint pointIn;
        BPoint pointOut;
        bool connected;

        int32 removeIndex;
        int32 addIndex;
        if (!clockWise) {
                removeIndex = fPath->CountPoints() - 1;
                addIndex = 0;
        } else {
                removeIndex = 0;
                addIndex = fPath->CountPoints() - 1;
        }

        if (!fPath->GetPointsAt(removeIndex, point, pointIn, pointOut, &connected))
                return B_ERROR;

        fPath->RemovePoint(removeIndex);
        fPath->AddPoint(point, addIndex);
        fPath->SetPoint(addIndex, point, pointIn, pointOut, connected);

        return B_OK;
}