1128277c9SStephan Aßmus /* 2*7c4b3726SStephan Aßmus * Copyright 2006-2007, 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 #ifndef PATH_MANIPULATOR_H 10128277c9SStephan Aßmus #define PATH_MANIPULATOR_H 11128277c9SStephan Aßmus 12128277c9SStephan Aßmus #include "Manipulator.h" 1305fd3818SStephan Aßmus #include "VectorPath.h" 14128277c9SStephan Aßmus 15128277c9SStephan Aßmus class AddPointCommand; 16f67876a0SStephan Aßmus class CanvasView; 17128277c9SStephan Aßmus class ChangePointCommand; 18128277c9SStephan Aßmus class InsertPointCommand; 190e1ba39fSStephan Aßmus class NudgePointsCommand; 200e1ba39fSStephan Aßmus class TransformPointsBox; 21128277c9SStephan Aßmus 22128277c9SStephan Aßmus //class PathSelection { 23128277c9SStephan Aßmus // public: 24128277c9SStephan Aßmus // PathSelection(); 25128277c9SStephan Aßmus // virtual ~PathSelection(); 26128277c9SStephan Aßmus // 27128277c9SStephan Aßmus // virtual PathSelection* Clone() const; 28128277c9SStephan Aßmus // virtual bool SetTo(const PathSelection* other); 29128277c9SStephan Aßmus // 30128277c9SStephan Aßmus // virtual Command* Delete(); 31128277c9SStephan Aßmus //}; 32128277c9SStephan Aßmus 3305fd3818SStephan Aßmus class PathManipulator : public Manipulator, 3405fd3818SStephan Aßmus public PathListener { 35128277c9SStephan Aßmus public: 36128277c9SStephan Aßmus PathManipulator(VectorPath* path); 37128277c9SStephan Aßmus virtual ~PathManipulator(); 38128277c9SStephan Aßmus 39128277c9SStephan Aßmus // Manipulator interface 40128277c9SStephan Aßmus virtual void Draw(BView* into, BRect updateRect); 41128277c9SStephan Aßmus 42128277c9SStephan Aßmus virtual bool MouseDown(BPoint where); 43128277c9SStephan Aßmus virtual void MouseMoved(BPoint where); 44128277c9SStephan Aßmus virtual Command* MouseUp(); 45128277c9SStephan Aßmus virtual bool MouseOver(BPoint where); 46128277c9SStephan Aßmus virtual bool DoubleClicked(BPoint where); 47128277c9SStephan Aßmus 48f4bd80a2SStephan Aßmus virtual bool ShowContextMenu(BPoint where); 49f4bd80a2SStephan Aßmus 50128277c9SStephan Aßmus virtual BRect Bounds(); 51128277c9SStephan Aßmus virtual BRect TrackingBounds(BView* withinView); 52128277c9SStephan Aßmus 53128277c9SStephan Aßmus virtual bool MessageReceived(BMessage* message, 54128277c9SStephan Aßmus Command** _command); 55128277c9SStephan Aßmus 56128277c9SStephan Aßmus virtual void ModifiersChanged(uint32 modifiers); 57128277c9SStephan Aßmus virtual bool HandleKeyDown(uint32 key, uint32 modifiers, 58128277c9SStephan Aßmus Command** _command); 59128277c9SStephan Aßmus virtual bool HandleKeyUp(uint32 key, uint32 modifiers, 60128277c9SStephan Aßmus Command** _command); 61128277c9SStephan Aßmus 62*7c4b3726SStephan Aßmus virtual bool UpdateCursor(); 63128277c9SStephan Aßmus 64128277c9SStephan Aßmus virtual void AttachedToView(BView* view); 65128277c9SStephan Aßmus virtual void DetachedFromView(BView* view); 66128277c9SStephan Aßmus 67128277c9SStephan Aßmus // Observer interface (Manipulator) 68128277c9SStephan Aßmus virtual void ObjectChanged(const Observable* object); 69128277c9SStephan Aßmus 7005fd3818SStephan Aßmus // PathListener interface 7105fd3818SStephan Aßmus virtual void PointAdded(int32 index); 7205fd3818SStephan Aßmus virtual void PointRemoved(int32 index); 7305fd3818SStephan Aßmus virtual void PointChanged(int32 index); 7405fd3818SStephan Aßmus virtual void PathChanged(); 7505fd3818SStephan Aßmus virtual void PathClosedChanged(); 7605fd3818SStephan Aßmus virtual void PathReversed(); 7705fd3818SStephan Aßmus 78128277c9SStephan Aßmus // PathManipulator 79128277c9SStephan Aßmus uint32 ControlFlags() const; 80128277c9SStephan Aßmus 81128277c9SStephan Aßmus // PathSelection* Selection() const; 82128277c9SStephan Aßmus // 83128277c9SStephan Aßmus // path manipulation 84128277c9SStephan Aßmus void ReversePath(); 85128277c9SStephan Aßmus 86128277c9SStephan Aßmus private: 87128277c9SStephan Aßmus friend class PathCommand; 88128277c9SStephan Aßmus friend class PointSelection; 89128277c9SStephan Aßmus friend class EnterTransformPointsCommand; 90128277c9SStephan Aßmus friend class ExitTransformPointsCommand; 91128277c9SStephan Aßmus friend class TransformPointsCommand; 92128277c9SStephan Aßmus // friend class NewPathCommand; 93128277c9SStephan Aßmus // friend class RemovePathCommand; 94128277c9SStephan Aßmus friend class ReversePathCommand; 95128277c9SStephan Aßmus // friend class SelectPathCommand; 96128277c9SStephan Aßmus 97128277c9SStephan Aßmus void _SetMode(uint32 mode); 980e1ba39fSStephan Aßmus void _SetTransformBox( 990e1ba39fSStephan Aßmus TransformPointsBox* transformBox); 100128277c9SStephan Aßmus 101128277c9SStephan Aßmus // BEGIN functions that need to be undoable 102128277c9SStephan Aßmus void _AddPoint(BPoint where); 103128277c9SStephan Aßmus void _InsertPoint(BPoint where, int32 index); 1040e1ba39fSStephan Aßmus void _SetInOutConnected(int32 index, 1050e1ba39fSStephan Aßmus bool connected); 106128277c9SStephan Aßmus void _SetSharp(int32 index); 107128277c9SStephan Aßmus 108128277c9SStephan Aßmus void _RemoveSelection(); 109128277c9SStephan Aßmus void _RemovePoint(int32 index); 110128277c9SStephan Aßmus void _RemovePointIn(int32 index); 111128277c9SStephan Aßmus void _RemovePointOut(int32 index); 112128277c9SStephan Aßmus 113128277c9SStephan Aßmus Command* _Delete(); 114128277c9SStephan Aßmus 115128277c9SStephan Aßmus void _Select(BRect canvasRect); 116128277c9SStephan Aßmus void _Select(int32 index, bool extend = false); 1170e1ba39fSStephan Aßmus void _Select(const int32* indices, 1180e1ba39fSStephan Aßmus int32 count, bool extend = false); 119128277c9SStephan Aßmus void _Deselect(int32 index); 1200e1ba39fSStephan Aßmus void _ShiftSelection(int32 startIndex, 1210e1ba39fSStephan Aßmus int32 direction); 122128277c9SStephan Aßmus bool _IsSelected(int32 index) const; 123128277c9SStephan Aßmus // END functions that need to be undoable 124128277c9SStephan Aßmus 125128277c9SStephan Aßmus void _InvalidateCanvas(BRect rect) const; 1260e1ba39fSStephan Aßmus void _InvalidateHighlightPoints(int32 newIndex, 1270e1ba39fSStephan Aßmus uint32 newMode); 128128277c9SStephan Aßmus 129128277c9SStephan Aßmus void _UpdateSelection() const; 130128277c9SStephan Aßmus 131128277c9SStephan Aßmus BRect _ControlPointRect() const; 1320e1ba39fSStephan Aßmus BRect _ControlPointRect(int32 index, 1330e1ba39fSStephan Aßmus uint32 mode) const; 134128277c9SStephan Aßmus void _GetChangableAreas(BRect* pathArea, 135128277c9SStephan Aßmus BRect* controlPointArea) const; 136128277c9SStephan Aßmus 137128277c9SStephan Aßmus void _SetModeForMousePos(BPoint canvasWhere); 138128277c9SStephan Aßmus 139128277c9SStephan Aßmus void _Nudge(BPoint direction); 1400e1ba39fSStephan Aßmus Command* _FinishNudging(); 141128277c9SStephan Aßmus 142f67876a0SStephan Aßmus CanvasView* fCanvasView; 143128277c9SStephan Aßmus 144128277c9SStephan Aßmus bool fCommandDown; 145128277c9SStephan Aßmus bool fOptionDown; 146128277c9SStephan Aßmus bool fShiftDown; 147128277c9SStephan Aßmus bool fAltDown; 148128277c9SStephan Aßmus 149128277c9SStephan Aßmus bool fClickToClose; 150128277c9SStephan Aßmus 151128277c9SStephan Aßmus uint32 fMode; 152128277c9SStephan Aßmus uint32 fFallBackMode; 153128277c9SStephan Aßmus 154128277c9SStephan Aßmus bool fMouseDown; 155128277c9SStephan Aßmus BPoint fTrackingStart; 156128277c9SStephan Aßmus BPoint fLastCanvasPos; 157128277c9SStephan Aßmus 158128277c9SStephan Aßmus VectorPath* fPath; 159128277c9SStephan Aßmus int32 fCurrentPathPoint; 160128277c9SStephan Aßmus BRect fPreviousBounds; 161128277c9SStephan Aßmus 162128277c9SStephan Aßmus ChangePointCommand* fChangePointCommand; 163128277c9SStephan Aßmus InsertPointCommand* fInsertPointCommand; 164128277c9SStephan Aßmus AddPointCommand* fAddPointCommand; 165128277c9SStephan Aßmus 166ce181bb0SStephan Aßmus class Selection; 167128277c9SStephan Aßmus Selection* fSelection; 168128277c9SStephan Aßmus Selection* fOldSelection; 1690e1ba39fSStephan Aßmus TransformPointsBox* fTransformBox; 170128277c9SStephan Aßmus 171128277c9SStephan Aßmus // stuff needed for nudging 172128277c9SStephan Aßmus BPoint fNudgeOffset; 173128277c9SStephan Aßmus bigtime_t fLastNudgeTime; 1740e1ba39fSStephan Aßmus NudgePointsCommand* fNudgeCommand; 175128277c9SStephan Aßmus }; 176128277c9SStephan Aßmus 177128277c9SStephan Aßmus #endif // SHAPE_STATE_H 178