xref: /haiku/src/servers/app/decorator/DefaultWindowBehaviour.h (revision a5061ecec55353a5f394759473f1fd6df04890da)
1 /*
2  * Copyright 2001-2010, Haiku, Inc.
3  * Distributed under the terms of the MIT license.
4  *
5  * Authors:
6  *		DarkWyrm <bpmagic@columbus.rr.com>
7  *		Adi Oanca <adioanca@gmail.com>
8  *		Stephan Aßmus <superstippi@gmx.de>
9  *		Axel Dörfler <axeld@pinc-software.de>
10  *		Brecht Machiels <brecht@mos6581.org>
11  *		Clemens Zeidler <haiku@clemens-zeidler.de>
12  *		Ingo Weinhold <ingo_weinhold@gmx.de>
13  */
14 #ifndef DEFAULT_WINDOW_BEHAVIOUR_H
15 #define DEFAULT_WINDOW_BEHAVIOUR_H
16 
17 
18 #include "WindowBehaviour.h"
19 
20 #include "Decorator.h"
21 #include "MagneticBorder.h"
22 #include "ServerCursor.h"
23 
24 #include <AutoDeleter.h>
25 
26 
27 class Desktop;
28 class Window;
29 
30 
31 class DefaultWindowBehaviour : public WindowBehaviour {
32 public:
33 								DefaultWindowBehaviour(Window* window);
34 	virtual						~DefaultWindowBehaviour();
35 
36 	virtual	bool				MouseDown(BMessage* message, BPoint where,
37 									int32 lastHitRegion, int32& clickCount,
38 									int32& _hitRegion);
39 	virtual	void				MouseUp(BMessage* message, BPoint where);
40 	virtual	void				MouseMoved(BMessage *message, BPoint where,
41 									bool isFake);
42 
43 	virtual	void				ModifiersChanged(int32 modifiers);
44 
45 protected:
46 	virtual bool				AlterDeltaForSnap(Window* window, BPoint& delta,
47 									bigtime_t now);
48 private:
49 			enum Action {
50 				ACTION_NONE,
51 				ACTION_ZOOM,
52 				ACTION_CLOSE,
53 				ACTION_MINIMIZE,
54 				ACTION_TAB,
55 				ACTION_DRAG,
56 				ACTION_SLIDE_TAB,
57 				ACTION_RESIZE,
58 				ACTION_RESIZE_BORDER
59 			};
60 
61 			enum {
62 				// 1 for the "natural" resize border, -1 for the opposite, so
63 				// multiplying the movement delta by that value results in the
64 				// size change.
65 				LEFT	= -1,
66 				TOP		= -1,
67 				NONE	= 0,
68 				RIGHT	= 1,
69 				BOTTOM	= 1
70 			};
71 
72 			struct State;
73 			struct MouseTrackingState;
74 			struct DragState;
75 			struct ResizeState;
76 			struct SlideTabState;
77 			struct ResizeBorderState;
78 			struct DecoratorButtonState;
79 			struct ManageWindowState;
80 
81 			// to keep gcc 2 happy
82 			friend struct State;
83 			friend struct MouseTrackingState;
84 			friend struct DragState;
85 			friend struct ResizeState;
86 			friend struct SlideTabState;
87 			friend struct ResizeBorderState;
88 			friend struct DecoratorButtonState;
89 			friend struct ManageWindowState;
90 
91 private:
92 			bool				_IsWindowModifier(int32 modifiers) const;
93 			Decorator::Region	_RegionFor(const BMessage* message,
94 									int32& tab) const;
95 
96 			void				_SetBorderHighlights(int8 horizontal,
97 									int8 vertical, bool active);
98 
99 			ServerCursor*		_ResizeCursorFor(int8 horizontal,
100 									int8 vertical);
101 			void				_SetResizeCursor(int8 horizontal,
102 									int8 vertical);
103 			void				_ResetResizeCursor();
104 	static	void				_ComputeResizeDirection(float x, float y,
105 									int8& _horizontal, int8& _vertical);
106 
107 			void				_NextState(State* state);
108 
109 protected:
110 			Window*				fWindow;
111 			Desktop*			fDesktop;
112 			ObjectDeleter<State>
113 								fState;
114 			int32				fLastModifiers;
115 
116 			MagneticBorder		fMagneticBorder;
117 };
118 
119 
120 #endif	// DEFAULT_WINDOW_BEHAVIOUR_H
121