xref: /haiku/src/apps/icon-o-matic/shape/PathManipulator.h (revision 7c4b3726d9477810a630f9c0d0604a36473df559)
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