xref: /haiku/src/apps/icon-o-matic/transformable/TransformBox.h (revision e1c4049fed1047bdb957b0529e1921e97ef94770)
1 /*
2  * Copyright 2006-2007, Haiku.
3  * Distributed under the terms of the MIT License.
4  *
5  * Authors:
6  *		Stephan Aßmus <superstippi@gmx.de>
7  */
8 #ifndef TRANSFORM_BOX_H
9 #define TRANSFORM_BOX_H
10 
11 #include <List.h>
12 
13 #include "ChannelTransform.h"
14 #include "Manipulator.h"
15 
16 
17 namespace TransformBoxStates {
18 	class DragState;
19 }
20 
21 class Command;
22 class StateView;
23 class TransformBox;
24 class TransformCommand;
25 
26 
27 class TransformBoxListener {
28 public:
29 								TransformBoxListener() {}
30 	virtual						~TransformBoxListener() {}
31 
32 	virtual	void				TransformBoxDeleted(
33 									const TransformBox* box) = 0;
34 };
35 
36 class TransformBox : public ChannelTransform,
37 					 public Manipulator {
38 public:
39 								TransformBox(StateView* view, BRect box);
40 	virtual						~TransformBox();
41 
42 	// Manipulator interface
43 	virtual	void				Draw(BView* into, BRect updateRect);
44 
45 	virtual	bool				MouseDown(BPoint where);
46 	virtual	void				MouseMoved(BPoint where);
47 	virtual	Command*			MouseUp();
48 	virtual	bool				MouseOver(BPoint where);
49 	virtual	bool				DoubleClicked(BPoint where);
50 
51 	virtual	BRect				Bounds();
52 	virtual	BRect				TrackingBounds(BView* withinView);
53 
54 	virtual	void				ModifiersChanged(uint32 modifiers);
55 	virtual	bool				HandleKeyDown(uint32 key,
56 									uint32 modifiers, Command** _command);
57 	virtual	bool				HandleKeyUp(uint32 key,
58 									uint32 modifiers, Command** _command);
59 
60 	virtual	bool				UpdateCursor();
61 
62 	virtual	void				AttachedToView(BView* view);
63 	virtual	void				DetachedFromView(BView* view);
64 
65 	// TransformBox
66 	virtual	void				Update(bool deep = true);
67 
68 			void				OffsetCenter(BPoint offset);
69 			BPoint				Center() const;
70 			void				SetBox(BRect box);
71 			BRect				Box() const
72 									{ return fOriginalBox; }
73 
74 			Command*			FinishTransaction();
75 
76 			void				NudgeBy(BPoint offset);
77 			bool				IsNudging() const
78 									{ return fNudging; }
79 			Command*			FinishNudging();
80 
81 	virtual	void				TransformFromCanvas(BPoint& point) const;
82 	virtual	void				TransformToCanvas(BPoint& point) const;
83 	virtual	float				ZoomLevel() const;
84 
85 
86 	virtual	TransformCommand*	MakeCommand(const char* actionName) = 0;
87 
88 			bool				IsRotating() const
89 									{ return fCurrentState == fRotateState; }
90 	virtual	double				ViewSpaceRotation() const;
91 
92 	// Listener support
93 			bool				AddListener(TransformBoxListener* listener);
94 			bool				RemoveListener(TransformBoxListener* listener);
95 
96 private:
97 			TransformBoxStates::DragState* _DragStateFor(
98 									BPoint canvasWhere, float canvasZoom);
99 			void				_StrokeBWLine(BView* into,
100 									BPoint from, BPoint to) const;
101 			void				_StrokeBWPoint(BView* into,
102 									BPoint point, double angle) const;
103 
104 private:
105 			BRect				fOriginalBox;
106 
107 			BPoint				fLeftTop;
108 			BPoint				fRightTop;
109 			BPoint				fLeftBottom;
110 			BPoint				fRightBottom;
111 
112 			BPoint				fPivot;
113 			BPoint				fPivotOffset;
114 
115 			TransformCommand*	fCurrentCommand;
116 			TransformBoxStates::DragState* fCurrentState;
117 
118 			bool				fDragging;
119 			BPoint				fMousePos;
120 			uint32				fModifiers;
121 
122 			bool				fNudging;
123 
124 			BList				fListeners;
125 
126 protected:
127 			void				_NotifyDeleted() const;
128 
129 			// "static" state objects
130 			StateView*			fView;
131 
132 			TransformBoxStates::DragState* fDragLTState;
133 			TransformBoxStates::DragState* fDragRTState;
134 			TransformBoxStates::DragState* fDragLBState;
135 			TransformBoxStates::DragState* fDragRBState;
136 
137 			TransformBoxStates::DragState* fDragLState;
138 			TransformBoxStates::DragState* fDragRState;
139 			TransformBoxStates::DragState* fDragTState;
140 			TransformBoxStates::DragState* fDragBState;
141 
142 			TransformBoxStates::DragState* fRotateState;
143 			TransformBoxStates::DragState* fTranslateState;
144 			TransformBoxStates::DragState* fOffsetCenterState;
145 };
146 
147 #endif // TRANSFORM_BOX_H
148