xref: /haiku/src/kits/interface/ControlLook.cpp (revision d452ff664c6c7d1b4c429fb7b53f920f165e52f7)
12f86ba45SStephan Aßmus /*
22f86ba45SStephan Aßmus  * Copyright 2009, Stephan Aßmus <superstippi@gmx.de>
32f86ba45SStephan Aßmus  * Distributed under the terms of the MIT License.
42f86ba45SStephan Aßmus  */
5*d452ff66SAxel Dörfler 
6*d452ff66SAxel Dörfler 
72f86ba45SStephan Aßmus #include <ControlLook.h>
82f86ba45SStephan Aßmus 
9d63b75faSPhilippe Saint-Pierre #include "ContainerWindow.h"
10d63b75faSPhilippe Saint-Pierre 
112f86ba45SStephan Aßmus #include <stdio.h>
122f86ba45SStephan Aßmus 
132f86ba45SStephan Aßmus #include <Control.h>
142f86ba45SStephan Aßmus #include <GradientLinear.h>
152f86ba45SStephan Aßmus #include <Region.h>
162f86ba45SStephan Aßmus #include <Shape.h>
172f86ba45SStephan Aßmus #include <String.h>
182f86ba45SStephan Aßmus #include <View.h>
19d63b75faSPhilippe Saint-Pierre #include <Window.h>
202f86ba45SStephan Aßmus 
212f86ba45SStephan Aßmus namespace BPrivate {
222f86ba45SStephan Aßmus 
232f86ba45SStephan Aßmus static const float kEdgeBevelLightTint = 0.59;
242f86ba45SStephan Aßmus static const float kEdgeBevelShadowTint = 1.0735;
25d63b75faSPhilippe Saint-Pierre const rgb_color kWhite = (rgb_color){255, 255, 255, 255};
26d63b75faSPhilippe Saint-Pierre const rgb_color kBlack = (rgb_color){0, 0, 0, 255};
272f86ba45SStephan Aßmus 
282f86ba45SStephan Aßmus 
29d63b75faSPhilippe Saint-Pierre BControlLook::BControlLook():
30d63b75faSPhilippe Saint-Pierre 	fCachedOutline(false),
31d63b75faSPhilippe Saint-Pierre 	fCachedWorkspace(-1)
322f86ba45SStephan Aßmus {
332f86ba45SStephan Aßmus }
342f86ba45SStephan Aßmus 
352f86ba45SStephan Aßmus 
362f86ba45SStephan Aßmus BControlLook::~BControlLook()
372f86ba45SStephan Aßmus {
382f86ba45SStephan Aßmus }
392f86ba45SStephan Aßmus 
402f86ba45SStephan Aßmus 
412f86ba45SStephan Aßmus BAlignment
422f86ba45SStephan Aßmus BControlLook::DefaultLabelAlignment() const
432f86ba45SStephan Aßmus {
442f86ba45SStephan Aßmus 	return BAlignment(B_ALIGN_LEFT, B_ALIGN_VERTICAL_CENTER);
452f86ba45SStephan Aßmus }
462f86ba45SStephan Aßmus 
472f86ba45SStephan Aßmus 
482f86ba45SStephan Aßmus float
492f86ba45SStephan Aßmus BControlLook::DefaultLabelSpacing() const
502f86ba45SStephan Aßmus {
5120a11271SAxel Dörfler 	return ceilf(be_plain_font->Size() / 2.0);
5220a11271SAxel Dörfler }
5320a11271SAxel Dörfler 
5420a11271SAxel Dörfler 
5520a11271SAxel Dörfler float
5620a11271SAxel Dörfler BControlLook::DefaultItemSpacing() const
5720a11271SAxel Dörfler {
5820a11271SAxel Dörfler 	return ceilf(be_plain_font->Size() * 0.85);
592f86ba45SStephan Aßmus }
602f86ba45SStephan Aßmus 
612f86ba45SStephan Aßmus 
6282ab3167SAlex Wilson float
636648dd3cSAlex Wilson BControlLook::ComposeSpacing(float spacing)
6482ab3167SAlex Wilson {
65d90a465eSAlex Wilson 	if (spacing == B_USE_DEFAULT_SPACING || spacing == B_USE_ITEM_SPACING) {
6682ab3167SAlex Wilson 		return be_control_look->DefaultItemSpacing();
676648dd3cSAlex Wilson 	} else if (spacing == B_USE_HALF_ITEM_SPACING) {
686648dd3cSAlex Wilson 		return be_control_look->DefaultItemSpacing() * 0.5f;
696648dd3cSAlex Wilson 	} else if (spacing == B_USE_WINDOW_INSETS) {
706648dd3cSAlex Wilson 		return be_control_look->DefaultItemSpacing();
716648dd3cSAlex Wilson 	} else if (spacing == B_USE_SMALL_SPACING) {
726648dd3cSAlex Wilson 		return be_control_look->DefaultItemSpacing() * 0.7f;
736648dd3cSAlex Wilson 	} else if (spacing == B_USE_BIG_SPACING) {
746648dd3cSAlex Wilson 		return be_control_look->DefaultItemSpacing() * 1.3f;
756648dd3cSAlex Wilson 	}
766648dd3cSAlex Wilson 	return spacing;
7782ab3167SAlex Wilson }
7882ab3167SAlex Wilson 
7982ab3167SAlex Wilson 
802f86ba45SStephan Aßmus uint32
812f86ba45SStephan Aßmus BControlLook::Flags(BControl* control) const
822f86ba45SStephan Aßmus {
832f86ba45SStephan Aßmus 	uint32 flags = 0;
842f86ba45SStephan Aßmus 
852f86ba45SStephan Aßmus 	if (!control->IsEnabled())
862f86ba45SStephan Aßmus 		flags |= B_DISABLED;
872f86ba45SStephan Aßmus 
882f86ba45SStephan Aßmus 	if (control->IsFocus())
892f86ba45SStephan Aßmus 		flags |= B_FOCUSED;
902f86ba45SStephan Aßmus 
912f86ba45SStephan Aßmus 	if (control->Value() == B_CONTROL_ON)
922f86ba45SStephan Aßmus 		flags |= B_ACTIVATED;
932f86ba45SStephan Aßmus 
9461ac1a85SStephan Aßmus 	if (control->Parent() != NULL
9561ac1a85SStephan Aßmus 		&& (control->Parent()->Flags() & B_DRAW_ON_CHILDREN) != 0) {
9661ac1a85SStephan Aßmus 		// In this constellation, assume we want to render the control
9761ac1a85SStephan Aßmus 		// against the already existing view contents of the parent view.
9861ac1a85SStephan Aßmus 		flags |= B_BLEND_FRAME;
9961ac1a85SStephan Aßmus 	}
10061ac1a85SStephan Aßmus 
1012f86ba45SStephan Aßmus 	return flags;
1022f86ba45SStephan Aßmus }
1032f86ba45SStephan Aßmus 
1042f86ba45SStephan Aßmus 
1052f86ba45SStephan Aßmus // #pragma mark -
1062f86ba45SStephan Aßmus 
1072f86ba45SStephan Aßmus 
1082f86ba45SStephan Aßmus void
1092f86ba45SStephan Aßmus BControlLook::DrawButtonFrame(BView* view, BRect& rect, const BRect& updateRect,
110681c2e44SStephan Aßmus 	const rgb_color& base, const rgb_color& background, uint32 flags,
111681c2e44SStephan Aßmus 	uint32 borders)
1122f86ba45SStephan Aßmus {
113681c2e44SStephan Aßmus 	_DrawButtonFrame(view, rect, updateRect, base, background, 1.0, 1.0, flags,
114681c2e44SStephan Aßmus 		borders);
1152f86ba45SStephan Aßmus }
1162f86ba45SStephan Aßmus 
1172f86ba45SStephan Aßmus 
1182f86ba45SStephan Aßmus void
1192f86ba45SStephan Aßmus BControlLook::DrawButtonBackground(BView* view, BRect& rect,
1202f86ba45SStephan Aßmus 	const BRect& updateRect, const rgb_color& base, uint32 flags,
1212f86ba45SStephan Aßmus 	uint32 borders, enum orientation orientation)
1222f86ba45SStephan Aßmus {
1232f86ba45SStephan Aßmus 	if (!rect.IsValid() || !updateRect.Intersects(rect))
1242f86ba45SStephan Aßmus 		return;
1252f86ba45SStephan Aßmus 
1262f86ba45SStephan Aßmus 	// the surface edges
1272f86ba45SStephan Aßmus 
1282f86ba45SStephan Aßmus 	// colors
1292f86ba45SStephan Aßmus 	rgb_color buttonBgColor = tint_color(base, B_LIGHTEN_1_TINT);
1302f86ba45SStephan Aßmus 	rgb_color maxLightColor;
1312f86ba45SStephan Aßmus 
1322f86ba45SStephan Aßmus 	rgb_color bevelColor1;
1332f86ba45SStephan Aßmus 	rgb_color bevelColor2;
1342f86ba45SStephan Aßmus 
1352f86ba45SStephan Aßmus 	if ((flags & B_DISABLED) == 0) {
1362f86ba45SStephan Aßmus 		maxLightColor = tint_color(base, 0.2);
1372f86ba45SStephan Aßmus 		bevelColor1 = tint_color(base, 1.08);
1382f86ba45SStephan Aßmus 		bevelColor2 = base;
1392f86ba45SStephan Aßmus 	} else {
1402f86ba45SStephan Aßmus 		maxLightColor = tint_color(base, 0.7);
1412f86ba45SStephan Aßmus 		bevelColor1 = base;
1422f86ba45SStephan Aßmus 		bevelColor2 = buttonBgColor;
1432f86ba45SStephan Aßmus 		buttonBgColor = maxLightColor;
1442f86ba45SStephan Aßmus 	}
1452f86ba45SStephan Aßmus 
1462f86ba45SStephan Aßmus 	if (flags & B_ACTIVATED) {
1472f86ba45SStephan Aßmus 		view->BeginLineArray(4);
1482f86ba45SStephan Aßmus 
1492f86ba45SStephan Aßmus 		bevelColor1 = tint_color(bevelColor1, B_DARKEN_1_TINT);
1502f86ba45SStephan Aßmus 		bevelColor2 = tint_color(bevelColor2, B_DARKEN_1_TINT);
1512f86ba45SStephan Aßmus 
1522f86ba45SStephan Aßmus 		// shadow along left/top borders
1532f86ba45SStephan Aßmus 		if (borders & B_LEFT_BORDER) {
1542f86ba45SStephan Aßmus 			view->AddLine(BPoint(rect.left, rect.top),
1552f86ba45SStephan Aßmus 				BPoint(rect.left, rect.bottom), bevelColor1);
1562f86ba45SStephan Aßmus 			rect.left++;
1572f86ba45SStephan Aßmus 		}
1582f86ba45SStephan Aßmus 		if (borders & B_TOP_BORDER) {
1592f86ba45SStephan Aßmus 			view->AddLine(BPoint(rect.left, rect.top),
1602f86ba45SStephan Aßmus 				BPoint(rect.right, rect.top), bevelColor1);
1612f86ba45SStephan Aßmus 			rect.top++;
1622f86ba45SStephan Aßmus 		}
1632f86ba45SStephan Aßmus 
1642f86ba45SStephan Aßmus 		// softer shadow along left/top borders
1652f86ba45SStephan Aßmus 		if (borders & B_LEFT_BORDER) {
1662f86ba45SStephan Aßmus 			view->AddLine(BPoint(rect.left, rect.top),
1672f86ba45SStephan Aßmus 				BPoint(rect.left, rect.bottom), bevelColor2);
1682f86ba45SStephan Aßmus 			rect.left++;
1692f86ba45SStephan Aßmus 		}
1702f86ba45SStephan Aßmus 		if (borders & B_TOP_BORDER) {
1712f86ba45SStephan Aßmus 			view->AddLine(BPoint(rect.left, rect.top),
1722f86ba45SStephan Aßmus 				BPoint(rect.right, rect.top), bevelColor2);
1732f86ba45SStephan Aßmus 			rect.top++;
1742f86ba45SStephan Aßmus 		}
1752f86ba45SStephan Aßmus 
1762f86ba45SStephan Aßmus 		view->EndLineArray();
1772f86ba45SStephan Aßmus 	} else {
1782f86ba45SStephan Aßmus 		_DrawFrame(view, rect,
1792f86ba45SStephan Aßmus 			maxLightColor, maxLightColor,
1802f86ba45SStephan Aßmus 			bevelColor1, bevelColor1,
1812f86ba45SStephan Aßmus 			buttonBgColor, buttonBgColor, borders);
1822f86ba45SStephan Aßmus 	}
1832f86ba45SStephan Aßmus 
1842f86ba45SStephan Aßmus 	// the actual surface top
1852f86ba45SStephan Aßmus 
1862f86ba45SStephan Aßmus 	float topTint = 0.49;
1872f86ba45SStephan Aßmus 	float middleTint1 = 0.62;
1882f86ba45SStephan Aßmus 	float middleTint2 = 0.76;
1892f86ba45SStephan Aßmus 	float bottomTint = 0.90;
1902f86ba45SStephan Aßmus 
1912f86ba45SStephan Aßmus 	if (flags & B_ACTIVATED) {
1922f86ba45SStephan Aßmus 		topTint = 1.11;
1932f86ba45SStephan Aßmus 		bottomTint = 1.08;
1942f86ba45SStephan Aßmus 	}
1952f86ba45SStephan Aßmus 
1962f86ba45SStephan Aßmus 	if (flags & B_DISABLED) {
1972f86ba45SStephan Aßmus 		topTint = (topTint + B_NO_TINT) / 2;
1982f86ba45SStephan Aßmus 		middleTint1 = (middleTint1 + B_NO_TINT) / 2;
1992f86ba45SStephan Aßmus 		middleTint2 = (middleTint2 + B_NO_TINT) / 2;
2002f86ba45SStephan Aßmus 		bottomTint = (bottomTint + B_NO_TINT) / 2;
2012f86ba45SStephan Aßmus 	} else if (flags & B_HOVER) {
2022f86ba45SStephan Aßmus 		static const float kHoverTintFactor = 0.85;
2032f86ba45SStephan Aßmus 		topTint *= kHoverTintFactor;
2042f86ba45SStephan Aßmus 		middleTint1 *= kHoverTintFactor;
2052f86ba45SStephan Aßmus 		middleTint2 *= kHoverTintFactor;
2062f86ba45SStephan Aßmus 		bottomTint *= kHoverTintFactor;
2072f86ba45SStephan Aßmus 	}
2082f86ba45SStephan Aßmus 
2092f86ba45SStephan Aßmus 	if (flags & B_ACTIVATED) {
2102f86ba45SStephan Aßmus 		_FillGradient(view, rect, base, topTint, bottomTint, orientation);
2112f86ba45SStephan Aßmus 	} else {
2122f86ba45SStephan Aßmus 		_FillGlossyGradient(view, rect, base, topTint, middleTint1,
2132f86ba45SStephan Aßmus 			middleTint2, bottomTint, orientation);
2142f86ba45SStephan Aßmus 	}
2152f86ba45SStephan Aßmus }
2162f86ba45SStephan Aßmus 
2172f86ba45SStephan Aßmus 
2182f86ba45SStephan Aßmus void
2192f86ba45SStephan Aßmus BControlLook::DrawMenuBarBackground(BView* view, BRect& rect,
2201a72cb41SStephan Aßmus 	const BRect& updateRect, const rgb_color& base, uint32 flags,
2211a72cb41SStephan Aßmus 	uint32 borders)
2222f86ba45SStephan Aßmus {
2232f86ba45SStephan Aßmus 	if (!rect.IsValid() || !updateRect.Intersects(rect))
2242f86ba45SStephan Aßmus 		return;
2252f86ba45SStephan Aßmus 
2262f86ba45SStephan Aßmus 	// the surface edges
2272f86ba45SStephan Aßmus 
2282f86ba45SStephan Aßmus 	// colors
2291a72cb41SStephan Aßmus 	float topTint;
2301a72cb41SStephan Aßmus 	float bottomTint;
2311a72cb41SStephan Aßmus 
2321a72cb41SStephan Aßmus 	if (flags & B_ACTIVATED) {
2331a72cb41SStephan Aßmus 		rgb_color bevelColor1 = tint_color(base, 1.40);
2341a72cb41SStephan Aßmus 		rgb_color bevelColor2 = tint_color(base, 1.25);
2351a72cb41SStephan Aßmus 
2361a72cb41SStephan Aßmus 		topTint = 1.25;
2371a72cb41SStephan Aßmus 		bottomTint = 1.20;
2382f86ba45SStephan Aßmus 
2392f86ba45SStephan Aßmus 		_DrawFrame(view, rect,
2401a72cb41SStephan Aßmus 			bevelColor1, bevelColor1,
2411a72cb41SStephan Aßmus 			bevelColor2, bevelColor2,
2421a72cb41SStephan Aßmus 			borders & B_TOP_BORDER);
2431a72cb41SStephan Aßmus 	} else {
2441a72cb41SStephan Aßmus 		rgb_color cornerColor = tint_color(base, 0.9);
2451a72cb41SStephan Aßmus 		rgb_color bevelColorTop = tint_color(base, 0.5);
2461a72cb41SStephan Aßmus 		rgb_color bevelColorLeft = tint_color(base, 0.7);
2471a72cb41SStephan Aßmus 		rgb_color bevelColorRightBottom = tint_color(base, 1.08);
2481a72cb41SStephan Aßmus 
2491a72cb41SStephan Aßmus 		topTint = 0.69;
2501a72cb41SStephan Aßmus 		bottomTint = 1.03;
2511a72cb41SStephan Aßmus 
2521a72cb41SStephan Aßmus 		_DrawFrame(view, rect,
2531a72cb41SStephan Aßmus 			bevelColorLeft, bevelColorTop,
2541a72cb41SStephan Aßmus 			bevelColorRightBottom, bevelColorRightBottom,
2552f86ba45SStephan Aßmus 			cornerColor, cornerColor,
2562f86ba45SStephan Aßmus 			borders);
2571a72cb41SStephan Aßmus 	}
2582f86ba45SStephan Aßmus 
2592f86ba45SStephan Aßmus 	// the actual surface top
2602f86ba45SStephan Aßmus 
2612f86ba45SStephan Aßmus 	_FillGradient(view, rect, base, topTint, bottomTint);
2622f86ba45SStephan Aßmus }
2632f86ba45SStephan Aßmus 
2642f86ba45SStephan Aßmus 
2652f86ba45SStephan Aßmus void
266681c2e44SStephan Aßmus BControlLook::DrawMenuFieldFrame(BView* view, BRect& rect,
267681c2e44SStephan Aßmus 	const BRect& updateRect, const rgb_color& base,
268681c2e44SStephan Aßmus 	const rgb_color& background, uint32 flags, uint32 borders)
26913cd46dfSStephan Aßmus {
270681c2e44SStephan Aßmus 	_DrawButtonFrame(view, rect, updateRect, base, background, 0.6, 1.0, flags,
271681c2e44SStephan Aßmus 		borders);
27213cd46dfSStephan Aßmus }
27313cd46dfSStephan Aßmus 
27413cd46dfSStephan Aßmus 
27513cd46dfSStephan Aßmus void
2762f86ba45SStephan Aßmus BControlLook::DrawMenuFieldBackground(BView* view, BRect& rect,
2772f86ba45SStephan Aßmus 	const BRect& updateRect, const rgb_color& base, bool popupIndicator,
2782f86ba45SStephan Aßmus 	uint32 flags)
2792f86ba45SStephan Aßmus {
2802f86ba45SStephan Aßmus 	if (popupIndicator) {
2812f86ba45SStephan Aßmus 		BRect leftRect(rect);
2822f86ba45SStephan Aßmus 		leftRect.right -= 10;
2832f86ba45SStephan Aßmus 
2842f86ba45SStephan Aßmus 		BRect rightRect(rect);
2852f86ba45SStephan Aßmus 		rightRect.left = rightRect.right - 9;
2862f86ba45SStephan Aßmus 
2872f86ba45SStephan Aßmus 		DrawMenuFieldBackground(view, leftRect, updateRect, base, flags,
2882f86ba45SStephan Aßmus 			B_LEFT_BORDER | B_TOP_BORDER | B_BOTTOM_BORDER);
2892f86ba45SStephan Aßmus 
2902f86ba45SStephan Aßmus 		rgb_color indicatorBase;
2912f86ba45SStephan Aßmus 		rgb_color markColor;
2922f86ba45SStephan Aßmus 		if (flags & B_DISABLED) {
2932f86ba45SStephan Aßmus 			indicatorBase = tint_color(base, 1.05);
29413cd46dfSStephan Aßmus 			markColor = tint_color(base, 1.35);
2952f86ba45SStephan Aßmus 		} else {
29613cd46dfSStephan Aßmus 			indicatorBase = tint_color(base, 1.12);
29713cd46dfSStephan Aßmus 			markColor = tint_color(base, 1.65);
2982f86ba45SStephan Aßmus 		}
2992f86ba45SStephan Aßmus 
3002f86ba45SStephan Aßmus 		DrawMenuFieldBackground(view, rightRect, updateRect, indicatorBase,
3012f86ba45SStephan Aßmus 			flags, B_RIGHT_BORDER | B_TOP_BORDER | B_BOTTOM_BORDER);
3022f86ba45SStephan Aßmus 
3032f86ba45SStephan Aßmus 		// popup marker
3042f86ba45SStephan Aßmus 		BPoint center(roundf((rightRect.left + rightRect.right) / 2.0),
3052f86ba45SStephan Aßmus 					  roundf((rightRect.top + rightRect.bottom) / 2.0));
3062f86ba45SStephan Aßmus 		BPoint triangle[3];
3072f86ba45SStephan Aßmus 		triangle[0] = center + BPoint(-2.5, -0.5);
3082f86ba45SStephan Aßmus 		triangle[1] = center + BPoint(2.5, -0.5);
3092f86ba45SStephan Aßmus 		triangle[2] = center + BPoint(0.0, 2.0);
3102f86ba45SStephan Aßmus 
3112f86ba45SStephan Aßmus 		uint32 viewFlags = view->Flags();
3122f86ba45SStephan Aßmus 		view->SetFlags(viewFlags | B_SUBPIXEL_PRECISE);
3132f86ba45SStephan Aßmus 
3142f86ba45SStephan Aßmus 		view->SetHighColor(markColor);
3152f86ba45SStephan Aßmus 		view->FillTriangle(triangle[0], triangle[1], triangle[2]);
3162f86ba45SStephan Aßmus 
3172f86ba45SStephan Aßmus 		view->SetFlags(viewFlags);
3182f86ba45SStephan Aßmus 
3192f86ba45SStephan Aßmus 		rect = leftRect;
3202f86ba45SStephan Aßmus 	} else {
3212f86ba45SStephan Aßmus 		DrawMenuFieldBackground(view, rect, updateRect, base, flags);
3222f86ba45SStephan Aßmus 	}
3232f86ba45SStephan Aßmus }
3242f86ba45SStephan Aßmus 
3252f86ba45SStephan Aßmus void
3262f86ba45SStephan Aßmus BControlLook::DrawMenuFieldBackground(BView* view, BRect& rect,
3272f86ba45SStephan Aßmus 	const BRect& updateRect, const rgb_color& base, uint32 flags,
3282f86ba45SStephan Aßmus 	uint32 borders)
3292f86ba45SStephan Aßmus {
3302f86ba45SStephan Aßmus 	if (!rect.IsValid() || !updateRect.Intersects(rect))
3312f86ba45SStephan Aßmus 		return;
3322f86ba45SStephan Aßmus 
3332f86ba45SStephan Aßmus 	// the surface edges
3342f86ba45SStephan Aßmus 
3352f86ba45SStephan Aßmus 	// colors
3362f86ba45SStephan Aßmus 	rgb_color cornerColor = tint_color(base, 0.85);
3372f86ba45SStephan Aßmus 	rgb_color bevelColor1 = tint_color(base, 0.3);
3382f86ba45SStephan Aßmus 	rgb_color bevelColor2 = tint_color(base, 0.5);
3392f86ba45SStephan Aßmus 	rgb_color bevelColor3 = tint_color(base, 1.03);
3402f86ba45SStephan Aßmus 
3412f86ba45SStephan Aßmus 	if (flags & B_DISABLED) {
3422f86ba45SStephan Aßmus 		cornerColor = tint_color(base, 0.8);
3432f86ba45SStephan Aßmus 		bevelColor1 = tint_color(base, 0.7);
3442f86ba45SStephan Aßmus 		bevelColor2 = tint_color(base, 0.8);
3452f86ba45SStephan Aßmus 		bevelColor3 = tint_color(base, 1.01);
3462f86ba45SStephan Aßmus 	} else {
3472f86ba45SStephan Aßmus 		cornerColor = tint_color(base, 0.85);
3482f86ba45SStephan Aßmus 		bevelColor1 = tint_color(base, 0.3);
3492f86ba45SStephan Aßmus 		bevelColor2 = tint_color(base, 0.5);
3502f86ba45SStephan Aßmus 		bevelColor3 = tint_color(base, 1.03);
3512f86ba45SStephan Aßmus 	}
3522f86ba45SStephan Aßmus 
3532f86ba45SStephan Aßmus 	_DrawFrame(view, rect,
3542f86ba45SStephan Aßmus 		bevelColor2, bevelColor1,
3552f86ba45SStephan Aßmus 		bevelColor3, bevelColor3,
3562f86ba45SStephan Aßmus 		cornerColor, cornerColor,
3572f86ba45SStephan Aßmus 		borders);
3582f86ba45SStephan Aßmus 
3592f86ba45SStephan Aßmus 	// the actual surface top
3602f86ba45SStephan Aßmus 
3612f86ba45SStephan Aßmus 	float topTint = 0.49;
3622f86ba45SStephan Aßmus 	float middleTint1 = 0.62;
3632f86ba45SStephan Aßmus 	float middleTint2 = 0.76;
3642f86ba45SStephan Aßmus 	float bottomTint = 0.90;
3652f86ba45SStephan Aßmus 
3662f86ba45SStephan Aßmus 	if (flags & B_DISABLED) {
3672f86ba45SStephan Aßmus 		topTint = (topTint + B_NO_TINT) / 2;
3682f86ba45SStephan Aßmus 		middleTint1 = (middleTint1 + B_NO_TINT) / 2;
3692f86ba45SStephan Aßmus 		middleTint2 = (middleTint2 + B_NO_TINT) / 2;
3702f86ba45SStephan Aßmus 		bottomTint = (bottomTint + B_NO_TINT) / 2;
3712f86ba45SStephan Aßmus 	} else if (flags & B_HOVER) {
3722f86ba45SStephan Aßmus 		static const float kHoverTintFactor = 0.85;
3732f86ba45SStephan Aßmus 		topTint *= kHoverTintFactor;
3742f86ba45SStephan Aßmus 		middleTint1 *= kHoverTintFactor;
3752f86ba45SStephan Aßmus 		middleTint2 *= kHoverTintFactor;
3762f86ba45SStephan Aßmus 		bottomTint *= kHoverTintFactor;
3772f86ba45SStephan Aßmus 	}
3782f86ba45SStephan Aßmus 
3792f86ba45SStephan Aßmus 	_FillGlossyGradient(view, rect, base, topTint, middleTint1,
3802f86ba45SStephan Aßmus 		middleTint2, bottomTint);
3812f86ba45SStephan Aßmus }
3822f86ba45SStephan Aßmus 
3832f86ba45SStephan Aßmus void
3842f86ba45SStephan Aßmus BControlLook::DrawMenuBackground(BView* view, BRect& rect,
3852f86ba45SStephan Aßmus 	const BRect& updateRect, const rgb_color& base, uint32 flags,
3862f86ba45SStephan Aßmus 	uint32 borders)
3872f86ba45SStephan Aßmus {
3882f86ba45SStephan Aßmus 	if (!rect.IsValid() || !updateRect.Intersects(rect))
3892f86ba45SStephan Aßmus 		return;
3902f86ba45SStephan Aßmus 
3912f86ba45SStephan Aßmus 	// the surface edges
3922f86ba45SStephan Aßmus 
3932f86ba45SStephan Aßmus 	rgb_color bevelLightColor;
3942f86ba45SStephan Aßmus 	rgb_color bevelShadowColor;
3952f86ba45SStephan Aßmus 	rgb_color background = tint_color(base, 0.75);
3962f86ba45SStephan Aßmus 
3972f86ba45SStephan Aßmus 	if (flags & B_DISABLED) {
3982f86ba45SStephan Aßmus 		bevelLightColor = tint_color(background, 0.80);
3992f86ba45SStephan Aßmus 		bevelShadowColor = tint_color(background, 1.07);
4002f86ba45SStephan Aßmus 	} else {
4012f86ba45SStephan Aßmus 		bevelLightColor = tint_color(background, 0.6);
4022f86ba45SStephan Aßmus 		bevelShadowColor = tint_color(background, 1.12);
4032f86ba45SStephan Aßmus 	}
4042f86ba45SStephan Aßmus 
4052f86ba45SStephan Aßmus 	_DrawFrame(view, rect,
4062f86ba45SStephan Aßmus 		bevelLightColor, bevelLightColor,
4072f86ba45SStephan Aßmus 		bevelShadowColor, bevelShadowColor,
4082f86ba45SStephan Aßmus 		borders);
4092f86ba45SStephan Aßmus 
4102f86ba45SStephan Aßmus 	// the actual surface top
4112f86ba45SStephan Aßmus 
4122f86ba45SStephan Aßmus 	view->SetHighColor(background);
4132f86ba45SStephan Aßmus 	view->FillRect(rect);
4142f86ba45SStephan Aßmus }
4152f86ba45SStephan Aßmus 
4162f86ba45SStephan Aßmus 
4172f86ba45SStephan Aßmus void
4182f86ba45SStephan Aßmus BControlLook::DrawMenuItemBackground(BView* view, BRect& rect,
4192f86ba45SStephan Aßmus 	const BRect& updateRect, const rgb_color& base, uint32 flags,
4202f86ba45SStephan Aßmus 	uint32 borders)
4212f86ba45SStephan Aßmus {
4222f86ba45SStephan Aßmus 	if (!rect.IsValid() || !updateRect.Intersects(rect))
4232f86ba45SStephan Aßmus 		return;
4242f86ba45SStephan Aßmus 
4252f86ba45SStephan Aßmus 	// the surface edges
4262f86ba45SStephan Aßmus 
4272f86ba45SStephan Aßmus 	float topTint;
4282f86ba45SStephan Aßmus 	float bottomTint;
4292f86ba45SStephan Aßmus 	rgb_color selectedColor = base;
4302f86ba45SStephan Aßmus 
4312f86ba45SStephan Aßmus 	if (flags & B_ACTIVATED) {
4322f86ba45SStephan Aßmus 		topTint = 0.9;
4332f86ba45SStephan Aßmus 		bottomTint = 1.05;
4342f86ba45SStephan Aßmus 		selectedColor = tint_color(base, 1.26);
4352f86ba45SStephan Aßmus 	} else if (flags & B_DISABLED) {
4362f86ba45SStephan Aßmus 		topTint = 0.80;
4372f86ba45SStephan Aßmus 		bottomTint = 1.07;
4382f86ba45SStephan Aßmus 	} else {
4392f86ba45SStephan Aßmus 		topTint = 0.6;
4402f86ba45SStephan Aßmus 		bottomTint = 1.12;
4412f86ba45SStephan Aßmus 	}
4422f86ba45SStephan Aßmus 
4432f86ba45SStephan Aßmus 	rgb_color bevelLightColor = tint_color(selectedColor, topTint);
4442f86ba45SStephan Aßmus 	rgb_color bevelShadowColor = tint_color(selectedColor, bottomTint);
4452f86ba45SStephan Aßmus 
4462f86ba45SStephan Aßmus 	_DrawFrame(view, rect,
4472f86ba45SStephan Aßmus 		bevelLightColor, bevelLightColor,
4482f86ba45SStephan Aßmus 		bevelShadowColor, bevelShadowColor,
4492f86ba45SStephan Aßmus 		borders);
4502f86ba45SStephan Aßmus 
4512f86ba45SStephan Aßmus 	// the actual surface top
4522f86ba45SStephan Aßmus 
4532f86ba45SStephan Aßmus 	view->SetLowColor(selectedColor);
4542f86ba45SStephan Aßmus //	_FillGradient(view, rect, selectedColor, topTint, bottomTint);
4552f86ba45SStephan Aßmus 	_FillGradient(view, rect, selectedColor, bottomTint, topTint);
4562f86ba45SStephan Aßmus }
4572f86ba45SStephan Aßmus 
4582f86ba45SStephan Aßmus 
4592f86ba45SStephan Aßmus void
4602f86ba45SStephan Aßmus BControlLook::DrawStatusBar(BView* view, BRect& rect, const BRect& updateRect,
4612f86ba45SStephan Aßmus 	const rgb_color& base, const rgb_color& barColor, float progressPosition)
4622f86ba45SStephan Aßmus {
4632f86ba45SStephan Aßmus 	if (!rect.Intersects(updateRect))
4642f86ba45SStephan Aßmus 		return;
4652f86ba45SStephan Aßmus 
4662f86ba45SStephan Aßmus 	_DrawOuterResessedFrame(view, rect, base, 0.6);
4672f86ba45SStephan Aßmus 
4682f86ba45SStephan Aßmus 	// colors
4692f86ba45SStephan Aßmus 	rgb_color dark1BorderColor = tint_color(base, 1.3);
4702f86ba45SStephan Aßmus 	rgb_color dark2BorderColor = tint_color(base, 1.2);
4712f86ba45SStephan Aßmus 	rgb_color dark1FilledBorderColor = tint_color(barColor, 1.20);
4722f86ba45SStephan Aßmus 	rgb_color dark2FilledBorderColor = tint_color(barColor, 1.45);
4732f86ba45SStephan Aßmus 
4742f86ba45SStephan Aßmus 	BRect filledRect(rect);
4752f86ba45SStephan Aßmus 	filledRect.right = progressPosition - 1;
4762f86ba45SStephan Aßmus 
4772f86ba45SStephan Aßmus 	BRect nonfilledRect(rect);
4782f86ba45SStephan Aßmus 	nonfilledRect.left = progressPosition;
4792f86ba45SStephan Aßmus 
4802f86ba45SStephan Aßmus 	bool filledSurface = filledRect.Width() > 0;
4812f86ba45SStephan Aßmus 	bool nonfilledSurface = nonfilledRect.Width() > 0;
4822f86ba45SStephan Aßmus 
4832f86ba45SStephan Aßmus 	if (filledSurface) {
4842f86ba45SStephan Aßmus 		_DrawFrame(view, filledRect,
4852f86ba45SStephan Aßmus 			dark1FilledBorderColor, dark1FilledBorderColor,
4862f86ba45SStephan Aßmus 			dark2FilledBorderColor, dark2FilledBorderColor);
4872f86ba45SStephan Aßmus 
4882f86ba45SStephan Aßmus 		_FillGlossyGradient(view, filledRect, barColor, 0.55, 0.68, 0.76, 0.90);
4892f86ba45SStephan Aßmus 	}
4902f86ba45SStephan Aßmus 
4912f86ba45SStephan Aßmus 	if (nonfilledSurface) {
4922f86ba45SStephan Aßmus 		_DrawFrame(view, nonfilledRect, dark1BorderColor, dark1BorderColor,
4932f86ba45SStephan Aßmus 			dark2BorderColor, dark2BorderColor,
4942f86ba45SStephan Aßmus 			B_TOP_BORDER | B_BOTTOM_BORDER | B_RIGHT_BORDER);
4952f86ba45SStephan Aßmus 
4962f86ba45SStephan Aßmus 		if (nonfilledRect.left < nonfilledRect.right) {
4972f86ba45SStephan Aßmus 			// shadow from fill bar, or left border
4982f86ba45SStephan Aßmus 			rgb_color leftBorder = dark1BorderColor;
4992f86ba45SStephan Aßmus 			if (filledSurface)
5002f86ba45SStephan Aßmus 				leftBorder = tint_color(base, 0.50);
5012f86ba45SStephan Aßmus 			view->SetHighColor(leftBorder);
5022f86ba45SStephan Aßmus 			view->StrokeLine(nonfilledRect.LeftTop(),
5032f86ba45SStephan Aßmus 				nonfilledRect.LeftBottom());
5042f86ba45SStephan Aßmus 			nonfilledRect.left++;
5052f86ba45SStephan Aßmus 		}
5062f86ba45SStephan Aßmus 
5072f86ba45SStephan Aßmus 		_FillGradient(view, nonfilledRect, base, 0.25, 0.06);
5082f86ba45SStephan Aßmus 	}
5092f86ba45SStephan Aßmus }
5102f86ba45SStephan Aßmus 
5112f86ba45SStephan Aßmus 
5122f86ba45SStephan Aßmus void
5132f86ba45SStephan Aßmus BControlLook::DrawCheckBox(BView* view, BRect& rect, const BRect& updateRect,
5142f86ba45SStephan Aßmus 	const rgb_color& base, uint32 flags)
5152f86ba45SStephan Aßmus {
5162f86ba45SStephan Aßmus 	if (!rect.Intersects(updateRect))
5172f86ba45SStephan Aßmus 		return;
5182f86ba45SStephan Aßmus 
5192f86ba45SStephan Aßmus 	rgb_color dark1BorderColor;
5202f86ba45SStephan Aßmus 	rgb_color dark2BorderColor;
5212f86ba45SStephan Aßmus 	rgb_color navigationColor = ui_color(B_KEYBOARD_NAVIGATION_COLOR);
5222f86ba45SStephan Aßmus 
5232f86ba45SStephan Aßmus 	if (flags & B_DISABLED) {
5244f579098SStephan Aßmus 		_DrawOuterResessedFrame(view, rect, base, 0.0, 1.0, flags);
5252f86ba45SStephan Aßmus 
5262f86ba45SStephan Aßmus 		dark1BorderColor = tint_color(base, 1.15);
5272f86ba45SStephan Aßmus 		dark2BorderColor = tint_color(base, 1.15);
5282f86ba45SStephan Aßmus 	} else if (flags & B_CLICKED) {
5292f86ba45SStephan Aßmus 		dark1BorderColor = tint_color(base, 1.50);
5302f86ba45SStephan Aßmus 		dark2BorderColor = tint_color(base, 1.48);
5312f86ba45SStephan Aßmus 
5322f86ba45SStephan Aßmus 		_DrawFrame(view, rect,
5332f86ba45SStephan Aßmus 			dark1BorderColor, dark1BorderColor,
5342f86ba45SStephan Aßmus 			dark2BorderColor, dark2BorderColor);
5352f86ba45SStephan Aßmus 
5362f86ba45SStephan Aßmus 		dark2BorderColor = dark1BorderColor;
5372f86ba45SStephan Aßmus 	} else {
5384f579098SStephan Aßmus 		_DrawOuterResessedFrame(view, rect, base, 0.6, 1.0, flags);
5392f86ba45SStephan Aßmus 
5402f86ba45SStephan Aßmus 		dark1BorderColor = tint_color(base, 1.40);
5412f86ba45SStephan Aßmus 		dark2BorderColor = tint_color(base, 1.38);
5422f86ba45SStephan Aßmus 	}
5432f86ba45SStephan Aßmus 
5442f86ba45SStephan Aßmus 	if (flags & B_FOCUSED) {
5452f86ba45SStephan Aßmus 		dark1BorderColor = navigationColor;
5462f86ba45SStephan Aßmus 		dark2BorderColor = navigationColor;
5472f86ba45SStephan Aßmus 	}
5482f86ba45SStephan Aßmus 
5492f86ba45SStephan Aßmus 	_DrawFrame(view, rect,
5502f86ba45SStephan Aßmus 		dark1BorderColor, dark1BorderColor,
5512f86ba45SStephan Aßmus 		dark2BorderColor, dark2BorderColor);
5522f86ba45SStephan Aßmus 
5532f86ba45SStephan Aßmus 	if (flags & B_DISABLED) {
5542f86ba45SStephan Aßmus 		_FillGradient(view, rect, base, 0.4, 0.2);
5552f86ba45SStephan Aßmus 	} else {
5562f86ba45SStephan Aßmus 		_FillGradient(view, rect, base, 0.15, 0.0);
5572f86ba45SStephan Aßmus 	}
5582f86ba45SStephan Aßmus 
5592f86ba45SStephan Aßmus 	rgb_color markColor;
5602f86ba45SStephan Aßmus 	if (_RadioButtonAndCheckBoxMarkColor(base, markColor, flags)) {
5612f86ba45SStephan Aßmus 		view->SetHighColor(markColor);
5622f86ba45SStephan Aßmus 
5632f86ba45SStephan Aßmus 		rect.InsetBy(2, 2);
5642f86ba45SStephan Aßmus 		view->SetPenSize(max_c(1.0, ceilf(rect.Width() / 3.5)));
5652f86ba45SStephan Aßmus 		view->SetDrawingMode(B_OP_OVER);
5662f86ba45SStephan Aßmus 
5672f86ba45SStephan Aßmus 		view->StrokeLine(rect.LeftTop(), rect.RightBottom());
5682f86ba45SStephan Aßmus 		view->StrokeLine(rect.LeftBottom(), rect.RightTop());
5692f86ba45SStephan Aßmus 	}
5702f86ba45SStephan Aßmus }
5712f86ba45SStephan Aßmus 
5722f86ba45SStephan Aßmus 
5732f86ba45SStephan Aßmus void
5742f86ba45SStephan Aßmus BControlLook::DrawRadioButton(BView* view, BRect& rect, const BRect& updateRect,
5752f86ba45SStephan Aßmus 	const rgb_color& base, uint32 flags)
5762f86ba45SStephan Aßmus {
5772f86ba45SStephan Aßmus 	if (!rect.Intersects(updateRect))
5782f86ba45SStephan Aßmus 		return;
5792f86ba45SStephan Aßmus 
5802f86ba45SStephan Aßmus 	rgb_color borderColor;
5812f86ba45SStephan Aßmus 	rgb_color bevelLight;
5822f86ba45SStephan Aßmus 	rgb_color bevelShadow;
5832f86ba45SStephan Aßmus 	rgb_color navigationColor = ui_color(B_KEYBOARD_NAVIGATION_COLOR);
5842f86ba45SStephan Aßmus 
5852f86ba45SStephan Aßmus 	if (flags & B_DISABLED) {
5862f86ba45SStephan Aßmus 		borderColor = tint_color(base, 1.15);
5872f86ba45SStephan Aßmus 		bevelLight = base;
5882f86ba45SStephan Aßmus 		bevelShadow = base;
5892f86ba45SStephan Aßmus 	} else if (flags & B_CLICKED) {
5902f86ba45SStephan Aßmus 		borderColor = tint_color(base, 1.50);
5912f86ba45SStephan Aßmus 		bevelLight = borderColor;
5922f86ba45SStephan Aßmus 		bevelShadow = borderColor;
5932f86ba45SStephan Aßmus 	} else {
5942f86ba45SStephan Aßmus 		borderColor = tint_color(base, 1.45);
5952f86ba45SStephan Aßmus 		bevelLight = tint_color(base, 0.55);
5962f86ba45SStephan Aßmus 		bevelShadow = tint_color(base, 1.11);
5972f86ba45SStephan Aßmus 	}
5982f86ba45SStephan Aßmus 
5992f86ba45SStephan Aßmus 	if (flags & B_FOCUSED) {
6002f86ba45SStephan Aßmus 		borderColor = navigationColor;
6012f86ba45SStephan Aßmus 	}
6022f86ba45SStephan Aßmus 
6032f86ba45SStephan Aßmus 	BGradientLinear bevelGradient;
6042f86ba45SStephan Aßmus 	bevelGradient.AddColor(bevelShadow, 0);
6052f86ba45SStephan Aßmus 	bevelGradient.AddColor(bevelLight, 255);
6062f86ba45SStephan Aßmus 	bevelGradient.SetStart(rect.LeftTop());
6072f86ba45SStephan Aßmus 	bevelGradient.SetEnd(rect.RightBottom());
6082f86ba45SStephan Aßmus 
6092f86ba45SStephan Aßmus 	view->FillEllipse(rect, bevelGradient);
6102f86ba45SStephan Aßmus 	rect.InsetBy(1, 1);
6112f86ba45SStephan Aßmus 
6122f86ba45SStephan Aßmus 	bevelGradient.MakeEmpty();
6132f86ba45SStephan Aßmus 	bevelGradient.AddColor(borderColor, 0);
6142f86ba45SStephan Aßmus 	bevelGradient.AddColor(tint_color(borderColor, 0.8), 255);
6152f86ba45SStephan Aßmus 	view->FillEllipse(rect, bevelGradient);
6162f86ba45SStephan Aßmus 	rect.InsetBy(1, 1);
6172f86ba45SStephan Aßmus 
6182f86ba45SStephan Aßmus 	float topTint;
6192f86ba45SStephan Aßmus 	float bottomTint;
6202f86ba45SStephan Aßmus 	if (flags & B_DISABLED) {
6212f86ba45SStephan Aßmus 		topTint = 0.4;
6222f86ba45SStephan Aßmus 		bottomTint = 0.2;
6232f86ba45SStephan Aßmus 	} else {
6242f86ba45SStephan Aßmus 		topTint = 0.15;
6252f86ba45SStephan Aßmus 		bottomTint = 0.0;
6262f86ba45SStephan Aßmus 	}
6272f86ba45SStephan Aßmus 
6282f86ba45SStephan Aßmus 	BGradientLinear gradient;
6292f86ba45SStephan Aßmus 	_MakeGradient(gradient, rect, base, topTint, bottomTint);
6302f86ba45SStephan Aßmus 	view->FillEllipse(rect, gradient);
6312f86ba45SStephan Aßmus 
6322f86ba45SStephan Aßmus 	rgb_color markColor;
6332f86ba45SStephan Aßmus 	if (_RadioButtonAndCheckBoxMarkColor(base, markColor, flags)) {
6342f86ba45SStephan Aßmus 		view->SetHighColor(markColor);
6352f86ba45SStephan Aßmus 		rect.InsetBy(3, 3);
6362f86ba45SStephan Aßmus 		view->FillEllipse(rect);
6372f86ba45SStephan Aßmus 	}
6382f86ba45SStephan Aßmus }
6392f86ba45SStephan Aßmus 
6402f86ba45SStephan Aßmus 
6412f86ba45SStephan Aßmus void
6422f86ba45SStephan Aßmus BControlLook::DrawScrollBarBackground(BView* view, BRect& rect1, BRect& rect2,
6432f86ba45SStephan Aßmus 	const BRect& updateRect, const rgb_color& base, uint32 flags,
6442f86ba45SStephan Aßmus 	enum orientation orientation)
6452f86ba45SStephan Aßmus {
6462f86ba45SStephan Aßmus 	DrawScrollBarBackground(view, rect1, updateRect, base, flags, orientation);
6472f86ba45SStephan Aßmus 	DrawScrollBarBackground(view, rect2, updateRect, base, flags, orientation);
6482f86ba45SStephan Aßmus }
6492f86ba45SStephan Aßmus 
6502f86ba45SStephan Aßmus void
6512f86ba45SStephan Aßmus BControlLook::DrawScrollBarBackground(BView* view, BRect& rect,
6522f86ba45SStephan Aßmus 	const BRect& updateRect, const rgb_color& base, uint32 flags,
6532f86ba45SStephan Aßmus 	enum orientation orientation)
6542f86ba45SStephan Aßmus {
6552f86ba45SStephan Aßmus 	if (!rect.IsValid() || !rect.Intersects(updateRect))
6562f86ba45SStephan Aßmus 		return;
6572f86ba45SStephan Aßmus 
6582f86ba45SStephan Aßmus 	float gradient1Tint;
6592f86ba45SStephan Aßmus 	float gradient2Tint;
6602f86ba45SStephan Aßmus 	float darkEdge1Tint;
6612f86ba45SStephan Aßmus 	float darkEdge2Tint;
6622f86ba45SStephan Aßmus 	float shadowTint;
6632f86ba45SStephan Aßmus 
6642f86ba45SStephan Aßmus 	if (flags & B_DISABLED) {
6652f86ba45SStephan Aßmus 		gradient1Tint = 0.9;
6662f86ba45SStephan Aßmus 		gradient2Tint = 0.8;
6672f86ba45SStephan Aßmus 		darkEdge1Tint = B_DARKEN_2_TINT;
6682f86ba45SStephan Aßmus 		darkEdge2Tint = B_DARKEN_2_TINT;
6692f86ba45SStephan Aßmus 		shadowTint = gradient1Tint;
6702f86ba45SStephan Aßmus 	} else {
6712f86ba45SStephan Aßmus 		gradient1Tint = 1.10;
6722f86ba45SStephan Aßmus 		gradient2Tint = 1.05;
6732f86ba45SStephan Aßmus 		darkEdge1Tint = B_DARKEN_3_TINT;
6742f86ba45SStephan Aßmus 		darkEdge2Tint = B_DARKEN_2_TINT;
6752f86ba45SStephan Aßmus 		shadowTint = gradient1Tint;
6762f86ba45SStephan Aßmus 	}
6772f86ba45SStephan Aßmus 
6782f86ba45SStephan Aßmus 	rgb_color darkEdge1 = tint_color(base, darkEdge1Tint);
6792f86ba45SStephan Aßmus 	rgb_color darkEdge2 = tint_color(base, darkEdge2Tint);
6802f86ba45SStephan Aßmus 	rgb_color shadow = tint_color(base, shadowTint);
6812f86ba45SStephan Aßmus 
6822f86ba45SStephan Aßmus 	if (orientation == B_HORIZONTAL) {
6832f86ba45SStephan Aßmus 		// dark vertical line on left edge
6842f86ba45SStephan Aßmus 		if (rect.Width() > 0) {
6852f86ba45SStephan Aßmus 			view->SetHighColor(darkEdge1);
6862f86ba45SStephan Aßmus 			view->StrokeLine(rect.LeftTop(), rect.LeftBottom());
6872f86ba45SStephan Aßmus 			rect.left++;
6882f86ba45SStephan Aßmus 		}
6892f86ba45SStephan Aßmus 		// dark vertical line on right edge
6902f86ba45SStephan Aßmus 		if (rect.Width() >= 0) {
6912f86ba45SStephan Aßmus 			view->SetHighColor(darkEdge2);
6922f86ba45SStephan Aßmus 			view->StrokeLine(rect.RightTop(), rect.RightBottom());
6932f86ba45SStephan Aßmus 			rect.right--;
6942f86ba45SStephan Aßmus 		}
6952f86ba45SStephan Aßmus 		// vertical shadow line after left edge
6962f86ba45SStephan Aßmus 		if (rect.Width() >= 0) {
6972f86ba45SStephan Aßmus 			view->SetHighColor(shadow);
6982f86ba45SStephan Aßmus 			view->StrokeLine(rect.LeftTop(), rect.LeftBottom());
6992f86ba45SStephan Aßmus 			rect.left++;
7002f86ba45SStephan Aßmus 		}
7012f86ba45SStephan Aßmus 		// fill
7022f86ba45SStephan Aßmus 		if (rect.Width() >= 0) {
7032f86ba45SStephan Aßmus 			_FillGradient(view, rect, base, gradient1Tint, gradient2Tint,
7042f86ba45SStephan Aßmus 				orientation);
7052f86ba45SStephan Aßmus 		}
7062f86ba45SStephan Aßmus 	} else {
7072f86ba45SStephan Aßmus 		// dark vertical line on top edge
7082f86ba45SStephan Aßmus 		if (rect.Height() > 0) {
7092f86ba45SStephan Aßmus 			view->SetHighColor(darkEdge1);
7102f86ba45SStephan Aßmus 			view->StrokeLine(rect.LeftTop(), rect.RightTop());
7112f86ba45SStephan Aßmus 			rect.top++;
7122f86ba45SStephan Aßmus 		}
7132f86ba45SStephan Aßmus 		// dark vertical line on bottom edge
7142f86ba45SStephan Aßmus 		if (rect.Height() >= 0) {
7152f86ba45SStephan Aßmus 			view->SetHighColor(darkEdge2);
7162f86ba45SStephan Aßmus 			view->StrokeLine(rect.LeftBottom(), rect.RightBottom());
7172f86ba45SStephan Aßmus 			rect.bottom--;
7182f86ba45SStephan Aßmus 		}
7192f86ba45SStephan Aßmus 		// horizontal shadow line after top edge
7202f86ba45SStephan Aßmus 		if (rect.Height() >= 0) {
7212f86ba45SStephan Aßmus 			view->SetHighColor(shadow);
7222f86ba45SStephan Aßmus 			view->StrokeLine(rect.LeftTop(), rect.RightTop());
7232f86ba45SStephan Aßmus 			rect.top++;
7242f86ba45SStephan Aßmus 		}
7252f86ba45SStephan Aßmus 		// fill
7262f86ba45SStephan Aßmus 		if (rect.Height() >= 0) {
7272f86ba45SStephan Aßmus 			_FillGradient(view, rect, base, gradient1Tint, gradient2Tint,
7282f86ba45SStephan Aßmus 				orientation);
7292f86ba45SStephan Aßmus 		}
7302f86ba45SStephan Aßmus 	}
7312f86ba45SStephan Aßmus }
7322f86ba45SStephan Aßmus 
7332f86ba45SStephan Aßmus 
73440a10e1cSStephan Aßmus void
73574bb70aeSStephan Aßmus BControlLook::DrawScrollViewFrame(BView* view, BRect& rect,
73674bb70aeSStephan Aßmus 	const BRect& updateRect, BRect verticalScrollBarFrame,
73774bb70aeSStephan Aßmus 	BRect horizontalScrollBarFrame, const rgb_color& base,
73874bb70aeSStephan Aßmus 	border_style border, uint32 flags, uint32 _borders)
73974bb70aeSStephan Aßmus {
740ce955579SStephan Aßmus 	// calculate scroll corner rect before messing with the "rect"
741ce955579SStephan Aßmus 	BRect scrollCornerFillRect(rect.right, rect.bottom,
742ce955579SStephan Aßmus 		rect.right, rect.bottom);
743ce955579SStephan Aßmus 	if (horizontalScrollBarFrame.IsValid())
744ce955579SStephan Aßmus 		scrollCornerFillRect.left = horizontalScrollBarFrame.right + 1;
745ce955579SStephan Aßmus 	if (verticalScrollBarFrame.IsValid())
746ce955579SStephan Aßmus 		scrollCornerFillRect.top = verticalScrollBarFrame.bottom + 1;
747ce955579SStephan Aßmus 
748c44aa833SStephan Aßmus 	if (border == B_NO_BORDER) {
749c44aa833SStephan Aßmus 		if (scrollCornerFillRect.IsValid()) {
750c44aa833SStephan Aßmus 			view->SetHighColor(base);
751c44aa833SStephan Aßmus 			view->FillRect(scrollCornerFillRect);
752c44aa833SStephan Aßmus 		}
753c44aa833SStephan Aßmus 		return;
754c44aa833SStephan Aßmus 	}
755c44aa833SStephan Aßmus 
756c44aa833SStephan Aßmus 	bool excludeScrollCorner = border == B_FANCY_BORDER
757c44aa833SStephan Aßmus 		&& horizontalScrollBarFrame.IsValid()
758c44aa833SStephan Aßmus 		&& verticalScrollBarFrame.IsValid();
759c44aa833SStephan Aßmus 
76074bb70aeSStephan Aßmus 	uint32 borders = _borders;
76174bb70aeSStephan Aßmus 	if (excludeScrollCorner) {
76274bb70aeSStephan Aßmus 		rect.bottom = horizontalScrollBarFrame.top;
76374bb70aeSStephan Aßmus 		rect.right = verticalScrollBarFrame.left;
76474bb70aeSStephan Aßmus 		borders &= ~(B_RIGHT_BORDER | B_BOTTOM_BORDER);
76574bb70aeSStephan Aßmus 	}
76674bb70aeSStephan Aßmus 
76774bb70aeSStephan Aßmus 	rgb_color scrollbarFrameColor = tint_color(base, B_DARKEN_2_TINT);
76874bb70aeSStephan Aßmus 
76974bb70aeSStephan Aßmus 	if (border == B_FANCY_BORDER)
7704f579098SStephan Aßmus 		_DrawOuterResessedFrame(view, rect, base, 1.0, 1.0, flags, borders);
77174bb70aeSStephan Aßmus 
77274bb70aeSStephan Aßmus 	if (flags & B_FOCUSED) {
77374bb70aeSStephan Aßmus 		rgb_color focusColor = ui_color(B_KEYBOARD_NAVIGATION_COLOR);
77474bb70aeSStephan Aßmus 		_DrawFrame(view, rect, focusColor, focusColor, focusColor, focusColor,
77574bb70aeSStephan Aßmus 			borders);
77674bb70aeSStephan Aßmus 	} else {
77774bb70aeSStephan Aßmus 		_DrawFrame(view, rect, scrollbarFrameColor, scrollbarFrameColor,
77874bb70aeSStephan Aßmus 			scrollbarFrameColor, scrollbarFrameColor, borders);
77974bb70aeSStephan Aßmus 	}
78074bb70aeSStephan Aßmus 
78174bb70aeSStephan Aßmus 	if (excludeScrollCorner) {
78274bb70aeSStephan Aßmus 		horizontalScrollBarFrame.InsetBy(-1, -1);
78374bb70aeSStephan Aßmus 		// do not overdraw the top edge
78474bb70aeSStephan Aßmus 		horizontalScrollBarFrame.top += 2;
78574bb70aeSStephan Aßmus 		borders = _borders;
78674bb70aeSStephan Aßmus 		borders &= ~B_TOP_BORDER;
78774bb70aeSStephan Aßmus 		_DrawOuterResessedFrame(view, horizontalScrollBarFrame, base,
7884f579098SStephan Aßmus 			1.0, 1.0, flags, borders);
78974bb70aeSStephan Aßmus 		_DrawFrame(view, horizontalScrollBarFrame, scrollbarFrameColor,
79074bb70aeSStephan Aßmus 			scrollbarFrameColor, scrollbarFrameColor, scrollbarFrameColor,
79174bb70aeSStephan Aßmus 			borders);
79274bb70aeSStephan Aßmus 
79374bb70aeSStephan Aßmus 
79474bb70aeSStephan Aßmus 		verticalScrollBarFrame.InsetBy(-1, -1);
79574bb70aeSStephan Aßmus 		// do not overdraw the left edge
79674bb70aeSStephan Aßmus 		verticalScrollBarFrame.left += 2;
79774bb70aeSStephan Aßmus 		borders = _borders;
79874bb70aeSStephan Aßmus 		borders &= ~B_LEFT_BORDER;
79974bb70aeSStephan Aßmus 		_DrawOuterResessedFrame(view, verticalScrollBarFrame, base,
8004f579098SStephan Aßmus 			1.0, 1.0, flags, borders);
80174bb70aeSStephan Aßmus 		_DrawFrame(view, verticalScrollBarFrame, scrollbarFrameColor,
80274bb70aeSStephan Aßmus 			scrollbarFrameColor, scrollbarFrameColor, scrollbarFrameColor,
80374bb70aeSStephan Aßmus 			borders);
804ce955579SStephan Aßmus 
805ce955579SStephan Aßmus 		// exclude recessed frame
806ce955579SStephan Aßmus 		scrollCornerFillRect.top++;
807ce955579SStephan Aßmus 		scrollCornerFillRect.left++;
808ce955579SStephan Aßmus 	}
809ce955579SStephan Aßmus 
810ce955579SStephan Aßmus 	if (scrollCornerFillRect.IsValid()) {
811ce955579SStephan Aßmus 		view->SetHighColor(base);
812ce955579SStephan Aßmus 		view->FillRect(scrollCornerFillRect);
81374bb70aeSStephan Aßmus 	}
81474bb70aeSStephan Aßmus }
81574bb70aeSStephan Aßmus 
81674bb70aeSStephan Aßmus 
81774bb70aeSStephan Aßmus void
81840a10e1cSStephan Aßmus BControlLook::DrawArrowShape(BView* view, BRect& rect, const BRect& updateRect,
81940a10e1cSStephan Aßmus 	const rgb_color& base, uint32 direction, uint32 flags, float tint)
82040a10e1cSStephan Aßmus {
82140a10e1cSStephan Aßmus 	BPoint tri1, tri2, tri3;
82240a10e1cSStephan Aßmus 	float hInset = rect.Width() / 3;
82340a10e1cSStephan Aßmus 	float vInset = rect.Height() / 3;
82440a10e1cSStephan Aßmus 	rect.InsetBy(hInset, vInset);
82540a10e1cSStephan Aßmus 
82640a10e1cSStephan Aßmus 	switch (direction) {
82740a10e1cSStephan Aßmus 		case B_LEFT_ARROW:
82840a10e1cSStephan Aßmus 			tri1.Set(rect.right, rect.top);
82940a10e1cSStephan Aßmus 			tri2.Set(rect.right - rect.Width() / 1.33,
83040a10e1cSStephan Aßmus 				(rect.top + rect.bottom + 1) /2 );
83140a10e1cSStephan Aßmus 			tri3.Set(rect.right, rect.bottom + 1);
83240a10e1cSStephan Aßmus 			break;
83340a10e1cSStephan Aßmus 		case B_RIGHT_ARROW:
83440a10e1cSStephan Aßmus 			tri1.Set(rect.left, rect.bottom + 1);
83540a10e1cSStephan Aßmus 			tri2.Set(rect.left + rect.Width() / 1.33,
83640a10e1cSStephan Aßmus 				(rect.top + rect.bottom + 1) / 2);
83740a10e1cSStephan Aßmus 			tri3.Set(rect.left, rect.top);
83840a10e1cSStephan Aßmus 			break;
83940a10e1cSStephan Aßmus 		case B_UP_ARROW:
84040a10e1cSStephan Aßmus 			tri1.Set(rect.left, rect.bottom);
84140a10e1cSStephan Aßmus 			tri2.Set((rect.left + rect.right + 1) / 2,
84240a10e1cSStephan Aßmus 				rect.bottom - rect.Height() / 1.33);
84340a10e1cSStephan Aßmus 			tri3.Set(rect.right + 1, rect.bottom);
84440a10e1cSStephan Aßmus 			break;
84540a10e1cSStephan Aßmus 		case B_DOWN_ARROW:
84640a10e1cSStephan Aßmus 		default:
84740a10e1cSStephan Aßmus 			tri1.Set(rect.left, rect.top);
84840a10e1cSStephan Aßmus 			tri2.Set((rect.left + rect.right + 1) / 2,
84940a10e1cSStephan Aßmus 				rect.top + rect.Height() / 1.33);
85040a10e1cSStephan Aßmus 			tri3.Set(rect.right + 1, rect.top);
85140a10e1cSStephan Aßmus 			break;
85240a10e1cSStephan Aßmus 	}
85340a10e1cSStephan Aßmus 	// offset triangle if down
85440a10e1cSStephan Aßmus 	if (flags & B_ACTIVATED)
85540a10e1cSStephan Aßmus 		view->MovePenTo(BPoint(1, 1));
85640a10e1cSStephan Aßmus 	else
85740a10e1cSStephan Aßmus 		view->MovePenTo(BPoint(0, 0));
85840a10e1cSStephan Aßmus 
85940a10e1cSStephan Aßmus 	BShape arrowShape;
86040a10e1cSStephan Aßmus 	arrowShape.MoveTo(tri1);
86140a10e1cSStephan Aßmus 	arrowShape.LineTo(tri2);
86240a10e1cSStephan Aßmus 	arrowShape.LineTo(tri3);
86340a10e1cSStephan Aßmus 
86440a10e1cSStephan Aßmus 	if (flags & B_DISABLED)
86540a10e1cSStephan Aßmus 		tint = (tint + B_NO_TINT + B_NO_TINT) / 3;
86640a10e1cSStephan Aßmus 
86740a10e1cSStephan Aßmus 	view->SetHighColor(tint_color(base, tint));
86840a10e1cSStephan Aßmus 
86940a10e1cSStephan Aßmus 	float penSize = view->PenSize();
87040a10e1cSStephan Aßmus 	drawing_mode mode = view->DrawingMode();
87140a10e1cSStephan Aßmus 
87240a10e1cSStephan Aßmus 	view->SetPenSize(ceilf(hInset / 2.0));
87340a10e1cSStephan Aßmus 	view->SetDrawingMode(B_OP_OVER);
87440a10e1cSStephan Aßmus 	view->StrokeShape(&arrowShape);
87540a10e1cSStephan Aßmus 
87640a10e1cSStephan Aßmus 	view->SetPenSize(penSize);
87740a10e1cSStephan Aßmus 	view->SetDrawingMode(mode);
87840a10e1cSStephan Aßmus }
87940a10e1cSStephan Aßmus 
88040a10e1cSStephan Aßmus 
8812f86ba45SStephan Aßmus rgb_color
8822f86ba45SStephan Aßmus BControlLook::SliderBarColor(const rgb_color& base)
8832f86ba45SStephan Aßmus {
8842f86ba45SStephan Aßmus 	return tint_color(ui_color(B_PANEL_BACKGROUND_COLOR), B_DARKEN_1_TINT);
8852f86ba45SStephan Aßmus }
8862f86ba45SStephan Aßmus 
8872f86ba45SStephan Aßmus 
8882f86ba45SStephan Aßmus void
8892f86ba45SStephan Aßmus BControlLook::DrawSliderBar(BView* view, BRect rect, const BRect& updateRect,
8902f86ba45SStephan Aßmus 	const rgb_color& base, rgb_color leftFillColor, rgb_color rightFillColor,
8912f86ba45SStephan Aßmus 	float sliderScale, uint32 flags, enum orientation orientation)
8922f86ba45SStephan Aßmus {
8932f86ba45SStephan Aßmus 	if (!rect.IsValid() || !rect.Intersects(updateRect))
8942f86ba45SStephan Aßmus 		return;
8952f86ba45SStephan Aßmus 
8962f86ba45SStephan Aßmus 	// separate the bar in two sides
8972f86ba45SStephan Aßmus 	float sliderPosition;
8982f86ba45SStephan Aßmus 	BRect leftBarSide = rect;
8992f86ba45SStephan Aßmus 	BRect rightBarSide = rect;
9002f86ba45SStephan Aßmus 
9012f86ba45SStephan Aßmus 	if (orientation == B_HORIZONTAL) {
9022f86ba45SStephan Aßmus 		sliderPosition = floorf(rect.left + 2 + (rect.Width() - 2)
9032f86ba45SStephan Aßmus 			* sliderScale);
9042f86ba45SStephan Aßmus 		leftBarSide.right = sliderPosition - 1;
9052f86ba45SStephan Aßmus 		rightBarSide.left = sliderPosition;
9062f86ba45SStephan Aßmus 	} else {
907f3997b74SStephan Aßmus 		// NOTE: position is reverse of coords
9082f86ba45SStephan Aßmus 		sliderPosition = floorf(rect.top + 2 + (rect.Height() - 2)
909f3997b74SStephan Aßmus 			* (1.0 - sliderScale));
910f3997b74SStephan Aßmus 		leftBarSide.top = sliderPosition;
911f3997b74SStephan Aßmus 		rightBarSide.bottom = sliderPosition - 1;
9122f86ba45SStephan Aßmus 	}
9132f86ba45SStephan Aßmus 
9142f86ba45SStephan Aßmus 	// fill the background for the corners, exclude the middle bar for now
9152f86ba45SStephan Aßmus 	BRegion region(rect);
9162f86ba45SStephan Aßmus 	region.Exclude(rightBarSide);
9172f86ba45SStephan Aßmus 	view->ConstrainClippingRegion(&region);
9182f86ba45SStephan Aßmus 
9192f86ba45SStephan Aßmus 	view->PushState();
9202f86ba45SStephan Aßmus 
9212f86ba45SStephan Aßmus 	DrawSliderBar(view, rect, updateRect, base, leftFillColor, flags,
9222f86ba45SStephan Aßmus 		orientation);
9232f86ba45SStephan Aßmus 
9242f86ba45SStephan Aßmus 	view->PopState();
9252f86ba45SStephan Aßmus 
9262f86ba45SStephan Aßmus 	region.Set(rect);
9272f86ba45SStephan Aßmus 	region.Exclude(leftBarSide);
9282f86ba45SStephan Aßmus 	view->ConstrainClippingRegion(&region);
9292f86ba45SStephan Aßmus 
9302f86ba45SStephan Aßmus 	view->PushState();
9312f86ba45SStephan Aßmus 
9322f86ba45SStephan Aßmus 	DrawSliderBar(view, rect, updateRect, base, rightFillColor, flags,
9332f86ba45SStephan Aßmus 		orientation);
9342f86ba45SStephan Aßmus 
9352f86ba45SStephan Aßmus 	view->PopState();
9362f86ba45SStephan Aßmus 
9372f86ba45SStephan Aßmus 	view->ConstrainClippingRegion(NULL);
9382f86ba45SStephan Aßmus }
9392f86ba45SStephan Aßmus 
9402f86ba45SStephan Aßmus 
9412f86ba45SStephan Aßmus void
9422f86ba45SStephan Aßmus BControlLook::DrawSliderBar(BView* view, BRect rect, const BRect& updateRect,
9432f86ba45SStephan Aßmus 	const rgb_color& base, rgb_color fillColor, uint32 flags,
9442f86ba45SStephan Aßmus 	enum orientation orientation)
9452f86ba45SStephan Aßmus {
9462f86ba45SStephan Aßmus 	if (!rect.IsValid() || !rect.Intersects(updateRect))
9472f86ba45SStephan Aßmus 		return;
9482f86ba45SStephan Aßmus 
9492f86ba45SStephan Aßmus 	// separate the rect into corners
9502f86ba45SStephan Aßmus 	BRect leftCorner(rect);
9512f86ba45SStephan Aßmus 	BRect rightCorner(rect);
9522f86ba45SStephan Aßmus 	BRect barRect(rect);
9532f86ba45SStephan Aßmus 
9542f86ba45SStephan Aßmus 	if (orientation == B_HORIZONTAL) {
9552f86ba45SStephan Aßmus 		leftCorner.right = leftCorner.left + leftCorner.Height();
9562f86ba45SStephan Aßmus 		rightCorner.left = rightCorner.right - rightCorner.Height();
9572f86ba45SStephan Aßmus 		barRect.left += ceilf(barRect.Height() / 2);
9582f86ba45SStephan Aßmus 		barRect.right -= ceilf(barRect.Height() / 2);
9592f86ba45SStephan Aßmus 	} else {
9602f86ba45SStephan Aßmus 		leftCorner.bottom = leftCorner.top + leftCorner.Width();
9612f86ba45SStephan Aßmus 		rightCorner.top = rightCorner.bottom - rightCorner.Width();
9622f86ba45SStephan Aßmus 		barRect.top += ceilf(barRect.Width() / 2);
9632f86ba45SStephan Aßmus 		barRect.bottom -= ceilf(barRect.Width() / 2);
9642f86ba45SStephan Aßmus 	}
9652f86ba45SStephan Aßmus 
9662f86ba45SStephan Aßmus 	// fill the background for the corners, exclude the middle bar for now
9672f86ba45SStephan Aßmus 	BRegion region(rect);
9682f86ba45SStephan Aßmus 	region.Exclude(barRect);
9692f86ba45SStephan Aßmus 	view->ConstrainClippingRegion(&region);
9702f86ba45SStephan Aßmus 
97161ac1a85SStephan Aßmus 	if ((flags & B_BLEND_FRAME) == 0) {
9722f86ba45SStephan Aßmus 		view->SetHighColor(base);
9732f86ba45SStephan Aßmus 		view->FillRect(rect);
97461ac1a85SStephan Aßmus 	}
9752f86ba45SStephan Aßmus 
9762f86ba45SStephan Aßmus 	// figure out the tints to be used
9772f86ba45SStephan Aßmus 	float edgeLightTint;
9782f86ba45SStephan Aßmus 	float edgeShadowTint;
9792f86ba45SStephan Aßmus 	float frameLightTint;
9802f86ba45SStephan Aßmus 	float frameShadowTint;
9812f86ba45SStephan Aßmus 	float fillLightTint;
9822f86ba45SStephan Aßmus 	float fillShadowTint;
98361ac1a85SStephan Aßmus 	uint8 edgeLightAlpha;
98461ac1a85SStephan Aßmus 	uint8 edgeShadowAlpha;
98561ac1a85SStephan Aßmus 	uint8 frameLightAlpha;
98661ac1a85SStephan Aßmus 	uint8 frameShadowAlpha;
9872f86ba45SStephan Aßmus 
9882f86ba45SStephan Aßmus 	if (flags & B_DISABLED) {
9892f86ba45SStephan Aßmus 		edgeLightTint = 1.0;
9902f86ba45SStephan Aßmus 		edgeShadowTint = 1.0;
9912f86ba45SStephan Aßmus 		frameLightTint = 1.20;
9922f86ba45SStephan Aßmus 		frameShadowTint = 1.25;
9932f86ba45SStephan Aßmus 		fillLightTint = 0.9;
9942f86ba45SStephan Aßmus 		fillShadowTint = 1.05;
99510ddee8dSStephan Aßmus 		edgeLightAlpha = 12;
99610ddee8dSStephan Aßmus 		edgeShadowAlpha = 12;
99761ac1a85SStephan Aßmus 		frameLightAlpha = 40;
99861ac1a85SStephan Aßmus 		frameShadowAlpha = 45;
9992f86ba45SStephan Aßmus 
10002f86ba45SStephan Aßmus 		fillColor.red = uint8(fillColor.red * 0.4 + base.red * 0.6);
10012f86ba45SStephan Aßmus 		fillColor.green = uint8(fillColor.green * 0.4 + base.green * 0.6);
10022f86ba45SStephan Aßmus 		fillColor.blue = uint8(fillColor.blue * 0.4 + base.blue * 0.6);
10032f86ba45SStephan Aßmus 	} else {
10042f86ba45SStephan Aßmus 		edgeLightTint = 0.65;
10052f86ba45SStephan Aßmus 		edgeShadowTint = 1.07;
10062f86ba45SStephan Aßmus 		frameLightTint = 1.40;
10072f86ba45SStephan Aßmus 		frameShadowTint = 1.50;
10082f86ba45SStephan Aßmus 		fillLightTint = 0.8;
10092f86ba45SStephan Aßmus 		fillShadowTint = 1.1;
101010ddee8dSStephan Aßmus 		edgeLightAlpha = 15;
101110ddee8dSStephan Aßmus 		edgeShadowAlpha = 15;
101261ac1a85SStephan Aßmus 		frameLightAlpha = 92;
101361ac1a85SStephan Aßmus 		frameShadowAlpha = 107;
10142f86ba45SStephan Aßmus 	}
10152f86ba45SStephan Aßmus 
101661ac1a85SStephan Aßmus 	rgb_color edgeLightColor;
101761ac1a85SStephan Aßmus 	rgb_color edgeShadowColor;
101861ac1a85SStephan Aßmus 	rgb_color frameLightColor;
101961ac1a85SStephan Aßmus 	rgb_color frameShadowColor;
10202f86ba45SStephan Aßmus 	rgb_color fillLightColor = tint_color(fillColor, fillLightTint);
10212f86ba45SStephan Aßmus 	rgb_color fillShadowColor = tint_color(fillColor, fillShadowTint);
10222f86ba45SStephan Aßmus 
102361ac1a85SStephan Aßmus 	drawing_mode oldMode = view->DrawingMode();
102461ac1a85SStephan Aßmus 
102561ac1a85SStephan Aßmus 	if (flags & B_BLEND_FRAME) {
102661ac1a85SStephan Aßmus 		edgeLightColor = (rgb_color){ 255, 255, 255, edgeLightAlpha };
102761ac1a85SStephan Aßmus 		edgeShadowColor = (rgb_color){ 0, 0, 0, edgeShadowAlpha };
102861ac1a85SStephan Aßmus 		frameLightColor = (rgb_color){ 0, 0, 0, frameLightAlpha };
102961ac1a85SStephan Aßmus 		frameShadowColor = (rgb_color){ 0, 0, 0, frameShadowAlpha };
103061ac1a85SStephan Aßmus 
103161ac1a85SStephan Aßmus 		view->SetDrawingMode(B_OP_ALPHA);
103261ac1a85SStephan Aßmus 	} else {
103361ac1a85SStephan Aßmus 		edgeLightColor = tint_color(base, edgeLightTint);
103461ac1a85SStephan Aßmus 		edgeShadowColor = tint_color(base, edgeShadowTint);
103561ac1a85SStephan Aßmus 		frameLightColor = tint_color(fillColor, frameLightTint);
103661ac1a85SStephan Aßmus 		frameShadowColor = tint_color(fillColor, frameShadowTint);
103761ac1a85SStephan Aßmus 	}
103861ac1a85SStephan Aßmus 
10392f86ba45SStephan Aßmus 	if (orientation == B_HORIZONTAL) {
10402f86ba45SStephan Aßmus 		_DrawRoundBarCorner(view, leftCorner, updateRect, edgeLightColor,
10412f86ba45SStephan Aßmus 			edgeShadowColor, frameLightColor, frameShadowColor, fillLightColor,
10422f86ba45SStephan Aßmus 			fillShadowColor, 1.0, 1.0, 0.0, -1.0, orientation);
10432f86ba45SStephan Aßmus 
10442f86ba45SStephan Aßmus 		_DrawRoundBarCorner(view, rightCorner, updateRect, edgeLightColor,
10452f86ba45SStephan Aßmus 			edgeShadowColor, frameLightColor, frameShadowColor, fillLightColor,
10462f86ba45SStephan Aßmus 			fillShadowColor, 0.0, 1.0, -1.0, -1.0, orientation);
10472f86ba45SStephan Aßmus 	} else {
10482f86ba45SStephan Aßmus 		_DrawRoundBarCorner(view, leftCorner, updateRect, edgeLightColor,
10492f86ba45SStephan Aßmus 			edgeShadowColor, frameLightColor, frameShadowColor, fillLightColor,
10502f86ba45SStephan Aßmus 			fillShadowColor, 1.0, 1.0, -1.0, 0.0, orientation);
10512f86ba45SStephan Aßmus 
10522f86ba45SStephan Aßmus 		_DrawRoundBarCorner(view, rightCorner, updateRect, edgeLightColor,
10532f86ba45SStephan Aßmus 			edgeShadowColor, frameLightColor, frameShadowColor, fillLightColor,
10542f86ba45SStephan Aßmus 			fillShadowColor, 1.0, 0.0, -1.0, -1.0, orientation);
10552f86ba45SStephan Aßmus 	}
10562f86ba45SStephan Aßmus 
10572f86ba45SStephan Aßmus 	view->ConstrainClippingRegion(NULL);
10582f86ba45SStephan Aßmus 
10592f86ba45SStephan Aßmus 	view->BeginLineArray(4);
10602f86ba45SStephan Aßmus 	if (orientation == B_HORIZONTAL) {
10612f86ba45SStephan Aßmus 		view->AddLine(barRect.LeftTop(), barRect.RightTop(), edgeShadowColor);
10622f86ba45SStephan Aßmus 		view->AddLine(barRect.LeftBottom(), barRect.RightBottom(),
10632f86ba45SStephan Aßmus 			edgeLightColor);
10642f86ba45SStephan Aßmus 		barRect.InsetBy(0, 1);
10652f86ba45SStephan Aßmus 		view->AddLine(barRect.LeftTop(), barRect.RightTop(), frameShadowColor);
10662f86ba45SStephan Aßmus 		view->AddLine(barRect.LeftBottom(), barRect.RightBottom(),
10672f86ba45SStephan Aßmus 			frameLightColor);
10682f86ba45SStephan Aßmus 		barRect.InsetBy(0, 1);
10692f86ba45SStephan Aßmus 	} else {
10702f86ba45SStephan Aßmus 		view->AddLine(barRect.LeftTop(), barRect.LeftBottom(), edgeShadowColor);
10712f86ba45SStephan Aßmus 		view->AddLine(barRect.RightTop(), barRect.RightBottom(),
10722f86ba45SStephan Aßmus 			edgeLightColor);
10732f86ba45SStephan Aßmus 		barRect.InsetBy(1, 0);
10742f86ba45SStephan Aßmus 		view->AddLine(barRect.LeftTop(), barRect.LeftBottom(), frameShadowColor);
10752f86ba45SStephan Aßmus 		view->AddLine(barRect.RightTop(), barRect.RightBottom(),
10762f86ba45SStephan Aßmus 			frameLightColor);
10772f86ba45SStephan Aßmus 		barRect.InsetBy(1, 0);
10782f86ba45SStephan Aßmus 	}
10792f86ba45SStephan Aßmus 	view->EndLineArray();
10802f86ba45SStephan Aßmus 
108161ac1a85SStephan Aßmus 	view->SetDrawingMode(oldMode);
108261ac1a85SStephan Aßmus 
10832f86ba45SStephan Aßmus 	_FillGradient(view, barRect, fillColor, fillShadowTint, fillLightTint,
10842f86ba45SStephan Aßmus 		orientation);
10852f86ba45SStephan Aßmus }
10862f86ba45SStephan Aßmus 
10872f86ba45SStephan Aßmus 
10882f86ba45SStephan Aßmus void
10892f86ba45SStephan Aßmus BControlLook::DrawSliderThumb(BView* view, BRect& rect, const BRect& updateRect,
10902f86ba45SStephan Aßmus 	const rgb_color& base, uint32 flags, enum orientation orientation)
10912f86ba45SStephan Aßmus {
10922f86ba45SStephan Aßmus 	if (!rect.IsValid() || !rect.Intersects(updateRect))
10932f86ba45SStephan Aßmus 		return;
10942f86ba45SStephan Aßmus 
10952f86ba45SStephan Aßmus 	// figure out frame color
10962f86ba45SStephan Aßmus 	rgb_color frameLightColor;
10972f86ba45SStephan Aßmus 	rgb_color frameShadowColor;
10982f86ba45SStephan Aßmus 	rgb_color shadowColor = (rgb_color){ 0, 0, 0, 60 };
10992f86ba45SStephan Aßmus 
11002f86ba45SStephan Aßmus 	if (flags & B_FOCUSED) {
11012f86ba45SStephan Aßmus 		// focused
11022f86ba45SStephan Aßmus 		frameLightColor = ui_color(B_KEYBOARD_NAVIGATION_COLOR);
11032f86ba45SStephan Aßmus 		frameShadowColor = frameLightColor;
11042f86ba45SStephan Aßmus 	} else {
11052f86ba45SStephan Aßmus 		// figure out the tints to be used
11062f86ba45SStephan Aßmus 		float frameLightTint;
11072f86ba45SStephan Aßmus 		float frameShadowTint;
11082f86ba45SStephan Aßmus 
11092f86ba45SStephan Aßmus 		if (flags & B_DISABLED) {
11102f86ba45SStephan Aßmus 			frameLightTint = 1.30;
11112f86ba45SStephan Aßmus 			frameShadowTint = 1.35;
11122f86ba45SStephan Aßmus 			shadowColor.alpha = 30;
11132f86ba45SStephan Aßmus 		} else {
11142f86ba45SStephan Aßmus 			frameLightTint = 1.6;
11152f86ba45SStephan Aßmus 			frameShadowTint = 1.65;
11162f86ba45SStephan Aßmus 		}
11172f86ba45SStephan Aßmus 
11182f86ba45SStephan Aßmus 		frameLightColor = tint_color(base, frameLightTint);
11192f86ba45SStephan Aßmus 		frameShadowColor = tint_color(base, frameShadowTint);
11202f86ba45SStephan Aßmus 	}
11212f86ba45SStephan Aßmus 
11222f86ba45SStephan Aßmus 	BRect originalRect(rect);
11232f86ba45SStephan Aßmus 	rect.right--;
11242f86ba45SStephan Aßmus 	rect.bottom--;
11252f86ba45SStephan Aßmus 
11262f86ba45SStephan Aßmus 	_DrawFrame(view, rect, frameLightColor, frameLightColor,
11272f86ba45SStephan Aßmus 		frameShadowColor, frameShadowColor);
11282f86ba45SStephan Aßmus 
11292f86ba45SStephan Aßmus 	flags &= ~B_ACTIVATED;
11302f86ba45SStephan Aßmus 	DrawButtonBackground(view, rect, updateRect, base, flags);
11312f86ba45SStephan Aßmus 
11322f86ba45SStephan Aßmus 	// thumb shadow
11332f86ba45SStephan Aßmus 	view->SetDrawingMode(B_OP_ALPHA);
11342f86ba45SStephan Aßmus 	view->SetHighColor(shadowColor);
11352f86ba45SStephan Aßmus 	originalRect.left++;
11362f86ba45SStephan Aßmus 	originalRect.top++;
11372f86ba45SStephan Aßmus 	view->StrokeLine(originalRect.LeftBottom(), originalRect.RightBottom());
11382f86ba45SStephan Aßmus 	originalRect.bottom--;
11392f86ba45SStephan Aßmus 	view->StrokeLine(originalRect.RightTop(), originalRect.RightBottom());
11402f86ba45SStephan Aßmus 
11412f86ba45SStephan Aßmus 	// thumb edge
11422f86ba45SStephan Aßmus 	if (orientation == B_HORIZONTAL) {
11432f86ba45SStephan Aßmus 		rect.InsetBy(0, floorf(rect.Height() / 4));
11442f86ba45SStephan Aßmus 		rect.left = floorf((rect.left + rect.right) / 2);
11452f86ba45SStephan Aßmus 		rect.right = rect.left + 1;
11462f86ba45SStephan Aßmus 		shadowColor = tint_color(base, B_DARKEN_2_TINT);
11472f86ba45SStephan Aßmus 		shadowColor.alpha = 128;
11482f86ba45SStephan Aßmus 		view->SetHighColor(shadowColor);
11492f86ba45SStephan Aßmus 		view->StrokeLine(rect.LeftTop(), rect.LeftBottom());
11502f86ba45SStephan Aßmus 		rgb_color lightColor = tint_color(base, B_LIGHTEN_2_TINT);
11512f86ba45SStephan Aßmus 		lightColor.alpha = 128;
11522f86ba45SStephan Aßmus 		view->SetHighColor(lightColor);
11532f86ba45SStephan Aßmus 		view->StrokeLine(rect.RightTop(), rect.RightBottom());
11542f86ba45SStephan Aßmus 	} else {
11552f86ba45SStephan Aßmus 		rect.InsetBy(floorf(rect.Width() / 4), 0);
11562f86ba45SStephan Aßmus 		rect.top = floorf((rect.top + rect.bottom) / 2);
11572f86ba45SStephan Aßmus 		rect.bottom = rect.top + 1;
11582f86ba45SStephan Aßmus 		shadowColor = tint_color(base, B_DARKEN_2_TINT);
11592f86ba45SStephan Aßmus 		shadowColor.alpha = 128;
11602f86ba45SStephan Aßmus 		view->SetHighColor(shadowColor);
11612f86ba45SStephan Aßmus 		view->StrokeLine(rect.LeftTop(), rect.RightTop());
11622f86ba45SStephan Aßmus 		rgb_color lightColor = tint_color(base, B_LIGHTEN_2_TINT);
11632f86ba45SStephan Aßmus 		lightColor.alpha = 128;
11642f86ba45SStephan Aßmus 		view->SetHighColor(lightColor);
11652f86ba45SStephan Aßmus 		view->StrokeLine(rect.LeftBottom(), rect.RightBottom());
11662f86ba45SStephan Aßmus 	}
11672f86ba45SStephan Aßmus 
11682f86ba45SStephan Aßmus 	view->SetDrawingMode(B_OP_COPY);
11692f86ba45SStephan Aßmus }
11702f86ba45SStephan Aßmus 
11712f86ba45SStephan Aßmus 
11722f86ba45SStephan Aßmus void
11732f86ba45SStephan Aßmus BControlLook::DrawSliderTriangle(BView* view, BRect& rect,
11742f86ba45SStephan Aßmus 	const BRect& updateRect, const rgb_color& base, uint32 flags,
11752f86ba45SStephan Aßmus 	enum orientation orientation)
11762f86ba45SStephan Aßmus {
11778ee9217eSStephan Aßmus 	DrawSliderTriangle(view, rect, updateRect, base, base, flags, orientation);
11788ee9217eSStephan Aßmus }
11798ee9217eSStephan Aßmus 
11808ee9217eSStephan Aßmus 
11818ee9217eSStephan Aßmus void
11828ee9217eSStephan Aßmus BControlLook::DrawSliderTriangle(BView* view, BRect& rect,
11838ee9217eSStephan Aßmus 	const BRect& updateRect, const rgb_color& base, const rgb_color& fill,
11848ee9217eSStephan Aßmus 	uint32 flags, enum orientation orientation)
11858ee9217eSStephan Aßmus {
11862f86ba45SStephan Aßmus 	if (!rect.IsValid() || !rect.Intersects(updateRect))
11872f86ba45SStephan Aßmus 		return;
11882f86ba45SStephan Aßmus 
11892f86ba45SStephan Aßmus 	// figure out frame color
11902f86ba45SStephan Aßmus 	rgb_color frameLightColor;
11912f86ba45SStephan Aßmus 	rgb_color frameShadowColor;
11922f86ba45SStephan Aßmus 	rgb_color shadowColor = (rgb_color){ 0, 0, 0, 60 };
11932f86ba45SStephan Aßmus 
11942f86ba45SStephan Aßmus 	float topTint = 0.49;
11952f86ba45SStephan Aßmus 	float middleTint1 = 0.62;
11962f86ba45SStephan Aßmus 	float middleTint2 = 0.76;
11972f86ba45SStephan Aßmus 	float bottomTint = 0.90;
11982f86ba45SStephan Aßmus 
11992f86ba45SStephan Aßmus 	if (flags & B_DISABLED) {
12002f86ba45SStephan Aßmus 		topTint = (topTint + B_NO_TINT) / 2;
12012f86ba45SStephan Aßmus 		middleTint1 = (middleTint1 + B_NO_TINT) / 2;
12022f86ba45SStephan Aßmus 		middleTint2 = (middleTint2 + B_NO_TINT) / 2;
12032f86ba45SStephan Aßmus 		bottomTint = (bottomTint + B_NO_TINT) / 2;
12042f86ba45SStephan Aßmus 	} else if (flags & B_HOVER) {
12052f86ba45SStephan Aßmus 		static const float kHoverTintFactor = 0.85;
12062f86ba45SStephan Aßmus 		topTint *= kHoverTintFactor;
12072f86ba45SStephan Aßmus 		middleTint1 *= kHoverTintFactor;
12082f86ba45SStephan Aßmus 		middleTint2 *= kHoverTintFactor;
12092f86ba45SStephan Aßmus 		bottomTint *= kHoverTintFactor;
12102f86ba45SStephan Aßmus 	}
12112f86ba45SStephan Aßmus 
12122f86ba45SStephan Aßmus 	if (flags & B_FOCUSED) {
12132f86ba45SStephan Aßmus 		// focused
12142f86ba45SStephan Aßmus 		frameLightColor = ui_color(B_KEYBOARD_NAVIGATION_COLOR);
12152f86ba45SStephan Aßmus 		frameShadowColor = frameLightColor;
12162f86ba45SStephan Aßmus 	} else {
12172f86ba45SStephan Aßmus 		// figure out the tints to be used
12182f86ba45SStephan Aßmus 		float frameLightTint;
12192f86ba45SStephan Aßmus 		float frameShadowTint;
12202f86ba45SStephan Aßmus 
12212f86ba45SStephan Aßmus 		if (flags & B_DISABLED) {
12222f86ba45SStephan Aßmus 			frameLightTint = 1.30;
12232f86ba45SStephan Aßmus 			frameShadowTint = 1.35;
12242f86ba45SStephan Aßmus 			shadowColor.alpha = 30;
12252f86ba45SStephan Aßmus 		} else {
12262f86ba45SStephan Aßmus 			frameLightTint = 1.6;
12272f86ba45SStephan Aßmus 			frameShadowTint = 1.65;
12282f86ba45SStephan Aßmus 		}
12292f86ba45SStephan Aßmus 
12302f86ba45SStephan Aßmus 		frameLightColor = tint_color(base, frameLightTint);
12312f86ba45SStephan Aßmus 		frameShadowColor = tint_color(base, frameShadowTint);
12322f86ba45SStephan Aßmus 	}
12332f86ba45SStephan Aßmus 
12348ee9217eSStephan Aßmus 	// make room for the shadow
12358ee9217eSStephan Aßmus 	rect.right--;
12368ee9217eSStephan Aßmus 	rect.bottom--;
12372f86ba45SStephan Aßmus 
12382f86ba45SStephan Aßmus 	uint32 viewFlags = view->Flags();
12392f86ba45SStephan Aßmus 	view->SetFlags(viewFlags | B_SUBPIXEL_PRECISE);
12402f86ba45SStephan Aßmus 	view->SetLineMode(B_ROUND_CAP, B_ROUND_JOIN);
12412f86ba45SStephan Aßmus 
1242f3997b74SStephan Aßmus 	float centerh = (rect.left + rect.right) / 2;
1243f3997b74SStephan Aßmus 	float centerv = (rect.top + rect.bottom) / 2;
12442f86ba45SStephan Aßmus 
12458ee9217eSStephan Aßmus 	BShape shape;
1246f3997b74SStephan Aßmus 	if (orientation == B_HORIZONTAL) {
12478ee9217eSStephan Aßmus 		shape.MoveTo(BPoint(rect.left + 0.5, rect.bottom + 0.5));
12488ee9217eSStephan Aßmus 		shape.LineTo(BPoint(rect.right + 0.5, rect.bottom + 0.5));
12498ee9217eSStephan Aßmus 		shape.LineTo(BPoint(rect.right + 0.5, rect.bottom - 1 + 0.5));
1250f3997b74SStephan Aßmus 		shape.LineTo(BPoint(centerh + 0.5, rect.top + 0.5));
12518ee9217eSStephan Aßmus 		shape.LineTo(BPoint(rect.left + 0.5, rect.bottom - 1 + 0.5));
1252f3997b74SStephan Aßmus 	} else {
1253f3997b74SStephan Aßmus 		shape.MoveTo(BPoint(rect.right + 0.5, rect.top + 0.5));
1254f3997b74SStephan Aßmus 		shape.LineTo(BPoint(rect.right + 0.5, rect.bottom + 0.5));
1255f3997b74SStephan Aßmus 		shape.LineTo(BPoint(rect.right - 1 + 0.5, rect.bottom + 0.5));
1256f3997b74SStephan Aßmus 		shape.LineTo(BPoint(rect.left + 0.5, centerv + 0.5));
1257f3997b74SStephan Aßmus 		shape.LineTo(BPoint(rect.right - 1 + 0.5, rect.top + 0.5));
1258f3997b74SStephan Aßmus 	}
12598ee9217eSStephan Aßmus 	shape.Close();
12608ee9217eSStephan Aßmus 
12618ee9217eSStephan Aßmus 	view->MovePenTo(BPoint(1, 1));
12628ee9217eSStephan Aßmus 
12638ee9217eSStephan Aßmus 	view->SetDrawingMode(B_OP_ALPHA);
12648ee9217eSStephan Aßmus 	view->SetHighColor(shadowColor);
12658ee9217eSStephan Aßmus 	view->StrokeShape(&shape);
12668ee9217eSStephan Aßmus 
12678ee9217eSStephan Aßmus 	view->MovePenTo(B_ORIGIN);
12688ee9217eSStephan Aßmus 
12698ee9217eSStephan Aßmus 	view->SetDrawingMode(B_OP_COPY);
12702f86ba45SStephan Aßmus 	view->SetHighColor(frameLightColor);
12718ee9217eSStephan Aßmus 	view->StrokeShape(&shape);
12722f86ba45SStephan Aßmus 
12732f86ba45SStephan Aßmus 	rect.InsetBy(1, 1);
12748ee9217eSStephan Aßmus 	shape.Clear();
1275f3997b74SStephan Aßmus 	if (orientation == B_HORIZONTAL) {
12768ee9217eSStephan Aßmus 		shape.MoveTo(BPoint(rect.left, rect.bottom + 1));
12778ee9217eSStephan Aßmus 		shape.LineTo(BPoint(rect.right + 1, rect.bottom + 1));
1278f3997b74SStephan Aßmus 		shape.LineTo(BPoint(centerh + 0.5, rect.top));
1279f3997b74SStephan Aßmus 	} else {
1280f3997b74SStephan Aßmus 		shape.MoveTo(BPoint(rect.right + 1, rect.top));
1281f3997b74SStephan Aßmus 		shape.LineTo(BPoint(rect.right + 1, rect.bottom + 1));
1282f3997b74SStephan Aßmus 		shape.LineTo(BPoint(rect.left, centerv + 0.5));
1283f3997b74SStephan Aßmus 	}
12848ee9217eSStephan Aßmus 	shape.Close();
12852f86ba45SStephan Aßmus 
12862f86ba45SStephan Aßmus 	BGradientLinear gradient;
12872f86ba45SStephan Aßmus 	if (flags & B_DISABLED) {
12888ee9217eSStephan Aßmus 		_MakeGradient(gradient, rect, fill, topTint, bottomTint);
12892f86ba45SStephan Aßmus 	} else {
12908ee9217eSStephan Aßmus 		_MakeGlossyGradient(gradient, rect, fill, topTint, middleTint1,
12912f86ba45SStephan Aßmus 			middleTint2, bottomTint);
12922f86ba45SStephan Aßmus 	}
12932f86ba45SStephan Aßmus 
12948ee9217eSStephan Aßmus 	view->FillShape(&shape, gradient);
12952f86ba45SStephan Aßmus 
12962f86ba45SStephan Aßmus 	view->SetFlags(viewFlags);
12972f86ba45SStephan Aßmus }
12982f86ba45SStephan Aßmus 
12992f86ba45SStephan Aßmus 
13002f86ba45SStephan Aßmus void
13012f86ba45SStephan Aßmus BControlLook::DrawSliderHashMarks(BView* view, BRect& rect,
13022f86ba45SStephan Aßmus 	const BRect& updateRect, const rgb_color& base, int32 count,
13032f86ba45SStephan Aßmus 	hash_mark_location location, uint32 flags, enum orientation orientation)
13042f86ba45SStephan Aßmus {
13052f86ba45SStephan Aßmus 	if (!rect.IsValid() || !rect.Intersects(updateRect))
13062f86ba45SStephan Aßmus 		return;
13072f86ba45SStephan Aßmus 
13082f86ba45SStephan Aßmus 	rgb_color lightColor;
13092f86ba45SStephan Aßmus 	rgb_color darkColor;
13102f86ba45SStephan Aßmus 
13112f86ba45SStephan Aßmus 	if (flags & B_DISABLED) {
13122f86ba45SStephan Aßmus 		lightColor = tint_color(base, 0.9);
13132f86ba45SStephan Aßmus 		darkColor = tint_color(base, 1.07);
13142f86ba45SStephan Aßmus 	} else {
13152f86ba45SStephan Aßmus 		lightColor = tint_color(base, 0.8);
13162f86ba45SStephan Aßmus 		darkColor = tint_color(base, 1.14);
13172f86ba45SStephan Aßmus 	}
13182f86ba45SStephan Aßmus 
13192f86ba45SStephan Aßmus 	int32 hashMarkCount = max_c(count, 2);
13202f86ba45SStephan Aßmus 		// draw at least two hashmarks at min/max if
13212f86ba45SStephan Aßmus 		// fHashMarks != B_HASH_MARKS_NONE
13222f86ba45SStephan Aßmus 	float factor;
13232f86ba45SStephan Aßmus 	float startPos;
13242f86ba45SStephan Aßmus 	if (orientation == B_HORIZONTAL) {
13252f86ba45SStephan Aßmus 		factor = (rect.Width() - 2) / (hashMarkCount - 1);
13262f86ba45SStephan Aßmus 		startPos = rect.left + 1;
13272f86ba45SStephan Aßmus 	} else {
13282f86ba45SStephan Aßmus 		factor = (rect.Height() - 2) / (hashMarkCount - 1);
13292f86ba45SStephan Aßmus 		startPos = rect.top + 1;
13302f86ba45SStephan Aßmus 	}
13312f86ba45SStephan Aßmus 
13322f86ba45SStephan Aßmus 	if (location & B_HASH_MARKS_TOP) {
13332f86ba45SStephan Aßmus 		view->BeginLineArray(hashMarkCount * 2);
13342f86ba45SStephan Aßmus 
13352f86ba45SStephan Aßmus 		if (orientation == B_HORIZONTAL) {
13362f86ba45SStephan Aßmus 			float pos = startPos;
13372f86ba45SStephan Aßmus 			for (int32 i = 0; i < hashMarkCount; i++) {
13382f86ba45SStephan Aßmus 				view->AddLine(BPoint(pos, rect.top),
13392f86ba45SStephan Aßmus 							  BPoint(pos, rect.top + 4), darkColor);
13402f86ba45SStephan Aßmus 				view->AddLine(BPoint(pos + 1, rect.top),
13412f86ba45SStephan Aßmus 							  BPoint(pos + 1, rect.top + 4), lightColor);
13422f86ba45SStephan Aßmus 
13432f86ba45SStephan Aßmus 				pos += factor;
13442f86ba45SStephan Aßmus 			}
13452f86ba45SStephan Aßmus 		} else {
13462f86ba45SStephan Aßmus 			float pos = startPos;
13472f86ba45SStephan Aßmus 			for (int32 i = 0; i < hashMarkCount; i++) {
13482f86ba45SStephan Aßmus 				view->AddLine(BPoint(rect.left, pos),
13492f86ba45SStephan Aßmus 							  BPoint(rect.left + 4, pos), darkColor);
13502f86ba45SStephan Aßmus 				view->AddLine(BPoint(rect.left, pos + 1),
13512f86ba45SStephan Aßmus 							  BPoint(rect.left + 4, pos + 1), lightColor);
13522f86ba45SStephan Aßmus 
13532f86ba45SStephan Aßmus 				pos += factor;
13542f86ba45SStephan Aßmus 			}
13552f86ba45SStephan Aßmus 		}
13562f86ba45SStephan Aßmus 
13572f86ba45SStephan Aßmus 		view->EndLineArray();
13582f86ba45SStephan Aßmus 	}
13592f86ba45SStephan Aßmus 
13602f86ba45SStephan Aßmus 	if (location & B_HASH_MARKS_BOTTOM) {
13612f86ba45SStephan Aßmus 
13622f86ba45SStephan Aßmus 		view->BeginLineArray(hashMarkCount * 2);
13632f86ba45SStephan Aßmus 
13642f86ba45SStephan Aßmus 		if (orientation == B_HORIZONTAL) {
13652f86ba45SStephan Aßmus 			float pos = startPos;
13662f86ba45SStephan Aßmus 			for (int32 i = 0; i < hashMarkCount; i++) {
13672f86ba45SStephan Aßmus 				view->AddLine(BPoint(pos, rect.bottom - 4),
13682f86ba45SStephan Aßmus 							  BPoint(pos, rect.bottom), darkColor);
13692f86ba45SStephan Aßmus 				view->AddLine(BPoint(pos + 1, rect.bottom - 4),
13702f86ba45SStephan Aßmus 							  BPoint(pos + 1, rect.bottom), lightColor);
13712f86ba45SStephan Aßmus 
13722f86ba45SStephan Aßmus 				pos += factor;
13732f86ba45SStephan Aßmus 			}
13742f86ba45SStephan Aßmus 		} else {
13752f86ba45SStephan Aßmus 			float pos = startPos;
13762f86ba45SStephan Aßmus 			for (int32 i = 0; i < hashMarkCount; i++) {
13772f86ba45SStephan Aßmus 				view->AddLine(BPoint(rect.right - 4, pos),
13782f86ba45SStephan Aßmus 							  BPoint(rect.right, pos), darkColor);
13792f86ba45SStephan Aßmus 				view->AddLine(BPoint(rect.right - 4, pos + 1),
13802f86ba45SStephan Aßmus 							  BPoint(rect.right, pos + 1), lightColor);
13812f86ba45SStephan Aßmus 
13822f86ba45SStephan Aßmus 				pos += factor;
13832f86ba45SStephan Aßmus 			}
13842f86ba45SStephan Aßmus 		}
13852f86ba45SStephan Aßmus 
13862f86ba45SStephan Aßmus 		view->EndLineArray();
13872f86ba45SStephan Aßmus 	}
13882f86ba45SStephan Aßmus }
13892f86ba45SStephan Aßmus 
13902f86ba45SStephan Aßmus 
13912f86ba45SStephan Aßmus void
13922f86ba45SStephan Aßmus BControlLook::DrawActiveTab(BView* view, BRect& rect, const BRect& updateRect,
13932f86ba45SStephan Aßmus 	const rgb_color& base, uint32 flags, uint32 borders)
13942f86ba45SStephan Aßmus {
13952f86ba45SStephan Aßmus 	if (!rect.IsValid() || !rect.Intersects(updateRect))
13962f86ba45SStephan Aßmus 		return;
13972f86ba45SStephan Aßmus 
13982f86ba45SStephan Aßmus 	rgb_color edgeShadowColor;
13992f86ba45SStephan Aßmus 	rgb_color edgeLightColor;
14002f86ba45SStephan Aßmus 	rgb_color frameShadowColor;
14012f86ba45SStephan Aßmus 	rgb_color frameLightColor;
14022f86ba45SStephan Aßmus 	rgb_color bevelShadowColor;
14032f86ba45SStephan Aßmus 	rgb_color bevelLightColor;
14042f86ba45SStephan Aßmus 	BGradientLinear fillGradient;
14052f86ba45SStephan Aßmus 	fillGradient.SetStart(rect.LeftTop() + BPoint(3, 3));
14062f86ba45SStephan Aßmus 	fillGradient.SetEnd(rect.LeftBottom() + BPoint(3, -3));
14072f86ba45SStephan Aßmus 
14082f86ba45SStephan Aßmus 	if (flags & B_DISABLED) {
14092f86ba45SStephan Aßmus 		edgeShadowColor = base;
14102f86ba45SStephan Aßmus 		edgeLightColor = base;
14112f86ba45SStephan Aßmus 		frameShadowColor = tint_color(base, 1.30);
14122f86ba45SStephan Aßmus 		frameLightColor = tint_color(base, 1.25);
14132f86ba45SStephan Aßmus 		bevelShadowColor = tint_color(base, 1.07);
14142f86ba45SStephan Aßmus 		bevelLightColor = tint_color(base, 0.8);
14152f86ba45SStephan Aßmus 		fillGradient.AddColor(tint_color(base, 0.85), 0);
14162f86ba45SStephan Aßmus 		fillGradient.AddColor(base, 255);
14172f86ba45SStephan Aßmus 	} else {
14182f86ba45SStephan Aßmus 		edgeShadowColor = tint_color(base, 1.03);
14192f86ba45SStephan Aßmus 		edgeLightColor = tint_color(base, 0.80);
14202f86ba45SStephan Aßmus 		frameShadowColor = tint_color(base, 1.30);
14212f86ba45SStephan Aßmus 		frameLightColor = tint_color(base, 1.30);
14222f86ba45SStephan Aßmus 		bevelShadowColor = tint_color(base, 1.07);
14232f86ba45SStephan Aßmus 		bevelLightColor = tint_color(base, 0.6);
14242f86ba45SStephan Aßmus 		fillGradient.AddColor(tint_color(base, 0.75), 0);
14252f86ba45SStephan Aßmus 		fillGradient.AddColor(tint_color(base, 1.03), 255);
14262f86ba45SStephan Aßmus 	}
142712ea5a2cSStephan Aßmus 
14282f86ba45SStephan Aßmus 	static const float kRoundCornerRadius = 4;
14292f86ba45SStephan Aßmus 
14302f86ba45SStephan Aßmus 	// left/top corner
14312f86ba45SStephan Aßmus 	BRect cornerRect(rect);
14322f86ba45SStephan Aßmus 	cornerRect.right = cornerRect.left + kRoundCornerRadius;
14332f86ba45SStephan Aßmus 	cornerRect.bottom = cornerRect.top + kRoundCornerRadius;
14342f86ba45SStephan Aßmus 
14352f86ba45SStephan Aßmus 	BRegion clipping(rect);
14362f86ba45SStephan Aßmus 	clipping.Exclude(cornerRect);
14372f86ba45SStephan Aßmus 
14382f86ba45SStephan Aßmus 	_DrawRoundCornerLeftTop(view, cornerRect, updateRect, base, edgeShadowColor,
14392f86ba45SStephan Aßmus 		frameLightColor, bevelLightColor, fillGradient);
14402f86ba45SStephan Aßmus 
14412f86ba45SStephan Aßmus 	// left/top corner
14422f86ba45SStephan Aßmus 	cornerRect.right = rect.right;
14432f86ba45SStephan Aßmus 	cornerRect.left = cornerRect.right - kRoundCornerRadius;
14442f86ba45SStephan Aßmus 
14452f86ba45SStephan Aßmus 	clipping.Exclude(cornerRect);
14462f86ba45SStephan Aßmus 
14472f86ba45SStephan Aßmus 	_DrawRoundCornerRightTop(view, cornerRect, updateRect, base, edgeShadowColor,
14482f86ba45SStephan Aßmus 		edgeLightColor, frameLightColor, frameShadowColor, bevelLightColor,
14492f86ba45SStephan Aßmus 		bevelShadowColor, fillGradient);
14502f86ba45SStephan Aßmus 
14512f86ba45SStephan Aßmus 	// rest of frame and fill
14522f86ba45SStephan Aßmus 	view->ConstrainClippingRegion(&clipping);
14532f86ba45SStephan Aßmus 
14542f86ba45SStephan Aßmus 	_DrawFrame(view, rect, edgeShadowColor, edgeShadowColor, edgeLightColor,
14552f86ba45SStephan Aßmus 		edgeLightColor,
14562f86ba45SStephan Aßmus 		borders & (B_LEFT_BORDER | B_TOP_BORDER | B_RIGHT_BORDER));
14572f86ba45SStephan Aßmus 	if ((borders & B_LEFT_BORDER) == 0)
14582f86ba45SStephan Aßmus 		rect.left++;
14592f86ba45SStephan Aßmus 	if ((borders & B_RIGHT_BORDER) == 0)
14602f86ba45SStephan Aßmus 		rect.right--;
14612f86ba45SStephan Aßmus 
14622f86ba45SStephan Aßmus 	_DrawFrame(view, rect, frameLightColor, frameLightColor, frameShadowColor,
14632f86ba45SStephan Aßmus 		frameShadowColor, B_LEFT_BORDER | B_TOP_BORDER | B_RIGHT_BORDER);
14642f86ba45SStephan Aßmus 
14652f86ba45SStephan Aßmus 	_DrawFrame(view, rect, bevelLightColor, bevelLightColor, bevelShadowColor,
14662f86ba45SStephan Aßmus 		bevelShadowColor);
14672f86ba45SStephan Aßmus 
14682f86ba45SStephan Aßmus 	view->FillRect(rect, fillGradient);
14692f86ba45SStephan Aßmus 
14702f86ba45SStephan Aßmus 	view->ConstrainClippingRegion(NULL);
14712f86ba45SStephan Aßmus }
14722f86ba45SStephan Aßmus 
14732f86ba45SStephan Aßmus 
14742f86ba45SStephan Aßmus void
147583aff015SPhilippe Houdoin BControlLook::DrawInactiveTab(BView* view, BRect& rect, const BRect& updateRect,
14762f86ba45SStephan Aßmus 	const rgb_color& base, uint32 flags, uint32 borders)
14772f86ba45SStephan Aßmus {
14782f86ba45SStephan Aßmus 	if (!rect.IsValid() || !rect.Intersects(updateRect))
14792f86ba45SStephan Aßmus 		return;
14802f86ba45SStephan Aßmus 
14812f86ba45SStephan Aßmus 	rgb_color edgeShadowColor;
14822f86ba45SStephan Aßmus 	rgb_color edgeLightColor;
14832f86ba45SStephan Aßmus 	rgb_color frameShadowColor;
14842f86ba45SStephan Aßmus 	rgb_color frameLightColor;
14852f86ba45SStephan Aßmus 	rgb_color bevelShadowColor;
14862f86ba45SStephan Aßmus 	rgb_color bevelLightColor;
14872f86ba45SStephan Aßmus 	BGradientLinear fillGradient;
14882f86ba45SStephan Aßmus 	fillGradient.SetStart(rect.LeftTop() + BPoint(3, 3));
14892f86ba45SStephan Aßmus 	fillGradient.SetEnd(rect.LeftBottom() + BPoint(3, -3));
14902f86ba45SStephan Aßmus 
14912f86ba45SStephan Aßmus 	if (flags & B_DISABLED) {
14922f86ba45SStephan Aßmus 		edgeShadowColor = base;
14932f86ba45SStephan Aßmus 		edgeLightColor = base;
14942f86ba45SStephan Aßmus 		frameShadowColor = tint_color(base, 1.30);
14952f86ba45SStephan Aßmus 		frameLightColor = tint_color(base, 1.25);
14962f86ba45SStephan Aßmus 		bevelShadowColor = tint_color(base, 1.07);
14972f86ba45SStephan Aßmus 		bevelLightColor = tint_color(base, 0.8);
14982f86ba45SStephan Aßmus 		fillGradient.AddColor(tint_color(base, 0.85), 0);
14992f86ba45SStephan Aßmus 		fillGradient.AddColor(base, 255);
15002f86ba45SStephan Aßmus 	} else {
15012f86ba45SStephan Aßmus 		edgeShadowColor = tint_color(base, 1.03);
15022f86ba45SStephan Aßmus 		edgeLightColor = tint_color(base, 0.80);
15032f86ba45SStephan Aßmus 		frameShadowColor = tint_color(base, 1.30);
15042f86ba45SStephan Aßmus 		frameLightColor = tint_color(base, 1.30);
150512ea5a2cSStephan Aßmus 		bevelShadowColor = tint_color(base, 1.17);
15062f86ba45SStephan Aßmus 		bevelLightColor = tint_color(base, 1.10);
15072f86ba45SStephan Aßmus 		fillGradient.AddColor(tint_color(base, 1.12), 0);
15082f86ba45SStephan Aßmus 		fillGradient.AddColor(tint_color(base, 1.08), 255);
15092f86ba45SStephan Aßmus 	}
15102f86ba45SStephan Aßmus 
15112f86ba45SStephan Aßmus 	// active tabs stand out at the top, but this is an inactive tab
15122f86ba45SStephan Aßmus 	view->SetHighColor(base);
15132f86ba45SStephan Aßmus 	view->FillRect(BRect(rect.left, rect.top, rect.right, rect.top + 4));
15142f86ba45SStephan Aßmus 	rect.top += 4;
15152f86ba45SStephan Aßmus 
15162f86ba45SStephan Aßmus 	// frame and fill
15172f86ba45SStephan Aßmus 	_DrawFrame(view, rect, edgeShadowColor, edgeShadowColor, edgeLightColor,
15182f86ba45SStephan Aßmus 		edgeLightColor,
15192f86ba45SStephan Aßmus 		borders & (B_LEFT_BORDER | B_TOP_BORDER | B_RIGHT_BORDER));
15202f86ba45SStephan Aßmus 
15212f86ba45SStephan Aßmus 	_DrawFrame(view, rect, frameLightColor, frameLightColor, frameShadowColor,
15222f86ba45SStephan Aßmus 		frameShadowColor,
15232f86ba45SStephan Aßmus 		borders & (B_LEFT_BORDER | B_TOP_BORDER | B_RIGHT_BORDER));
15242f86ba45SStephan Aßmus 
1525b3601d82SStephan Aßmus 	if (rect.IsValid()) {
1526b3601d82SStephan Aßmus 		_DrawFrame(view, rect, bevelShadowColor, bevelShadowColor,
1527b3601d82SStephan Aßmus 			bevelLightColor, bevelLightColor, B_LEFT_BORDER & ~borders);
1528b3601d82SStephan Aßmus 	} else {
1529b3601d82SStephan Aßmus 		if ((B_LEFT_BORDER & ~borders) != 0)
1530b3601d82SStephan Aßmus 			rect.left++;
1531b3601d82SStephan Aßmus 	}
15322f86ba45SStephan Aßmus 
15332f86ba45SStephan Aßmus 	view->FillRect(rect, fillGradient);
15342f86ba45SStephan Aßmus }
15352f86ba45SStephan Aßmus 
15362f86ba45SStephan Aßmus 
15371f9fd6d8SStephan Aßmus void
15381f9fd6d8SStephan Aßmus BControlLook::DrawSplitter(BView* view, BRect& rect, const BRect& updateRect,
15391f9fd6d8SStephan Aßmus 	const rgb_color& base, enum orientation orientation, uint32 flags,
15401f9fd6d8SStephan Aßmus 	uint32 borders)
15411f9fd6d8SStephan Aßmus {
15421f9fd6d8SStephan Aßmus 	rgb_color background;
15431f9fd6d8SStephan Aßmus 	if ((flags & (B_CLICKED | B_ACTIVATED)) != 0)
15441f9fd6d8SStephan Aßmus 		background = tint_color(base, B_DARKEN_1_TINT);
15451f9fd6d8SStephan Aßmus 	else
15461f9fd6d8SStephan Aßmus 		background = base;
15471f9fd6d8SStephan Aßmus 
15481f9fd6d8SStephan Aßmus 	rgb_color light = tint_color(background, 0.6);
15491f9fd6d8SStephan Aßmus 	rgb_color shadow = tint_color(background, 1.21);
15501f9fd6d8SStephan Aßmus 
15511f9fd6d8SStephan Aßmus 	// frame
15521f9fd6d8SStephan Aßmus 	if (borders != 0 && rect.Width() > 3 && rect.Height() > 3)
15531f9fd6d8SStephan Aßmus 		DrawRaisedBorder(view, rect, updateRect, background, flags, borders);
15541f9fd6d8SStephan Aßmus 
15551f9fd6d8SStephan Aßmus 	// dots and rest of background
15561f9fd6d8SStephan Aßmus 	if (orientation == B_HORIZONTAL) {
15571f9fd6d8SStephan Aßmus 		if (rect.Width() > 2) {
15581f9fd6d8SStephan Aßmus 			// background on left/right
15591f9fd6d8SStephan Aßmus 			BRegion region(rect);
15601f9fd6d8SStephan Aßmus 			rect.left = floorf((rect.left + rect.right) / 2.0 - 0.5);
15611f9fd6d8SStephan Aßmus 			rect.right = rect.left + 1;
15621f9fd6d8SStephan Aßmus 			region.Exclude(rect);
15631f9fd6d8SStephan Aßmus 			view->SetHighColor(background);
15641f9fd6d8SStephan Aßmus 			view->FillRegion(&region);
15651f9fd6d8SStephan Aßmus 		}
15661f9fd6d8SStephan Aßmus 
15671f9fd6d8SStephan Aßmus 		BPoint dot = rect.LeftTop();
15681f9fd6d8SStephan Aßmus 		BPoint stop = rect.LeftBottom();
15691f9fd6d8SStephan Aßmus 		int32 num = 1;
15701f9fd6d8SStephan Aßmus 		while (dot.y <= stop.y) {
15711f9fd6d8SStephan Aßmus 			rgb_color col1;
15721f9fd6d8SStephan Aßmus 			rgb_color col2;
15731f9fd6d8SStephan Aßmus 			switch (num) {
15741f9fd6d8SStephan Aßmus 				case 1:
15751f9fd6d8SStephan Aßmus 					col1 = background;
15761f9fd6d8SStephan Aßmus 					col2 = background;
15771f9fd6d8SStephan Aßmus 					break;
15781f9fd6d8SStephan Aßmus 				case 2:
15791f9fd6d8SStephan Aßmus 					col1 = shadow;
15801f9fd6d8SStephan Aßmus 					col2 = background;
15811f9fd6d8SStephan Aßmus 					break;
15821f9fd6d8SStephan Aßmus 				case 3:
1583a5339f65SStephan Aßmus 				default:
15841f9fd6d8SStephan Aßmus 					col1 = background;
15851f9fd6d8SStephan Aßmus 					col2 = light;
15861f9fd6d8SStephan Aßmus 					num = 0;
15871f9fd6d8SStephan Aßmus 					break;
15881f9fd6d8SStephan Aßmus 			}
15891f9fd6d8SStephan Aßmus 			view->SetHighColor(col1);
15901f9fd6d8SStephan Aßmus 			view->StrokeLine(dot, dot, B_SOLID_HIGH);
15911f9fd6d8SStephan Aßmus 			view->SetHighColor(col2);
15921f9fd6d8SStephan Aßmus 			dot.x++;
15931f9fd6d8SStephan Aßmus 			view->StrokeLine(dot, dot, B_SOLID_HIGH);
15941f9fd6d8SStephan Aßmus 			dot.x -= 1.0;
15951f9fd6d8SStephan Aßmus 			// next pixel
15961f9fd6d8SStephan Aßmus 			num++;
15971f9fd6d8SStephan Aßmus 			dot.y++;
15981f9fd6d8SStephan Aßmus 		}
15991f9fd6d8SStephan Aßmus 	} else {
16001f9fd6d8SStephan Aßmus 		if (rect.Height() > 2) {
16011f9fd6d8SStephan Aßmus 			// background on left/right
16021f9fd6d8SStephan Aßmus 			BRegion region(rect);
16031f9fd6d8SStephan Aßmus 			rect.top = floorf((rect.top + rect.bottom) / 2.0 - 0.5);
16041f9fd6d8SStephan Aßmus 			rect.bottom = rect.top + 1;
16051f9fd6d8SStephan Aßmus 			region.Exclude(rect);
16061f9fd6d8SStephan Aßmus 			view->SetHighColor(background);
16071f9fd6d8SStephan Aßmus 			view->FillRegion(&region);
16081f9fd6d8SStephan Aßmus 		}
16091f9fd6d8SStephan Aßmus 
16101f9fd6d8SStephan Aßmus 		BPoint dot = rect.LeftTop();
16111f9fd6d8SStephan Aßmus 		BPoint stop = rect.RightTop();
16121f9fd6d8SStephan Aßmus 		int32 num = 1;
16131f9fd6d8SStephan Aßmus 		while (dot.x <= stop.x) {
16141f9fd6d8SStephan Aßmus 			rgb_color col1;
16151f9fd6d8SStephan Aßmus 			rgb_color col2;
16161f9fd6d8SStephan Aßmus 			switch (num) {
16171f9fd6d8SStephan Aßmus 				case 1:
16181f9fd6d8SStephan Aßmus 					col1 = background;
16191f9fd6d8SStephan Aßmus 					col2 = background;
16201f9fd6d8SStephan Aßmus 					break;
16211f9fd6d8SStephan Aßmus 				case 2:
16221f9fd6d8SStephan Aßmus 					col1 = shadow;
16231f9fd6d8SStephan Aßmus 					col2 = background;
16241f9fd6d8SStephan Aßmus 					break;
16251f9fd6d8SStephan Aßmus 				case 3:
16269f981a88SFrançois Revol 				default:
16271f9fd6d8SStephan Aßmus 					col1 = background;
16281f9fd6d8SStephan Aßmus 					col2 = light;
16291f9fd6d8SStephan Aßmus 					num = 0;
16301f9fd6d8SStephan Aßmus 					break;
16311f9fd6d8SStephan Aßmus 			}
16321f9fd6d8SStephan Aßmus 			view->SetHighColor(col1);
16331f9fd6d8SStephan Aßmus 			view->StrokeLine(dot, dot, B_SOLID_HIGH);
16341f9fd6d8SStephan Aßmus 			view->SetHighColor(col2);
16351f9fd6d8SStephan Aßmus 			dot.y++;
16361f9fd6d8SStephan Aßmus 			view->StrokeLine(dot, dot, B_SOLID_HIGH);
16371f9fd6d8SStephan Aßmus 			dot.y -= 1.0;
16381f9fd6d8SStephan Aßmus 			// next pixel
16391f9fd6d8SStephan Aßmus 			num++;
16401f9fd6d8SStephan Aßmus 			dot.x++;
16411f9fd6d8SStephan Aßmus 		}
16421f9fd6d8SStephan Aßmus 	}
16431f9fd6d8SStephan Aßmus }
16441f9fd6d8SStephan Aßmus 
16451f9fd6d8SStephan Aßmus 
16462f86ba45SStephan Aßmus // #pragma mark -
16472f86ba45SStephan Aßmus 
16482f86ba45SStephan Aßmus 
16492f86ba45SStephan Aßmus void
16502f86ba45SStephan Aßmus BControlLook::DrawBorder(BView* view, BRect& rect, const BRect& updateRect,
16512f86ba45SStephan Aßmus 	const rgb_color& base, border_style border, uint32 flags, uint32 borders)
16522f86ba45SStephan Aßmus {
16532f86ba45SStephan Aßmus 	if (border == B_NO_BORDER)
16542f86ba45SStephan Aßmus 		return;
16552f86ba45SStephan Aßmus 
16562f86ba45SStephan Aßmus 	rgb_color scrollbarFrameColor = tint_color(base, B_DARKEN_2_TINT);
16572f86ba45SStephan Aßmus 	if (flags & B_FOCUSED)
16582f86ba45SStephan Aßmus 		scrollbarFrameColor = ui_color(B_KEYBOARD_NAVIGATION_COLOR);
16592f86ba45SStephan Aßmus 
16602f86ba45SStephan Aßmus 	if (border == B_FANCY_BORDER)
16614f579098SStephan Aßmus 		_DrawOuterResessedFrame(view, rect, base, 1.0, 1.0, flags, borders);
16622f86ba45SStephan Aßmus 
16632f86ba45SStephan Aßmus 	_DrawFrame(view, rect, scrollbarFrameColor, scrollbarFrameColor,
16642f86ba45SStephan Aßmus 		scrollbarFrameColor, scrollbarFrameColor, borders);
16652f86ba45SStephan Aßmus }
16662f86ba45SStephan Aßmus 
16672f86ba45SStephan Aßmus 
16682f86ba45SStephan Aßmus void
16692f86ba45SStephan Aßmus BControlLook::DrawRaisedBorder(BView* view, BRect& rect,
16702f86ba45SStephan Aßmus 	const BRect& updateRect, const rgb_color& base, uint32 flags,
16712f86ba45SStephan Aßmus 	uint32 borders)
16722f86ba45SStephan Aßmus {
16732f86ba45SStephan Aßmus 	rgb_color lightColor;
16742f86ba45SStephan Aßmus 	rgb_color shadowColor;
16752f86ba45SStephan Aßmus 
16762f86ba45SStephan Aßmus 	if (flags & B_DISABLED) {
16772f86ba45SStephan Aßmus 		lightColor = base;
16782f86ba45SStephan Aßmus 		shadowColor = base;
16792f86ba45SStephan Aßmus 	} else {
16802f86ba45SStephan Aßmus 		lightColor = tint_color(base, 0.85);
16812f86ba45SStephan Aßmus 		shadowColor = tint_color(base, 1.07);
16822f86ba45SStephan Aßmus 	}
16832f86ba45SStephan Aßmus 
16842f86ba45SStephan Aßmus 	_DrawFrame(view, rect, lightColor, lightColor, shadowColor, shadowColor,
16852f86ba45SStephan Aßmus 		borders);
16862f86ba45SStephan Aßmus }
16872f86ba45SStephan Aßmus 
16882f86ba45SStephan Aßmus 
16892f86ba45SStephan Aßmus void
16902f86ba45SStephan Aßmus BControlLook::DrawTextControlBorder(BView* view, BRect& rect,
16912f86ba45SStephan Aßmus 	const BRect& updateRect, const rgb_color& base, uint32 flags,
16922f86ba45SStephan Aßmus 	uint32 borders)
16932f86ba45SStephan Aßmus {
16942f86ba45SStephan Aßmus 	if (!rect.Intersects(updateRect))
16952f86ba45SStephan Aßmus 		return;
16962f86ba45SStephan Aßmus 
16972f86ba45SStephan Aßmus 	rgb_color dark1BorderColor;
16982f86ba45SStephan Aßmus 	rgb_color dark2BorderColor;
16992f86ba45SStephan Aßmus 	rgb_color navigationColor = ui_color(B_KEYBOARD_NAVIGATION_COLOR);
17002f86ba45SStephan Aßmus 
17012f86ba45SStephan Aßmus 	if (flags & B_DISABLED) {
17024f579098SStephan Aßmus 		_DrawOuterResessedFrame(view, rect, base, 0.0, 1.0, flags, borders);
17032f86ba45SStephan Aßmus 
17044f579098SStephan Aßmus 		if (flags & B_BLEND_FRAME)
17054f579098SStephan Aßmus 			dark1BorderColor = (rgb_color){ 0, 0, 0, 40 };
17064f579098SStephan Aßmus 		else
17072f86ba45SStephan Aßmus 			dark1BorderColor = tint_color(base, 1.15);
17084f579098SStephan Aßmus 		dark2BorderColor = dark1BorderColor;
17092f86ba45SStephan Aßmus 	} else if (flags & B_CLICKED) {
17102f86ba45SStephan Aßmus 		dark1BorderColor = tint_color(base, 1.50);
17112f86ba45SStephan Aßmus 		dark2BorderColor = tint_color(base, 1.49);
17122f86ba45SStephan Aßmus 
17134f579098SStephan Aßmus 		// BCheckBox uses this to indicate the clicked state...
17142f86ba45SStephan Aßmus 		_DrawFrame(view, rect,
17152f86ba45SStephan Aßmus 			dark1BorderColor, dark1BorderColor,
17162f86ba45SStephan Aßmus 			dark2BorderColor, dark2BorderColor);
17172f86ba45SStephan Aßmus 
17182f86ba45SStephan Aßmus 		dark2BorderColor = dark1BorderColor;
17192f86ba45SStephan Aßmus 	} else {
17204f579098SStephan Aßmus 		_DrawOuterResessedFrame(view, rect, base, 0.6, 1.0, flags, borders);
17212f86ba45SStephan Aßmus 
17224f579098SStephan Aßmus 		if (flags & B_BLEND_FRAME) {
17234f579098SStephan Aßmus 			dark1BorderColor = (rgb_color){ 0, 0, 0, 102 };
17244f579098SStephan Aßmus 			dark2BorderColor = (rgb_color){ 0, 0, 0, 97 };
17254f579098SStephan Aßmus 		} else {
17262f86ba45SStephan Aßmus 			dark1BorderColor = tint_color(base, 1.40);
17272f86ba45SStephan Aßmus 			dark2BorderColor = tint_color(base, 1.38);
17282f86ba45SStephan Aßmus 		}
17294f579098SStephan Aßmus 	}
17302f86ba45SStephan Aßmus 
17312f86ba45SStephan Aßmus 	if ((flags & B_DISABLED) == 0 && (flags & B_FOCUSED)) {
17322f86ba45SStephan Aßmus 		dark1BorderColor = navigationColor;
17332f86ba45SStephan Aßmus 		dark2BorderColor = navigationColor;
17342f86ba45SStephan Aßmus 	}
17352f86ba45SStephan Aßmus 
17364f579098SStephan Aßmus 	if (flags & B_BLEND_FRAME) {
17374f579098SStephan Aßmus 		drawing_mode oldMode = view->DrawingMode();
17384f579098SStephan Aßmus 		view->SetDrawingMode(B_OP_ALPHA);
17394f579098SStephan Aßmus 
17402f86ba45SStephan Aßmus 		_DrawFrame(view, rect,
17412f86ba45SStephan Aßmus 			dark1BorderColor, dark1BorderColor,
17422f86ba45SStephan Aßmus 			dark2BorderColor, dark2BorderColor, borders);
17434f579098SStephan Aßmus 
17444f579098SStephan Aßmus 		view->SetDrawingMode(oldMode);
17454f579098SStephan Aßmus 	} else {
17464f579098SStephan Aßmus 		_DrawFrame(view, rect,
17474f579098SStephan Aßmus 			dark1BorderColor, dark1BorderColor,
17484f579098SStephan Aßmus 			dark2BorderColor, dark2BorderColor, borders);
17494f579098SStephan Aßmus 	}
17502f86ba45SStephan Aßmus }
17512f86ba45SStephan Aßmus 
17522f86ba45SStephan Aßmus 
17532f86ba45SStephan Aßmus void
17542f86ba45SStephan Aßmus BControlLook::DrawGroupFrame(BView* view, BRect& rect, const BRect& updateRect,
17552f86ba45SStephan Aßmus 	const rgb_color& base, uint32 borders)
17562f86ba45SStephan Aßmus {
17572f86ba45SStephan Aßmus 	rgb_color frameColor = tint_color(base, 1.30);
17582f86ba45SStephan Aßmus 	rgb_color bevelLight = tint_color(base, 0.8);
17592f86ba45SStephan Aßmus 	rgb_color bevelShadow = tint_color(base, 1.03);
17602f86ba45SStephan Aßmus 
17612f86ba45SStephan Aßmus 	_DrawFrame(view, rect, bevelShadow, bevelShadow, bevelLight, bevelLight,
17622f86ba45SStephan Aßmus 		borders);
17632f86ba45SStephan Aßmus 
17642f86ba45SStephan Aßmus 	_DrawFrame(view, rect, frameColor, frameColor, frameColor, frameColor,
17652f86ba45SStephan Aßmus 		borders);
17662f86ba45SStephan Aßmus 
17672f86ba45SStephan Aßmus 	_DrawFrame(view, rect, bevelLight, bevelLight, bevelShadow, bevelShadow,
17682f86ba45SStephan Aßmus 		borders);
17692f86ba45SStephan Aßmus }
17702f86ba45SStephan Aßmus 
17712f86ba45SStephan Aßmus 
17722f86ba45SStephan Aßmus void
17732f86ba45SStephan Aßmus BControlLook::DrawLabel(BView* view, const char* label, BRect rect,
17742f86ba45SStephan Aßmus 	const BRect& updateRect, const rgb_color& base, uint32 flags)
17752f86ba45SStephan Aßmus {
17762f86ba45SStephan Aßmus 	DrawLabel(view, label, rect, updateRect, base, flags,
17772f86ba45SStephan Aßmus 		DefaultLabelAlignment());
17782f86ba45SStephan Aßmus }
17792f86ba45SStephan Aßmus 
17802f86ba45SStephan Aßmus 
17812f86ba45SStephan Aßmus void
17822f86ba45SStephan Aßmus BControlLook::DrawLabel(BView* view, const char* label, BRect rect,
17832f86ba45SStephan Aßmus 	const BRect& updateRect, const rgb_color& base, uint32 flags,
17842f86ba45SStephan Aßmus 	const BAlignment& alignment)
17852f86ba45SStephan Aßmus {
17862f86ba45SStephan Aßmus 	if (!rect.Intersects(updateRect))
17872f86ba45SStephan Aßmus 		return;
17882f86ba45SStephan Aßmus 
17892f86ba45SStephan Aßmus 	// truncate the label if necessary and get the width and height
17902f86ba45SStephan Aßmus 	BString truncatedLabel(label);
17912f86ba45SStephan Aßmus 
17922f86ba45SStephan Aßmus 	BFont font;
17932f86ba45SStephan Aßmus 	view->GetFont(&font);
17942f86ba45SStephan Aßmus 
17952f86ba45SStephan Aßmus 	float width = rect.Width();
17962f86ba45SStephan Aßmus 	font.TruncateString(&truncatedLabel, B_TRUNCATE_END, width);
17972f86ba45SStephan Aßmus 	width = font.StringWidth(truncatedLabel.String());
17982f86ba45SStephan Aßmus 
17992f86ba45SStephan Aßmus 	font_height fontHeight;
18002f86ba45SStephan Aßmus 	font.GetHeight(&fontHeight);
18012f86ba45SStephan Aßmus 	float height = ceilf(fontHeight.ascent) + ceilf(fontHeight.descent);
18022f86ba45SStephan Aßmus 
18032f86ba45SStephan Aßmus 	// handle alignment
18042f86ba45SStephan Aßmus 	BPoint location;
18052f86ba45SStephan Aßmus 
18062f86ba45SStephan Aßmus 	switch (alignment.horizontal) {
18072f86ba45SStephan Aßmus 	default:
18082f86ba45SStephan Aßmus 		case B_ALIGN_LEFT:
18092f86ba45SStephan Aßmus 			location.x = rect.left;
18102f86ba45SStephan Aßmus 			break;
18112f86ba45SStephan Aßmus 		case B_ALIGN_RIGHT:
18122f86ba45SStephan Aßmus 			location.x = rect.right - width;
18132f86ba45SStephan Aßmus 			break;
18142f86ba45SStephan Aßmus 		case B_ALIGN_CENTER:
18152f86ba45SStephan Aßmus 			location.x = (rect.left + rect.right - width) / 2.0f;
18162f86ba45SStephan Aßmus 			break;
18172f86ba45SStephan Aßmus 	}
18182f86ba45SStephan Aßmus 
18192f86ba45SStephan Aßmus 	switch (alignment.vertical) {
18202f86ba45SStephan Aßmus 		case B_ALIGN_TOP:
18212f86ba45SStephan Aßmus 			location.y = rect.top + ceilf(fontHeight.ascent);
18222f86ba45SStephan Aßmus 			break;
18232f86ba45SStephan Aßmus 		default:
18242f86ba45SStephan Aßmus 		case B_ALIGN_MIDDLE:
18252f86ba45SStephan Aßmus 			location.y = floorf((rect.top + rect.bottom - height) / 2.0f + 0.5f)
18262f86ba45SStephan Aßmus 				+ ceilf(fontHeight.ascent);
18272f86ba45SStephan Aßmus 			break;
18282f86ba45SStephan Aßmus 		case B_ALIGN_BOTTOM:
18292f86ba45SStephan Aßmus 			location.y = rect.bottom - ceilf(fontHeight.descent);
18302f86ba45SStephan Aßmus 			break;
18312f86ba45SStephan Aßmus 	}
18322f86ba45SStephan Aßmus 
1833c4e211feSStephan Aßmus 	DrawLabel(view, truncatedLabel.String(), base, flags, location);
1834c4e211feSStephan Aßmus }
1835c4e211feSStephan Aßmus 
1836c4e211feSStephan Aßmus 
1837c4e211feSStephan Aßmus void
1838c4e211feSStephan Aßmus BControlLook::DrawLabel(BView* view, const char* label, const rgb_color& base,
1839c4e211feSStephan Aßmus 	uint32 flags, const BPoint& where)
1840c4e211feSStephan Aßmus {
1841c4e211feSStephan Aßmus 	// setup the text color
1842c4e211feSStephan Aßmus 	// TODO: Should either use the ui_color(B_CONTROL_TEXT_COLOR) here,
1843c4e211feSStephan Aßmus 	// or elliminate that constant alltogether (stippi: +1).
1844d63b75faSPhilippe Saint-Pierre 
1845d63b75faSPhilippe Saint-Pierre 	BWindow* window = view->Window();
1846d63b75faSPhilippe Saint-Pierre 	bool isDesktop = window
1847d63b75faSPhilippe Saint-Pierre 		&& window->Feel() == kPrivateDesktopWindowFeel
1848d63b75faSPhilippe Saint-Pierre 		&& window->Look() == kPrivateDesktopWindowLook
1849d63b75faSPhilippe Saint-Pierre 		&& view->Parent()
1850d63b75faSPhilippe Saint-Pierre 		&& view->Parent()->Parent() == NULL
1851d63b75faSPhilippe Saint-Pierre 		&& (flags & B_IGNORE_OUTLINE) == 0;
1852d63b75faSPhilippe Saint-Pierre 
1853d63b75faSPhilippe Saint-Pierre 	rgb_color	low;
1854c4e211feSStephan Aßmus 	rgb_color	color;
1855d63b75faSPhilippe Saint-Pierre 	rgb_color	glowColor;
1856d63b75faSPhilippe Saint-Pierre 
1857d63b75faSPhilippe Saint-Pierre 	if (isDesktop)
1858d63b75faSPhilippe Saint-Pierre 		low = view->Parent()->ViewColor();
1859c4e211feSStephan Aßmus 	else
1860d63b75faSPhilippe Saint-Pierre 		low = base;
1861d63b75faSPhilippe Saint-Pierre 
1862d63b75faSPhilippe Saint-Pierre 	if (low.red + low.green + low.blue > 128 * 3) {
1863d63b75faSPhilippe Saint-Pierre 		color = tint_color(low, B_DARKEN_MAX_TINT);
1864d63b75faSPhilippe Saint-Pierre 		glowColor = kWhite;
1865d63b75faSPhilippe Saint-Pierre 	} else {
1866d63b75faSPhilippe Saint-Pierre 		color = tint_color(low, B_LIGHTEN_MAX_TINT);
1867d63b75faSPhilippe Saint-Pierre 		glowColor = kBlack;
1868d63b75faSPhilippe Saint-Pierre 	}
1869c4e211feSStephan Aßmus 
1870c4e211feSStephan Aßmus 	if (flags & B_DISABLED) {
1871d63b75faSPhilippe Saint-Pierre 		color.red = (uint8)(((int32)low.red + color.red + 1) / 2);
1872d63b75faSPhilippe Saint-Pierre 		color.green = (uint8)(((int32)low.green + color.green + 1) / 2);
1873d63b75faSPhilippe Saint-Pierre 		color.blue = (uint8)(((int32)low.blue + color.blue + 1) / 2);
1874d63b75faSPhilippe Saint-Pierre 	}
1875d63b75faSPhilippe Saint-Pierre 
1876d63b75faSPhilippe Saint-Pierre 	drawing_mode oldMode = view->DrawingMode();
1877d63b75faSPhilippe Saint-Pierre 
1878d63b75faSPhilippe Saint-Pierre 	// check if the drawing occurs on the desktop
1879d63b75faSPhilippe Saint-Pierre 	if (isDesktop) {
1880d63b75faSPhilippe Saint-Pierre 
1881d63b75faSPhilippe Saint-Pierre 		if (fCachedWorkspace != current_workspace()) {
1882d63b75faSPhilippe Saint-Pierre 
1883d63b75faSPhilippe Saint-Pierre 			int8 indice = 0;
1884d63b75faSPhilippe Saint-Pierre 			int32 mask;
1885d63b75faSPhilippe Saint-Pierre 			bool tmpOutline;
1886d63b75faSPhilippe Saint-Pierre 			while (fBackgroundInfo.FindInt32("be:bgndimginfoworkspaces",
1887d63b75faSPhilippe Saint-Pierre 					indice, &mask) == B_OK
1888d63b75faSPhilippe Saint-Pierre 				&& fBackgroundInfo.FindBool("be:bgndimginfoerasetext",
1889d63b75faSPhilippe Saint-Pierre 					indice, &tmpOutline) == B_OK) {
1890d63b75faSPhilippe Saint-Pierre 
1891d63b75faSPhilippe Saint-Pierre 				if (((1 << current_workspace()) & mask) != 0) {
1892d63b75faSPhilippe Saint-Pierre 					fCachedOutline = tmpOutline;
1893d63b75faSPhilippe Saint-Pierre 					fCachedWorkspace = current_workspace();
1894d63b75faSPhilippe Saint-Pierre 					break;
1895d63b75faSPhilippe Saint-Pierre 				}
1896d63b75faSPhilippe Saint-Pierre 				indice++;
1897d63b75faSPhilippe Saint-Pierre 			}
1898d63b75faSPhilippe Saint-Pierre 		}
1899d63b75faSPhilippe Saint-Pierre 
1900d63b75faSPhilippe Saint-Pierre 		if (fCachedOutline) {
1901d63b75faSPhilippe Saint-Pierre 			BFont font;
1902d63b75faSPhilippe Saint-Pierre 			view->GetFont(&font);
1903d63b75faSPhilippe Saint-Pierre 
1904d63b75faSPhilippe Saint-Pierre 			view->SetDrawingMode(B_OP_ALPHA);
1905d63b75faSPhilippe Saint-Pierre 			view->SetBlendingMode(B_CONSTANT_ALPHA, B_ALPHA_OVERLAY);
1906d63b75faSPhilippe Saint-Pierre 			// Draw glow or outline
1907d63b75faSPhilippe Saint-Pierre 			if (glowColor == kWhite) {
1908d63b75faSPhilippe Saint-Pierre 					font.SetFalseBoldWidth(2.0);
1909d63b75faSPhilippe Saint-Pierre 					view->SetFont(&font, B_FONT_FALSE_BOLD_WIDTH);
1910d63b75faSPhilippe Saint-Pierre 
1911d63b75faSPhilippe Saint-Pierre 					glowColor.alpha = 30;
1912d63b75faSPhilippe Saint-Pierre 					view->SetHighColor(glowColor);
1913d63b75faSPhilippe Saint-Pierre 					view->DrawString(label, where);
1914d63b75faSPhilippe Saint-Pierre 
1915d63b75faSPhilippe Saint-Pierre 					font.SetFalseBoldWidth(1.0);
1916d63b75faSPhilippe Saint-Pierre 					view->SetFont(&font, B_FONT_FALSE_BOLD_WIDTH);
1917d63b75faSPhilippe Saint-Pierre 
1918d63b75faSPhilippe Saint-Pierre 					glowColor.alpha = 65;
1919d63b75faSPhilippe Saint-Pierre 					view->SetHighColor(glowColor);
1920d63b75faSPhilippe Saint-Pierre 					view->DrawString(label, where);
1921d63b75faSPhilippe Saint-Pierre 
1922d63b75faSPhilippe Saint-Pierre 					font.SetFalseBoldWidth(0.0);
1923d63b75faSPhilippe Saint-Pierre 					view->SetFont(&font, B_FONT_FALSE_BOLD_WIDTH);
1924d63b75faSPhilippe Saint-Pierre 
1925d63b75faSPhilippe Saint-Pierre 			} else if (glowColor == kBlack) {
1926d63b75faSPhilippe Saint-Pierre 					font.SetFalseBoldWidth(1.0);
1927d63b75faSPhilippe Saint-Pierre 					view->SetFont(&font, B_FONT_FALSE_BOLD_WIDTH);
1928d63b75faSPhilippe Saint-Pierre 
1929d63b75faSPhilippe Saint-Pierre 					glowColor.alpha = 30;
1930d63b75faSPhilippe Saint-Pierre 					view->SetHighColor(glowColor);
1931d63b75faSPhilippe Saint-Pierre 					view->DrawString(label, where);
1932d63b75faSPhilippe Saint-Pierre 
1933d63b75faSPhilippe Saint-Pierre 					font.SetFalseBoldWidth(0.0);
1934d63b75faSPhilippe Saint-Pierre 					view->SetFont(&font, B_FONT_FALSE_BOLD_WIDTH);
1935d63b75faSPhilippe Saint-Pierre 
1936d63b75faSPhilippe Saint-Pierre 					glowColor.alpha = 200;
1937d63b75faSPhilippe Saint-Pierre 					view->SetHighColor(glowColor);
1938d63b75faSPhilippe Saint-Pierre 					view->DrawString(label, BPoint(where.x + 1, where.y + 1));
1939d63b75faSPhilippe Saint-Pierre 			}
1940d63b75faSPhilippe Saint-Pierre 		}
1941c4e211feSStephan Aßmus 	}
1942c4e211feSStephan Aßmus 
1943c4e211feSStephan Aßmus 	view->SetHighColor(color);
1944d63b75faSPhilippe Saint-Pierre 
1945c4e211feSStephan Aßmus 	view->SetDrawingMode(B_OP_OVER);
1946c4e211feSStephan Aßmus 
1947c4e211feSStephan Aßmus 	view->DrawString(label, where);
1948c4e211feSStephan Aßmus 
1949c4e211feSStephan Aßmus 	view->SetDrawingMode(oldMode);
19502f86ba45SStephan Aßmus }
19512f86ba45SStephan Aßmus 
19522f86ba45SStephan Aßmus 
1953d63b75faSPhilippe Saint-Pierre void
1954*d452ff66SAxel Dörfler BControlLook::SetBackgroundInfo(const BMessage& backgroundInfo)
1955d63b75faSPhilippe Saint-Pierre {
1956*d452ff66SAxel Dörfler 	fBackgroundInfo = backgroundInfo;
1957d63b75faSPhilippe Saint-Pierre 	fCachedWorkspace = -1;
1958d63b75faSPhilippe Saint-Pierre }
1959d63b75faSPhilippe Saint-Pierre 
1960d63b75faSPhilippe Saint-Pierre 
19612f86ba45SStephan Aßmus // #pragma mark -
19622f86ba45SStephan Aßmus 
19632f86ba45SStephan Aßmus 
19642f86ba45SStephan Aßmus void
196513cd46dfSStephan Aßmus BControlLook::_DrawButtonFrame(BView* view, BRect& rect,
1966681c2e44SStephan Aßmus 	const BRect& updateRect, const rgb_color& base, const rgb_color& background,
196713cd46dfSStephan Aßmus 	float contrast, float brightness, uint32 flags, uint32 borders)
196813cd46dfSStephan Aßmus {
196913cd46dfSStephan Aßmus 	// colors
197013cd46dfSStephan Aßmus 	rgb_color dark1BorderColor;
197113cd46dfSStephan Aßmus 	rgb_color dark2BorderColor;
197213cd46dfSStephan Aßmus 
197313cd46dfSStephan Aßmus 	if ((flags & B_DISABLED) == 0) {
19744f579098SStephan Aßmus 		if (flags & B_BLEND_FRAME) {
19754f579098SStephan Aßmus 			dark1BorderColor = (rgb_color){ 0, 0, 0, 75 };
19764f579098SStephan Aßmus 			dark2BorderColor = (rgb_color){ 0, 0, 0, 95 };
19774f579098SStephan Aßmus 		} else {
197813cd46dfSStephan Aßmus 			dark1BorderColor = tint_color(base, 1.33);
197913cd46dfSStephan Aßmus 			dark2BorderColor = tint_color(base, 1.45);
19804f579098SStephan Aßmus 		}
198113cd46dfSStephan Aßmus 
198213cd46dfSStephan Aßmus 		if (flags & B_DEFAULT_BUTTON) {
19834f579098SStephan Aßmus 			// TODO: B_BLEND_FRAME
198413cd46dfSStephan Aßmus 			dark2BorderColor = tint_color(dark1BorderColor, 1.5);
198513cd46dfSStephan Aßmus 			dark1BorderColor = tint_color(dark1BorderColor, 1.35);
198613cd46dfSStephan Aßmus 		}
198713cd46dfSStephan Aßmus 	} else {
19884f579098SStephan Aßmus 		// TODO: B_BLEND_FRAME
198913cd46dfSStephan Aßmus 		dark1BorderColor = tint_color(base, 1.147);
199013cd46dfSStephan Aßmus 		dark2BorderColor = tint_color(base, 1.24);
199113cd46dfSStephan Aßmus 
199213cd46dfSStephan Aßmus 		if (flags & B_DEFAULT_BUTTON) {
199374bb70aeSStephan Aßmus 			dark1BorderColor = tint_color(dark1BorderColor, 1.14);
199474bb70aeSStephan Aßmus 			dark2BorderColor = tint_color(dark1BorderColor, 1.12);
199513cd46dfSStephan Aßmus 		}
199613cd46dfSStephan Aßmus 	}
199713cd46dfSStephan Aßmus 
199813cd46dfSStephan Aßmus 	if (flags & B_ACTIVATED) {
199913cd46dfSStephan Aßmus 		rgb_color temp = dark2BorderColor;
200013cd46dfSStephan Aßmus 		dark2BorderColor = dark1BorderColor;
200113cd46dfSStephan Aßmus 		dark1BorderColor = temp;
200213cd46dfSStephan Aßmus 	}
200313cd46dfSStephan Aßmus 
200413cd46dfSStephan Aßmus 	// indicate focus by changing main button border
200513cd46dfSStephan Aßmus 	if (flags & B_FOCUSED) {
200613cd46dfSStephan Aßmus 		dark1BorderColor = ui_color(B_KEYBOARD_NAVIGATION_COLOR);
200713cd46dfSStephan Aßmus 		dark2BorderColor = dark1BorderColor;
200813cd46dfSStephan Aßmus 	}
200913cd46dfSStephan Aßmus 
201013cd46dfSStephan Aßmus 	if (flags & B_DEFAULT_BUTTON) {
20114f579098SStephan Aßmus 		// TODO: B_BLEND_FRAME
201213cd46dfSStephan Aßmus 		float focusTint = 1.2;
201313cd46dfSStephan Aßmus 		if (flags & B_DISABLED)
201413cd46dfSStephan Aßmus 			focusTint = (B_NO_TINT + focusTint) / 2;
201513cd46dfSStephan Aßmus 
201613cd46dfSStephan Aßmus 		rgb_color focusColor = tint_color(base, focusTint);
201713cd46dfSStephan Aßmus 		view->SetHighColor(base);
201813cd46dfSStephan Aßmus 
201913cd46dfSStephan Aßmus 		view->StrokeRect(rect);
202013cd46dfSStephan Aßmus 		rect.InsetBy(1.0, 1.0);
202113cd46dfSStephan Aßmus 
202213cd46dfSStephan Aßmus 		view->SetHighColor(focusColor);
202313cd46dfSStephan Aßmus 		view->StrokeRect(rect);
202413cd46dfSStephan Aßmus 		rect.InsetBy(1.0, 1.0);
202513cd46dfSStephan Aßmus 		view->StrokeRect(rect);
202613cd46dfSStephan Aßmus 		rect.InsetBy(1.0, 1.0);
202713cd46dfSStephan Aßmus 
202813cd46dfSStephan Aßmus 		// bevel around external border
202913cd46dfSStephan Aßmus 		_DrawOuterResessedFrame(view, rect, focusColor,
203074bb70aeSStephan Aßmus 			contrast * (((flags & B_DISABLED) ? 0.3 : 0.8)),
203174bb70aeSStephan Aßmus 			brightness * (((flags & B_DISABLED) ? 1.0 : 0.9)),
20324f579098SStephan Aßmus 			flags, borders);
203313cd46dfSStephan Aßmus 	} else {
203413cd46dfSStephan Aßmus 		// bevel around external border
2035681c2e44SStephan Aßmus 		_DrawOuterResessedFrame(view, rect, background,
203613cd46dfSStephan Aßmus 			contrast * ((flags & B_DISABLED) ? 0.0 : 1.0), brightness * 1.0,
20374f579098SStephan Aßmus 			flags, borders);
203813cd46dfSStephan Aßmus 	}
203913cd46dfSStephan Aßmus 
20404f579098SStephan Aßmus 	if (flags & B_BLEND_FRAME) {
20414f579098SStephan Aßmus 		drawing_mode oldDrawingMode = view->DrawingMode();
20424f579098SStephan Aßmus 		view->SetDrawingMode(B_OP_ALPHA);
20434f579098SStephan Aßmus 
204413cd46dfSStephan Aßmus 		_DrawFrame(view, rect, dark1BorderColor, dark1BorderColor,
204513cd46dfSStephan Aßmus 			dark2BorderColor, dark2BorderColor, borders);
20464f579098SStephan Aßmus 
20474f579098SStephan Aßmus 		view->SetDrawingMode(oldDrawingMode);
20484f579098SStephan Aßmus 	} else {
20494f579098SStephan Aßmus 		_DrawFrame(view, rect, dark1BorderColor, dark1BorderColor,
20504f579098SStephan Aßmus 			dark2BorderColor, dark2BorderColor, borders);
20514f579098SStephan Aßmus 	}
205213cd46dfSStephan Aßmus }
205313cd46dfSStephan Aßmus 
205413cd46dfSStephan Aßmus 
205513cd46dfSStephan Aßmus void
20562f86ba45SStephan Aßmus BControlLook::_DrawOuterResessedFrame(BView* view, BRect& rect,
20574f579098SStephan Aßmus 	const rgb_color& base, float contrast, float brightness, uint32 flags,
20584f579098SStephan Aßmus 	uint32 borders)
20592f86ba45SStephan Aßmus {
20604f579098SStephan Aßmus 	if (flags & B_BLEND_FRAME) {
20614f579098SStephan Aßmus 		// assumes the background has already been painted
20624f579098SStephan Aßmus 		drawing_mode oldDrawingMode = view->DrawingMode();
20634f579098SStephan Aßmus 		view->SetDrawingMode(B_OP_ALPHA);
20644f579098SStephan Aßmus 
20654f579098SStephan Aßmus 		uint8 alpha = uint8(20 * contrast);
20664f579098SStephan Aßmus 		uint32 white = uint8(255 * brightness);
20674f579098SStephan Aßmus 
20684f579098SStephan Aßmus 		rgb_color borderBevelShadow = (rgb_color){ 0, 0, 0, alpha };
20694f579098SStephan Aßmus 		rgb_color borderBevelLight = (rgb_color){ white, white, white, alpha };
20704f579098SStephan Aßmus 
20714f579098SStephan Aßmus 		_DrawFrame(view, rect, borderBevelShadow, borderBevelShadow,
20724f579098SStephan Aßmus 			borderBevelLight, borderBevelLight, borders);
20734f579098SStephan Aßmus 
20744f579098SStephan Aßmus 		view->SetDrawingMode(oldDrawingMode);
20754f579098SStephan Aßmus 	} else {
20762f86ba45SStephan Aßmus 		// colors
20772f86ba45SStephan Aßmus 		float tintLight = kEdgeBevelLightTint;
20782f86ba45SStephan Aßmus 		float tintShadow = kEdgeBevelShadowTint;
20792f86ba45SStephan Aßmus 
20802f86ba45SStephan Aßmus 		if (contrast == 0.0) {
20812f86ba45SStephan Aßmus 			tintLight = B_NO_TINT;
20822f86ba45SStephan Aßmus 			tintShadow = B_NO_TINT;
20832f86ba45SStephan Aßmus 		} else if (contrast != 1.0) {
20842f86ba45SStephan Aßmus 			tintLight = B_NO_TINT + (tintLight - B_NO_TINT) * contrast;
20852f86ba45SStephan Aßmus 			tintShadow = B_NO_TINT + (tintShadow - B_NO_TINT) * contrast;
20862f86ba45SStephan Aßmus 		}
20872f86ba45SStephan Aßmus 
20882f86ba45SStephan Aßmus 		rgb_color borderBevelShadow = tint_color(base, tintShadow);
20892f86ba45SStephan Aßmus 		rgb_color borderBevelLight = tint_color(base, tintLight);
20902f86ba45SStephan Aßmus 
20912f86ba45SStephan Aßmus 		if (brightness < 1.0) {
20922f86ba45SStephan Aßmus 			borderBevelShadow.red = uint8(borderBevelShadow.red * brightness);
20932f86ba45SStephan Aßmus 			borderBevelShadow.green = uint8(borderBevelShadow.green * brightness);
20942f86ba45SStephan Aßmus 			borderBevelShadow.blue = uint8(borderBevelShadow.blue * brightness);
20952f86ba45SStephan Aßmus 			borderBevelLight.red = uint8(borderBevelLight.red * brightness);
20962f86ba45SStephan Aßmus 			borderBevelLight.green = uint8(borderBevelLight.green * brightness);
20972f86ba45SStephan Aßmus 			borderBevelLight.blue = uint8(borderBevelLight.blue * brightness);
20982f86ba45SStephan Aßmus 		}
20992f86ba45SStephan Aßmus 
21002f86ba45SStephan Aßmus 		_DrawFrame(view, rect, borderBevelShadow, borderBevelShadow,
21012f86ba45SStephan Aßmus 			borderBevelLight, borderBevelLight, borders);
21022f86ba45SStephan Aßmus 	}
21034f579098SStephan Aßmus }
21042f86ba45SStephan Aßmus 
21052f86ba45SStephan Aßmus 
21062f86ba45SStephan Aßmus void
21072f86ba45SStephan Aßmus BControlLook::_DrawFrame(BView* view, BRect& rect, const rgb_color& left,
21082f86ba45SStephan Aßmus 	const rgb_color& top, const rgb_color& right, const rgb_color& bottom,
21092f86ba45SStephan Aßmus 	uint32 borders)
21102f86ba45SStephan Aßmus {
21112f86ba45SStephan Aßmus 	view->BeginLineArray(4);
21122f86ba45SStephan Aßmus 
21132f86ba45SStephan Aßmus 	if (borders & B_LEFT_BORDER) {
21142f86ba45SStephan Aßmus 		view->AddLine(
21152f86ba45SStephan Aßmus 			BPoint(rect.left, rect.bottom),
21162f86ba45SStephan Aßmus 			BPoint(rect.left, rect.top), left);
21172f86ba45SStephan Aßmus 		rect.left++;
21182f86ba45SStephan Aßmus 	}
21192f86ba45SStephan Aßmus 	if (borders & B_TOP_BORDER) {
21202f86ba45SStephan Aßmus 		view->AddLine(
21212f86ba45SStephan Aßmus 			BPoint(rect.left, rect.top),
21222f86ba45SStephan Aßmus 			BPoint(rect.right, rect.top), top);
21232f86ba45SStephan Aßmus 		rect.top++;
21242f86ba45SStephan Aßmus 	}
21252f86ba45SStephan Aßmus 	if (borders & B_RIGHT_BORDER) {
21262f86ba45SStephan Aßmus 		view->AddLine(
21272f86ba45SStephan Aßmus 			BPoint(rect.right, rect.top),
21282f86ba45SStephan Aßmus 			BPoint(rect.right, rect.bottom), right);
21292f86ba45SStephan Aßmus 		rect.right--;
21302f86ba45SStephan Aßmus 	}
21312f86ba45SStephan Aßmus 	if (borders & B_BOTTOM_BORDER) {
21322f86ba45SStephan Aßmus 		view->AddLine(
21332f86ba45SStephan Aßmus 			BPoint(rect.left, rect.bottom),
21342f86ba45SStephan Aßmus 			BPoint(rect.right, rect.bottom), bottom);
21352f86ba45SStephan Aßmus 		rect.bottom--;
21362f86ba45SStephan Aßmus 	}
21372f86ba45SStephan Aßmus 
21382f86ba45SStephan Aßmus 	view->EndLineArray();
21392f86ba45SStephan Aßmus }
21402f86ba45SStephan Aßmus 
21412f86ba45SStephan Aßmus 
21422f86ba45SStephan Aßmus void
21432f86ba45SStephan Aßmus BControlLook::_DrawFrame(BView* view, BRect& rect, const rgb_color& left,
21442f86ba45SStephan Aßmus 	const rgb_color& top, const rgb_color& right, const rgb_color& bottom,
21452f86ba45SStephan Aßmus 	const rgb_color& rightTop, const rgb_color& leftBottom, uint32 borders)
21462f86ba45SStephan Aßmus {
21472f86ba45SStephan Aßmus 	view->BeginLineArray(6);
21482f86ba45SStephan Aßmus 
21492f86ba45SStephan Aßmus 	if (borders & B_TOP_BORDER) {
21502f86ba45SStephan Aßmus 		if (borders & B_RIGHT_BORDER) {
21512f86ba45SStephan Aßmus 			view->AddLine(
21522f86ba45SStephan Aßmus 				BPoint(rect.left, rect.top),
21532f86ba45SStephan Aßmus 				BPoint(rect.right - 1, rect.top), top);
21542f86ba45SStephan Aßmus 			view->AddLine(
21552f86ba45SStephan Aßmus 				BPoint(rect.right, rect.top),
21562f86ba45SStephan Aßmus 				BPoint(rect.right, rect.top), rightTop);
21572f86ba45SStephan Aßmus 		} else {
21582f86ba45SStephan Aßmus 			view->AddLine(
21592f86ba45SStephan Aßmus 				BPoint(rect.left, rect.top),
21602f86ba45SStephan Aßmus 				BPoint(rect.right, rect.top), top);
21612f86ba45SStephan Aßmus 		}
21622f86ba45SStephan Aßmus 		rect.top++;
21632f86ba45SStephan Aßmus 	}
21642f86ba45SStephan Aßmus 
21652f86ba45SStephan Aßmus 	if (borders & B_LEFT_BORDER) {
21662f86ba45SStephan Aßmus 		view->AddLine(
21672f86ba45SStephan Aßmus 			BPoint(rect.left, rect.top),
21682f86ba45SStephan Aßmus 			BPoint(rect.left, rect.bottom - 1), left);
21692f86ba45SStephan Aßmus 		view->AddLine(
21702f86ba45SStephan Aßmus 			BPoint(rect.left, rect.bottom),
21712f86ba45SStephan Aßmus 			BPoint(rect.left, rect.bottom), leftBottom);
21722f86ba45SStephan Aßmus 		rect.left++;
21732f86ba45SStephan Aßmus 	}
21742f86ba45SStephan Aßmus 
21752f86ba45SStephan Aßmus 	if (borders & B_BOTTOM_BORDER) {
21762f86ba45SStephan Aßmus 		view->AddLine(
21772f86ba45SStephan Aßmus 			BPoint(rect.left, rect.bottom),
21782f86ba45SStephan Aßmus 			BPoint(rect.right, rect.bottom), bottom);
21792f86ba45SStephan Aßmus 		rect.bottom--;
21802f86ba45SStephan Aßmus 	}
21812f86ba45SStephan Aßmus 
21822f86ba45SStephan Aßmus 	if (borders & B_RIGHT_BORDER) {
21832f86ba45SStephan Aßmus 		view->AddLine(
21842f86ba45SStephan Aßmus 			BPoint(rect.right, rect.bottom),
21852f86ba45SStephan Aßmus 			BPoint(rect.right, rect.top), right);
21862f86ba45SStephan Aßmus 		rect.right--;
21872f86ba45SStephan Aßmus 	}
21882f86ba45SStephan Aßmus 
21892f86ba45SStephan Aßmus 	view->EndLineArray();
21902f86ba45SStephan Aßmus }
21912f86ba45SStephan Aßmus 
21922f86ba45SStephan Aßmus 
21932f86ba45SStephan Aßmus //void
21942f86ba45SStephan Aßmus //BControlLook::_DrawShadowFrame(BView* view, BRect& rect, const rgb_color& base,
21952f86ba45SStephan Aßmus //	uint32 borders)
21962f86ba45SStephan Aßmus //{
21972f86ba45SStephan Aßmus //	view->BeginLineArray(4);
21982f86ba45SStephan Aßmus //
21992f86ba45SStephan Aßmus //	bevelColor1 = tint_color(base, 1.2);
22002f86ba45SStephan Aßmus //	bevelColor2 = tint_color(base, 1.1);
22012f86ba45SStephan Aßmus //
22022f86ba45SStephan Aßmus //	// shadow along left/top borders
22032f86ba45SStephan Aßmus //	if (rect.Height() > 0 && borders & B_LEFT_BORDER) {
22042f86ba45SStephan Aßmus //		view->AddLine(BPoint(rect.left, rect.top),
22052f86ba45SStephan Aßmus //			BPoint(rect.left, rect.bottom), bevelColor1);
22062f86ba45SStephan Aßmus //		rect.left++;
22072f86ba45SStephan Aßmus //	}
22082f86ba45SStephan Aßmus //	if (rect.Width() > 0 && borders & B_TOP_BORDER) {
22092f86ba45SStephan Aßmus //		view->AddLine(BPoint(rect.left, rect.top),
22102f86ba45SStephan Aßmus //			BPoint(rect.right, rect.top), bevelColor1);
22112f86ba45SStephan Aßmus //		rect.top++;
22122f86ba45SStephan Aßmus //	}
22132f86ba45SStephan Aßmus //
22142f86ba45SStephan Aßmus //	// softer shadow along left/top borders
22152f86ba45SStephan Aßmus //	if (rect.Height() > 0 && borders & B_LEFT_BORDER) {
22162f86ba45SStephan Aßmus //		view->AddLine(BPoint(rect.left, rect.top),
22172f86ba45SStephan Aßmus //			BPoint(rect.left, rect.bottom), bevelColor2);
22182f86ba45SStephan Aßmus //		rect.left++;
22192f86ba45SStephan Aßmus //	}
22202f86ba45SStephan Aßmus //	if (rect.Width() > 0 && borders & B_TOP_BORDER) {
22212f86ba45SStephan Aßmus //		view->AddLine(BPoint(rect.left, rect.top),
22222f86ba45SStephan Aßmus //			BPoint(rect.right, rect.top), bevelColor2);
22232f86ba45SStephan Aßmus //		rect.top++;
22242f86ba45SStephan Aßmus //	}
22252f86ba45SStephan Aßmus //
22262f86ba45SStephan Aßmus //	view->EndLineArray();
22272f86ba45SStephan Aßmus //}
22282f86ba45SStephan Aßmus 
22292f86ba45SStephan Aßmus 
22302f86ba45SStephan Aßmus void
22312f86ba45SStephan Aßmus BControlLook::_FillGradient(BView* view, const BRect& rect,
22322f86ba45SStephan Aßmus 	const rgb_color& base, float topTint, float bottomTint,
22332f86ba45SStephan Aßmus 	enum orientation orientation)
22342f86ba45SStephan Aßmus {
22352f86ba45SStephan Aßmus 	BGradientLinear gradient;
22362f86ba45SStephan Aßmus 	_MakeGradient(gradient, rect, base, topTint, bottomTint, orientation);
22372f86ba45SStephan Aßmus 	view->FillRect(rect, gradient);
22382f86ba45SStephan Aßmus }
22392f86ba45SStephan Aßmus 
22402f86ba45SStephan Aßmus 
22412f86ba45SStephan Aßmus void
22422f86ba45SStephan Aßmus BControlLook::_FillGlossyGradient(BView* view, const BRect& rect,
22432f86ba45SStephan Aßmus 	const rgb_color& base, float topTint, float middle1Tint,
22442f86ba45SStephan Aßmus 	float middle2Tint, float bottomTint, enum orientation orientation)
22452f86ba45SStephan Aßmus {
22462f86ba45SStephan Aßmus 	BGradientLinear gradient;
22472f86ba45SStephan Aßmus 	_MakeGlossyGradient(gradient, rect, base, topTint, middle1Tint,
22482f86ba45SStephan Aßmus 		middle2Tint, bottomTint, orientation);
22492f86ba45SStephan Aßmus 	view->FillRect(rect, gradient);
22502f86ba45SStephan Aßmus }
22512f86ba45SStephan Aßmus 
22522f86ba45SStephan Aßmus 
22532f86ba45SStephan Aßmus void
22542f86ba45SStephan Aßmus BControlLook::_MakeGradient(BGradientLinear& gradient, const BRect& rect,
22552f86ba45SStephan Aßmus 	const rgb_color& base, float topTint, float bottomTint,
22562f86ba45SStephan Aßmus 	enum orientation orientation) const
22572f86ba45SStephan Aßmus {
22582f86ba45SStephan Aßmus 	gradient.AddColor(tint_color(base, topTint), 0);
22592f86ba45SStephan Aßmus 	gradient.AddColor(tint_color(base, bottomTint), 255);
22602f86ba45SStephan Aßmus 	gradient.SetStart(rect.LeftTop());
22612f86ba45SStephan Aßmus 	if (orientation == B_HORIZONTAL)
22622f86ba45SStephan Aßmus 		gradient.SetEnd(rect.LeftBottom());
22632f86ba45SStephan Aßmus 	else
22642f86ba45SStephan Aßmus 		gradient.SetEnd(rect.RightTop());
22652f86ba45SStephan Aßmus }
22662f86ba45SStephan Aßmus 
22672f86ba45SStephan Aßmus 
22682f86ba45SStephan Aßmus void
22692f86ba45SStephan Aßmus BControlLook::_MakeGlossyGradient(BGradientLinear& gradient, const BRect& rect,
22702f86ba45SStephan Aßmus 	const rgb_color& base, float topTint, float middle1Tint,
22712f86ba45SStephan Aßmus 	float middle2Tint, float bottomTint,
22722f86ba45SStephan Aßmus 	enum orientation orientation) const
22732f86ba45SStephan Aßmus {
22742f86ba45SStephan Aßmus 	gradient.AddColor(tint_color(base, topTint), 0);
22752f86ba45SStephan Aßmus 	gradient.AddColor(tint_color(base, middle1Tint), 132);
22762f86ba45SStephan Aßmus 	gradient.AddColor(tint_color(base, middle2Tint), 136);
22772f86ba45SStephan Aßmus 	gradient.AddColor(tint_color(base, bottomTint), 255);
22782f86ba45SStephan Aßmus 	gradient.SetStart(rect.LeftTop());
22792f86ba45SStephan Aßmus 	if (orientation == B_HORIZONTAL)
22802f86ba45SStephan Aßmus 		gradient.SetEnd(rect.LeftBottom());
22812f86ba45SStephan Aßmus 	else
22822f86ba45SStephan Aßmus 		gradient.SetEnd(rect.RightTop());
22832f86ba45SStephan Aßmus }
22842f86ba45SStephan Aßmus 
22852f86ba45SStephan Aßmus 
22862f86ba45SStephan Aßmus bool
22872f86ba45SStephan Aßmus BControlLook::_RadioButtonAndCheckBoxMarkColor(const rgb_color& base,
22882f86ba45SStephan Aßmus 	rgb_color& color, uint32 flags) const
22892f86ba45SStephan Aßmus {
22902f86ba45SStephan Aßmus 	if ((flags & (B_ACTIVATED | B_CLICKED)) == 0) {
22912f86ba45SStephan Aßmus 		// no mark to be drawn at all
22922f86ba45SStephan Aßmus 		return false;
22932f86ba45SStephan Aßmus 	}
22942f86ba45SStephan Aßmus 
22952f86ba45SStephan Aßmus 	// TODO: Get from UI settings
22962f86ba45SStephan Aßmus 	color.red = 27;
22972f86ba45SStephan Aßmus 	color.green = 82;
22982f86ba45SStephan Aßmus 	color.blue = 140;
22992f86ba45SStephan Aßmus 
23002f86ba45SStephan Aßmus 	float mix = 1.0;
23012f86ba45SStephan Aßmus 
23022f86ba45SStephan Aßmus 	if (flags & B_DISABLED) {
23032f86ba45SStephan Aßmus 		// activated, but disabled
23042f86ba45SStephan Aßmus 		mix = 0.4;
23052f86ba45SStephan Aßmus 	} else if (flags & B_CLICKED) {
23062f86ba45SStephan Aßmus 		if (flags & B_ACTIVATED) {
23072f86ba45SStephan Aßmus 			// loosing activation
23082f86ba45SStephan Aßmus 			mix = 0.7;
23092f86ba45SStephan Aßmus 		} else {
23102f86ba45SStephan Aßmus 			// becoming activated
23112f86ba45SStephan Aßmus 			mix = 0.3;
23122f86ba45SStephan Aßmus 		}
23132f86ba45SStephan Aßmus 	} else {
23142f86ba45SStephan Aßmus 		// simply activated
23152f86ba45SStephan Aßmus 	}
23162f86ba45SStephan Aßmus 
23172f86ba45SStephan Aßmus 	color.red = uint8(color.red * mix + base.red * (1.0 - mix));
23182f86ba45SStephan Aßmus 	color.green = uint8(color.green * mix + base.green * (1.0 - mix));
23192f86ba45SStephan Aßmus 	color.blue = uint8(color.blue * mix + base.blue * (1.0 - mix));
23202f86ba45SStephan Aßmus 
23212f86ba45SStephan Aßmus 	return true;
23222f86ba45SStephan Aßmus }
23232f86ba45SStephan Aßmus 
23242f86ba45SStephan Aßmus 
23252f86ba45SStephan Aßmus void
23262f86ba45SStephan Aßmus BControlLook::_DrawRoundBarCorner(BView* view, BRect& rect,
23272f86ba45SStephan Aßmus 	const BRect& updateRect,
23282f86ba45SStephan Aßmus 	const rgb_color& edgeLightColor, const rgb_color& edgeShadowColor,
23292f86ba45SStephan Aßmus 	const rgb_color& frameLightColor, const rgb_color& frameShadowColor,
23302f86ba45SStephan Aßmus 	const rgb_color& fillLightColor, const rgb_color& fillShadowColor,
23312f86ba45SStephan Aßmus 	float leftInset, float topInset, float rightInset, float bottomInset,
23322f86ba45SStephan Aßmus 	enum orientation orientation)
23332f86ba45SStephan Aßmus {
23342f86ba45SStephan Aßmus 	if (!rect.IsValid() || !rect.Intersects(updateRect))
23352f86ba45SStephan Aßmus 		return;
23362f86ba45SStephan Aßmus 
23372f86ba45SStephan Aßmus 	BGradientLinear gradient;
23382f86ba45SStephan Aßmus 	gradient.AddColor(edgeShadowColor, 0);
23392f86ba45SStephan Aßmus 	gradient.AddColor(edgeLightColor, 255);
23402f86ba45SStephan Aßmus 	gradient.SetStart(rect.LeftTop());
23412f86ba45SStephan Aßmus 	if (orientation == B_HORIZONTAL)
23422f86ba45SStephan Aßmus 		gradient.SetEnd(rect.LeftBottom());
23432f86ba45SStephan Aßmus 	else
23442f86ba45SStephan Aßmus 		gradient.SetEnd(rect.RightTop());
23452f86ba45SStephan Aßmus 
23462f86ba45SStephan Aßmus 	view->FillEllipse(rect, gradient);
23472f86ba45SStephan Aßmus 
23482f86ba45SStephan Aßmus 	rect.left += leftInset;
23492f86ba45SStephan Aßmus 	rect.top += topInset;
23502f86ba45SStephan Aßmus 	rect.right += rightInset;
23512f86ba45SStephan Aßmus 	rect.bottom += bottomInset;
23522f86ba45SStephan Aßmus 
23532f86ba45SStephan Aßmus 	gradient.MakeEmpty();
23542f86ba45SStephan Aßmus 	gradient.AddColor(frameShadowColor, 0);
23552f86ba45SStephan Aßmus 	gradient.AddColor(frameLightColor, 255);
23562f86ba45SStephan Aßmus 	gradient.SetStart(rect.LeftTop());
23572f86ba45SStephan Aßmus 	if (orientation == B_HORIZONTAL)
23582f86ba45SStephan Aßmus 		gradient.SetEnd(rect.LeftBottom());
23592f86ba45SStephan Aßmus 	else
23602f86ba45SStephan Aßmus 		gradient.SetEnd(rect.RightTop());
23612f86ba45SStephan Aßmus 
23622f86ba45SStephan Aßmus 	view->FillEllipse(rect, gradient);
23632f86ba45SStephan Aßmus 
23642f86ba45SStephan Aßmus 	rect.left += leftInset;
23652f86ba45SStephan Aßmus 	rect.top += topInset;
23662f86ba45SStephan Aßmus 	rect.right += rightInset;
23672f86ba45SStephan Aßmus 	rect.bottom += bottomInset;
23682f86ba45SStephan Aßmus 
23692f86ba45SStephan Aßmus 	gradient.MakeEmpty();
23702f86ba45SStephan Aßmus 	gradient.AddColor(fillShadowColor, 0);
23712f86ba45SStephan Aßmus 	gradient.AddColor(fillLightColor, 255);
23722f86ba45SStephan Aßmus 	gradient.SetStart(rect.LeftTop());
23732f86ba45SStephan Aßmus 	if (orientation == B_HORIZONTAL)
23742f86ba45SStephan Aßmus 		gradient.SetEnd(rect.LeftBottom());
23752f86ba45SStephan Aßmus 	else
23762f86ba45SStephan Aßmus 		gradient.SetEnd(rect.RightTop());
23772f86ba45SStephan Aßmus 
23782f86ba45SStephan Aßmus 	view->FillEllipse(rect, gradient);
23792f86ba45SStephan Aßmus }
23802f86ba45SStephan Aßmus 
23812f86ba45SStephan Aßmus 
23822f86ba45SStephan Aßmus void
23832f86ba45SStephan Aßmus BControlLook::_DrawRoundCornerLeftTop(BView* view, BRect& rect,
23842f86ba45SStephan Aßmus 	const BRect& updateRect, const rgb_color& base, const rgb_color& edgeColor,
23852f86ba45SStephan Aßmus 	const rgb_color& frameColor, const rgb_color& bevelColor,
23862f86ba45SStephan Aßmus 	const BGradientLinear& fillGradient)
23872f86ba45SStephan Aßmus {
23882f86ba45SStephan Aßmus 	if (!rect.IsValid() || !rect.Intersects(updateRect))
23892f86ba45SStephan Aßmus 		return;
23902f86ba45SStephan Aßmus 
23912f86ba45SStephan Aßmus 	BRegion clipping(rect);
23922f86ba45SStephan Aßmus 	view->ConstrainClippingRegion(&clipping);
23932f86ba45SStephan Aßmus 
23942f86ba45SStephan Aßmus 	// background
23952f86ba45SStephan Aßmus 	view->SetHighColor(base);
23962f86ba45SStephan Aßmus 	view->FillRect(rect);
23972f86ba45SStephan Aßmus 
23982f86ba45SStephan Aßmus 	// outer edge
23992f86ba45SStephan Aßmus 	BRect ellipseRect(rect);
24002f86ba45SStephan Aßmus 	ellipseRect.right = ellipseRect.left + ellipseRect.Width() * 2;
24012f86ba45SStephan Aßmus 	ellipseRect.bottom = ellipseRect.top + ellipseRect.Height() * 2;
24022f86ba45SStephan Aßmus 
24032f86ba45SStephan Aßmus 	view->SetHighColor(edgeColor);
24042f86ba45SStephan Aßmus 	view->FillEllipse(ellipseRect);
24052f86ba45SStephan Aßmus 
24062f86ba45SStephan Aßmus 	// frame
24072f86ba45SStephan Aßmus 	ellipseRect.InsetBy(1, 1);
24082f86ba45SStephan Aßmus 	view->SetHighColor(frameColor);
24092f86ba45SStephan Aßmus 	view->FillEllipse(ellipseRect);
24102f86ba45SStephan Aßmus 
24112f86ba45SStephan Aßmus 	// bevel
24122f86ba45SStephan Aßmus 	ellipseRect.InsetBy(1, 1);
24132f86ba45SStephan Aßmus 	view->SetHighColor(bevelColor);
24142f86ba45SStephan Aßmus 	view->FillEllipse(ellipseRect);
24152f86ba45SStephan Aßmus 
24162f86ba45SStephan Aßmus 	// fill
24172f86ba45SStephan Aßmus 	ellipseRect.InsetBy(1, 1);
24182f86ba45SStephan Aßmus 	view->FillEllipse(ellipseRect, fillGradient);
24192f86ba45SStephan Aßmus 
24202f86ba45SStephan Aßmus 	view->ConstrainClippingRegion(NULL);
24212f86ba45SStephan Aßmus }
24222f86ba45SStephan Aßmus 
24232f86ba45SStephan Aßmus void
24242f86ba45SStephan Aßmus BControlLook::_DrawRoundCornerRightTop(BView* view, BRect& rect,
24252f86ba45SStephan Aßmus 	const BRect& updateRect, const rgb_color& base,
24262f86ba45SStephan Aßmus 	const rgb_color& edgeTopColor, const rgb_color& edgeRightColor,
24272f86ba45SStephan Aßmus 	const rgb_color& frameTopColor, const rgb_color& frameRightColor,
24282f86ba45SStephan Aßmus 	const rgb_color& bevelTopColor, const rgb_color& bevelRightColor,
24292f86ba45SStephan Aßmus 	const BGradientLinear& fillGradient)
24302f86ba45SStephan Aßmus {
24312f86ba45SStephan Aßmus 	if (!rect.IsValid() || !rect.Intersects(updateRect))
24322f86ba45SStephan Aßmus 		return;
24332f86ba45SStephan Aßmus 
24342f86ba45SStephan Aßmus 	BRegion clipping(rect);
24352f86ba45SStephan Aßmus 	view->ConstrainClippingRegion(&clipping);
24362f86ba45SStephan Aßmus 
24372f86ba45SStephan Aßmus 	// background
24382f86ba45SStephan Aßmus 	view->SetHighColor(base);
24392f86ba45SStephan Aßmus 	view->FillRect(rect);
24402f86ba45SStephan Aßmus 
24412f86ba45SStephan Aßmus 	// outer edge
24422f86ba45SStephan Aßmus 	BRect ellipseRect(rect);
24432f86ba45SStephan Aßmus 	ellipseRect.left = ellipseRect.right - ellipseRect.Width() * 2;
24442f86ba45SStephan Aßmus 	ellipseRect.bottom = ellipseRect.top + ellipseRect.Height() * 2;
24452f86ba45SStephan Aßmus 
24462f86ba45SStephan Aßmus 	BGradientLinear gradient;
24472f86ba45SStephan Aßmus 	gradient.AddColor(edgeTopColor, 0);
24482f86ba45SStephan Aßmus 	gradient.AddColor(edgeRightColor, 255);
24492f86ba45SStephan Aßmus 	gradient.SetStart(rect.LeftTop());
24502f86ba45SStephan Aßmus 	gradient.SetEnd(rect.RightBottom());
24512f86ba45SStephan Aßmus 	view->FillEllipse(ellipseRect, gradient);
24522f86ba45SStephan Aßmus 
24532f86ba45SStephan Aßmus 	// frame
24542f86ba45SStephan Aßmus 	ellipseRect.InsetBy(1, 1);
24552f86ba45SStephan Aßmus 	rect.right--;
24562f86ba45SStephan Aßmus 	rect.top++;
24572f86ba45SStephan Aßmus 	if (frameTopColor == frameRightColor) {
24582f86ba45SStephan Aßmus 		view->SetHighColor(frameTopColor);
24592f86ba45SStephan Aßmus 		view->FillEllipse(ellipseRect);
24602f86ba45SStephan Aßmus 	} else {
24612f86ba45SStephan Aßmus 		gradient.SetColor(0, frameTopColor);
24622f86ba45SStephan Aßmus 		gradient.SetColor(1, frameRightColor);
24632f86ba45SStephan Aßmus 		gradient.SetStart(rect.LeftTop());
24642f86ba45SStephan Aßmus 		gradient.SetEnd(rect.RightBottom());
24652f86ba45SStephan Aßmus 		view->FillEllipse(ellipseRect, gradient);
24662f86ba45SStephan Aßmus 	}
24672f86ba45SStephan Aßmus 
24682f86ba45SStephan Aßmus 	// bevel
24692f86ba45SStephan Aßmus 	ellipseRect.InsetBy(1, 1);
24702f86ba45SStephan Aßmus 	rect.right--;
24712f86ba45SStephan Aßmus 	rect.top++;
24722f86ba45SStephan Aßmus 	gradient.SetColor(0, bevelTopColor);
24732f86ba45SStephan Aßmus 	gradient.SetColor(1, bevelRightColor);
24742f86ba45SStephan Aßmus 	gradient.SetStart(rect.LeftTop());
24752f86ba45SStephan Aßmus 	gradient.SetEnd(rect.RightBottom());
24762f86ba45SStephan Aßmus 	view->FillEllipse(ellipseRect, gradient);
24772f86ba45SStephan Aßmus 
24782f86ba45SStephan Aßmus 	// fill
24792f86ba45SStephan Aßmus 	ellipseRect.InsetBy(1, 1);
24802f86ba45SStephan Aßmus 	view->FillEllipse(ellipseRect, fillGradient);
24812f86ba45SStephan Aßmus 
24822f86ba45SStephan Aßmus 	view->ConstrainClippingRegion(NULL);
24832f86ba45SStephan Aßmus }
24842f86ba45SStephan Aßmus 
24852f86ba45SStephan Aßmus 
24862f86ba45SStephan Aßmus // NOTE: May come from a add-on in the future. Initialized in
24872f86ba45SStephan Aßmus // InterfaceDefs.cpp
24882f86ba45SStephan Aßmus BControlLook* be_control_look = NULL;
24892f86ba45SStephan Aßmus 
24902f86ba45SStephan Aßmus } // namespace BPrivate
2491