1/*
2 * Copyright 2010, Haiku, Inc.
3 * Distributed under the terms of the MIT License.
4 *
5 * Authors:
6 *		Clemens Zeidler <haiku@clemens-zeidler.de>
7 *		Ingo Weinhold <ingo_weinhold@gmx.de>
8 */
9
10
11#include "SATDecorator.h"
12
13#include <new>
14
15#include <GradientLinear.h>
16#include <WindowPrivate.h>
17
18#include "DrawingEngine.h"
19#include "SATWindow.h"
20
21
22//#define DEBUG_SATDECORATOR
23#ifdef DEBUG_SATDECORATOR
24#	define STRACE(x) debug_printf x
25#else
26#	define STRACE(x) ;
27#endif
28
29
30static const float kResizeKnobSize = 18.0;
31
32static const rgb_color kHighlightFrameColors[6] = {
33	{ 52, 52, 52, 255 },
34	{ 140, 140, 140, 255 },
35	{ 124, 124, 124, 255 },
36	{ 108, 108, 108, 255 },
37	{ 52, 52, 52, 255 },
38	{ 8, 8, 8, 255 }
39};
40
41static const rgb_color kTabColor = {255, 203, 0, 255};
42static const rgb_color kHighlightTabColor = tint_color(kTabColor,
43	B_DARKEN_2_TINT);
44static const rgb_color kHighlightTabColorLight = tint_color(kHighlightTabColor,
45	(B_LIGHTEN_MAX_TINT + B_LIGHTEN_2_TINT) / 2);
46static const rgb_color kHighlightTabColorBevel = tint_color(kHighlightTabColor,
47	B_LIGHTEN_2_TINT);
48static const rgb_color kHighlightTabColorShadow = tint_color(kHighlightTabColor,
49	(B_DARKEN_1_TINT + B_NO_TINT) / 2);
50
51
52SATDecorator::SATDecorator(DesktopSettings& settings, BRect frame)
53	:
54	DefaultDecorator(settings, frame)
55{
56
57}
58
59
60void
61SATDecorator::GetComponentColors(Component component, uint8 highlight,
62	ComponentColors _colors, Decorator::Tab* _tab)
63{
64	DefaultDecorator::Tab* tab = static_cast<DefaultDecorator::Tab*>(_tab);
65	// we handle only our own highlights
66	if (highlight != HIGHLIGHT_STACK_AND_TILE) {
67		DefaultDecorator::GetComponentColors(component, highlight,
68			_colors, tab);
69		return;
70	}
71
72	if (tab && tab->isHighlighted == false
73		&& (component == COMPONENT_TAB || component == COMPONENT_CLOSE_BUTTON
74			|| component == COMPONENT_ZOOM_BUTTON)) {
75		DefaultDecorator::GetComponentColors(component, highlight,
76			_colors, tab);
77		return;
78	}
79
80	switch (component) {
81		case COMPONENT_TAB:
82			_colors[COLOR_TAB_FRAME_LIGHT] = kFrameColors[0];
83			_colors[COLOR_TAB_FRAME_DARK] = kFrameColors[3];
84			_colors[COLOR_TAB] = kHighlightTabColor;
85			_colors[COLOR_TAB_LIGHT] = kHighlightTabColorLight;
86			_colors[COLOR_TAB_BEVEL] = kHighlightTabColorBevel;
87			_colors[COLOR_TAB_SHADOW] = kHighlightTabColorShadow;
88			_colors[COLOR_TAB_TEXT] = kFocusTextColor;
89			break;
90
91		case COMPONENT_CLOSE_BUTTON:
92		case COMPONENT_ZOOM_BUTTON:
93			_colors[COLOR_BUTTON] = kHighlightTabColor;
94			_colors[COLOR_BUTTON_LIGHT] = kHighlightTabColorLight;
95			break;
96
97		case COMPONENT_LEFT_BORDER:
98		case COMPONENT_RIGHT_BORDER:
99		case COMPONENT_TOP_BORDER:
100		case COMPONENT_BOTTOM_BORDER:
101		case COMPONENT_RESIZE_CORNER:
102		default:
103			_colors[0] = kHighlightFrameColors[0];
104			_colors[1] = kHighlightFrameColors[1];
105			_colors[2] = kHighlightFrameColors[2];
106			_colors[3] = kHighlightFrameColors[3];
107			_colors[4] = kHighlightFrameColors[4];
108			_colors[5] = kHighlightFrameColors[5];
109			break;
110	}
111}
112
113
114SATWindowBehaviour::SATWindowBehaviour(Window* window, StackAndTile* sat)
115	:
116	DefaultWindowBehaviour(window),
117
118	fStackAndTile(sat)
119{
120}
121
122
123bool
124SATWindowBehaviour::AlterDeltaForSnap(Window* window, BPoint& delta,
125	bigtime_t now)
126{
127	if (DefaultWindowBehaviour::AlterDeltaForSnap(window, delta, now) == true)
128		return true;
129
130	SATWindow* satWindow = fStackAndTile->GetSATWindow(window);
131	if (satWindow == NULL)
132		return false;
133	SATGroup* group = satWindow->GetGroup();
134	if (group == NULL)
135		return false;
136
137	BRect groupFrame = group->WindowAt(0)->CompleteWindowFrame();
138	for (int32 i = 1; i < group->CountItems(); i++)
139		groupFrame = groupFrame | group->WindowAt(i)->CompleteWindowFrame();
140
141	return fMagneticBorder.AlterDeltaForSnap(window->Screen(),
142		groupFrame, delta, now);
143}
144