1/*
2 * Copyright 2009-2020 Haiku, Inc. All rights reserved.
3 * Distributed under the terms of the MIT License.
4 */
5#ifndef _CONTROL_LOOK_H
6#define _CONTROL_LOOK_H
7
8
9#include <Alignment.h>
10#include <Font.h>
11#include <Rect.h>
12#include <Slider.h>
13
14
15class BBitmap;
16class BControl;
17class BGradientLinear;
18class BView;
19
20
21// WARNING! This is experimental API and may change! Be prepared to
22// recompile your software in a next version of haiku.
23
24
25namespace BPrivate {
26
27
28class BControlLook {
29public:
30								BControlLook();
31	virtual						~BControlLook();
32
33	// TODO: Probably more convenient to pull these enums into global
34	// namespace and rename them to e.g. "B_CONTROL_LOOK_FOCUSED" instead of
35	// "BControlLook::B_FOCUSED".
36
37	enum frame_type {
38		B_BUTTON_FRAME,
39		B_GROUP_FRAME,
40		B_MENU_FIELD_FRAME,
41		B_SCROLL_VIEW_FRAME,
42		B_TEXT_CONTROL_FRAME,
43	};
44
45	enum background_type {
46		B_BUTTON_BACKGROUND,
47		B_BUTTON_WITH_POP_UP_BACKGROUND,
48		B_MENU_BACKGROUND,
49		B_MENU_BAR_BACKGROUND,
50		B_MENU_FIELD_BACKGROUND,
51		B_MENU_ITEM_BACKGROUND,
52		B_HORIZONTAL_SCROLL_BAR_BACKGROUND,
53		B_VERTICAL_SCROLL_BAR_BACKGROUND,
54	};
55
56	enum {
57		B_LEFT_BORDER		= 1 << 0,
58		B_RIGHT_BORDER		= 1 << 1,
59		B_TOP_BORDER		= 1 << 2,
60		B_BOTTOM_BORDER		= 1 << 3,
61
62		B_ALL_BORDERS		= B_LEFT_BORDER | B_RIGHT_BORDER
63								| B_TOP_BORDER | B_BOTTOM_BORDER
64	};
65
66	enum {
67		B_LEFT_ARROW		= 0,
68		B_RIGHT_ARROW		= 1,
69		B_UP_ARROW			= 2,
70		B_DOWN_ARROW		= 3,
71		B_LEFT_UP_ARROW		= 4,
72		B_RIGHT_UP_ARROW	= 5,
73		B_RIGHT_DOWN_ARROW	= 6,
74		B_LEFT_DOWN_ARROW	= 7
75	};
76
77	enum {
78		B_FOCUSED				= 1 << 0,
79		B_CLICKED				= 1 << 1, // some controls activate on mouse up
80		B_ACTIVATED				= 1 << 2,
81		B_HOVER					= 1 << 3,
82		B_DISABLED				= 1 << 4,
83		B_DEFAULT_BUTTON		= 1 << 5,
84		B_IGNORE_OUTLINE		= 1 << 6,
85		B_PARTIALLY_ACTIVATED	= 1 << 7, // like B_ACTIVATED, but for tri-state
86		B_FLAT					= 1 << 8, // flat look (e.g. button background)
87		B_INVALID				= 1 << 9, // invalid value, use B_FAILURE_COLOR
88		B_IS_CONTROL			= 1 << 10, // use control colors
89
90		B_BLEND_FRAME			= 1 << 16,
91	};
92
93	enum {
94		B_KNOB_NONE = 0,
95		B_KNOB_DOTS,
96		B_KNOB_LINES
97	};
98
99	virtual BAlignment			DefaultLabelAlignment() const = 0;
100	virtual float				DefaultLabelSpacing() const = 0;
101
102	virtual	float				DefaultItemSpacing() const = 0;
103
104	static	float				ComposeSpacing(float spacing);
105	static	BSize				ComposeIconSize(int32 size);
106
107	virtual uint32				Flags(BControl* control) const = 0;
108
109	virtual	void				DrawButtonFrame(BView* view, BRect& rect,
110									const BRect& updateRect,
111									const rgb_color& base,
112									const rgb_color& background,
113									uint32 flags = 0,
114									uint32 borders = B_ALL_BORDERS) = 0;
115	virtual	void				DrawButtonFrame(BView* view, BRect& rect,
116									const BRect& updateRect,
117									float radius,
118									const rgb_color& base,
119									const rgb_color& background,
120									uint32 flags = 0,
121									uint32 borders = B_ALL_BORDERS) = 0;
122	virtual	void				DrawButtonFrame(BView* view, BRect& rect,
123									const BRect& updateRect,
124									float leftTopRadius,
125									float rightTopRadius,
126									float leftBottomRadius,
127									float rightBottomRadius,
128									const rgb_color& base,
129									const rgb_color& background,
130									uint32 flags = 0,
131									uint32 borders = B_ALL_BORDERS) = 0;
132
133	virtual	void				DrawButtonBackground(BView* view, BRect& rect,
134									const BRect& updateRect,
135									const rgb_color& base,
136									uint32 flags = 0,
137									uint32 borders = B_ALL_BORDERS,
138									orientation orientation = B_HORIZONTAL) = 0;
139	virtual	void				DrawButtonBackground(BView* view, BRect& rect,
140									const BRect& updateRect,
141									float radius,
142									const rgb_color& base,
143									uint32 flags = 0,
144									uint32 borders = B_ALL_BORDERS,
145									orientation orientation = B_HORIZONTAL) = 0;
146	virtual	void				DrawButtonBackground(BView* view, BRect& rect,
147									const BRect& updateRect,
148									float leftTopRadius,
149									float rightTopRadius,
150									float leftBottomRadius,
151									float rightBottomRadius,
152									const rgb_color& base,
153									uint32 flags = 0,
154									uint32 borders = B_ALL_BORDERS,
155									orientation orientation = B_HORIZONTAL) = 0;
156
157	virtual	void				DrawMenuBarBackground(BView* view, BRect& rect,
158									const BRect& updateRect,
159									const rgb_color& base,
160									uint32 flags = 0,
161									uint32 borders = B_ALL_BORDERS) = 0;
162
163	virtual	void				DrawMenuFieldFrame(BView* view, BRect& rect,
164									const BRect& updateRect,
165									const rgb_color& base,
166									const rgb_color& background,
167									uint32 flags = 0,
168									uint32 borders = B_ALL_BORDERS) = 0;
169	virtual	void				DrawMenuFieldFrame(BView* view, BRect& rect,
170									const BRect& updateRect,
171									float radius,
172									const rgb_color& base,
173									const rgb_color& background,
174									uint32 flags = 0,
175									uint32 borders = B_ALL_BORDERS) = 0;
176	virtual	void				DrawMenuFieldFrame(BView* view, BRect& rect,
177									const BRect& updateRect,
178									float leftTopRadius,
179									float rightTopRadius,
180									float leftBottomRadius,
181									float rightBottomRadius,
182									const rgb_color& base,
183									const rgb_color& background,
184									uint32 flags = 0,
185									uint32 borders = B_ALL_BORDERS) = 0;
186
187	virtual	void				DrawMenuFieldBackground(BView* view,
188									BRect& rect, const BRect& updateRect,
189									const rgb_color& base, bool popupIndicator,
190									uint32 flags = 0) = 0;
191	virtual	void				DrawMenuFieldBackground(BView* view,
192									BRect& rect, const BRect& updateRect,
193									float radius, const rgb_color& base,
194									bool popupIndicator, uint32 flags = 0) = 0;
195	virtual	void				DrawMenuFieldBackground(BView* view,
196									BRect& rect, const BRect& updateRect,
197									float leftTopRadius,
198									float rightTopRadius,
199									float leftBottomRadius,
200									float rightBottomRadius,
201									const rgb_color& base,
202									bool popupIndicator, uint32 flags = 0) = 0;
203	virtual	void				DrawMenuFieldBackground(BView* view,
204									BRect& rect, const BRect& updateRect,
205									const rgb_color& base, uint32 flags = 0,
206									uint32 borders = B_ALL_BORDERS) = 0;
207
208	virtual	void				DrawMenuBackground(BView* view,
209									BRect& rect, const BRect& updateRect,
210									const rgb_color& base, uint32 flags = 0,
211									uint32 borders = B_ALL_BORDERS) = 0;
212
213	virtual	void				DrawMenuItemBackground(BView* view,
214									BRect& rect, const BRect& updateRect,
215									const rgb_color& base, uint32 flags = 0,
216									uint32 borders = B_ALL_BORDERS) = 0;
217
218	virtual	void				DrawStatusBar(BView* view, BRect& rect,
219									const BRect& updateRect,
220									const rgb_color& base,
221									const rgb_color& barColor,
222									float progressPosition) = 0;
223
224	virtual	void				DrawCheckBox(BView* view, BRect& rect,
225									const BRect& updateRect,
226									const rgb_color& base,
227									uint32 flags = 0) = 0;
228
229	virtual	void				DrawRadioButton(BView* view, BRect& rect,
230									const BRect& updateRect,
231									const rgb_color& base,
232									uint32 flags = 0) = 0;
233
234	virtual	void				DrawScrollBarBackground(BView* view,
235									BRect& rect1, BRect& rect2,
236									const BRect& updateRect,
237									const rgb_color& base, uint32 flags,
238									orientation orientation) = 0;
239	virtual	void				DrawScrollBarBackground(BView* view,
240									BRect& rect, const BRect& updateRect,
241									const rgb_color& base, uint32 flags,
242									orientation orientation) = 0;
243
244	virtual	void				DrawScrollViewFrame(BView* view,
245									BRect& rect, const BRect& updateRect,
246									BRect verticalScrollBarFrame,
247									BRect horizontalScrollBarFrame,
248									const rgb_color& base,
249									border_style borderStyle,
250									uint32 flags = 0,
251									uint32 borders = B_ALL_BORDERS) = 0;
252
253	virtual	void				DrawArrowShape(BView* view,
254									BRect& rect, const BRect& updateRect,
255									const rgb_color& base, uint32 direction,
256									uint32 flags = 0,
257									float tint = B_DARKEN_MAX_TINT) = 0;
258
259	virtual	rgb_color			SliderBarColor(const rgb_color& base) = 0;
260
261	virtual	void				DrawSliderBar(BView* view, BRect rect,
262									const BRect& updateRect,
263									const rgb_color& base,
264									rgb_color leftFillColor,
265									rgb_color rightFillColor,
266									float sliderScale, uint32 flags,
267									orientation orientation) = 0;
268	virtual	void				DrawSliderBar(BView* view, BRect rect,
269									const BRect& updateRect,
270									const rgb_color& base, rgb_color fillColor,
271									uint32 flags, orientation orientation) = 0;
272
273	virtual	void				DrawSliderThumb(BView* view, BRect& rect,
274									const BRect& updateRect,
275									const rgb_color& base, uint32 flags,
276									orientation orientation) = 0;
277
278	virtual	void				DrawSliderTriangle(BView* view, BRect& rect,
279									const BRect& updateRect,
280									const rgb_color& base, uint32 flags,
281									orientation orientation) = 0;
282	virtual	void				DrawSliderTriangle(BView* view, BRect& rect,
283									const BRect& updateRect,
284									const rgb_color& base,
285									const rgb_color& fill, uint32 flags,
286									orientation orientation) = 0;
287
288	virtual	void				DrawSliderHashMarks(BView* view, BRect& rect,
289									const BRect& updateRect,
290									const rgb_color& base, int32 count,
291									hash_mark_location location,
292									uint32 flags, orientation orientation) = 0;
293
294	virtual	void				DrawActiveTab(BView* view, BRect& rect,
295									const BRect& updateRect,
296									const rgb_color& base, uint32 flags = 0,
297									uint32 borders = B_ALL_BORDERS,
298									uint32 side = B_TOP_BORDER,
299									int32 index = 0, int32 selected = -1,
300									int32 first = 0, int32 last = 0) = 0;
301	virtual	void				DrawInactiveTab(BView* view, BRect& rect,
302									const BRect& updateRect,
303									const rgb_color& base, uint32 flags = 0,
304									uint32 borders = B_ALL_BORDERS,
305									uint32 side = B_TOP_BORDER,
306									int32 index = 0, int32 selected = -1,
307									int32 first = 0, int32 last = 0) = 0;
308
309	virtual	void				DrawSplitter(BView* view, BRect& rect,
310									const BRect& updateRect,
311									const rgb_color& base,
312									orientation orientation,
313									uint32 flags = 0,
314									uint32 borders = B_ALL_BORDERS) = 0;
315
316	// various borders
317
318	virtual	void				DrawBorder(BView* view, BRect& rect,
319									const BRect& updateRect,
320									const rgb_color& base,
321									border_style borderStyle, uint32 flags = 0,
322									uint32 borders = B_ALL_BORDERS) = 0;
323
324	virtual	void				DrawRaisedBorder(BView* view, BRect& rect,
325									const BRect& updateRect,
326									const rgb_color& base, uint32 flags = 0,
327									uint32 borders = B_ALL_BORDERS) = 0;
328
329	virtual	void				DrawGroupFrame(BView* view, BRect& rect,
330									const BRect& updateRect,
331									const rgb_color& base,
332									uint32 borders = B_ALL_BORDERS) = 0;
333
334	virtual	void				DrawTextControlBorder(BView* view, BRect& rect,
335									const BRect& updateRect,
336									const rgb_color& base, uint32 flags = 0,
337									uint32 borders = B_ALL_BORDERS) = 0;
338
339	// aligned labels
340
341	virtual	void				DrawLabel(BView* view, const char* label,
342									BRect rect, const BRect& updateRect,
343									const rgb_color& base, uint32 flags,
344									const rgb_color* textColor = NULL) = 0;
345	virtual	void				DrawLabel(BView* view, const char* label,
346									BRect rect, const BRect& updateRect,
347									const rgb_color& base, uint32 flags,
348									const BAlignment& alignment,
349									const rgb_color* textColor = NULL) = 0;
350	// TODO: Would be nice to have a (non-virtual) version of this method
351	// which takes an array of labels and locations. That would save some
352	// setup with the view graphics state.
353	virtual	void				DrawLabel(BView* view, const char* label,
354									const rgb_color& base, uint32 flags,
355									const BPoint& where,
356									const rgb_color* textColor = NULL) = 0;
357
358			void				DrawLabel(BView* view, const char* label,
359									const BBitmap* icon, BRect rect,
360									const BRect& updateRect,
361									const rgb_color& base, uint32 flags,
362									const rgb_color* textColor = NULL);
363	virtual	void				DrawLabel(BView* view, const char* label,
364									const BBitmap* icon, BRect rect,
365									const BRect& updateRect,
366									const rgb_color& base, uint32 flags,
367									const BAlignment& alignment,
368									const rgb_color* textColor = NULL) = 0;
369
370	virtual	void				GetFrameInsets(frame_type frameType,
371									uint32 flags, float& _left, float& _top,
372									float& _right, float& _bottom) = 0;
373	virtual	void				GetBackgroundInsets(
374									background_type backgroundType,
375									uint32 flags, float& _left, float& _top,
376									float& _right, float& _bottom) = 0;
377			void				GetInsets(frame_type frameType,
378									background_type backgroundType,
379									uint32 flags, float& _left, float& _top,
380									float& _right, float& _bottom);
381
382	virtual	void				DrawButtonWithPopUpBackground(BView* view,
383									BRect& rect, const BRect& updateRect,
384									const rgb_color& base,
385									uint32 flags = 0,
386									uint32 borders = B_ALL_BORDERS,
387									orientation orientation = B_HORIZONTAL) = 0;
388	virtual	void				DrawButtonWithPopUpBackground(BView* view,
389									BRect& rect, const BRect& updateRect,
390									float radius,
391									const rgb_color& base,
392									uint32 flags = 0,
393									uint32 borders = B_ALL_BORDERS,
394									orientation orientation = B_HORIZONTAL) = 0;
395	virtual	void				DrawButtonWithPopUpBackground(BView* view,
396									BRect& rect, const BRect& updateRect,
397									float leftTopRadius,
398									float rightTopRadius,
399									float leftBottomRadius,
400									float rightBottomRadius,
401									const rgb_color& base,
402									uint32 flags = 0,
403									uint32 borders = B_ALL_BORDERS,
404									orientation orientation = B_HORIZONTAL) = 0;
405
406			void				SetBackgroundInfo(
407									const BMessage& backgroundInfo);
408
409	virtual	void				DrawTabFrame(BView* view, BRect& rect,
410									const BRect& updateRect,
411									const rgb_color& base, uint32 flags = 0,
412									uint32 borders = B_ALL_BORDERS,
413									border_style borderStyle = B_FANCY_BORDER,
414									uint32 side = B_TOP_BORDER) = 0;
415
416	virtual	void				DrawScrollBarButton(BView* view,
417									BRect rect, const BRect& updateRect,
418									const rgb_color& base, uint32 flags,
419									int32 direction, orientation orientation,
420									bool down = false) = 0;
421	virtual	void				DrawScrollBarThumb(BView* view,
422									BRect& rect, const BRect& updateRect,
423									const rgb_color& base, uint32 flags,
424									orientation orientation,
425									uint32 knobStyle = B_KNOB_NONE) = 0;
426	virtual	void				DrawScrollBarBorder(BView* view,
427									BRect rect, const BRect& updateRect,
428									const rgb_color& base, uint32 flags,
429									orientation orientation) = 0;
430	virtual float				GetScrollBarWidth(
431									orientation orientation = B_VERTICAL);
432
433	static	bool				ShouldDraw(BView* view, const BRect& rect,
434									const BRect& updateRect);
435
436private:
437	// FBC padding
438	virtual	void				_ReservedControlLook6();
439	virtual	void				_ReservedControlLook7();
440	virtual	void				_ReservedControlLook8();
441	virtual	void				_ReservedControlLook9();
442	virtual	void				_ReservedControlLook10();
443
444protected:
445			int32				fCachedWorkspace;
446			BMessage			fBackgroundInfo;
447
448			uint32				_reserved[20];
449};
450
451extern BControlLook* be_control_look;
452
453extern "C" _EXPORT BControlLook *instantiate_control_look(image_id id);
454
455
456} // namespace BPrivate
457
458using BPrivate::BControlLook;
459using BPrivate::be_control_look;
460
461
462#endif // _CONTROL_LOOK_H
463