* 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 PathManipulator : public Manipulator,
public PathListener {
public:
PathManipulator(VectorPath* path);
virtual ~PathManipulator();
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);
virtual void ObjectChanged(const Observable* object);
virtual void PointAdded(int32 index);
virtual void PointRemoved(int32 index);
virtual void PointChanged(int32 index);
virtual void PathChanged();
virtual void PathClosedChanged();
virtual void PathReversed();
uint32 ControlFlags() const;
void ReversePath();
private:
friend class PathCommand;
friend class PointSelection;
friend class EnterTransformPointsCommand;
friend class ExitTransformPointsCommand;
friend class TransformPointsCommand;
friend class ReversePathCommand;
void _SetMode(uint32 mode);
void _SetTransformBox(
TransformPointsBox* transformBox);
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;
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;
BPoint fNudgeOffset;
bigtime_t fLastNudgeTime;
NudgePointsCommand* fNudgeCommand;
};
#endif