xref: /haiku/src/servers/app/decorator/TabDecorator.h (revision 97f11716bfaa0f385eb0e28a52bf56a5023b9e99)
1 /*
2  * Copyright 2001-2020 Haiku, Inc.
3  * Distributed under the terms of the MIT License.
4  *
5  * Authors:
6  *		Stephan Aßmus, superstippi@gmx.de
7  *		DarkWyrm, bpmagic@columbus.rr.com
8  *		Ryan Leavengood, leavengood@gmail.com
9  *		Philippe Saint-Pierre, stpere@gmail.com
10  *		John Scipione, jscipione@gmail.com
11  *		Ingo Weinhold, ingo_weinhold@gmx.de
12  *		Clemens Zeidler, haiku@clemens-zeidler.de
13  *		Joseph Groover, looncraz@looncraz.net
14  *		Jacob Secunda, secundja@gmail.com
15  */
16 #ifndef TAB_DECORATOR_H
17 #define TAB_DECORATOR_H
18 
19 
20 #include <Region.h>
21 
22 #include "Decorator.h"
23 
24 
25 class Desktop;
26 
27 
28 class TabDecorator: public Decorator {
29 public:
30 								TabDecorator(DesktopSettings& settings,
31 									BRect frame, Desktop* desktop);
32 	virtual						~TabDecorator();
33 
34 protected:
35 			enum {
36 				COLOR_TAB_FRAME_LIGHT	= 0,
37 				COLOR_TAB_FRAME_DARK	= 1,
38 				COLOR_TAB				= 2,
39 				COLOR_TAB_LIGHT			= 3,
40 				COLOR_TAB_BEVEL			= 4,
41 				COLOR_TAB_SHADOW		= 5,
42 				COLOR_TAB_TEXT			= 6
43 			};
44 
45 			enum {
46 				COLOR_BUTTON			= 0,
47 				COLOR_BUTTON_LIGHT		= 1
48 			};
49 
50 			enum Component {
51 				COMPONENT_TAB,
52 
53 				COMPONENT_CLOSE_BUTTON,
54 				COMPONENT_ZOOM_BUTTON,
55 
56 				COMPONENT_LEFT_BORDER,
57 				COMPONENT_RIGHT_BORDER,
58 				COMPONENT_TOP_BORDER,
59 				COMPONENT_BOTTOM_BORDER,
60 
61 				COMPONENT_RESIZE_CORNER
62 			};
63 
64 			typedef rgb_color ComponentColors[7];
65 
66 public:
67 	virtual	void				Draw(BRect updateRect);
68 	virtual	void				Draw();
69 
70 	virtual	Region				RegionAt(BPoint where, int32& tab) const;
71 
72 	virtual	bool				SetRegionHighlight(Region region,
73 									uint8 highlight, BRegion* dirty,
74 									int32 tab = -1);
75 
76 	virtual void				UpdateColors(DesktopSettings& settings);
77 
78 protected:
79 	virtual	void				_DoLayout();
80 	virtual	void				_DoOutlineLayout();
81 	virtual	void				_DoTabLayout();
82 			void				_DistributeTabSize(float delta);
83 
84 	virtual	void				_DrawFrame(BRect rect) = 0;
85 	virtual	void				_DrawOutlineFrame(BRect rect);
86 	virtual	void				_DrawTab(Decorator::Tab* tab, BRect r) = 0;
87 
88 	virtual	void				_DrawButtons(Decorator::Tab* tab,
89 									const BRect& invalid);
90 	virtual	void				_DrawClose(Decorator::Tab* tab, bool direct,
91 									BRect r) = 0;
92 	virtual	void				_DrawTitle(Decorator::Tab* tab, BRect r) = 0;
93 	virtual	void				_DrawZoom(Decorator::Tab* tab, bool direct,
94 									BRect r) = 0;
95 
96 	virtual	void				_SetTitle(Decorator::Tab* tab,
97 									const char* string,
98 									BRegion* updateRegion = NULL);
99 
100 	virtual	void				_MoveBy(BPoint offset);
101 	virtual	void				_ResizeBy(BPoint offset, BRegion* dirty);
102 
103 	virtual	void				_SetFocus(Decorator::Tab* tab);
104 	virtual	bool				_SetTabLocation(Decorator::Tab* tab,
105 									float location, bool isShifting,
106 									BRegion* updateRegion = NULL);
107 
108 	virtual	bool				_SetSettings(const BMessage& settings,
109 									BRegion* updateRegion = NULL);
110 
111 	virtual	bool				_AddTab(DesktopSettings& settings,
112 									int32 index = -1,
113 									BRegion* updateRegion = NULL);
114 	virtual	bool				_RemoveTab(int32 index,
115 									BRegion* updateRegion = NULL);
116 	virtual	bool				_MoveTab(int32 from, int32 to, bool isMoving,
117 									BRegion* updateRegion = NULL);
118 
119 	virtual	void				_GetFootprint(BRegion* region);
120 
121 	virtual	void				_GetButtonSizeAndOffset(const BRect& tabRect,
122 									float* offset, float* size,
123 									float* inset) const;
124 
125 	virtual	void				_UpdateFont(DesktopSettings& settings);
126 
127 private:
128 			void				_LayoutTabItems(Decorator::Tab* tab,
129 									const BRect& tabRect);
130 
131 protected:
132 	inline	float				_DefaultTextOffset() const;
133 	inline	float				_SingleTabOffsetAndSize(float& tabSize);
134 
135 			void				_CalculateTabsRegion();
136 
137 protected:
138 			BRegion				fTabsRegion;
139 			BRect				fOldMovingTab;
140 			float				fBorderResizeLength, fResizeKnobSize;
141 
142 			rgb_color			fFocusFrameColor;
143 
144 			rgb_color			fFocusTabColor;
145 			rgb_color			fFocusTabColorLight;
146 			rgb_color			fFocusTabColorBevel;
147 			rgb_color			fFocusTabColorShadow;
148 			rgb_color			fFocusTextColor;
149 
150 			rgb_color			fNonFocusFrameColor;
151 
152 			rgb_color			fNonFocusTabColor;
153 			rgb_color			fNonFocusTabColorLight;
154 			rgb_color			fNonFocusTabColorBevel;
155 			rgb_color			fNonFocusTabColorShadow;
156 			rgb_color			fNonFocusTextColor;
157 };
158 
159 
160 #endif	// TAB_DECORATOR_H
161