1/*
2 * Copyright 2010-2015, 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 rgb_color kFrameColors[4] = {
31	{ 152, 152, 152, 255 },
32	{ 240, 240, 240, 255 },
33	{ 152, 152, 152, 255 },
34	{ 108, 108, 108, 255 }
35};
36
37static const rgb_color kHighlightFrameColors[6] = {
38	{ 52, 52, 52, 255 },
39	{ 140, 140, 140, 255 },
40	{ 124, 124, 124, 255 },
41	{ 108, 108, 108, 255 },
42	{ 52, 52, 52, 255 },
43	{ 8, 8, 8, 255 }
44};
45
46SATDecorator::SATDecorator(DesktopSettings& settings, BRect frame,
47							Desktop* desktop)
48	:
49	DefaultDecorator(settings, frame, desktop)
50{
51}
52
53
54void
55SATDecorator::UpdateColors(DesktopSettings& settings)
56{
57	DefaultDecorator::UpdateColors(settings);
58
59	// Called during construction, and during any changes
60	fHighlightTabColor		= tint_color(fFocusTabColor, B_DARKEN_2_TINT);
61	fHighlightTabColorLight	= tint_color(fHighlightTabColor,
62								(B_LIGHTEN_MAX_TINT + B_LIGHTEN_2_TINT) / 2);
63	fHighlightTabColorBevel	= tint_color(fHighlightTabColor, B_LIGHTEN_2_TINT);
64	fHighlightTabColorShadow= tint_color(fHighlightTabColor,
65								(B_DARKEN_1_TINT + B_NO_TINT) / 2);
66}
67
68
69void
70SATDecorator::GetComponentColors(Component component, uint8 highlight,
71	ComponentColors _colors, Decorator::Tab* _tab)
72{
73	DefaultDecorator::Tab* tab = static_cast<DefaultDecorator::Tab*>(_tab);
74
75	// Get the standard colors from the DefaultDecorator
76	DefaultDecorator::GetComponentColors(component, highlight, _colors, tab);
77
78	// Now we need to make some changes if the Stack and tile highlight is used
79	if (highlight != HIGHLIGHT_STACK_AND_TILE)
80		return;
81
82	if (tab && tab->isHighlighted == false
83		&& (component == COMPONENT_TAB || component == COMPONENT_CLOSE_BUTTON
84			|| component == COMPONENT_ZOOM_BUTTON)) {
85		return;
86	}
87
88	switch (component) {
89		case COMPONENT_TAB:
90			_colors[COLOR_TAB_FRAME_LIGHT] = kFrameColors[0];
91			_colors[COLOR_TAB_FRAME_DARK] = kFrameColors[3];
92			_colors[COLOR_TAB] = fHighlightTabColor;
93			_colors[COLOR_TAB_LIGHT] = fHighlightTabColorLight;
94			_colors[COLOR_TAB_BEVEL] = fHighlightTabColorBevel;
95			_colors[COLOR_TAB_SHADOW] = fHighlightTabColorShadow;
96			_colors[COLOR_TAB_TEXT] = fFocusTextColor;
97			break;
98
99		case COMPONENT_CLOSE_BUTTON:
100		case COMPONENT_ZOOM_BUTTON:
101			_colors[COLOR_BUTTON] = fHighlightTabColor;
102			_colors[COLOR_BUTTON_LIGHT] = fHighlightTabColorLight;
103			break;
104
105		case COMPONENT_LEFT_BORDER:
106		case COMPONENT_RIGHT_BORDER:
107		case COMPONENT_TOP_BORDER:
108		case COMPONENT_BOTTOM_BORDER:
109		case COMPONENT_RESIZE_CORNER:
110		default:
111			_colors[0] = kHighlightFrameColors[0];
112			_colors[1] = kHighlightFrameColors[1];
113			_colors[2] = kHighlightFrameColors[2];
114			_colors[3] = kHighlightFrameColors[3];
115			_colors[4] = kHighlightFrameColors[4];
116			_colors[5] = kHighlightFrameColors[5];
117			break;
118	}
119}
120
121
122SATWindowBehaviour::SATWindowBehaviour(Window* window, StackAndTile* sat)
123	:
124	DefaultWindowBehaviour(window),
125
126	fStackAndTile(sat)
127{
128}
129
130
131bool
132SATWindowBehaviour::AlterDeltaForSnap(Window* window, BPoint& delta,
133	bigtime_t now)
134{
135	if (DefaultWindowBehaviour::AlterDeltaForSnap(window, delta, now) == true)
136		return true;
137
138	SATWindow* satWindow = fStackAndTile->GetSATWindow(window);
139	if (satWindow == NULL)
140		return false;
141	SATGroup* group = satWindow->GetGroup();
142	if (group == NULL)
143		return false;
144
145	BRect groupFrame = group->WindowAt(0)->CompleteWindowFrame();
146	for (int32 i = 1; i < group->CountItems(); i++)
147		groupFrame = groupFrame | group->WindowAt(i)->CompleteWindowFrame();
148
149	return fMagneticBorder.AlterDeltaForSnap(window->Screen(),
150		groupFrame, delta, now);
151}
152