root/src/apps/icon-o-matic/shape/PathManipulator.h
/*
 * Copyright 2006-2007, Haiku.
 * Distributed under the terms of the MIT License.
 *
 * Authors:
 *              Stephan Aßmus <superstippi@gmx.de>
 */

#ifndef PATH_MANIPULATOR_H
#define PATH_MANIPULATOR_H

#include "Manipulator.h"
#include "VectorPath.h"

class AddPointCommand;
class CanvasView;
class ChangePointCommand;
class InsertPointCommand;
class NudgePointsCommand;
class TransformPointsBox;

//class PathSelection {
// public:
//                                                              PathSelection();
//      virtual                                         ~PathSelection();
//
//      virtual PathSelection*          Clone() const;
//      virtual bool                            SetTo(const PathSelection* other);
//
//      virtual Command*                        Delete();
//};

class PathManipulator : public Manipulator,
                                                public PathListener {
 public:
                                                                PathManipulator(VectorPath* path);
        virtual                                         ~PathManipulator();

        // Manipulator interface
        virtual void                            Draw(BView* into, BRect updateRect);

        virtual bool                            MouseDown(BPoint where);
        virtual void                            MouseMoved(BPoint where);
        virtual Command*                        MouseUp();
        virtual bool                            MouseOver(BPoint where);
        virtual bool                            DoubleClicked(BPoint where);

        virtual bool                            ShowContextMenu(BPoint where);

        virtual BRect                           Bounds();
        virtual BRect                           TrackingBounds(BView* withinView);

        virtual bool                            MessageReceived(BMessage* message,
                                                                                                Command** _command);

        virtual void                            ModifiersChanged(uint32 modifiers);
        virtual bool                            HandleKeyDown(uint32 key, uint32 modifiers,
                                                                                          Command** _command);
        virtual bool                            HandleKeyUp(uint32 key, uint32 modifiers,
                                                                                        Command** _command);

        virtual bool                            UpdateCursor();

        virtual void                            AttachedToView(BView* view);
        virtual void                            DetachedFromView(BView* view);

        // Observer interface (Manipulator)
        virtual void                            ObjectChanged(const Observable* object);

        // PathListener interface
        virtual void                            PointAdded(int32 index);
        virtual void                            PointRemoved(int32 index);
        virtual void                            PointChanged(int32 index);
        virtual void                            PathChanged();
        virtual void                            PathClosedChanged();
        virtual void                            PathReversed();

        // PathManipulator
                        uint32                          ControlFlags() const;

//                      PathSelection*          Selection() const;
//
                        // path manipulation
                        void                            ReversePath();

 private:
                        friend  class           PathCommand;
                        friend  class           PointSelection;
                        friend  class           EnterTransformPointsCommand;
                        friend  class           ExitTransformPointsCommand;
                        friend  class           TransformPointsCommand;
//                      friend  class           NewPathCommand;
//                      friend  class           RemovePathCommand;
                        friend  class           ReversePathCommand;
//                      friend  class           SelectPathCommand;

                        void                            _SetMode(uint32 mode);
                        void                            _SetTransformBox(
                                                                        TransformPointsBox* transformBox);

                        // BEGIN functions that need to be undoable
                        void                            _AddPoint(BPoint where);
                        void                            _InsertPoint(BPoint where, int32 index);
                        void                            _SetInOutConnected(int32 index,
                                                                                                   bool connected);
                        void                            _SetSharp(int32 index);

                        void                            _RemoveSelection();
                        void                            _RemovePoint(int32 index);
                        void                            _RemovePointIn(int32 index);
                        void                            _RemovePointOut(int32 index);

                        Command*                        _Delete();

                        void                            _Select(BRect canvasRect);
                        void                            _Select(int32 index, bool extend = false);
                        void                            _Select(const int32* indices,
                                                                                int32 count, bool extend = false);
                        void                            _Deselect(int32 index);
                        void                            _ShiftSelection(int32 startIndex,
                                                                                                int32 direction);
                        bool                            _IsSelected(int32 index) const;
                        // END functions that need to be undoable

                        void                            _InvalidateCanvas(BRect rect) const;
                        void                            _InvalidateHighlightPoints(int32 newIndex,
                                                                                                                   uint32 newMode);

                        void                            _UpdateSelection() const;

                        BRect                           _ControlPointRect() const;
                        BRect                           _ControlPointRect(int32 index,
                                                                                                  uint32 mode) const;
                        void                            _GetChangableAreas(BRect* pathArea,
                                                                                                   BRect* controlPointArea) const;

                        void                            _SetModeForMousePos(BPoint canvasWhere);

                        void                            _Nudge(BPoint direction);
                        Command*                        _FinishNudging();

                        CanvasView*                     fCanvasView;

                        bool                            fCommandDown;
                        bool                            fOptionDown;
                        bool                            fShiftDown;
                        bool                            fAltDown;

                        bool                            fClickToClose;

                        uint32                          fMode;
                        uint32                          fFallBackMode;

                        bool                            fMouseDown;
                        BPoint                          fTrackingStart;
                        BPoint                          fLastCanvasPos;

                        VectorPath*                     fPath;
                        int32                           fCurrentPathPoint;
                        BRect                           fPreviousBounds;

                        ChangePointCommand*     fChangePointCommand;
                        InsertPointCommand*     fInsertPointCommand;
                        AddPointCommand*        fAddPointCommand;

                        class Selection;
                        Selection*                      fSelection;
                        Selection*                      fOldSelection;
                        TransformPointsBox*     fTransformBox;

                        // stuff needed for nudging
                        BPoint                          fNudgeOffset;
                        bigtime_t                       fLastNudgeTime;
                        NudgePointsCommand*     fNudgeCommand;
};

#endif  // SHAPE_STATE_H