xref: /haiku/src/kits/interface/ControlLook.cpp (revision 12ea5a2cfb193a9983cbf2447c614a3a81abdb87)
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  */
52f86ba45SStephan Aßmus #include <ControlLook.h>
62f86ba45SStephan Aßmus 
72f86ba45SStephan Aßmus #include <stdio.h>
82f86ba45SStephan Aßmus 
92f86ba45SStephan Aßmus #include <Control.h>
102f86ba45SStephan Aßmus #include <GradientLinear.h>
112f86ba45SStephan Aßmus #include <Region.h>
122f86ba45SStephan Aßmus #include <Shape.h>
132f86ba45SStephan Aßmus #include <String.h>
142f86ba45SStephan Aßmus #include <View.h>
152f86ba45SStephan Aßmus 
162f86ba45SStephan Aßmus namespace BPrivate {
172f86ba45SStephan Aßmus 
182f86ba45SStephan Aßmus static const float kEdgeBevelLightTint = 0.59;
192f86ba45SStephan Aßmus static const float kEdgeBevelShadowTint = 1.0735;
202f86ba45SStephan Aßmus 
212f86ba45SStephan Aßmus 
222f86ba45SStephan Aßmus BControlLook::BControlLook()
232f86ba45SStephan Aßmus {
242f86ba45SStephan Aßmus }
252f86ba45SStephan Aßmus 
262f86ba45SStephan Aßmus 
272f86ba45SStephan Aßmus BControlLook::~BControlLook()
282f86ba45SStephan Aßmus {
292f86ba45SStephan Aßmus }
302f86ba45SStephan Aßmus 
312f86ba45SStephan Aßmus 
322f86ba45SStephan Aßmus BAlignment
332f86ba45SStephan Aßmus BControlLook::DefaultLabelAlignment() const
342f86ba45SStephan Aßmus {
352f86ba45SStephan Aßmus 	return BAlignment(B_ALIGN_LEFT, B_ALIGN_VERTICAL_CENTER);
362f86ba45SStephan Aßmus }
372f86ba45SStephan Aßmus 
382f86ba45SStephan Aßmus 
392f86ba45SStephan Aßmus float
402f86ba45SStephan Aßmus BControlLook::DefaultLabelSpacing() const
412f86ba45SStephan Aßmus {
422f86ba45SStephan Aßmus 	return 4.0;//ceilf(be_plain_font->Size() / 4.0);
432f86ba45SStephan Aßmus }
442f86ba45SStephan Aßmus 
452f86ba45SStephan Aßmus 
462f86ba45SStephan Aßmus uint32
472f86ba45SStephan Aßmus BControlLook::Flags(BControl* control) const
482f86ba45SStephan Aßmus {
492f86ba45SStephan Aßmus 	uint32 flags = 0;
502f86ba45SStephan Aßmus 
512f86ba45SStephan Aßmus 	if (!control->IsEnabled())
522f86ba45SStephan Aßmus 		flags |= B_DISABLED;
532f86ba45SStephan Aßmus 
542f86ba45SStephan Aßmus 	if (control->IsFocus())
552f86ba45SStephan Aßmus 		flags |= B_FOCUSED;
562f86ba45SStephan Aßmus 
572f86ba45SStephan Aßmus 	if (control->Value() == B_CONTROL_ON)
582f86ba45SStephan Aßmus 		flags |= B_ACTIVATED;
592f86ba45SStephan Aßmus 
602f86ba45SStephan Aßmus 	return flags;
612f86ba45SStephan Aßmus }
622f86ba45SStephan Aßmus 
632f86ba45SStephan Aßmus 
642f86ba45SStephan Aßmus // #pragma mark -
652f86ba45SStephan Aßmus 
662f86ba45SStephan Aßmus 
672f86ba45SStephan Aßmus void
682f86ba45SStephan Aßmus BControlLook::DrawButtonFrame(BView* view, BRect& rect, const BRect& updateRect,
692f86ba45SStephan Aßmus 	const rgb_color& base, uint32 flags, uint32 borders)
702f86ba45SStephan Aßmus {
712f86ba45SStephan Aßmus 	// colors
722f86ba45SStephan Aßmus 	rgb_color dark1BorderColor;
732f86ba45SStephan Aßmus 	rgb_color dark2BorderColor;
742f86ba45SStephan Aßmus 
752f86ba45SStephan Aßmus 	if ((flags & B_DISABLED) == 0) {
762f86ba45SStephan Aßmus 		dark1BorderColor = tint_color(base, 1.33);
772f86ba45SStephan Aßmus 		dark2BorderColor = tint_color(base, 1.45);
782f86ba45SStephan Aßmus 
792f86ba45SStephan Aßmus 		if (flags & B_DEFAULT_BUTTON) {
802f86ba45SStephan Aßmus 			dark2BorderColor = tint_color(dark1BorderColor, 1.5);
812f86ba45SStephan Aßmus 			dark1BorderColor = tint_color(dark1BorderColor, 1.35);
822f86ba45SStephan Aßmus 		}
832f86ba45SStephan Aßmus 	} else {
842f86ba45SStephan Aßmus 		dark1BorderColor = tint_color(base, 1.147);
852f86ba45SStephan Aßmus 		dark2BorderColor = tint_color(base, 1.24);
862f86ba45SStephan Aßmus 
872f86ba45SStephan Aßmus 		if (flags & B_DEFAULT_BUTTON) {
882f86ba45SStephan Aßmus 			dark1BorderColor = tint_color(dark1BorderColor, 1.12);
892f86ba45SStephan Aßmus 			dark2BorderColor = tint_color(dark1BorderColor, 1.16);
902f86ba45SStephan Aßmus 		}
912f86ba45SStephan Aßmus 	}
922f86ba45SStephan Aßmus 
932f86ba45SStephan Aßmus 	if (flags & B_ACTIVATED) {
942f86ba45SStephan Aßmus 		rgb_color temp = dark2BorderColor;
952f86ba45SStephan Aßmus 		dark2BorderColor = dark1BorderColor;
962f86ba45SStephan Aßmus 		dark1BorderColor = temp;
972f86ba45SStephan Aßmus 	}
982f86ba45SStephan Aßmus 
992f86ba45SStephan Aßmus 	// indicate focus by changing main button border
1002f86ba45SStephan Aßmus 	if (flags & B_FOCUSED) {
1012f86ba45SStephan Aßmus 		dark1BorderColor = ui_color(B_KEYBOARD_NAVIGATION_COLOR);
1022f86ba45SStephan Aßmus 		dark2BorderColor = dark1BorderColor;
1032f86ba45SStephan Aßmus 	}
1042f86ba45SStephan Aßmus 
1052f86ba45SStephan Aßmus 	if (flags & B_DEFAULT_BUTTON) {
1062f86ba45SStephan Aßmus 		float focusTint = 1.2;
1072f86ba45SStephan Aßmus 		if (flags & B_DISABLED)
1082f86ba45SStephan Aßmus 			focusTint = (B_NO_TINT + focusTint) / 2;
1092f86ba45SStephan Aßmus 
1102f86ba45SStephan Aßmus 		rgb_color focusColor = tint_color(base, focusTint);
1112f86ba45SStephan Aßmus 		view->SetHighColor(base);
1122f86ba45SStephan Aßmus 
1132f86ba45SStephan Aßmus 		view->StrokeRect(rect);
1142f86ba45SStephan Aßmus 		rect.InsetBy(1.0, 1.0);
1152f86ba45SStephan Aßmus 
1162f86ba45SStephan Aßmus 		view->SetHighColor(focusColor);
1172f86ba45SStephan Aßmus 		view->StrokeRect(rect);
1182f86ba45SStephan Aßmus 		rect.InsetBy(1.0, 1.0);
1192f86ba45SStephan Aßmus 		view->StrokeRect(rect);
1202f86ba45SStephan Aßmus 		rect.InsetBy(1.0, 1.0);
1212f86ba45SStephan Aßmus 
1222f86ba45SStephan Aßmus 		// bevel around external border
1232f86ba45SStephan Aßmus 		_DrawOuterResessedFrame(view, rect, focusColor,
1242f86ba45SStephan Aßmus 			(flags & B_DISABLED) ? 0.5 : 0.8, 0.9, borders);
1252f86ba45SStephan Aßmus 	} else {
1262f86ba45SStephan Aßmus 		// bevel around external border
1272f86ba45SStephan Aßmus 		_DrawOuterResessedFrame(view, rect, base,
1282f86ba45SStephan Aßmus 			(flags & B_DISABLED) ? 0.0 : 1.0, 1.0, borders);
1292f86ba45SStephan Aßmus 	}
1302f86ba45SStephan Aßmus 
1312f86ba45SStephan Aßmus 	_DrawFrame(view, rect, dark1BorderColor, dark1BorderColor,
1322f86ba45SStephan Aßmus 		dark2BorderColor, dark2BorderColor, borders);
1332f86ba45SStephan Aßmus }
1342f86ba45SStephan Aßmus 
1352f86ba45SStephan Aßmus 
1362f86ba45SStephan Aßmus void
1372f86ba45SStephan Aßmus BControlLook::DrawButtonBackground(BView* view, BRect& rect,
1382f86ba45SStephan Aßmus 	const BRect& updateRect, const rgb_color& base, uint32 flags,
1392f86ba45SStephan Aßmus 	uint32 borders, enum orientation orientation)
1402f86ba45SStephan Aßmus {
1412f86ba45SStephan Aßmus 	if (!rect.IsValid() || !updateRect.Intersects(rect))
1422f86ba45SStephan Aßmus 		return;
1432f86ba45SStephan Aßmus 
1442f86ba45SStephan Aßmus 	// the surface edges
1452f86ba45SStephan Aßmus 
1462f86ba45SStephan Aßmus 	// colors
1472f86ba45SStephan Aßmus 	rgb_color buttonBgColor = tint_color(base, B_LIGHTEN_1_TINT);
1482f86ba45SStephan Aßmus 	rgb_color maxLightColor;
1492f86ba45SStephan Aßmus 
1502f86ba45SStephan Aßmus 	rgb_color bevelColor1;
1512f86ba45SStephan Aßmus 	rgb_color bevelColor2;
1522f86ba45SStephan Aßmus 
1532f86ba45SStephan Aßmus 	if ((flags & B_DISABLED) == 0) {
1542f86ba45SStephan Aßmus 		maxLightColor = tint_color(base, 0.2);
1552f86ba45SStephan Aßmus 		bevelColor1 = tint_color(base, 1.08);
1562f86ba45SStephan Aßmus 		bevelColor2 = base;
1572f86ba45SStephan Aßmus 	} else {
1582f86ba45SStephan Aßmus 		maxLightColor = tint_color(base, 0.7);
1592f86ba45SStephan Aßmus 		bevelColor1 = base;
1602f86ba45SStephan Aßmus 		bevelColor2 = buttonBgColor;
1612f86ba45SStephan Aßmus 		buttonBgColor = maxLightColor;
1622f86ba45SStephan Aßmus 	}
1632f86ba45SStephan Aßmus 
1642f86ba45SStephan Aßmus 	if (flags & B_ACTIVATED) {
1652f86ba45SStephan Aßmus 		view->BeginLineArray(4);
1662f86ba45SStephan Aßmus 
1672f86ba45SStephan Aßmus 		bevelColor1 = tint_color(bevelColor1, B_DARKEN_1_TINT);
1682f86ba45SStephan Aßmus 		bevelColor2 = tint_color(bevelColor2, B_DARKEN_1_TINT);
1692f86ba45SStephan Aßmus 
1702f86ba45SStephan Aßmus 		// shadow along left/top borders
1712f86ba45SStephan Aßmus 		if (borders & B_LEFT_BORDER) {
1722f86ba45SStephan Aßmus 			view->AddLine(BPoint(rect.left, rect.top),
1732f86ba45SStephan Aßmus 				BPoint(rect.left, rect.bottom), bevelColor1);
1742f86ba45SStephan Aßmus 			rect.left++;
1752f86ba45SStephan Aßmus 		}
1762f86ba45SStephan Aßmus 		if (borders & B_TOP_BORDER) {
1772f86ba45SStephan Aßmus 			view->AddLine(BPoint(rect.left, rect.top),
1782f86ba45SStephan Aßmus 				BPoint(rect.right, rect.top), bevelColor1);
1792f86ba45SStephan Aßmus 			rect.top++;
1802f86ba45SStephan Aßmus 		}
1812f86ba45SStephan Aßmus 
1822f86ba45SStephan Aßmus 		// softer shadow along left/top borders
1832f86ba45SStephan Aßmus 		if (borders & B_LEFT_BORDER) {
1842f86ba45SStephan Aßmus 			view->AddLine(BPoint(rect.left, rect.top),
1852f86ba45SStephan Aßmus 				BPoint(rect.left, rect.bottom), bevelColor2);
1862f86ba45SStephan Aßmus 			rect.left++;
1872f86ba45SStephan Aßmus 		}
1882f86ba45SStephan Aßmus 		if (borders & B_TOP_BORDER) {
1892f86ba45SStephan Aßmus 			view->AddLine(BPoint(rect.left, rect.top),
1902f86ba45SStephan Aßmus 				BPoint(rect.right, rect.top), bevelColor2);
1912f86ba45SStephan Aßmus 			rect.top++;
1922f86ba45SStephan Aßmus 		}
1932f86ba45SStephan Aßmus 
1942f86ba45SStephan Aßmus 		view->EndLineArray();
1952f86ba45SStephan Aßmus 	} else {
1962f86ba45SStephan Aßmus 		_DrawFrame(view, rect,
1972f86ba45SStephan Aßmus 			maxLightColor, maxLightColor,
1982f86ba45SStephan Aßmus 			bevelColor1, bevelColor1,
1992f86ba45SStephan Aßmus 			buttonBgColor, buttonBgColor, borders);
2002f86ba45SStephan Aßmus 	}
2012f86ba45SStephan Aßmus 
2022f86ba45SStephan Aßmus 	// the actual surface top
2032f86ba45SStephan Aßmus 
2042f86ba45SStephan Aßmus 	float topTint = 0.49;
2052f86ba45SStephan Aßmus 	float middleTint1 = 0.62;
2062f86ba45SStephan Aßmus 	float middleTint2 = 0.76;
2072f86ba45SStephan Aßmus 	float bottomTint = 0.90;
2082f86ba45SStephan Aßmus 
2092f86ba45SStephan Aßmus 	if (flags & B_ACTIVATED) {
2102f86ba45SStephan Aßmus 		topTint = 1.11;
2112f86ba45SStephan Aßmus 		bottomTint = 1.08;
2122f86ba45SStephan Aßmus 	}
2132f86ba45SStephan Aßmus 
2142f86ba45SStephan Aßmus 	if (flags & B_DISABLED) {
2152f86ba45SStephan Aßmus 		topTint = (topTint + B_NO_TINT) / 2;
2162f86ba45SStephan Aßmus 		middleTint1 = (middleTint1 + B_NO_TINT) / 2;
2172f86ba45SStephan Aßmus 		middleTint2 = (middleTint2 + B_NO_TINT) / 2;
2182f86ba45SStephan Aßmus 		bottomTint = (bottomTint + B_NO_TINT) / 2;
2192f86ba45SStephan Aßmus 	} else if (flags & B_HOVER) {
2202f86ba45SStephan Aßmus 		static const float kHoverTintFactor = 0.85;
2212f86ba45SStephan Aßmus 		topTint *= kHoverTintFactor;
2222f86ba45SStephan Aßmus 		middleTint1 *= kHoverTintFactor;
2232f86ba45SStephan Aßmus 		middleTint2 *= kHoverTintFactor;
2242f86ba45SStephan Aßmus 		bottomTint *= kHoverTintFactor;
2252f86ba45SStephan Aßmus 	}
2262f86ba45SStephan Aßmus 
2272f86ba45SStephan Aßmus 	if (flags & B_ACTIVATED) {
2282f86ba45SStephan Aßmus 		_FillGradient(view, rect, base, topTint, bottomTint, orientation);
2292f86ba45SStephan Aßmus 	} else {
2302f86ba45SStephan Aßmus 		_FillGlossyGradient(view, rect, base, topTint, middleTint1,
2312f86ba45SStephan Aßmus 			middleTint2, bottomTint, orientation);
2322f86ba45SStephan Aßmus 	}
2332f86ba45SStephan Aßmus }
2342f86ba45SStephan Aßmus 
2352f86ba45SStephan Aßmus 
2362f86ba45SStephan Aßmus void
2372f86ba45SStephan Aßmus BControlLook::DrawMenuBarBackground(BView* view, BRect& rect,
2382f86ba45SStephan Aßmus 	const BRect& updateRect, const rgb_color& base, uint32 borders)
2392f86ba45SStephan Aßmus {
2402f86ba45SStephan Aßmus 	if (!rect.IsValid() || !updateRect.Intersects(rect))
2412f86ba45SStephan Aßmus 		return;
2422f86ba45SStephan Aßmus 
2432f86ba45SStephan Aßmus 	// the surface edges
2442f86ba45SStephan Aßmus 
2452f86ba45SStephan Aßmus 	// colors
2462f86ba45SStephan Aßmus 	rgb_color cornerColor = tint_color(base, 0.9);
2472f86ba45SStephan Aßmus 	rgb_color bevelColor1 = tint_color(base, 0.5);
2482f86ba45SStephan Aßmus 	rgb_color bevelColor2 = tint_color(base, 0.7);
2492f86ba45SStephan Aßmus 	rgb_color bevelColor3 = tint_color(base, 1.08);
2502f86ba45SStephan Aßmus 
2512f86ba45SStephan Aßmus 	_DrawFrame(view, rect,
2522f86ba45SStephan Aßmus 		bevelColor2, bevelColor1,
2532f86ba45SStephan Aßmus 		bevelColor3, bevelColor3,
2542f86ba45SStephan Aßmus 		cornerColor, cornerColor,
2552f86ba45SStephan Aßmus 		borders);
2562f86ba45SStephan Aßmus 
2572f86ba45SStephan Aßmus 	// the actual surface top
2582f86ba45SStephan Aßmus 
2592f86ba45SStephan Aßmus 	float topTint = 0.69;
2602f86ba45SStephan Aßmus 	float bottomTint = 1.03;
2612f86ba45SStephan Aßmus 
2622f86ba45SStephan Aßmus 	_FillGradient(view, rect, base, topTint, bottomTint);
2632f86ba45SStephan Aßmus }
2642f86ba45SStephan Aßmus 
2652f86ba45SStephan Aßmus 
2662f86ba45SStephan Aßmus void
2672f86ba45SStephan Aßmus BControlLook::DrawMenuFieldBackground(BView* view, BRect& rect,
2682f86ba45SStephan Aßmus 	const BRect& updateRect, const rgb_color& base, bool popupIndicator,
2692f86ba45SStephan Aßmus 	uint32 flags)
2702f86ba45SStephan Aßmus {
2712f86ba45SStephan Aßmus 	if (popupIndicator) {
2722f86ba45SStephan Aßmus 		BRect leftRect(rect);
2732f86ba45SStephan Aßmus 		leftRect.right -= 10;
2742f86ba45SStephan Aßmus 
2752f86ba45SStephan Aßmus 		BRect rightRect(rect);
2762f86ba45SStephan Aßmus 		rightRect.left = rightRect.right - 9;
2772f86ba45SStephan Aßmus 
2782f86ba45SStephan Aßmus 		DrawMenuFieldBackground(view, leftRect, updateRect, base, flags,
2792f86ba45SStephan Aßmus 			B_LEFT_BORDER | B_TOP_BORDER | B_BOTTOM_BORDER);
2802f86ba45SStephan Aßmus 
2812f86ba45SStephan Aßmus 		rgb_color indicatorBase;
2822f86ba45SStephan Aßmus 		rgb_color markColor;
2832f86ba45SStephan Aßmus 		if (flags & B_DISABLED) {
2842f86ba45SStephan Aßmus 			indicatorBase = tint_color(base, 1.05);
2852f86ba45SStephan Aßmus 			markColor = tint_color(base, B_DARKEN_3_TINT);
2862f86ba45SStephan Aßmus 		} else {
2872f86ba45SStephan Aßmus 			indicatorBase = tint_color(base, 1.09);
2882f86ba45SStephan Aßmus 			markColor = tint_color(base, B_DARKEN_4_TINT);
2892f86ba45SStephan Aßmus 		}
2902f86ba45SStephan Aßmus 
2912f86ba45SStephan Aßmus 		DrawMenuFieldBackground(view, rightRect, updateRect, indicatorBase,
2922f86ba45SStephan Aßmus 			flags, B_RIGHT_BORDER | B_TOP_BORDER | B_BOTTOM_BORDER);
2932f86ba45SStephan Aßmus 
2942f86ba45SStephan Aßmus 		// popup marker
2952f86ba45SStephan Aßmus 		BPoint center(roundf((rightRect.left + rightRect.right) / 2.0),
2962f86ba45SStephan Aßmus 					  roundf((rightRect.top + rightRect.bottom) / 2.0));
2972f86ba45SStephan Aßmus 		BPoint triangle[3];
2982f86ba45SStephan Aßmus 		triangle[0] = center + BPoint(-2.5, -0.5);
2992f86ba45SStephan Aßmus 		triangle[1] = center + BPoint(2.5, -0.5);
3002f86ba45SStephan Aßmus 		triangle[2] = center + BPoint(0.0, 2.0);
3012f86ba45SStephan Aßmus 
3022f86ba45SStephan Aßmus 		uint32 viewFlags = view->Flags();
3032f86ba45SStephan Aßmus 		view->SetFlags(viewFlags | B_SUBPIXEL_PRECISE);
3042f86ba45SStephan Aßmus 
3052f86ba45SStephan Aßmus 		view->SetHighColor(markColor);
3062f86ba45SStephan Aßmus 		view->FillTriangle(triangle[0], triangle[1], triangle[2]);
3072f86ba45SStephan Aßmus 
3082f86ba45SStephan Aßmus 		view->SetFlags(viewFlags);
3092f86ba45SStephan Aßmus 
3102f86ba45SStephan Aßmus 		rect = leftRect;
3112f86ba45SStephan Aßmus 	} else {
3122f86ba45SStephan Aßmus 		DrawMenuFieldBackground(view, rect, updateRect, base, flags);
3132f86ba45SStephan Aßmus 	}
3142f86ba45SStephan Aßmus }
3152f86ba45SStephan Aßmus 
3162f86ba45SStephan Aßmus void
3172f86ba45SStephan Aßmus BControlLook::DrawMenuFieldBackground(BView* view, BRect& rect,
3182f86ba45SStephan Aßmus 	const BRect& updateRect, const rgb_color& base, uint32 flags,
3192f86ba45SStephan Aßmus 	uint32 borders)
3202f86ba45SStephan Aßmus {
3212f86ba45SStephan Aßmus 	if (!rect.IsValid() || !updateRect.Intersects(rect))
3222f86ba45SStephan Aßmus 		return;
3232f86ba45SStephan Aßmus 
3242f86ba45SStephan Aßmus 	// the surface edges
3252f86ba45SStephan Aßmus 
3262f86ba45SStephan Aßmus 	// colors
3272f86ba45SStephan Aßmus 	rgb_color cornerColor = tint_color(base, 0.85);
3282f86ba45SStephan Aßmus 	rgb_color bevelColor1 = tint_color(base, 0.3);
3292f86ba45SStephan Aßmus 	rgb_color bevelColor2 = tint_color(base, 0.5);
3302f86ba45SStephan Aßmus 	rgb_color bevelColor3 = tint_color(base, 1.03);
3312f86ba45SStephan Aßmus 
3322f86ba45SStephan Aßmus 	if (flags & B_DISABLED) {
3332f86ba45SStephan Aßmus 		cornerColor = tint_color(base, 0.8);
3342f86ba45SStephan Aßmus 		bevelColor1 = tint_color(base, 0.7);
3352f86ba45SStephan Aßmus 		bevelColor2 = tint_color(base, 0.8);
3362f86ba45SStephan Aßmus 		bevelColor3 = tint_color(base, 1.01);
3372f86ba45SStephan Aßmus 	} else {
3382f86ba45SStephan Aßmus 		cornerColor = tint_color(base, 0.85);
3392f86ba45SStephan Aßmus 		bevelColor1 = tint_color(base, 0.3);
3402f86ba45SStephan Aßmus 		bevelColor2 = tint_color(base, 0.5);
3412f86ba45SStephan Aßmus 		bevelColor3 = tint_color(base, 1.03);
3422f86ba45SStephan Aßmus 	}
3432f86ba45SStephan Aßmus 
3442f86ba45SStephan Aßmus 	_DrawFrame(view, rect,
3452f86ba45SStephan Aßmus 		bevelColor2, bevelColor1,
3462f86ba45SStephan Aßmus 		bevelColor3, bevelColor3,
3472f86ba45SStephan Aßmus 		cornerColor, cornerColor,
3482f86ba45SStephan Aßmus 		borders);
3492f86ba45SStephan Aßmus 
3502f86ba45SStephan Aßmus 	// the actual surface top
3512f86ba45SStephan Aßmus 
3522f86ba45SStephan Aßmus 	float topTint = 0.49;
3532f86ba45SStephan Aßmus 	float middleTint1 = 0.62;
3542f86ba45SStephan Aßmus 	float middleTint2 = 0.76;
3552f86ba45SStephan Aßmus 	float bottomTint = 0.90;
3562f86ba45SStephan Aßmus 
3572f86ba45SStephan Aßmus 	if (flags & B_DISABLED) {
3582f86ba45SStephan Aßmus 		topTint = (topTint + B_NO_TINT) / 2;
3592f86ba45SStephan Aßmus 		middleTint1 = (middleTint1 + B_NO_TINT) / 2;
3602f86ba45SStephan Aßmus 		middleTint2 = (middleTint2 + B_NO_TINT) / 2;
3612f86ba45SStephan Aßmus 		bottomTint = (bottomTint + B_NO_TINT) / 2;
3622f86ba45SStephan Aßmus 	} else if (flags & B_HOVER) {
3632f86ba45SStephan Aßmus 		static const float kHoverTintFactor = 0.85;
3642f86ba45SStephan Aßmus 		topTint *= kHoverTintFactor;
3652f86ba45SStephan Aßmus 		middleTint1 *= kHoverTintFactor;
3662f86ba45SStephan Aßmus 		middleTint2 *= kHoverTintFactor;
3672f86ba45SStephan Aßmus 		bottomTint *= kHoverTintFactor;
3682f86ba45SStephan Aßmus 	}
3692f86ba45SStephan Aßmus 
3702f86ba45SStephan Aßmus 	_FillGlossyGradient(view, rect, base, topTint, middleTint1,
3712f86ba45SStephan Aßmus 		middleTint2, bottomTint);
3722f86ba45SStephan Aßmus }
3732f86ba45SStephan Aßmus 
3742f86ba45SStephan Aßmus void
3752f86ba45SStephan Aßmus BControlLook::DrawMenuBackground(BView* view, BRect& rect,
3762f86ba45SStephan Aßmus 	const BRect& updateRect, const rgb_color& base, uint32 flags,
3772f86ba45SStephan Aßmus 	uint32 borders)
3782f86ba45SStephan Aßmus {
3792f86ba45SStephan Aßmus 	if (!rect.IsValid() || !updateRect.Intersects(rect))
3802f86ba45SStephan Aßmus 		return;
3812f86ba45SStephan Aßmus 
3822f86ba45SStephan Aßmus 	// the surface edges
3832f86ba45SStephan Aßmus 
3842f86ba45SStephan Aßmus 	rgb_color bevelLightColor;
3852f86ba45SStephan Aßmus 	rgb_color bevelShadowColor;
3862f86ba45SStephan Aßmus 	rgb_color background = tint_color(base, 0.75);
3872f86ba45SStephan Aßmus 
3882f86ba45SStephan Aßmus 	if (flags & B_DISABLED) {
3892f86ba45SStephan Aßmus 		bevelLightColor = tint_color(background, 0.80);
3902f86ba45SStephan Aßmus 		bevelShadowColor = tint_color(background, 1.07);
3912f86ba45SStephan Aßmus 	} else {
3922f86ba45SStephan Aßmus 		bevelLightColor = tint_color(background, 0.6);
3932f86ba45SStephan Aßmus 		bevelShadowColor = tint_color(background, 1.12);
3942f86ba45SStephan Aßmus 	}
3952f86ba45SStephan Aßmus 
3962f86ba45SStephan Aßmus 	_DrawFrame(view, rect,
3972f86ba45SStephan Aßmus 		bevelLightColor, bevelLightColor,
3982f86ba45SStephan Aßmus 		bevelShadowColor, bevelShadowColor,
3992f86ba45SStephan Aßmus 		borders);
4002f86ba45SStephan Aßmus 
4012f86ba45SStephan Aßmus 	// the actual surface top
4022f86ba45SStephan Aßmus 
4032f86ba45SStephan Aßmus 	view->SetHighColor(background);
4042f86ba45SStephan Aßmus 	view->FillRect(rect);
4052f86ba45SStephan Aßmus }
4062f86ba45SStephan Aßmus 
4072f86ba45SStephan Aßmus 
4082f86ba45SStephan Aßmus void
4092f86ba45SStephan Aßmus BControlLook::DrawMenuItemBackground(BView* view, BRect& rect,
4102f86ba45SStephan Aßmus 	const BRect& updateRect, const rgb_color& base, uint32 flags,
4112f86ba45SStephan Aßmus 	uint32 borders)
4122f86ba45SStephan Aßmus {
4132f86ba45SStephan Aßmus 	if (!rect.IsValid() || !updateRect.Intersects(rect))
4142f86ba45SStephan Aßmus 		return;
4152f86ba45SStephan Aßmus 
4162f86ba45SStephan Aßmus 	// the surface edges
4172f86ba45SStephan Aßmus 
4182f86ba45SStephan Aßmus 	float topTint;
4192f86ba45SStephan Aßmus 	float bottomTint;
4202f86ba45SStephan Aßmus 	rgb_color selectedColor = base;
4212f86ba45SStephan Aßmus 
4222f86ba45SStephan Aßmus 	if (flags & B_ACTIVATED) {
4232f86ba45SStephan Aßmus 		topTint = 0.9;
4242f86ba45SStephan Aßmus 		bottomTint = 1.05;
4252f86ba45SStephan Aßmus 		selectedColor = tint_color(base, 1.26);
4262f86ba45SStephan Aßmus 	} else if (flags & B_DISABLED) {
4272f86ba45SStephan Aßmus 		topTint = 0.80;
4282f86ba45SStephan Aßmus 		bottomTint = 1.07;
4292f86ba45SStephan Aßmus 	} else {
4302f86ba45SStephan Aßmus 		topTint = 0.6;
4312f86ba45SStephan Aßmus 		bottomTint = 1.12;
4322f86ba45SStephan Aßmus 	}
4332f86ba45SStephan Aßmus 
4342f86ba45SStephan Aßmus 	rgb_color bevelLightColor = tint_color(selectedColor, topTint);
4352f86ba45SStephan Aßmus 	rgb_color bevelShadowColor = tint_color(selectedColor, bottomTint);
4362f86ba45SStephan Aßmus 
4372f86ba45SStephan Aßmus 	_DrawFrame(view, rect,
4382f86ba45SStephan Aßmus 		bevelLightColor, bevelLightColor,
4392f86ba45SStephan Aßmus 		bevelShadowColor, bevelShadowColor,
4402f86ba45SStephan Aßmus 		borders);
4412f86ba45SStephan Aßmus 
4422f86ba45SStephan Aßmus 	// the actual surface top
4432f86ba45SStephan Aßmus 
4442f86ba45SStephan Aßmus 	view->SetLowColor(selectedColor);
4452f86ba45SStephan Aßmus //	_FillGradient(view, rect, selectedColor, topTint, bottomTint);
4462f86ba45SStephan Aßmus 	_FillGradient(view, rect, selectedColor, bottomTint, topTint);
4472f86ba45SStephan Aßmus }
4482f86ba45SStephan Aßmus 
4492f86ba45SStephan Aßmus 
4502f86ba45SStephan Aßmus void
4512f86ba45SStephan Aßmus BControlLook::DrawStatusBar(BView* view, BRect& rect, const BRect& updateRect,
4522f86ba45SStephan Aßmus 	const rgb_color& base, const rgb_color& barColor, float progressPosition)
4532f86ba45SStephan Aßmus {
4542f86ba45SStephan Aßmus 	if (!rect.Intersects(updateRect))
4552f86ba45SStephan Aßmus 		return;
4562f86ba45SStephan Aßmus 
4572f86ba45SStephan Aßmus 	_DrawOuterResessedFrame(view, rect, base, 0.6);
4582f86ba45SStephan Aßmus 
4592f86ba45SStephan Aßmus 	// colors
4602f86ba45SStephan Aßmus 	rgb_color dark1BorderColor = tint_color(base, 1.3);
4612f86ba45SStephan Aßmus 	rgb_color dark2BorderColor = tint_color(base, 1.2);
4622f86ba45SStephan Aßmus 	rgb_color dark1FilledBorderColor = tint_color(barColor, 1.20);
4632f86ba45SStephan Aßmus 	rgb_color dark2FilledBorderColor = tint_color(barColor, 1.45);
4642f86ba45SStephan Aßmus 
4652f86ba45SStephan Aßmus 	BRect filledRect(rect);
4662f86ba45SStephan Aßmus 	filledRect.right = progressPosition - 1;
4672f86ba45SStephan Aßmus 
4682f86ba45SStephan Aßmus 	BRect nonfilledRect(rect);
4692f86ba45SStephan Aßmus 	nonfilledRect.left = progressPosition;
4702f86ba45SStephan Aßmus 
4712f86ba45SStephan Aßmus 	bool filledSurface = filledRect.Width() > 0;
4722f86ba45SStephan Aßmus 	bool nonfilledSurface = nonfilledRect.Width() > 0;
4732f86ba45SStephan Aßmus 
4742f86ba45SStephan Aßmus 	if (filledSurface) {
4752f86ba45SStephan Aßmus 		_DrawFrame(view, filledRect,
4762f86ba45SStephan Aßmus 			dark1FilledBorderColor, dark1FilledBorderColor,
4772f86ba45SStephan Aßmus 			dark2FilledBorderColor, dark2FilledBorderColor);
4782f86ba45SStephan Aßmus 
4792f86ba45SStephan Aßmus 		_FillGlossyGradient(view, filledRect, barColor, 0.55, 0.68, 0.76, 0.90);
4802f86ba45SStephan Aßmus 	}
4812f86ba45SStephan Aßmus 
4822f86ba45SStephan Aßmus 	if (nonfilledSurface) {
4832f86ba45SStephan Aßmus 		_DrawFrame(view, nonfilledRect, dark1BorderColor, dark1BorderColor,
4842f86ba45SStephan Aßmus 			dark2BorderColor, dark2BorderColor,
4852f86ba45SStephan Aßmus 			B_TOP_BORDER | B_BOTTOM_BORDER | B_RIGHT_BORDER);
4862f86ba45SStephan Aßmus 
4872f86ba45SStephan Aßmus 		if (nonfilledRect.left < nonfilledRect.right) {
4882f86ba45SStephan Aßmus 			// shadow from fill bar, or left border
4892f86ba45SStephan Aßmus 			rgb_color leftBorder = dark1BorderColor;
4902f86ba45SStephan Aßmus 			if (filledSurface)
4912f86ba45SStephan Aßmus 				leftBorder = tint_color(base, 0.50);
4922f86ba45SStephan Aßmus 			view->SetHighColor(leftBorder);
4932f86ba45SStephan Aßmus 			view->StrokeLine(nonfilledRect.LeftTop(),
4942f86ba45SStephan Aßmus 				nonfilledRect.LeftBottom());
4952f86ba45SStephan Aßmus 			nonfilledRect.left++;
4962f86ba45SStephan Aßmus 		}
4972f86ba45SStephan Aßmus 
4982f86ba45SStephan Aßmus 		_FillGradient(view, nonfilledRect, base, 0.25, 0.06);
4992f86ba45SStephan Aßmus 	}
5002f86ba45SStephan Aßmus }
5012f86ba45SStephan Aßmus 
5022f86ba45SStephan Aßmus 
5032f86ba45SStephan Aßmus void
5042f86ba45SStephan Aßmus BControlLook::DrawCheckBox(BView* view, BRect& rect, const BRect& updateRect,
5052f86ba45SStephan Aßmus 	const rgb_color& base, uint32 flags)
5062f86ba45SStephan Aßmus {
5072f86ba45SStephan Aßmus 	if (!rect.Intersects(updateRect))
5082f86ba45SStephan Aßmus 		return;
5092f86ba45SStephan Aßmus 
5102f86ba45SStephan Aßmus 	rgb_color dark1BorderColor;
5112f86ba45SStephan Aßmus 	rgb_color dark2BorderColor;
5122f86ba45SStephan Aßmus 	rgb_color navigationColor = ui_color(B_KEYBOARD_NAVIGATION_COLOR);
5132f86ba45SStephan Aßmus 
5142f86ba45SStephan Aßmus 	if (flags & B_DISABLED) {
5152f86ba45SStephan Aßmus 		_DrawOuterResessedFrame(view, rect, base, 0.0);
5162f86ba45SStephan Aßmus 
5172f86ba45SStephan Aßmus 		dark1BorderColor = tint_color(base, 1.15);
5182f86ba45SStephan Aßmus 		dark2BorderColor = tint_color(base, 1.15);
5192f86ba45SStephan Aßmus 	} else if (flags & B_CLICKED) {
5202f86ba45SStephan Aßmus 		dark1BorderColor = tint_color(base, 1.50);
5212f86ba45SStephan Aßmus 		dark2BorderColor = tint_color(base, 1.48);
5222f86ba45SStephan Aßmus 
5232f86ba45SStephan Aßmus 		_DrawFrame(view, rect,
5242f86ba45SStephan Aßmus 			dark1BorderColor, dark1BorderColor,
5252f86ba45SStephan Aßmus 			dark2BorderColor, dark2BorderColor);
5262f86ba45SStephan Aßmus 
5272f86ba45SStephan Aßmus 		dark2BorderColor = dark1BorderColor;
5282f86ba45SStephan Aßmus 	} else {
5292f86ba45SStephan Aßmus 		_DrawOuterResessedFrame(view, rect, base, 0.6);
5302f86ba45SStephan Aßmus 
5312f86ba45SStephan Aßmus 		dark1BorderColor = tint_color(base, 1.40);
5322f86ba45SStephan Aßmus 		dark2BorderColor = tint_color(base, 1.38);
5332f86ba45SStephan Aßmus 	}
5342f86ba45SStephan Aßmus 
5352f86ba45SStephan Aßmus 	if (flags & B_FOCUSED) {
5362f86ba45SStephan Aßmus 		dark1BorderColor = navigationColor;
5372f86ba45SStephan Aßmus 		dark2BorderColor = navigationColor;
5382f86ba45SStephan Aßmus 	}
5392f86ba45SStephan Aßmus 
5402f86ba45SStephan Aßmus 	_DrawFrame(view, rect,
5412f86ba45SStephan Aßmus 		dark1BorderColor, dark1BorderColor,
5422f86ba45SStephan Aßmus 		dark2BorderColor, dark2BorderColor);
5432f86ba45SStephan Aßmus 
5442f86ba45SStephan Aßmus 	if (flags & B_DISABLED) {
5452f86ba45SStephan Aßmus 		_FillGradient(view, rect, base, 0.4, 0.2);
5462f86ba45SStephan Aßmus 	} else {
5472f86ba45SStephan Aßmus 		_FillGradient(view, rect, base, 0.15, 0.0);
5482f86ba45SStephan Aßmus 	}
5492f86ba45SStephan Aßmus 
5502f86ba45SStephan Aßmus 	rgb_color markColor;
5512f86ba45SStephan Aßmus 	if (_RadioButtonAndCheckBoxMarkColor(base, markColor, flags)) {
5522f86ba45SStephan Aßmus 		view->SetHighColor(markColor);
5532f86ba45SStephan Aßmus 
5542f86ba45SStephan Aßmus 		rect.InsetBy(2, 2);
5552f86ba45SStephan Aßmus 		view->SetPenSize(max_c(1.0, ceilf(rect.Width() / 3.5)));
5562f86ba45SStephan Aßmus 		view->SetDrawingMode(B_OP_OVER);
5572f86ba45SStephan Aßmus 
5582f86ba45SStephan Aßmus 		view->StrokeLine(rect.LeftTop(), rect.RightBottom());
5592f86ba45SStephan Aßmus 		view->StrokeLine(rect.LeftBottom(), rect.RightTop());
5602f86ba45SStephan Aßmus 	}
5612f86ba45SStephan Aßmus }
5622f86ba45SStephan Aßmus 
5632f86ba45SStephan Aßmus 
5642f86ba45SStephan Aßmus void
5652f86ba45SStephan Aßmus BControlLook::DrawRadioButton(BView* view, BRect& rect, const BRect& updateRect,
5662f86ba45SStephan Aßmus 	const rgb_color& base, uint32 flags)
5672f86ba45SStephan Aßmus {
5682f86ba45SStephan Aßmus 	if (!rect.Intersects(updateRect))
5692f86ba45SStephan Aßmus 		return;
5702f86ba45SStephan Aßmus 
5712f86ba45SStephan Aßmus 	rgb_color borderColor;
5722f86ba45SStephan Aßmus 	rgb_color bevelLight;
5732f86ba45SStephan Aßmus 	rgb_color bevelShadow;
5742f86ba45SStephan Aßmus 	rgb_color navigationColor = ui_color(B_KEYBOARD_NAVIGATION_COLOR);
5752f86ba45SStephan Aßmus 
5762f86ba45SStephan Aßmus 	if (flags & B_DISABLED) {
5772f86ba45SStephan Aßmus 		borderColor = tint_color(base, 1.15);
5782f86ba45SStephan Aßmus 		bevelLight = base;
5792f86ba45SStephan Aßmus 		bevelShadow = base;
5802f86ba45SStephan Aßmus 	} else if (flags & B_CLICKED) {
5812f86ba45SStephan Aßmus 		borderColor = tint_color(base, 1.50);
5822f86ba45SStephan Aßmus 		bevelLight = borderColor;
5832f86ba45SStephan Aßmus 		bevelShadow = borderColor;
5842f86ba45SStephan Aßmus 	} else {
5852f86ba45SStephan Aßmus 		borderColor = tint_color(base, 1.45);
5862f86ba45SStephan Aßmus 		bevelLight = tint_color(base, 0.55);
5872f86ba45SStephan Aßmus 		bevelShadow = tint_color(base, 1.11);
5882f86ba45SStephan Aßmus 	}
5892f86ba45SStephan Aßmus 
5902f86ba45SStephan Aßmus 	if (flags & B_FOCUSED) {
5912f86ba45SStephan Aßmus 		borderColor = navigationColor;
5922f86ba45SStephan Aßmus 	}
5932f86ba45SStephan Aßmus 
5942f86ba45SStephan Aßmus 	BGradientLinear bevelGradient;
5952f86ba45SStephan Aßmus 	bevelGradient.AddColor(bevelShadow, 0);
5962f86ba45SStephan Aßmus 	bevelGradient.AddColor(bevelLight, 255);
5972f86ba45SStephan Aßmus 	bevelGradient.SetStart(rect.LeftTop());
5982f86ba45SStephan Aßmus 	bevelGradient.SetEnd(rect.RightBottom());
5992f86ba45SStephan Aßmus 
6002f86ba45SStephan Aßmus 	view->FillEllipse(rect, bevelGradient);
6012f86ba45SStephan Aßmus 	rect.InsetBy(1, 1);
6022f86ba45SStephan Aßmus 
6032f86ba45SStephan Aßmus 	bevelGradient.MakeEmpty();
6042f86ba45SStephan Aßmus 	bevelGradient.AddColor(borderColor, 0);
6052f86ba45SStephan Aßmus 	bevelGradient.AddColor(tint_color(borderColor, 0.8), 255);
6062f86ba45SStephan Aßmus 	view->FillEllipse(rect, bevelGradient);
6072f86ba45SStephan Aßmus 	rect.InsetBy(1, 1);
6082f86ba45SStephan Aßmus 
6092f86ba45SStephan Aßmus 	float topTint;
6102f86ba45SStephan Aßmus 	float bottomTint;
6112f86ba45SStephan Aßmus 	if (flags & B_DISABLED) {
6122f86ba45SStephan Aßmus 		topTint = 0.4;
6132f86ba45SStephan Aßmus 		bottomTint = 0.2;
6142f86ba45SStephan Aßmus 	} else {
6152f86ba45SStephan Aßmus 		topTint = 0.15;
6162f86ba45SStephan Aßmus 		bottomTint = 0.0;
6172f86ba45SStephan Aßmus 	}
6182f86ba45SStephan Aßmus 
6192f86ba45SStephan Aßmus 	BGradientLinear gradient;
6202f86ba45SStephan Aßmus 	_MakeGradient(gradient, rect, base, topTint, bottomTint);
6212f86ba45SStephan Aßmus 	view->FillEllipse(rect, gradient);
6222f86ba45SStephan Aßmus 
6232f86ba45SStephan Aßmus 	rgb_color markColor;
6242f86ba45SStephan Aßmus 	if (_RadioButtonAndCheckBoxMarkColor(base, markColor, flags)) {
6252f86ba45SStephan Aßmus 		view->SetHighColor(markColor);
6262f86ba45SStephan Aßmus 		rect.InsetBy(3, 3);
6272f86ba45SStephan Aßmus 		view->FillEllipse(rect);
6282f86ba45SStephan Aßmus 	}
6292f86ba45SStephan Aßmus }
6302f86ba45SStephan Aßmus 
6312f86ba45SStephan Aßmus 
6322f86ba45SStephan Aßmus void
6332f86ba45SStephan Aßmus BControlLook::DrawScrollBarBackground(BView* view, BRect& rect1, BRect& rect2,
6342f86ba45SStephan Aßmus 	const BRect& updateRect, const rgb_color& base, uint32 flags,
6352f86ba45SStephan Aßmus 	enum orientation orientation)
6362f86ba45SStephan Aßmus {
6372f86ba45SStephan Aßmus 	DrawScrollBarBackground(view, rect1, updateRect, base, flags, orientation);
6382f86ba45SStephan Aßmus 	DrawScrollBarBackground(view, rect2, updateRect, base, flags, orientation);
6392f86ba45SStephan Aßmus }
6402f86ba45SStephan Aßmus 
6412f86ba45SStephan Aßmus void
6422f86ba45SStephan Aßmus BControlLook::DrawScrollBarBackground(BView* view, BRect& rect,
6432f86ba45SStephan Aßmus 	const BRect& updateRect, const rgb_color& base, uint32 flags,
6442f86ba45SStephan Aßmus 	enum orientation orientation)
6452f86ba45SStephan Aßmus {
6462f86ba45SStephan Aßmus 	if (!rect.IsValid() || !rect.Intersects(updateRect))
6472f86ba45SStephan Aßmus 		return;
6482f86ba45SStephan Aßmus 
6492f86ba45SStephan Aßmus 	float gradient1Tint;
6502f86ba45SStephan Aßmus 	float gradient2Tint;
6512f86ba45SStephan Aßmus 	float darkEdge1Tint;
6522f86ba45SStephan Aßmus 	float darkEdge2Tint;
6532f86ba45SStephan Aßmus 	float shadowTint;
6542f86ba45SStephan Aßmus 
6552f86ba45SStephan Aßmus 	if (flags & B_DISABLED) {
6562f86ba45SStephan Aßmus 		gradient1Tint = 0.9;
6572f86ba45SStephan Aßmus 		gradient2Tint = 0.8;
6582f86ba45SStephan Aßmus 		darkEdge1Tint = B_DARKEN_2_TINT;
6592f86ba45SStephan Aßmus 		darkEdge2Tint = B_DARKEN_2_TINT;
6602f86ba45SStephan Aßmus 		shadowTint = gradient1Tint;
6612f86ba45SStephan Aßmus 	} else {
6622f86ba45SStephan Aßmus 		gradient1Tint = 1.10;
6632f86ba45SStephan Aßmus 		gradient2Tint = 1.05;
6642f86ba45SStephan Aßmus 		darkEdge1Tint = B_DARKEN_3_TINT;
6652f86ba45SStephan Aßmus 		darkEdge2Tint = B_DARKEN_2_TINT;
6662f86ba45SStephan Aßmus 		shadowTint = gradient1Tint;
6672f86ba45SStephan Aßmus 	}
6682f86ba45SStephan Aßmus 
6692f86ba45SStephan Aßmus 	rgb_color darkEdge1 = tint_color(base, darkEdge1Tint);
6702f86ba45SStephan Aßmus 	rgb_color darkEdge2 = tint_color(base, darkEdge2Tint);
6712f86ba45SStephan Aßmus 	rgb_color shadow = tint_color(base, shadowTint);
6722f86ba45SStephan Aßmus 
6732f86ba45SStephan Aßmus 	if (orientation == B_HORIZONTAL) {
6742f86ba45SStephan Aßmus 		// dark vertical line on left edge
6752f86ba45SStephan Aßmus 		if (rect.Width() > 0) {
6762f86ba45SStephan Aßmus 			view->SetHighColor(darkEdge1);
6772f86ba45SStephan Aßmus 			view->StrokeLine(rect.LeftTop(), rect.LeftBottom());
6782f86ba45SStephan Aßmus 			rect.left++;
6792f86ba45SStephan Aßmus 		}
6802f86ba45SStephan Aßmus 		// dark vertical line on right edge
6812f86ba45SStephan Aßmus 		if (rect.Width() >= 0) {
6822f86ba45SStephan Aßmus 			view->SetHighColor(darkEdge2);
6832f86ba45SStephan Aßmus 			view->StrokeLine(rect.RightTop(), rect.RightBottom());
6842f86ba45SStephan Aßmus 			rect.right--;
6852f86ba45SStephan Aßmus 		}
6862f86ba45SStephan Aßmus 		// vertical shadow line after left edge
6872f86ba45SStephan Aßmus 		if (rect.Width() >= 0) {
6882f86ba45SStephan Aßmus 			view->SetHighColor(shadow);
6892f86ba45SStephan Aßmus 			view->StrokeLine(rect.LeftTop(), rect.LeftBottom());
6902f86ba45SStephan Aßmus 			rect.left++;
6912f86ba45SStephan Aßmus 		}
6922f86ba45SStephan Aßmus 		// fill
6932f86ba45SStephan Aßmus 		if (rect.Width() >= 0) {
6942f86ba45SStephan Aßmus 			_FillGradient(view, rect, base, gradient1Tint, gradient2Tint,
6952f86ba45SStephan Aßmus 				orientation);
6962f86ba45SStephan Aßmus 		}
6972f86ba45SStephan Aßmus 	} else {
6982f86ba45SStephan Aßmus 		// dark vertical line on top edge
6992f86ba45SStephan Aßmus 		if (rect.Height() > 0) {
7002f86ba45SStephan Aßmus 			view->SetHighColor(darkEdge1);
7012f86ba45SStephan Aßmus 			view->StrokeLine(rect.LeftTop(), rect.RightTop());
7022f86ba45SStephan Aßmus 			rect.top++;
7032f86ba45SStephan Aßmus 		}
7042f86ba45SStephan Aßmus 		// dark vertical line on bottom edge
7052f86ba45SStephan Aßmus 		if (rect.Height() >= 0) {
7062f86ba45SStephan Aßmus 			view->SetHighColor(darkEdge2);
7072f86ba45SStephan Aßmus 			view->StrokeLine(rect.LeftBottom(), rect.RightBottom());
7082f86ba45SStephan Aßmus 			rect.bottom--;
7092f86ba45SStephan Aßmus 		}
7102f86ba45SStephan Aßmus 		// horizontal shadow line after top edge
7112f86ba45SStephan Aßmus 		if (rect.Height() >= 0) {
7122f86ba45SStephan Aßmus 			view->SetHighColor(shadow);
7132f86ba45SStephan Aßmus 			view->StrokeLine(rect.LeftTop(), rect.RightTop());
7142f86ba45SStephan Aßmus 			rect.top++;
7152f86ba45SStephan Aßmus 		}
7162f86ba45SStephan Aßmus 		// fill
7172f86ba45SStephan Aßmus 		if (rect.Height() >= 0) {
7182f86ba45SStephan Aßmus 			_FillGradient(view, rect, base, gradient1Tint, gradient2Tint,
7192f86ba45SStephan Aßmus 				orientation);
7202f86ba45SStephan Aßmus 		}
7212f86ba45SStephan Aßmus 	}
7222f86ba45SStephan Aßmus }
7232f86ba45SStephan Aßmus 
7242f86ba45SStephan Aßmus 
7252f86ba45SStephan Aßmus rgb_color
7262f86ba45SStephan Aßmus BControlLook::SliderBarColor(const rgb_color& base)
7272f86ba45SStephan Aßmus {
7282f86ba45SStephan Aßmus 	return tint_color(ui_color(B_PANEL_BACKGROUND_COLOR), B_DARKEN_1_TINT);
7292f86ba45SStephan Aßmus }
7302f86ba45SStephan Aßmus 
7312f86ba45SStephan Aßmus 
7322f86ba45SStephan Aßmus void
7332f86ba45SStephan Aßmus BControlLook::DrawSliderBar(BView* view, BRect rect, const BRect& updateRect,
7342f86ba45SStephan Aßmus 	const rgb_color& base, rgb_color leftFillColor, rgb_color rightFillColor,
7352f86ba45SStephan Aßmus 	float sliderScale, uint32 flags, enum orientation orientation)
7362f86ba45SStephan Aßmus {
7372f86ba45SStephan Aßmus 	if (!rect.IsValid() || !rect.Intersects(updateRect))
7382f86ba45SStephan Aßmus 		return;
7392f86ba45SStephan Aßmus 
7402f86ba45SStephan Aßmus 	// separate the bar in two sides
7412f86ba45SStephan Aßmus 	float sliderPosition;
7422f86ba45SStephan Aßmus 	BRect leftBarSide = rect;
7432f86ba45SStephan Aßmus 	BRect rightBarSide = rect;
7442f86ba45SStephan Aßmus 
7452f86ba45SStephan Aßmus 	if (orientation == B_HORIZONTAL) {
7462f86ba45SStephan Aßmus 		sliderPosition = floorf(rect.left + 2 + (rect.Width() - 2)
7472f86ba45SStephan Aßmus 			* sliderScale);
7482f86ba45SStephan Aßmus 		leftBarSide.right = sliderPosition - 1;
7492f86ba45SStephan Aßmus 		rightBarSide.left = sliderPosition;
7502f86ba45SStephan Aßmus 	} else {
7512f86ba45SStephan Aßmus 		sliderPosition = floorf(rect.top + 2 + (rect.Height() - 2)
7522f86ba45SStephan Aßmus 			* sliderScale);
7532f86ba45SStephan Aßmus 		leftBarSide.bottom = sliderPosition - 1;
7542f86ba45SStephan Aßmus 		rightBarSide.top = sliderPosition;
7552f86ba45SStephan Aßmus 	}
7562f86ba45SStephan Aßmus 
7572f86ba45SStephan Aßmus 	// fill the background for the corners, exclude the middle bar for now
7582f86ba45SStephan Aßmus 	BRegion region(rect);
7592f86ba45SStephan Aßmus 	region.Exclude(rightBarSide);
7602f86ba45SStephan Aßmus 	view->ConstrainClippingRegion(&region);
7612f86ba45SStephan Aßmus 
7622f86ba45SStephan Aßmus 	view->PushState();
7632f86ba45SStephan Aßmus 
7642f86ba45SStephan Aßmus 	DrawSliderBar(view, rect, updateRect, base, leftFillColor, flags,
7652f86ba45SStephan Aßmus 		orientation);
7662f86ba45SStephan Aßmus 
7672f86ba45SStephan Aßmus 	view->PopState();
7682f86ba45SStephan Aßmus 
7692f86ba45SStephan Aßmus 	region.Set(rect);
7702f86ba45SStephan Aßmus 	region.Exclude(leftBarSide);
7712f86ba45SStephan Aßmus 	view->ConstrainClippingRegion(&region);
7722f86ba45SStephan Aßmus 
7732f86ba45SStephan Aßmus 	view->PushState();
7742f86ba45SStephan Aßmus 
7752f86ba45SStephan Aßmus 	DrawSliderBar(view, rect, updateRect, base, rightFillColor, flags,
7762f86ba45SStephan Aßmus 		orientation);
7772f86ba45SStephan Aßmus 
7782f86ba45SStephan Aßmus 	view->PopState();
7792f86ba45SStephan Aßmus 
7802f86ba45SStephan Aßmus 	view->ConstrainClippingRegion(NULL);
7812f86ba45SStephan Aßmus }
7822f86ba45SStephan Aßmus 
7832f86ba45SStephan Aßmus 
7842f86ba45SStephan Aßmus void
7852f86ba45SStephan Aßmus BControlLook::DrawSliderBar(BView* view, BRect rect, const BRect& updateRect,
7862f86ba45SStephan Aßmus 	const rgb_color& base, rgb_color fillColor, uint32 flags,
7872f86ba45SStephan Aßmus 	enum orientation orientation)
7882f86ba45SStephan Aßmus {
7892f86ba45SStephan Aßmus 	if (!rect.IsValid() || !rect.Intersects(updateRect))
7902f86ba45SStephan Aßmus 		return;
7912f86ba45SStephan Aßmus 
7922f86ba45SStephan Aßmus 	// separate the rect into corners
7932f86ba45SStephan Aßmus 	BRect leftCorner(rect);
7942f86ba45SStephan Aßmus 	BRect rightCorner(rect);
7952f86ba45SStephan Aßmus 	BRect barRect(rect);
7962f86ba45SStephan Aßmus 
7972f86ba45SStephan Aßmus 	if (orientation == B_HORIZONTAL) {
7982f86ba45SStephan Aßmus 		leftCorner.right = leftCorner.left + leftCorner.Height();
7992f86ba45SStephan Aßmus 		rightCorner.left = rightCorner.right - rightCorner.Height();
8002f86ba45SStephan Aßmus 		barRect.left += ceilf(barRect.Height() / 2);
8012f86ba45SStephan Aßmus 		barRect.right -= ceilf(barRect.Height() / 2);
8022f86ba45SStephan Aßmus 	} else {
8032f86ba45SStephan Aßmus 		leftCorner.bottom = leftCorner.top + leftCorner.Width();
8042f86ba45SStephan Aßmus 		rightCorner.top = rightCorner.bottom - rightCorner.Width();
8052f86ba45SStephan Aßmus 		barRect.top += ceilf(barRect.Width() / 2);
8062f86ba45SStephan Aßmus 		barRect.bottom -= ceilf(barRect.Width() / 2);
8072f86ba45SStephan Aßmus 	}
8082f86ba45SStephan Aßmus 
8092f86ba45SStephan Aßmus 	// fill the background for the corners, exclude the middle bar for now
8102f86ba45SStephan Aßmus 	BRegion region(rect);
8112f86ba45SStephan Aßmus 	region.Exclude(barRect);
8122f86ba45SStephan Aßmus 	view->ConstrainClippingRegion(&region);
8132f86ba45SStephan Aßmus 
8142f86ba45SStephan Aßmus 	view->SetHighColor(base);
8152f86ba45SStephan Aßmus 	view->FillRect(rect);
8162f86ba45SStephan Aßmus 
8172f86ba45SStephan Aßmus 	// figure out the tints to be used
8182f86ba45SStephan Aßmus 	float edgeLightTint;
8192f86ba45SStephan Aßmus 	float edgeShadowTint;
8202f86ba45SStephan Aßmus 	float frameLightTint;
8212f86ba45SStephan Aßmus 	float frameShadowTint;
8222f86ba45SStephan Aßmus 	float fillLightTint;
8232f86ba45SStephan Aßmus 	float fillShadowTint;
8242f86ba45SStephan Aßmus 
8252f86ba45SStephan Aßmus 	if (flags & B_DISABLED) {
8262f86ba45SStephan Aßmus 		edgeLightTint = 1.0;
8272f86ba45SStephan Aßmus 		edgeShadowTint = 1.0;
8282f86ba45SStephan Aßmus 		frameLightTint = 1.20;
8292f86ba45SStephan Aßmus 		frameShadowTint = 1.25;
8302f86ba45SStephan Aßmus 		fillLightTint = 0.9;
8312f86ba45SStephan Aßmus 		fillShadowTint = 1.05;
8322f86ba45SStephan Aßmus 
8332f86ba45SStephan Aßmus 		fillColor.red = uint8(fillColor.red * 0.4 + base.red * 0.6);
8342f86ba45SStephan Aßmus 		fillColor.green = uint8(fillColor.green * 0.4 + base.green * 0.6);
8352f86ba45SStephan Aßmus 		fillColor.blue = uint8(fillColor.blue * 0.4 + base.blue * 0.6);
8362f86ba45SStephan Aßmus 	} else {
8372f86ba45SStephan Aßmus 		edgeLightTint = 0.65;
8382f86ba45SStephan Aßmus 		edgeShadowTint = 1.07;
8392f86ba45SStephan Aßmus 		frameLightTint = 1.40;
8402f86ba45SStephan Aßmus 		frameShadowTint = 1.50;
8412f86ba45SStephan Aßmus 		fillLightTint = 0.8;
8422f86ba45SStephan Aßmus 		fillShadowTint = 1.1;
8432f86ba45SStephan Aßmus 	}
8442f86ba45SStephan Aßmus 
8452f86ba45SStephan Aßmus 	rgb_color edgeLightColor = tint_color(base, edgeLightTint);
8462f86ba45SStephan Aßmus 	rgb_color edgeShadowColor = tint_color(base, edgeShadowTint);
8472f86ba45SStephan Aßmus 	rgb_color frameLightColor = tint_color(fillColor, frameLightTint);
8482f86ba45SStephan Aßmus 	rgb_color frameShadowColor = tint_color(fillColor, frameShadowTint);
8492f86ba45SStephan Aßmus 	rgb_color fillLightColor = tint_color(fillColor, fillLightTint);
8502f86ba45SStephan Aßmus 	rgb_color fillShadowColor = tint_color(fillColor, fillShadowTint);
8512f86ba45SStephan Aßmus 
8522f86ba45SStephan Aßmus 	if (orientation == B_HORIZONTAL) {
8532f86ba45SStephan Aßmus 		_DrawRoundBarCorner(view, leftCorner, updateRect, edgeLightColor,
8542f86ba45SStephan Aßmus 			edgeShadowColor, frameLightColor, frameShadowColor, fillLightColor,
8552f86ba45SStephan Aßmus 			fillShadowColor, 1.0, 1.0, 0.0, -1.0, orientation);
8562f86ba45SStephan Aßmus 
8572f86ba45SStephan Aßmus 		_DrawRoundBarCorner(view, rightCorner, updateRect, edgeLightColor,
8582f86ba45SStephan Aßmus 			edgeShadowColor, frameLightColor, frameShadowColor, fillLightColor,
8592f86ba45SStephan Aßmus 			fillShadowColor, 0.0, 1.0, -1.0, -1.0, orientation);
8602f86ba45SStephan Aßmus 	} else {
8612f86ba45SStephan Aßmus 		_DrawRoundBarCorner(view, leftCorner, updateRect, edgeLightColor,
8622f86ba45SStephan Aßmus 			edgeShadowColor, frameLightColor, frameShadowColor, fillLightColor,
8632f86ba45SStephan Aßmus 			fillShadowColor, 1.0, 1.0, -1.0, 0.0, orientation);
8642f86ba45SStephan Aßmus 
8652f86ba45SStephan Aßmus 		_DrawRoundBarCorner(view, rightCorner, updateRect, edgeLightColor,
8662f86ba45SStephan Aßmus 			edgeShadowColor, frameLightColor, frameShadowColor, fillLightColor,
8672f86ba45SStephan Aßmus 			fillShadowColor, 1.0, 0.0, -1.0, -1.0, orientation);
8682f86ba45SStephan Aßmus 	}
8692f86ba45SStephan Aßmus 
8702f86ba45SStephan Aßmus 	view->ConstrainClippingRegion(NULL);
8712f86ba45SStephan Aßmus 
8722f86ba45SStephan Aßmus 	view->BeginLineArray(4);
8732f86ba45SStephan Aßmus 	if (orientation == B_HORIZONTAL) {
8742f86ba45SStephan Aßmus 		view->AddLine(barRect.LeftTop(), barRect.RightTop(), edgeShadowColor);
8752f86ba45SStephan Aßmus 		view->AddLine(barRect.LeftBottom(), barRect.RightBottom(),
8762f86ba45SStephan Aßmus 			edgeLightColor);
8772f86ba45SStephan Aßmus 		barRect.InsetBy(0, 1);
8782f86ba45SStephan Aßmus 		view->AddLine(barRect.LeftTop(), barRect.RightTop(), frameShadowColor);
8792f86ba45SStephan Aßmus 		view->AddLine(barRect.LeftBottom(), barRect.RightBottom(),
8802f86ba45SStephan Aßmus 			frameLightColor);
8812f86ba45SStephan Aßmus 		barRect.InsetBy(0, 1);
8822f86ba45SStephan Aßmus 	} else {
8832f86ba45SStephan Aßmus 		view->AddLine(barRect.LeftTop(), barRect.LeftBottom(), edgeShadowColor);
8842f86ba45SStephan Aßmus 		view->AddLine(barRect.RightTop(), barRect.RightBottom(),
8852f86ba45SStephan Aßmus 			edgeLightColor);
8862f86ba45SStephan Aßmus 		barRect.InsetBy(1, 0);
8872f86ba45SStephan Aßmus 		view->AddLine(barRect.LeftTop(), barRect.LeftBottom(), frameShadowColor);
8882f86ba45SStephan Aßmus 		view->AddLine(barRect.RightTop(), barRect.RightBottom(),
8892f86ba45SStephan Aßmus 			frameLightColor);
8902f86ba45SStephan Aßmus 		barRect.InsetBy(1, 0);
8912f86ba45SStephan Aßmus 	}
8922f86ba45SStephan Aßmus 	view->EndLineArray();
8932f86ba45SStephan Aßmus 
8942f86ba45SStephan Aßmus 	_FillGradient(view, barRect, fillColor, fillShadowTint, fillLightTint,
8952f86ba45SStephan Aßmus 		orientation);
8962f86ba45SStephan Aßmus }
8972f86ba45SStephan Aßmus 
8982f86ba45SStephan Aßmus 
8992f86ba45SStephan Aßmus void
9002f86ba45SStephan Aßmus BControlLook::DrawSliderThumb(BView* view, BRect& rect, const BRect& updateRect,
9012f86ba45SStephan Aßmus 	const rgb_color& base, uint32 flags, enum orientation orientation)
9022f86ba45SStephan Aßmus {
9032f86ba45SStephan Aßmus 	if (!rect.IsValid() || !rect.Intersects(updateRect))
9042f86ba45SStephan Aßmus 		return;
9052f86ba45SStephan Aßmus 
9062f86ba45SStephan Aßmus 	// figure out frame color
9072f86ba45SStephan Aßmus 	rgb_color frameLightColor;
9082f86ba45SStephan Aßmus 	rgb_color frameShadowColor;
9092f86ba45SStephan Aßmus 	rgb_color shadowColor = (rgb_color){ 0, 0, 0, 60 };
9102f86ba45SStephan Aßmus 
9112f86ba45SStephan Aßmus 	if (flags & B_FOCUSED) {
9122f86ba45SStephan Aßmus 		// focused
9132f86ba45SStephan Aßmus 		frameLightColor = ui_color(B_KEYBOARD_NAVIGATION_COLOR);
9142f86ba45SStephan Aßmus 		frameShadowColor = frameLightColor;
9152f86ba45SStephan Aßmus 	} else {
9162f86ba45SStephan Aßmus 		// figure out the tints to be used
9172f86ba45SStephan Aßmus 		float frameLightTint;
9182f86ba45SStephan Aßmus 		float frameShadowTint;
9192f86ba45SStephan Aßmus 
9202f86ba45SStephan Aßmus 		if (flags & B_DISABLED) {
9212f86ba45SStephan Aßmus 			frameLightTint = 1.30;
9222f86ba45SStephan Aßmus 			frameShadowTint = 1.35;
9232f86ba45SStephan Aßmus 			shadowColor.alpha = 30;
9242f86ba45SStephan Aßmus 		} else {
9252f86ba45SStephan Aßmus 			frameLightTint = 1.6;
9262f86ba45SStephan Aßmus 			frameShadowTint = 1.65;
9272f86ba45SStephan Aßmus 		}
9282f86ba45SStephan Aßmus 
9292f86ba45SStephan Aßmus 		frameLightColor = tint_color(base, frameLightTint);
9302f86ba45SStephan Aßmus 		frameShadowColor = tint_color(base, frameShadowTint);
9312f86ba45SStephan Aßmus 	}
9322f86ba45SStephan Aßmus 
9332f86ba45SStephan Aßmus 	BRect originalRect(rect);
9342f86ba45SStephan Aßmus 	rect.right--;
9352f86ba45SStephan Aßmus 	rect.bottom--;
9362f86ba45SStephan Aßmus 
9372f86ba45SStephan Aßmus 	_DrawFrame(view, rect, frameLightColor, frameLightColor,
9382f86ba45SStephan Aßmus 		frameShadowColor, frameShadowColor);
9392f86ba45SStephan Aßmus 
9402f86ba45SStephan Aßmus 	flags &= ~B_ACTIVATED;
9412f86ba45SStephan Aßmus 	DrawButtonBackground(view, rect, updateRect, base, flags);
9422f86ba45SStephan Aßmus 
9432f86ba45SStephan Aßmus 	// thumb shadow
9442f86ba45SStephan Aßmus 	view->SetDrawingMode(B_OP_ALPHA);
9452f86ba45SStephan Aßmus 	view->SetHighColor(shadowColor);
9462f86ba45SStephan Aßmus 	originalRect.left++;
9472f86ba45SStephan Aßmus 	originalRect.top++;
9482f86ba45SStephan Aßmus 	view->StrokeLine(originalRect.LeftBottom(), originalRect.RightBottom());
9492f86ba45SStephan Aßmus 	originalRect.bottom--;
9502f86ba45SStephan Aßmus 	view->StrokeLine(originalRect.RightTop(), originalRect.RightBottom());
9512f86ba45SStephan Aßmus 
9522f86ba45SStephan Aßmus 	// thumb edge
9532f86ba45SStephan Aßmus 	if (orientation == B_HORIZONTAL) {
9542f86ba45SStephan Aßmus 		rect.InsetBy(0, floorf(rect.Height() / 4));
9552f86ba45SStephan Aßmus 		rect.left = floorf((rect.left + rect.right) / 2);
9562f86ba45SStephan Aßmus 		rect.right = rect.left + 1;
9572f86ba45SStephan Aßmus 		shadowColor = tint_color(base, B_DARKEN_2_TINT);
9582f86ba45SStephan Aßmus 		shadowColor.alpha = 128;
9592f86ba45SStephan Aßmus 		view->SetHighColor(shadowColor);
9602f86ba45SStephan Aßmus 		view->StrokeLine(rect.LeftTop(), rect.LeftBottom());
9612f86ba45SStephan Aßmus 		rgb_color lightColor = tint_color(base, B_LIGHTEN_2_TINT);
9622f86ba45SStephan Aßmus 		lightColor.alpha = 128;
9632f86ba45SStephan Aßmus 		view->SetHighColor(lightColor);
9642f86ba45SStephan Aßmus 		view->StrokeLine(rect.RightTop(), rect.RightBottom());
9652f86ba45SStephan Aßmus 	} else {
9662f86ba45SStephan Aßmus 		rect.InsetBy(floorf(rect.Width() / 4), 0);
9672f86ba45SStephan Aßmus 		rect.top = floorf((rect.top + rect.bottom) / 2);
9682f86ba45SStephan Aßmus 		rect.bottom = rect.top + 1;
9692f86ba45SStephan Aßmus 		shadowColor = tint_color(base, B_DARKEN_2_TINT);
9702f86ba45SStephan Aßmus 		shadowColor.alpha = 128;
9712f86ba45SStephan Aßmus 		view->SetHighColor(shadowColor);
9722f86ba45SStephan Aßmus 		view->StrokeLine(rect.LeftTop(), rect.RightTop());
9732f86ba45SStephan Aßmus 		rgb_color lightColor = tint_color(base, B_LIGHTEN_2_TINT);
9742f86ba45SStephan Aßmus 		lightColor.alpha = 128;
9752f86ba45SStephan Aßmus 		view->SetHighColor(lightColor);
9762f86ba45SStephan Aßmus 		view->StrokeLine(rect.LeftBottom(), rect.RightBottom());
9772f86ba45SStephan Aßmus 	}
9782f86ba45SStephan Aßmus 
9792f86ba45SStephan Aßmus 	view->SetDrawingMode(B_OP_COPY);
9802f86ba45SStephan Aßmus }
9812f86ba45SStephan Aßmus 
9822f86ba45SStephan Aßmus 
9832f86ba45SStephan Aßmus void
9842f86ba45SStephan Aßmus BControlLook::DrawSliderTriangle(BView* view, BRect& rect,
9852f86ba45SStephan Aßmus 	const BRect& updateRect, const rgb_color& base, uint32 flags,
9862f86ba45SStephan Aßmus 	enum orientation orientation)
9872f86ba45SStephan Aßmus {
9882f86ba45SStephan Aßmus 	if (!rect.IsValid() || !rect.Intersects(updateRect))
9892f86ba45SStephan Aßmus 		return;
9902f86ba45SStephan Aßmus 
9912f86ba45SStephan Aßmus 	// figure out frame color
9922f86ba45SStephan Aßmus 	rgb_color frameLightColor;
9932f86ba45SStephan Aßmus 	rgb_color frameShadowColor;
9942f86ba45SStephan Aßmus 	rgb_color shadowColor = (rgb_color){ 0, 0, 0, 60 };
9952f86ba45SStephan Aßmus 
9962f86ba45SStephan Aßmus 	float topTint = 0.49;
9972f86ba45SStephan Aßmus 	float middleTint1 = 0.62;
9982f86ba45SStephan Aßmus 	float middleTint2 = 0.76;
9992f86ba45SStephan Aßmus 	float bottomTint = 0.90;
10002f86ba45SStephan Aßmus 
10012f86ba45SStephan Aßmus 	if (flags & B_DISABLED) {
10022f86ba45SStephan Aßmus 		topTint = (topTint + B_NO_TINT) / 2;
10032f86ba45SStephan Aßmus 		middleTint1 = (middleTint1 + B_NO_TINT) / 2;
10042f86ba45SStephan Aßmus 		middleTint2 = (middleTint2 + B_NO_TINT) / 2;
10052f86ba45SStephan Aßmus 		bottomTint = (bottomTint + B_NO_TINT) / 2;
10062f86ba45SStephan Aßmus 	} else if (flags & B_HOVER) {
10072f86ba45SStephan Aßmus 		static const float kHoverTintFactor = 0.85;
10082f86ba45SStephan Aßmus 		topTint *= kHoverTintFactor;
10092f86ba45SStephan Aßmus 		middleTint1 *= kHoverTintFactor;
10102f86ba45SStephan Aßmus 		middleTint2 *= kHoverTintFactor;
10112f86ba45SStephan Aßmus 		bottomTint *= kHoverTintFactor;
10122f86ba45SStephan Aßmus 	}
10132f86ba45SStephan Aßmus 
10142f86ba45SStephan Aßmus 	if (flags & B_FOCUSED) {
10152f86ba45SStephan Aßmus 		// focused
10162f86ba45SStephan Aßmus 		frameLightColor = ui_color(B_KEYBOARD_NAVIGATION_COLOR);
10172f86ba45SStephan Aßmus 		frameShadowColor = frameLightColor;
10182f86ba45SStephan Aßmus 	} else {
10192f86ba45SStephan Aßmus 		// figure out the tints to be used
10202f86ba45SStephan Aßmus 		float frameLightTint;
10212f86ba45SStephan Aßmus 		float frameShadowTint;
10222f86ba45SStephan Aßmus 
10232f86ba45SStephan Aßmus 		if (flags & B_DISABLED) {
10242f86ba45SStephan Aßmus 			frameLightTint = 1.30;
10252f86ba45SStephan Aßmus 			frameShadowTint = 1.35;
10262f86ba45SStephan Aßmus 			shadowColor.alpha = 30;
10272f86ba45SStephan Aßmus 		} else {
10282f86ba45SStephan Aßmus 			frameLightTint = 1.6;
10292f86ba45SStephan Aßmus 			frameShadowTint = 1.65;
10302f86ba45SStephan Aßmus 		}
10312f86ba45SStephan Aßmus 
10322f86ba45SStephan Aßmus 		frameLightColor = tint_color(base, frameLightTint);
10332f86ba45SStephan Aßmus 		frameShadowColor = tint_color(base, frameShadowTint);
10342f86ba45SStephan Aßmus 	}
10352f86ba45SStephan Aßmus 
10362f86ba45SStephan Aßmus //	BRect originalRect(rect);
10372f86ba45SStephan Aßmus //	rect.right--;
10382f86ba45SStephan Aßmus //	rect.bottom--;
10392f86ba45SStephan Aßmus 
10402f86ba45SStephan Aßmus 	float center = (rect.left + rect.right) / 2;
10412f86ba45SStephan Aßmus 
10422f86ba45SStephan Aßmus //	BShape shape;
10432f86ba45SStephan Aßmus //	shape.MoveTo(BPoint(rect.left + 0.5, rect.bottom + 0.5));
10442f86ba45SStephan Aßmus //	shape.LineTo(BPoint(rect.right + 0.5, rect.bottom + 0.5));
10452f86ba45SStephan Aßmus //	shape.LineTo(BPoint(rect.right + 0.5, rect.bottom - 1 + 0.5));
10462f86ba45SStephan Aßmus //	shape.LineTo(BPoint(rect.right + 0.5, rect.bottom - 1 + 0.5));
10472f86ba45SStephan Aßmus //	shape.LineTo(BPoint(center + 0.5, rect.top + 0.5));
10482f86ba45SStephan Aßmus //	shape.LineTo(BPoint(rect.left + 0.5, rect.bottom - 1 + 0.5));
10492f86ba45SStephan Aßmus //	shape.Close();
10502f86ba45SStephan Aßmus //
10512f86ba45SStephan Aßmus //	BGradientLinear gradient;
10522f86ba45SStephan Aßmus //	gradient.AddColor(frameLightColor, 0);
10532f86ba45SStephan Aßmus //	gradient.AddColor(frameShadowColor, 255);
10542f86ba45SStephan Aßmus //	gradient.SetStart(rect.LeftTop());
10552f86ba45SStephan Aßmus //	gradient.SetEnd(rect.RightBottom());
10562f86ba45SStephan Aßmus //
10572f86ba45SStephan Aßmus //	view->SetHighColor(frameLightColor);
10582f86ba45SStephan Aßmus //	view->StrokeShape(&shape);
10592f86ba45SStephan Aßmus //
10602f86ba45SStephan Aßmus //	view->StrokeRect(rect);
10612f86ba45SStephan Aßmus 
10622f86ba45SStephan Aßmus 	uint32 viewFlags = view->Flags();
10632f86ba45SStephan Aßmus 	view->SetFlags(viewFlags | B_SUBPIXEL_PRECISE);
10642f86ba45SStephan Aßmus 	view->SetLineMode(B_ROUND_CAP, B_ROUND_JOIN);
10652f86ba45SStephan Aßmus 
10662f86ba45SStephan Aßmus 	BPoint triangle[3];
10672f86ba45SStephan Aßmus 	triangle[0] = BPoint(rect.left + 0.5, rect.bottom - 1 + 0.5);
10682f86ba45SStephan Aßmus 	triangle[1] = BPoint(rect.right + 0.5, rect.bottom - 1 + 0.5);
10692f86ba45SStephan Aßmus 	triangle[2] = BPoint(center + 0.5, rect.top + 0.5);
10702f86ba45SStephan Aßmus 
10712f86ba45SStephan Aßmus 	view->SetHighColor(frameLightColor);
10722f86ba45SStephan Aßmus 	view->StrokeTriangle(triangle[0], triangle[1], triangle[2]);
10732f86ba45SStephan Aßmus 	view->StrokeLine(BPoint(rect.left, rect.bottom),
10742f86ba45SStephan Aßmus 		BPoint(rect.right + 1, rect.bottom));
10752f86ba45SStephan Aßmus 
10762f86ba45SStephan Aßmus 	rect.InsetBy(1, 1);
10772f86ba45SStephan Aßmus 
10782f86ba45SStephan Aßmus 	triangle[0] = BPoint(rect.left, rect.bottom);
10792f86ba45SStephan Aßmus 	triangle[1] = BPoint(rect.right + 1, rect.bottom);
10802f86ba45SStephan Aßmus 	triangle[2] = BPoint(center, rect.top);
10812f86ba45SStephan Aßmus 
10822f86ba45SStephan Aßmus 	BGradientLinear gradient;
10832f86ba45SStephan Aßmus 	if (flags & B_DISABLED) {
10842f86ba45SStephan Aßmus 		_MakeGradient(gradient, rect, base, topTint, bottomTint);
10852f86ba45SStephan Aßmus 	} else {
10862f86ba45SStephan Aßmus 		_MakeGlossyGradient(gradient, rect, base, topTint, middleTint1,
10872f86ba45SStephan Aßmus 			middleTint2, bottomTint);
10882f86ba45SStephan Aßmus 	}
10892f86ba45SStephan Aßmus 
10902f86ba45SStephan Aßmus 	view->FillTriangle(triangle[0], triangle[1], triangle[2], gradient);
10912f86ba45SStephan Aßmus 
10922f86ba45SStephan Aßmus 
10932f86ba45SStephan Aßmus //
10942f86ba45SStephan Aßmus //	_DrawFrame(view, rect, frameLightColor, frameLightColor,
10952f86ba45SStephan Aßmus //		frameShadowColor, frameShadowColor);
10962f86ba45SStephan Aßmus //
10972f86ba45SStephan Aßmus //	flags &= ~B_ACTIVATED;
10982f86ba45SStephan Aßmus //	DrawButtonBackground(view, rect, updateRect, base, flags);
10992f86ba45SStephan Aßmus //
11002f86ba45SStephan Aßmus //	// thumb shadow
11012f86ba45SStephan Aßmus //	view->SetDrawingMode(B_OP_ALPHA);
11022f86ba45SStephan Aßmus //	view->SetHighColor(shadowColor);
11032f86ba45SStephan Aßmus //	originalRect.left++;
11042f86ba45SStephan Aßmus //	originalRect.top++;
11052f86ba45SStephan Aßmus //	view->StrokeLine(originalRect.LeftBottom(), originalRect.RightBottom());
11062f86ba45SStephan Aßmus //	originalRect.bottom--;
11072f86ba45SStephan Aßmus //	view->StrokeLine(originalRect.RightTop(), originalRect.RightBottom());
11082f86ba45SStephan Aßmus //
11092f86ba45SStephan Aßmus //	// thumb edge
11102f86ba45SStephan Aßmus //	rect.InsetBy(0, 2);
11112f86ba45SStephan Aßmus //	rect.left = floorf((rect.left + rect.right) / 2);
11122f86ba45SStephan Aßmus //	rect.right = rect.left + 1;
11132f86ba45SStephan Aßmus //	shadowColor = tint_color(base, B_DARKEN_2_TINT);
11142f86ba45SStephan Aßmus //	shadowColor.alpha = 128;
11152f86ba45SStephan Aßmus //	view->SetHighColor(shadowColor);
11162f86ba45SStephan Aßmus //	view->StrokeLine(rect.LeftTop(), rect.LeftBottom());
11172f86ba45SStephan Aßmus //	rgb_color lightColor = tint_color(base, B_LIGHTEN_2_TINT);
11182f86ba45SStephan Aßmus //	lightColor.alpha = 128;
11192f86ba45SStephan Aßmus //	view->SetHighColor(lightColor);
11202f86ba45SStephan Aßmus //	view->StrokeLine(rect.RightTop(), rect.RightBottom());
11212f86ba45SStephan Aßmus //
11222f86ba45SStephan Aßmus //	view->SetDrawingMode(B_OP_COPY);
11232f86ba45SStephan Aßmus 
11242f86ba45SStephan Aßmus 	view->SetFlags(viewFlags);
11252f86ba45SStephan Aßmus }
11262f86ba45SStephan Aßmus 
11272f86ba45SStephan Aßmus 
11282f86ba45SStephan Aßmus void
11292f86ba45SStephan Aßmus BControlLook::DrawSliderHashMarks(BView* view, BRect& rect,
11302f86ba45SStephan Aßmus 	const BRect& updateRect, const rgb_color& base, int32 count,
11312f86ba45SStephan Aßmus 	hash_mark_location location, uint32 flags, enum orientation orientation)
11322f86ba45SStephan Aßmus {
11332f86ba45SStephan Aßmus 	if (!rect.IsValid() || !rect.Intersects(updateRect))
11342f86ba45SStephan Aßmus 		return;
11352f86ba45SStephan Aßmus 
11362f86ba45SStephan Aßmus 	rgb_color lightColor;
11372f86ba45SStephan Aßmus 	rgb_color darkColor;
11382f86ba45SStephan Aßmus 
11392f86ba45SStephan Aßmus 	if (flags & B_DISABLED) {
11402f86ba45SStephan Aßmus 		lightColor = tint_color(base, 0.9);
11412f86ba45SStephan Aßmus 		darkColor = tint_color(base, 1.07);
11422f86ba45SStephan Aßmus 	} else {
11432f86ba45SStephan Aßmus 		lightColor = tint_color(base, 0.8);
11442f86ba45SStephan Aßmus 		darkColor = tint_color(base, 1.14);
11452f86ba45SStephan Aßmus 	}
11462f86ba45SStephan Aßmus 
11472f86ba45SStephan Aßmus 	int32 hashMarkCount = max_c(count, 2);
11482f86ba45SStephan Aßmus 		// draw at least two hashmarks at min/max if
11492f86ba45SStephan Aßmus 		// fHashMarks != B_HASH_MARKS_NONE
11502f86ba45SStephan Aßmus 	float factor;
11512f86ba45SStephan Aßmus 	float startPos;
11522f86ba45SStephan Aßmus 	if (orientation == B_HORIZONTAL) {
11532f86ba45SStephan Aßmus 		factor = (rect.Width() - 2) / (hashMarkCount - 1);
11542f86ba45SStephan Aßmus 		startPos = rect.left + 1;
11552f86ba45SStephan Aßmus 	} else {
11562f86ba45SStephan Aßmus 		factor = (rect.Height() - 2) / (hashMarkCount - 1);
11572f86ba45SStephan Aßmus 		startPos = rect.top + 1;
11582f86ba45SStephan Aßmus 	}
11592f86ba45SStephan Aßmus 
11602f86ba45SStephan Aßmus 	if (location & B_HASH_MARKS_TOP) {
11612f86ba45SStephan Aßmus 		view->BeginLineArray(hashMarkCount * 2);
11622f86ba45SStephan Aßmus 
11632f86ba45SStephan Aßmus 		if (orientation == B_HORIZONTAL) {
11642f86ba45SStephan Aßmus 			float pos = startPos;
11652f86ba45SStephan Aßmus 			for (int32 i = 0; i < hashMarkCount; i++) {
11662f86ba45SStephan Aßmus 				view->AddLine(BPoint(pos, rect.top),
11672f86ba45SStephan Aßmus 							  BPoint(pos, rect.top + 4), darkColor);
11682f86ba45SStephan Aßmus 				view->AddLine(BPoint(pos + 1, rect.top),
11692f86ba45SStephan Aßmus 							  BPoint(pos + 1, rect.top + 4), lightColor);
11702f86ba45SStephan Aßmus 
11712f86ba45SStephan Aßmus 				pos += factor;
11722f86ba45SStephan Aßmus 			}
11732f86ba45SStephan Aßmus 		} else {
11742f86ba45SStephan Aßmus 			float pos = startPos;
11752f86ba45SStephan Aßmus 			for (int32 i = 0; i < hashMarkCount; i++) {
11762f86ba45SStephan Aßmus 				view->AddLine(BPoint(rect.left, pos),
11772f86ba45SStephan Aßmus 							  BPoint(rect.left + 4, pos), darkColor);
11782f86ba45SStephan Aßmus 				view->AddLine(BPoint(rect.left, pos + 1),
11792f86ba45SStephan Aßmus 							  BPoint(rect.left + 4, pos + 1), lightColor);
11802f86ba45SStephan Aßmus 
11812f86ba45SStephan Aßmus 				pos += factor;
11822f86ba45SStephan Aßmus 			}
11832f86ba45SStephan Aßmus 		}
11842f86ba45SStephan Aßmus 
11852f86ba45SStephan Aßmus 		view->EndLineArray();
11862f86ba45SStephan Aßmus 	}
11872f86ba45SStephan Aßmus 
11882f86ba45SStephan Aßmus 	if (location & B_HASH_MARKS_BOTTOM) {
11892f86ba45SStephan Aßmus 
11902f86ba45SStephan Aßmus 		view->BeginLineArray(hashMarkCount * 2);
11912f86ba45SStephan Aßmus 
11922f86ba45SStephan Aßmus 		if (orientation == B_HORIZONTAL) {
11932f86ba45SStephan Aßmus 			float pos = startPos;
11942f86ba45SStephan Aßmus 			for (int32 i = 0; i < hashMarkCount; i++) {
11952f86ba45SStephan Aßmus 				view->AddLine(BPoint(pos, rect.bottom - 4),
11962f86ba45SStephan Aßmus 							  BPoint(pos, rect.bottom), darkColor);
11972f86ba45SStephan Aßmus 				view->AddLine(BPoint(pos + 1, rect.bottom - 4),
11982f86ba45SStephan Aßmus 							  BPoint(pos + 1, rect.bottom), lightColor);
11992f86ba45SStephan Aßmus 
12002f86ba45SStephan Aßmus 				pos += factor;
12012f86ba45SStephan Aßmus 			}
12022f86ba45SStephan Aßmus 		} else {
12032f86ba45SStephan Aßmus 			float pos = startPos;
12042f86ba45SStephan Aßmus 			for (int32 i = 0; i < hashMarkCount; i++) {
12052f86ba45SStephan Aßmus 				view->AddLine(BPoint(rect.right - 4, pos),
12062f86ba45SStephan Aßmus 							  BPoint(rect.right, pos), darkColor);
12072f86ba45SStephan Aßmus 				view->AddLine(BPoint(rect.right - 4, pos + 1),
12082f86ba45SStephan Aßmus 							  BPoint(rect.right, pos + 1), lightColor);
12092f86ba45SStephan Aßmus 
12102f86ba45SStephan Aßmus 				pos += factor;
12112f86ba45SStephan Aßmus 			}
12122f86ba45SStephan Aßmus 		}
12132f86ba45SStephan Aßmus 
12142f86ba45SStephan Aßmus 		view->EndLineArray();
12152f86ba45SStephan Aßmus 	}
12162f86ba45SStephan Aßmus }
12172f86ba45SStephan Aßmus 
12182f86ba45SStephan Aßmus 
12192f86ba45SStephan Aßmus void
12202f86ba45SStephan Aßmus BControlLook::DrawActiveTab(BView* view, BRect& rect, const BRect& updateRect,
12212f86ba45SStephan Aßmus 	const rgb_color& base, uint32 flags, uint32 borders)
12222f86ba45SStephan Aßmus {
12232f86ba45SStephan Aßmus 	if (!rect.IsValid() || !rect.Intersects(updateRect))
12242f86ba45SStephan Aßmus 		return;
12252f86ba45SStephan Aßmus 
12262f86ba45SStephan Aßmus 	rgb_color edgeShadowColor;
12272f86ba45SStephan Aßmus 	rgb_color edgeLightColor;
12282f86ba45SStephan Aßmus 	rgb_color frameShadowColor;
12292f86ba45SStephan Aßmus 	rgb_color frameLightColor;
12302f86ba45SStephan Aßmus 	rgb_color bevelShadowColor;
12312f86ba45SStephan Aßmus 	rgb_color bevelLightColor;
12322f86ba45SStephan Aßmus 	BGradientLinear fillGradient;
12332f86ba45SStephan Aßmus 	fillGradient.SetStart(rect.LeftTop() + BPoint(3, 3));
12342f86ba45SStephan Aßmus 	fillGradient.SetEnd(rect.LeftBottom() + BPoint(3, -3));
12352f86ba45SStephan Aßmus 
12362f86ba45SStephan Aßmus 	if (flags & B_DISABLED) {
12372f86ba45SStephan Aßmus 		edgeShadowColor = base;
12382f86ba45SStephan Aßmus 		edgeLightColor = base;
12392f86ba45SStephan Aßmus 		frameShadowColor = tint_color(base, 1.30);
12402f86ba45SStephan Aßmus 		frameLightColor = tint_color(base, 1.25);
12412f86ba45SStephan Aßmus 		bevelShadowColor = tint_color(base, 1.07);
12422f86ba45SStephan Aßmus 		bevelLightColor = tint_color(base, 0.8);
12432f86ba45SStephan Aßmus 		fillGradient.AddColor(tint_color(base, 0.85), 0);
12442f86ba45SStephan Aßmus 		fillGradient.AddColor(base, 255);
12452f86ba45SStephan Aßmus 	} else {
12462f86ba45SStephan Aßmus 		edgeShadowColor = tint_color(base, 1.03);
12472f86ba45SStephan Aßmus 		edgeLightColor = tint_color(base, 0.80);
12482f86ba45SStephan Aßmus 		frameShadowColor = tint_color(base, 1.30);
12492f86ba45SStephan Aßmus 		frameLightColor = tint_color(base, 1.30);
12502f86ba45SStephan Aßmus 		bevelShadowColor = tint_color(base, 1.07);
12512f86ba45SStephan Aßmus 		bevelLightColor = tint_color(base, 0.6);
12522f86ba45SStephan Aßmus 		fillGradient.AddColor(tint_color(base, 0.75), 0);
12532f86ba45SStephan Aßmus 		fillGradient.AddColor(tint_color(base, 1.03), 255);
12542f86ba45SStephan Aßmus 	}
1255*12ea5a2cSStephan Aßmus 
12562f86ba45SStephan Aßmus 	static const float kRoundCornerRadius = 4;
12572f86ba45SStephan Aßmus 
12582f86ba45SStephan Aßmus 	// left/top corner
12592f86ba45SStephan Aßmus 	BRect cornerRect(rect);
12602f86ba45SStephan Aßmus 	cornerRect.right = cornerRect.left + kRoundCornerRadius;
12612f86ba45SStephan Aßmus 	cornerRect.bottom = cornerRect.top + kRoundCornerRadius;
12622f86ba45SStephan Aßmus 
12632f86ba45SStephan Aßmus 	BRegion clipping(rect);
12642f86ba45SStephan Aßmus 	clipping.Exclude(cornerRect);
12652f86ba45SStephan Aßmus 
12662f86ba45SStephan Aßmus 	_DrawRoundCornerLeftTop(view, cornerRect, updateRect, base, edgeShadowColor,
12672f86ba45SStephan Aßmus 		frameLightColor, bevelLightColor, fillGradient);
12682f86ba45SStephan Aßmus 
12692f86ba45SStephan Aßmus 	// left/top corner
12702f86ba45SStephan Aßmus 	cornerRect.right = rect.right;
12712f86ba45SStephan Aßmus 	cornerRect.left = cornerRect.right - kRoundCornerRadius;
12722f86ba45SStephan Aßmus 
12732f86ba45SStephan Aßmus 	clipping.Exclude(cornerRect);
12742f86ba45SStephan Aßmus 
12752f86ba45SStephan Aßmus 	_DrawRoundCornerRightTop(view, cornerRect, updateRect, base, edgeShadowColor,
12762f86ba45SStephan Aßmus 		edgeLightColor, frameLightColor, frameShadowColor, bevelLightColor,
12772f86ba45SStephan Aßmus 		bevelShadowColor, fillGradient);
12782f86ba45SStephan Aßmus 
12792f86ba45SStephan Aßmus 	// rest of frame and fill
12802f86ba45SStephan Aßmus 	view->ConstrainClippingRegion(&clipping);
12812f86ba45SStephan Aßmus 
12822f86ba45SStephan Aßmus 	_DrawFrame(view, rect, edgeShadowColor, edgeShadowColor, edgeLightColor,
12832f86ba45SStephan Aßmus 		edgeLightColor,
12842f86ba45SStephan Aßmus 		borders & (B_LEFT_BORDER | B_TOP_BORDER | B_RIGHT_BORDER));
12852f86ba45SStephan Aßmus 	if ((borders & B_LEFT_BORDER) == 0)
12862f86ba45SStephan Aßmus 		rect.left++;
12872f86ba45SStephan Aßmus 	if ((borders & B_RIGHT_BORDER) == 0)
12882f86ba45SStephan Aßmus 		rect.right--;
12892f86ba45SStephan Aßmus 
12902f86ba45SStephan Aßmus 	_DrawFrame(view, rect, frameLightColor, frameLightColor, frameShadowColor,
12912f86ba45SStephan Aßmus 		frameShadowColor, B_LEFT_BORDER | B_TOP_BORDER | B_RIGHT_BORDER);
12922f86ba45SStephan Aßmus 
12932f86ba45SStephan Aßmus 	_DrawFrame(view, rect, bevelLightColor, bevelLightColor, bevelShadowColor,
12942f86ba45SStephan Aßmus 		bevelShadowColor);
12952f86ba45SStephan Aßmus 
12962f86ba45SStephan Aßmus 	view->FillRect(rect, fillGradient);
12972f86ba45SStephan Aßmus 
12982f86ba45SStephan Aßmus 	view->ConstrainClippingRegion(NULL);
12992f86ba45SStephan Aßmus }
13002f86ba45SStephan Aßmus 
13012f86ba45SStephan Aßmus 
13022f86ba45SStephan Aßmus void
13032f86ba45SStephan Aßmus BControlLook::DrawInctiveTab(BView* view, BRect& rect, const BRect& updateRect,
13042f86ba45SStephan Aßmus 	const rgb_color& base, uint32 flags, uint32 borders)
13052f86ba45SStephan Aßmus {
13062f86ba45SStephan Aßmus 	if (!rect.IsValid() || !rect.Intersects(updateRect))
13072f86ba45SStephan Aßmus 		return;
13082f86ba45SStephan Aßmus 
13092f86ba45SStephan Aßmus 	rgb_color edgeShadowColor;
13102f86ba45SStephan Aßmus 	rgb_color edgeLightColor;
13112f86ba45SStephan Aßmus 	rgb_color frameShadowColor;
13122f86ba45SStephan Aßmus 	rgb_color frameLightColor;
13132f86ba45SStephan Aßmus 	rgb_color bevelShadowColor;
13142f86ba45SStephan Aßmus 	rgb_color bevelLightColor;
13152f86ba45SStephan Aßmus 	BGradientLinear fillGradient;
13162f86ba45SStephan Aßmus 	fillGradient.SetStart(rect.LeftTop() + BPoint(3, 3));
13172f86ba45SStephan Aßmus 	fillGradient.SetEnd(rect.LeftBottom() + BPoint(3, -3));
13182f86ba45SStephan Aßmus 
13192f86ba45SStephan Aßmus 	if (flags & B_DISABLED) {
13202f86ba45SStephan Aßmus 		edgeShadowColor = base;
13212f86ba45SStephan Aßmus 		edgeLightColor = base;
13222f86ba45SStephan Aßmus 		frameShadowColor = tint_color(base, 1.30);
13232f86ba45SStephan Aßmus 		frameLightColor = tint_color(base, 1.25);
13242f86ba45SStephan Aßmus 		bevelShadowColor = tint_color(base, 1.07);
13252f86ba45SStephan Aßmus 		bevelLightColor = tint_color(base, 0.8);
13262f86ba45SStephan Aßmus 		fillGradient.AddColor(tint_color(base, 0.85), 0);
13272f86ba45SStephan Aßmus 		fillGradient.AddColor(base, 255);
13282f86ba45SStephan Aßmus 	} else {
13292f86ba45SStephan Aßmus 		edgeShadowColor = tint_color(base, 1.03);
13302f86ba45SStephan Aßmus 		edgeLightColor = tint_color(base, 0.80);
13312f86ba45SStephan Aßmus 		frameShadowColor = tint_color(base, 1.30);
13322f86ba45SStephan Aßmus 		frameLightColor = tint_color(base, 1.30);
1333*12ea5a2cSStephan Aßmus 		bevelShadowColor = tint_color(base, 1.17);
13342f86ba45SStephan Aßmus 		bevelLightColor = tint_color(base, 1.10);
13352f86ba45SStephan Aßmus 		fillGradient.AddColor(tint_color(base, 1.12), 0);
13362f86ba45SStephan Aßmus 		fillGradient.AddColor(tint_color(base, 1.08), 255);
13372f86ba45SStephan Aßmus 	}
13382f86ba45SStephan Aßmus 
13392f86ba45SStephan Aßmus 	// active tabs stand out at the top, but this is an inactive tab
13402f86ba45SStephan Aßmus 	view->SetHighColor(base);
13412f86ba45SStephan Aßmus 	view->FillRect(BRect(rect.left, rect.top, rect.right, rect.top + 4));
13422f86ba45SStephan Aßmus 	rect.top += 4;
13432f86ba45SStephan Aßmus 
13442f86ba45SStephan Aßmus 	// frame and fill
13452f86ba45SStephan Aßmus 	_DrawFrame(view, rect, edgeShadowColor, edgeShadowColor, edgeLightColor,
13462f86ba45SStephan Aßmus 		edgeLightColor,
13472f86ba45SStephan Aßmus 		borders & (B_LEFT_BORDER | B_TOP_BORDER | B_RIGHT_BORDER));
13482f86ba45SStephan Aßmus 
13492f86ba45SStephan Aßmus 	_DrawFrame(view, rect, frameLightColor, frameLightColor, frameShadowColor,
13502f86ba45SStephan Aßmus 		frameShadowColor,
13512f86ba45SStephan Aßmus 		borders & (B_LEFT_BORDER | B_TOP_BORDER | B_RIGHT_BORDER));
13522f86ba45SStephan Aßmus 
1353*12ea5a2cSStephan Aßmus 	_DrawFrame(view, rect, bevelShadowColor, bevelShadowColor, bevelLightColor,
1354*12ea5a2cSStephan Aßmus 		bevelLightColor, B_LEFT_BORDER & ~borders);
13552f86ba45SStephan Aßmus 
13562f86ba45SStephan Aßmus 	view->FillRect(rect, fillGradient);
13572f86ba45SStephan Aßmus }
13582f86ba45SStephan Aßmus 
13592f86ba45SStephan Aßmus 
13602f86ba45SStephan Aßmus // #pragma mark -
13612f86ba45SStephan Aßmus 
13622f86ba45SStephan Aßmus 
13632f86ba45SStephan Aßmus void
13642f86ba45SStephan Aßmus BControlLook::DrawBorder(BView* view, BRect& rect, const BRect& updateRect,
13652f86ba45SStephan Aßmus 	const rgb_color& base, border_style border, uint32 flags, uint32 borders)
13662f86ba45SStephan Aßmus {
13672f86ba45SStephan Aßmus 	if (border == B_NO_BORDER)
13682f86ba45SStephan Aßmus 		return;
13692f86ba45SStephan Aßmus 
13702f86ba45SStephan Aßmus 	rgb_color scrollbarFrameColor = tint_color(base, B_DARKEN_2_TINT);
13712f86ba45SStephan Aßmus 	if (flags & B_FOCUSED)
13722f86ba45SStephan Aßmus 		scrollbarFrameColor = ui_color(B_KEYBOARD_NAVIGATION_COLOR);
13732f86ba45SStephan Aßmus 
13742f86ba45SStephan Aßmus 	if (border == B_FANCY_BORDER)
13752f86ba45SStephan Aßmus 		_DrawOuterResessedFrame(view, rect, base, 1.0, 1.0, borders);
13762f86ba45SStephan Aßmus 
13772f86ba45SStephan Aßmus 	_DrawFrame(view, rect, scrollbarFrameColor, scrollbarFrameColor,
13782f86ba45SStephan Aßmus 		scrollbarFrameColor, scrollbarFrameColor, borders);
13792f86ba45SStephan Aßmus }
13802f86ba45SStephan Aßmus 
13812f86ba45SStephan Aßmus 
13822f86ba45SStephan Aßmus void
13832f86ba45SStephan Aßmus BControlLook::DrawRaisedBorder(BView* view, BRect& rect,
13842f86ba45SStephan Aßmus 	const BRect& updateRect, const rgb_color& base, uint32 flags,
13852f86ba45SStephan Aßmus 	uint32 borders)
13862f86ba45SStephan Aßmus {
13872f86ba45SStephan Aßmus 	rgb_color lightColor;
13882f86ba45SStephan Aßmus 	rgb_color shadowColor;
13892f86ba45SStephan Aßmus 
13902f86ba45SStephan Aßmus 	if (flags & B_DISABLED) {
13912f86ba45SStephan Aßmus 		lightColor = base;
13922f86ba45SStephan Aßmus 		shadowColor = base;
13932f86ba45SStephan Aßmus 	} else {
13942f86ba45SStephan Aßmus 		lightColor = tint_color(base, 0.85);
13952f86ba45SStephan Aßmus 		shadowColor = tint_color(base, 1.07);
13962f86ba45SStephan Aßmus 	}
13972f86ba45SStephan Aßmus 
13982f86ba45SStephan Aßmus 	_DrawFrame(view, rect, lightColor, lightColor, shadowColor, shadowColor,
13992f86ba45SStephan Aßmus 		borders);
14002f86ba45SStephan Aßmus }
14012f86ba45SStephan Aßmus 
14022f86ba45SStephan Aßmus 
14032f86ba45SStephan Aßmus void
14042f86ba45SStephan Aßmus BControlLook::DrawTextControlBorder(BView* view, BRect& rect,
14052f86ba45SStephan Aßmus 	const BRect& updateRect, const rgb_color& base, uint32 flags,
14062f86ba45SStephan Aßmus 	uint32 borders)
14072f86ba45SStephan Aßmus {
14082f86ba45SStephan Aßmus 	if (!rect.Intersects(updateRect))
14092f86ba45SStephan Aßmus 		return;
14102f86ba45SStephan Aßmus 
14112f86ba45SStephan Aßmus 	rgb_color dark1BorderColor;
14122f86ba45SStephan Aßmus 	rgb_color dark2BorderColor;
14132f86ba45SStephan Aßmus 	rgb_color navigationColor = ui_color(B_KEYBOARD_NAVIGATION_COLOR);
14142f86ba45SStephan Aßmus 
14152f86ba45SStephan Aßmus 	if (flags & B_DISABLED) {
14162f86ba45SStephan Aßmus 		_DrawOuterResessedFrame(view, rect, base, 0.0, 1.0, borders);
14172f86ba45SStephan Aßmus 
14182f86ba45SStephan Aßmus 		dark1BorderColor = tint_color(base, 1.15);
14192f86ba45SStephan Aßmus 		dark2BorderColor = tint_color(base, 1.15);
14202f86ba45SStephan Aßmus 	} else if (flags & B_CLICKED) {
14212f86ba45SStephan Aßmus 		dark1BorderColor = tint_color(base, 1.50);
14222f86ba45SStephan Aßmus 		dark2BorderColor = tint_color(base, 1.49);
14232f86ba45SStephan Aßmus 
14242f86ba45SStephan Aßmus 		_DrawFrame(view, rect,
14252f86ba45SStephan Aßmus 			dark1BorderColor, dark1BorderColor,
14262f86ba45SStephan Aßmus 			dark2BorderColor, dark2BorderColor);
14272f86ba45SStephan Aßmus 
14282f86ba45SStephan Aßmus 		dark2BorderColor = dark1BorderColor;
14292f86ba45SStephan Aßmus 	} else {
14302f86ba45SStephan Aßmus 		_DrawOuterResessedFrame(view, rect, base, 0.6, 1.0, borders);
14312f86ba45SStephan Aßmus 
14322f86ba45SStephan Aßmus 		dark1BorderColor = tint_color(base, 1.40);
14332f86ba45SStephan Aßmus 		dark2BorderColor = tint_color(base, 1.38);
14342f86ba45SStephan Aßmus 	}
14352f86ba45SStephan Aßmus 
14362f86ba45SStephan Aßmus 	if ((flags & B_DISABLED) == 0 && (flags & B_FOCUSED)) {
14372f86ba45SStephan Aßmus 		dark1BorderColor = navigationColor;
14382f86ba45SStephan Aßmus 		dark2BorderColor = navigationColor;
14392f86ba45SStephan Aßmus 	}
14402f86ba45SStephan Aßmus 
14412f86ba45SStephan Aßmus 	_DrawFrame(view, rect,
14422f86ba45SStephan Aßmus 		dark1BorderColor, dark1BorderColor,
14432f86ba45SStephan Aßmus 		dark2BorderColor, dark2BorderColor, borders);
14442f86ba45SStephan Aßmus }
14452f86ba45SStephan Aßmus 
14462f86ba45SStephan Aßmus 
14472f86ba45SStephan Aßmus void
14482f86ba45SStephan Aßmus BControlLook::DrawGroupFrame(BView* view, BRect& rect, const BRect& updateRect,
14492f86ba45SStephan Aßmus 	const rgb_color& base, uint32 borders)
14502f86ba45SStephan Aßmus {
14512f86ba45SStephan Aßmus 	rgb_color frameColor = tint_color(base, 1.30);
14522f86ba45SStephan Aßmus 	rgb_color bevelLight = tint_color(base, 0.8);
14532f86ba45SStephan Aßmus 	rgb_color bevelShadow = tint_color(base, 1.03);
14542f86ba45SStephan Aßmus 
14552f86ba45SStephan Aßmus 	_DrawFrame(view, rect, bevelShadow, bevelShadow, bevelLight, bevelLight,
14562f86ba45SStephan Aßmus 		borders);
14572f86ba45SStephan Aßmus 
14582f86ba45SStephan Aßmus 	_DrawFrame(view, rect, frameColor, frameColor, frameColor, frameColor,
14592f86ba45SStephan Aßmus 		borders);
14602f86ba45SStephan Aßmus 
14612f86ba45SStephan Aßmus 	_DrawFrame(view, rect, bevelLight, bevelLight, bevelShadow, bevelShadow,
14622f86ba45SStephan Aßmus 		borders);
14632f86ba45SStephan Aßmus }
14642f86ba45SStephan Aßmus 
14652f86ba45SStephan Aßmus 
14662f86ba45SStephan Aßmus void
14672f86ba45SStephan Aßmus BControlLook::DrawLabel(BView* view, const char* label, BRect rect,
14682f86ba45SStephan Aßmus 	const BRect& updateRect, const rgb_color& base, uint32 flags)
14692f86ba45SStephan Aßmus {
14702f86ba45SStephan Aßmus 	DrawLabel(view, label, rect, updateRect, base, flags,
14712f86ba45SStephan Aßmus 		DefaultLabelAlignment());
14722f86ba45SStephan Aßmus }
14732f86ba45SStephan Aßmus 
14742f86ba45SStephan Aßmus 
14752f86ba45SStephan Aßmus void
14762f86ba45SStephan Aßmus BControlLook::DrawLabel(BView* view, const char* label, BRect rect,
14772f86ba45SStephan Aßmus 	const BRect& updateRect, const rgb_color& base, uint32 flags,
14782f86ba45SStephan Aßmus 	const BAlignment& alignment)
14792f86ba45SStephan Aßmus {
14802f86ba45SStephan Aßmus 	if (!rect.Intersects(updateRect))
14812f86ba45SStephan Aßmus 		return;
14822f86ba45SStephan Aßmus 
14832f86ba45SStephan Aßmus 	// setup the text color
14842f86ba45SStephan Aßmus 	rgb_color color;
14852f86ba45SStephan Aßmus 	if (base.red + base.green + base.blue > 128 * 3)
14862f86ba45SStephan Aßmus 		color = tint_color(base, B_DARKEN_MAX_TINT);
14872f86ba45SStephan Aßmus 	else
14882f86ba45SStephan Aßmus 		color = tint_color(base, B_LIGHTEN_MAX_TINT);
14892f86ba45SStephan Aßmus 
14902f86ba45SStephan Aßmus 	if (flags & B_DISABLED) {
14912f86ba45SStephan Aßmus 		color.red = (uint8)(((int32)base.red + color.red + 1) / 2);
14922f86ba45SStephan Aßmus 		color.green = (uint8)(((int32)base.green + color.green + 1) / 2);
14932f86ba45SStephan Aßmus 		color.blue = (uint8)(((int32)base.blue + color.blue + 1) / 2);
14942f86ba45SStephan Aßmus 	}
14952f86ba45SStephan Aßmus 
14962f86ba45SStephan Aßmus 	view->SetHighColor(color);
14972f86ba45SStephan Aßmus 	view->SetDrawingMode(B_OP_OVER);
14982f86ba45SStephan Aßmus 
14992f86ba45SStephan Aßmus 	// truncate the label if necessary and get the width and height
15002f86ba45SStephan Aßmus 	BString truncatedLabel(label);
15012f86ba45SStephan Aßmus 
15022f86ba45SStephan Aßmus 	BFont font;
15032f86ba45SStephan Aßmus 	view->GetFont(&font);
15042f86ba45SStephan Aßmus 
15052f86ba45SStephan Aßmus 	float width = rect.Width();
15062f86ba45SStephan Aßmus 	font.TruncateString(&truncatedLabel, B_TRUNCATE_END, width);
15072f86ba45SStephan Aßmus 	width = font.StringWidth(truncatedLabel.String());
15082f86ba45SStephan Aßmus 
15092f86ba45SStephan Aßmus 	font_height fontHeight;
15102f86ba45SStephan Aßmus 	font.GetHeight(&fontHeight);
15112f86ba45SStephan Aßmus 	float height = ceilf(fontHeight.ascent) + ceilf(fontHeight.descent);
15122f86ba45SStephan Aßmus 
15132f86ba45SStephan Aßmus 	// handle alignment
15142f86ba45SStephan Aßmus 	BPoint location;
15152f86ba45SStephan Aßmus 
15162f86ba45SStephan Aßmus 	switch (alignment.horizontal) {
15172f86ba45SStephan Aßmus 	default:
15182f86ba45SStephan Aßmus 	case B_ALIGN_LEFT:
15192f86ba45SStephan Aßmus 		location.x = rect.left;
15202f86ba45SStephan Aßmus 		break;
15212f86ba45SStephan Aßmus 	case B_ALIGN_RIGHT:
15222f86ba45SStephan Aßmus 		location.x = rect.right - width;
15232f86ba45SStephan Aßmus 		break;
15242f86ba45SStephan Aßmus 	case B_ALIGN_CENTER:
15252f86ba45SStephan Aßmus 		location.x = (rect.left + rect.right - width) / 2.0f;
15262f86ba45SStephan Aßmus 		break;
15272f86ba45SStephan Aßmus 	}
15282f86ba45SStephan Aßmus 
15292f86ba45SStephan Aßmus 	switch (alignment.vertical) {
15302f86ba45SStephan Aßmus 	case B_ALIGN_TOP:
15312f86ba45SStephan Aßmus 		location.y = rect.top + ceilf(fontHeight.ascent);
15322f86ba45SStephan Aßmus 		break;
15332f86ba45SStephan Aßmus 	default:
15342f86ba45SStephan Aßmus 	case B_ALIGN_MIDDLE:
15352f86ba45SStephan Aßmus 		location.y = floorf((rect.top + rect.bottom - height) / 2.0f + 0.5f)
15362f86ba45SStephan Aßmus 			+ ceilf(fontHeight.ascent);
15372f86ba45SStephan Aßmus 		break;
15382f86ba45SStephan Aßmus 	case B_ALIGN_BOTTOM:
15392f86ba45SStephan Aßmus 		location.y = rect.bottom - ceilf(fontHeight.descent);
15402f86ba45SStephan Aßmus 		break;
15412f86ba45SStephan Aßmus 	}
15422f86ba45SStephan Aßmus 
15432f86ba45SStephan Aßmus 	view->DrawString(truncatedLabel.String(), location);
15442f86ba45SStephan Aßmus }
15452f86ba45SStephan Aßmus 
15462f86ba45SStephan Aßmus 
15472f86ba45SStephan Aßmus // #pragma mark -
15482f86ba45SStephan Aßmus 
15492f86ba45SStephan Aßmus 
15502f86ba45SStephan Aßmus void
15512f86ba45SStephan Aßmus BControlLook::_DrawOuterResessedFrame(BView* view, BRect& rect,
15522f86ba45SStephan Aßmus 	const rgb_color& base, float contrast, float brightness, uint32 borders)
15532f86ba45SStephan Aßmus {
15542f86ba45SStephan Aßmus 	// colors
15552f86ba45SStephan Aßmus 	float tintLight = kEdgeBevelLightTint;
15562f86ba45SStephan Aßmus 	float tintShadow = kEdgeBevelShadowTint;
15572f86ba45SStephan Aßmus 
15582f86ba45SStephan Aßmus 	if (contrast == 0.0) {
15592f86ba45SStephan Aßmus 		tintLight = B_NO_TINT;
15602f86ba45SStephan Aßmus 		tintShadow = B_NO_TINT;
15612f86ba45SStephan Aßmus 	} else if (contrast != 1.0) {
15622f86ba45SStephan Aßmus 		tintLight = B_NO_TINT + (tintLight - B_NO_TINT) * contrast;
15632f86ba45SStephan Aßmus 		tintShadow = B_NO_TINT + (tintShadow - B_NO_TINT) * contrast;
15642f86ba45SStephan Aßmus 	}
15652f86ba45SStephan Aßmus 
15662f86ba45SStephan Aßmus 	rgb_color borderBevelShadow = tint_color(base, tintShadow);
15672f86ba45SStephan Aßmus 	rgb_color borderBevelLight = tint_color(base, tintLight);
15682f86ba45SStephan Aßmus 
15692f86ba45SStephan Aßmus 	if (brightness < 1.0) {
15702f86ba45SStephan Aßmus 		borderBevelShadow.red = uint8(borderBevelShadow.red * brightness);
15712f86ba45SStephan Aßmus 		borderBevelShadow.green = uint8(borderBevelShadow.green * brightness);
15722f86ba45SStephan Aßmus 		borderBevelShadow.blue = uint8(borderBevelShadow.blue * brightness);
15732f86ba45SStephan Aßmus 		borderBevelLight.red = uint8(borderBevelLight.red * brightness);
15742f86ba45SStephan Aßmus 		borderBevelLight.green = uint8(borderBevelLight.green * brightness);
15752f86ba45SStephan Aßmus 		borderBevelLight.blue = uint8(borderBevelLight.blue * brightness);
15762f86ba45SStephan Aßmus 	}
15772f86ba45SStephan Aßmus 
15782f86ba45SStephan Aßmus 	_DrawFrame(view, rect, borderBevelShadow, borderBevelShadow,
15792f86ba45SStephan Aßmus 		borderBevelLight, borderBevelLight, borders);
15802f86ba45SStephan Aßmus }
15812f86ba45SStephan Aßmus 
15822f86ba45SStephan Aßmus 
15832f86ba45SStephan Aßmus void
15842f86ba45SStephan Aßmus BControlLook::_DrawFrame(BView* view, BRect& rect, const rgb_color& left,
15852f86ba45SStephan Aßmus 	const rgb_color& top, const rgb_color& right, const rgb_color& bottom,
15862f86ba45SStephan Aßmus 	uint32 borders)
15872f86ba45SStephan Aßmus {
15882f86ba45SStephan Aßmus 	view->BeginLineArray(4);
15892f86ba45SStephan Aßmus 
15902f86ba45SStephan Aßmus 	if (borders & B_LEFT_BORDER) {
15912f86ba45SStephan Aßmus 		view->AddLine(
15922f86ba45SStephan Aßmus 			BPoint(rect.left, rect.bottom),
15932f86ba45SStephan Aßmus 			BPoint(rect.left, rect.top), left);
15942f86ba45SStephan Aßmus 		rect.left++;
15952f86ba45SStephan Aßmus 	}
15962f86ba45SStephan Aßmus 	if (borders & B_TOP_BORDER) {
15972f86ba45SStephan Aßmus 		view->AddLine(
15982f86ba45SStephan Aßmus 			BPoint(rect.left, rect.top),
15992f86ba45SStephan Aßmus 			BPoint(rect.right, rect.top), top);
16002f86ba45SStephan Aßmus 		rect.top++;
16012f86ba45SStephan Aßmus 	}
16022f86ba45SStephan Aßmus 	if (borders & B_RIGHT_BORDER) {
16032f86ba45SStephan Aßmus 		view->AddLine(
16042f86ba45SStephan Aßmus 			BPoint(rect.right, rect.top),
16052f86ba45SStephan Aßmus 			BPoint(rect.right, rect.bottom), right);
16062f86ba45SStephan Aßmus 		rect.right--;
16072f86ba45SStephan Aßmus 	}
16082f86ba45SStephan Aßmus 	if (borders & B_BOTTOM_BORDER) {
16092f86ba45SStephan Aßmus 		view->AddLine(
16102f86ba45SStephan Aßmus 			BPoint(rect.left, rect.bottom),
16112f86ba45SStephan Aßmus 			BPoint(rect.right, rect.bottom), bottom);
16122f86ba45SStephan Aßmus 		rect.bottom--;
16132f86ba45SStephan Aßmus 	}
16142f86ba45SStephan Aßmus 
16152f86ba45SStephan Aßmus 	view->EndLineArray();
16162f86ba45SStephan Aßmus }
16172f86ba45SStephan Aßmus 
16182f86ba45SStephan Aßmus 
16192f86ba45SStephan Aßmus void
16202f86ba45SStephan Aßmus BControlLook::_DrawFrame(BView* view, BRect& rect, const rgb_color& left,
16212f86ba45SStephan Aßmus 	const rgb_color& top, const rgb_color& right, const rgb_color& bottom,
16222f86ba45SStephan Aßmus 	const rgb_color& rightTop, const rgb_color& leftBottom, uint32 borders)
16232f86ba45SStephan Aßmus {
16242f86ba45SStephan Aßmus 	view->BeginLineArray(6);
16252f86ba45SStephan Aßmus 
16262f86ba45SStephan Aßmus 	if (borders & B_TOP_BORDER) {
16272f86ba45SStephan Aßmus 		if (borders & B_RIGHT_BORDER) {
16282f86ba45SStephan Aßmus 			view->AddLine(
16292f86ba45SStephan Aßmus 				BPoint(rect.left, rect.top),
16302f86ba45SStephan Aßmus 				BPoint(rect.right - 1, rect.top), top);
16312f86ba45SStephan Aßmus 			view->AddLine(
16322f86ba45SStephan Aßmus 				BPoint(rect.right, rect.top),
16332f86ba45SStephan Aßmus 				BPoint(rect.right, rect.top), rightTop);
16342f86ba45SStephan Aßmus 		} else {
16352f86ba45SStephan Aßmus 			view->AddLine(
16362f86ba45SStephan Aßmus 				BPoint(rect.left, rect.top),
16372f86ba45SStephan Aßmus 				BPoint(rect.right, rect.top), top);
16382f86ba45SStephan Aßmus 		}
16392f86ba45SStephan Aßmus 		rect.top++;
16402f86ba45SStephan Aßmus 	}
16412f86ba45SStephan Aßmus 
16422f86ba45SStephan Aßmus 	if (borders & B_LEFT_BORDER) {
16432f86ba45SStephan Aßmus 		view->AddLine(
16442f86ba45SStephan Aßmus 			BPoint(rect.left, rect.top),
16452f86ba45SStephan Aßmus 			BPoint(rect.left, rect.bottom - 1), left);
16462f86ba45SStephan Aßmus 		view->AddLine(
16472f86ba45SStephan Aßmus 			BPoint(rect.left, rect.bottom),
16482f86ba45SStephan Aßmus 			BPoint(rect.left, rect.bottom), leftBottom);
16492f86ba45SStephan Aßmus 		rect.left++;
16502f86ba45SStephan Aßmus 	}
16512f86ba45SStephan Aßmus 
16522f86ba45SStephan Aßmus 	if (borders & B_BOTTOM_BORDER) {
16532f86ba45SStephan Aßmus 		view->AddLine(
16542f86ba45SStephan Aßmus 			BPoint(rect.left, rect.bottom),
16552f86ba45SStephan Aßmus 			BPoint(rect.right, rect.bottom), bottom);
16562f86ba45SStephan Aßmus 		rect.bottom--;
16572f86ba45SStephan Aßmus 	}
16582f86ba45SStephan Aßmus 
16592f86ba45SStephan Aßmus 	if (borders & B_RIGHT_BORDER) {
16602f86ba45SStephan Aßmus 		view->AddLine(
16612f86ba45SStephan Aßmus 			BPoint(rect.right, rect.bottom),
16622f86ba45SStephan Aßmus 			BPoint(rect.right, rect.top), right);
16632f86ba45SStephan Aßmus 		rect.right--;
16642f86ba45SStephan Aßmus 	}
16652f86ba45SStephan Aßmus 
16662f86ba45SStephan Aßmus 	view->EndLineArray();
16672f86ba45SStephan Aßmus }
16682f86ba45SStephan Aßmus 
16692f86ba45SStephan Aßmus 
16702f86ba45SStephan Aßmus //void
16712f86ba45SStephan Aßmus //BControlLook::_DrawShadowFrame(BView* view, BRect& rect, const rgb_color& base,
16722f86ba45SStephan Aßmus //	uint32 borders)
16732f86ba45SStephan Aßmus //{
16742f86ba45SStephan Aßmus //	view->BeginLineArray(4);
16752f86ba45SStephan Aßmus //
16762f86ba45SStephan Aßmus //	bevelColor1 = tint_color(base, 1.2);
16772f86ba45SStephan Aßmus //	bevelColor2 = tint_color(base, 1.1);
16782f86ba45SStephan Aßmus //
16792f86ba45SStephan Aßmus //	// shadow along left/top borders
16802f86ba45SStephan Aßmus //	if (rect.Height() > 0 && borders & B_LEFT_BORDER) {
16812f86ba45SStephan Aßmus //		view->AddLine(BPoint(rect.left, rect.top),
16822f86ba45SStephan Aßmus //			BPoint(rect.left, rect.bottom), bevelColor1);
16832f86ba45SStephan Aßmus //		rect.left++;
16842f86ba45SStephan Aßmus //	}
16852f86ba45SStephan Aßmus //	if (rect.Width() > 0 && borders & B_TOP_BORDER) {
16862f86ba45SStephan Aßmus //		view->AddLine(BPoint(rect.left, rect.top),
16872f86ba45SStephan Aßmus //			BPoint(rect.right, rect.top), bevelColor1);
16882f86ba45SStephan Aßmus //		rect.top++;
16892f86ba45SStephan Aßmus //	}
16902f86ba45SStephan Aßmus //
16912f86ba45SStephan Aßmus //	// softer shadow along left/top borders
16922f86ba45SStephan Aßmus //	if (rect.Height() > 0 && borders & B_LEFT_BORDER) {
16932f86ba45SStephan Aßmus //		view->AddLine(BPoint(rect.left, rect.top),
16942f86ba45SStephan Aßmus //			BPoint(rect.left, rect.bottom), bevelColor2);
16952f86ba45SStephan Aßmus //		rect.left++;
16962f86ba45SStephan Aßmus //	}
16972f86ba45SStephan Aßmus //	if (rect.Width() > 0 && borders & B_TOP_BORDER) {
16982f86ba45SStephan Aßmus //		view->AddLine(BPoint(rect.left, rect.top),
16992f86ba45SStephan Aßmus //			BPoint(rect.right, rect.top), bevelColor2);
17002f86ba45SStephan Aßmus //		rect.top++;
17012f86ba45SStephan Aßmus //	}
17022f86ba45SStephan Aßmus //
17032f86ba45SStephan Aßmus //	view->EndLineArray();
17042f86ba45SStephan Aßmus //}
17052f86ba45SStephan Aßmus 
17062f86ba45SStephan Aßmus 
17072f86ba45SStephan Aßmus void
17082f86ba45SStephan Aßmus BControlLook::_FillGradient(BView* view, const BRect& rect,
17092f86ba45SStephan Aßmus 	const rgb_color& base, float topTint, float bottomTint,
17102f86ba45SStephan Aßmus 	enum orientation orientation)
17112f86ba45SStephan Aßmus {
17122f86ba45SStephan Aßmus 	BGradientLinear gradient;
17132f86ba45SStephan Aßmus 	_MakeGradient(gradient, rect, base, topTint, bottomTint, orientation);
17142f86ba45SStephan Aßmus 	view->FillRect(rect, gradient);
17152f86ba45SStephan Aßmus }
17162f86ba45SStephan Aßmus 
17172f86ba45SStephan Aßmus 
17182f86ba45SStephan Aßmus void
17192f86ba45SStephan Aßmus BControlLook::_FillGlossyGradient(BView* view, const BRect& rect,
17202f86ba45SStephan Aßmus 	const rgb_color& base, float topTint, float middle1Tint,
17212f86ba45SStephan Aßmus 	float middle2Tint, float bottomTint, enum orientation orientation)
17222f86ba45SStephan Aßmus {
17232f86ba45SStephan Aßmus 	BGradientLinear gradient;
17242f86ba45SStephan Aßmus 	_MakeGlossyGradient(gradient, rect, base, topTint, middle1Tint,
17252f86ba45SStephan Aßmus 		middle2Tint, bottomTint, orientation);
17262f86ba45SStephan Aßmus 	view->FillRect(rect, gradient);
17272f86ba45SStephan Aßmus }
17282f86ba45SStephan Aßmus 
17292f86ba45SStephan Aßmus 
17302f86ba45SStephan Aßmus void
17312f86ba45SStephan Aßmus BControlLook::_MakeGradient(BGradientLinear& gradient, const BRect& rect,
17322f86ba45SStephan Aßmus 	const rgb_color& base, float topTint, float bottomTint,
17332f86ba45SStephan Aßmus 	enum orientation orientation) const
17342f86ba45SStephan Aßmus {
17352f86ba45SStephan Aßmus 	gradient.AddColor(tint_color(base, topTint), 0);
17362f86ba45SStephan Aßmus 	gradient.AddColor(tint_color(base, bottomTint), 255);
17372f86ba45SStephan Aßmus 	gradient.SetStart(rect.LeftTop());
17382f86ba45SStephan Aßmus 	if (orientation == B_HORIZONTAL)
17392f86ba45SStephan Aßmus 		gradient.SetEnd(rect.LeftBottom());
17402f86ba45SStephan Aßmus 	else
17412f86ba45SStephan Aßmus 		gradient.SetEnd(rect.RightTop());
17422f86ba45SStephan Aßmus }
17432f86ba45SStephan Aßmus 
17442f86ba45SStephan Aßmus 
17452f86ba45SStephan Aßmus void
17462f86ba45SStephan Aßmus BControlLook::_MakeGlossyGradient(BGradientLinear& gradient, const BRect& rect,
17472f86ba45SStephan Aßmus 	const rgb_color& base, float topTint, float middle1Tint,
17482f86ba45SStephan Aßmus 	float middle2Tint, float bottomTint,
17492f86ba45SStephan Aßmus 	enum orientation orientation) const
17502f86ba45SStephan Aßmus {
17512f86ba45SStephan Aßmus 	gradient.AddColor(tint_color(base, topTint), 0);
17522f86ba45SStephan Aßmus 	gradient.AddColor(tint_color(base, middle1Tint), 132);
17532f86ba45SStephan Aßmus 	gradient.AddColor(tint_color(base, middle2Tint), 136);
17542f86ba45SStephan Aßmus 	gradient.AddColor(tint_color(base, bottomTint), 255);
17552f86ba45SStephan Aßmus 	gradient.SetStart(rect.LeftTop());
17562f86ba45SStephan Aßmus 	if (orientation == B_HORIZONTAL)
17572f86ba45SStephan Aßmus 		gradient.SetEnd(rect.LeftBottom());
17582f86ba45SStephan Aßmus 	else
17592f86ba45SStephan Aßmus 		gradient.SetEnd(rect.RightTop());
17602f86ba45SStephan Aßmus }
17612f86ba45SStephan Aßmus 
17622f86ba45SStephan Aßmus 
17632f86ba45SStephan Aßmus bool
17642f86ba45SStephan Aßmus BControlLook::_RadioButtonAndCheckBoxMarkColor(const rgb_color& base,
17652f86ba45SStephan Aßmus 	rgb_color& color, uint32 flags) const
17662f86ba45SStephan Aßmus {
17672f86ba45SStephan Aßmus 	if ((flags & (B_ACTIVATED | B_CLICKED)) == 0) {
17682f86ba45SStephan Aßmus 		// no mark to be drawn at all
17692f86ba45SStephan Aßmus 		return false;
17702f86ba45SStephan Aßmus 	}
17712f86ba45SStephan Aßmus 
17722f86ba45SStephan Aßmus 	// TODO: Get from UI settings
17732f86ba45SStephan Aßmus 	color.red = 27;
17742f86ba45SStephan Aßmus 	color.green = 82;
17752f86ba45SStephan Aßmus 	color.blue = 140;
17762f86ba45SStephan Aßmus 
17772f86ba45SStephan Aßmus 	float mix = 1.0;
17782f86ba45SStephan Aßmus 
17792f86ba45SStephan Aßmus 	if (flags & B_DISABLED) {
17802f86ba45SStephan Aßmus 		// activated, but disabled
17812f86ba45SStephan Aßmus 		mix = 0.4;
17822f86ba45SStephan Aßmus 	} else if (flags & B_CLICKED) {
17832f86ba45SStephan Aßmus 		if (flags & B_ACTIVATED) {
17842f86ba45SStephan Aßmus 			// loosing activation
17852f86ba45SStephan Aßmus 			mix = 0.7;
17862f86ba45SStephan Aßmus 		} else {
17872f86ba45SStephan Aßmus 			// becoming activated
17882f86ba45SStephan Aßmus 			mix = 0.3;
17892f86ba45SStephan Aßmus 		}
17902f86ba45SStephan Aßmus 	} else {
17912f86ba45SStephan Aßmus 		// simply activated
17922f86ba45SStephan Aßmus 	}
17932f86ba45SStephan Aßmus 
17942f86ba45SStephan Aßmus 	color.red = uint8(color.red * mix + base.red * (1.0 - mix));
17952f86ba45SStephan Aßmus 	color.green = uint8(color.green * mix + base.green * (1.0 - mix));
17962f86ba45SStephan Aßmus 	color.blue = uint8(color.blue * mix + base.blue * (1.0 - mix));
17972f86ba45SStephan Aßmus 
17982f86ba45SStephan Aßmus 	return true;
17992f86ba45SStephan Aßmus }
18002f86ba45SStephan Aßmus 
18012f86ba45SStephan Aßmus 
18022f86ba45SStephan Aßmus void
18032f86ba45SStephan Aßmus BControlLook::_DrawRoundBarCorner(BView* view, BRect& rect,
18042f86ba45SStephan Aßmus 	const BRect& updateRect,
18052f86ba45SStephan Aßmus 	const rgb_color& edgeLightColor, const rgb_color& edgeShadowColor,
18062f86ba45SStephan Aßmus 	const rgb_color& frameLightColor, const rgb_color& frameShadowColor,
18072f86ba45SStephan Aßmus 	const rgb_color& fillLightColor, const rgb_color& fillShadowColor,
18082f86ba45SStephan Aßmus 	float leftInset, float topInset, float rightInset, float bottomInset,
18092f86ba45SStephan Aßmus 	enum orientation orientation)
18102f86ba45SStephan Aßmus {
18112f86ba45SStephan Aßmus 	if (!rect.IsValid() || !rect.Intersects(updateRect))
18122f86ba45SStephan Aßmus 		return;
18132f86ba45SStephan Aßmus 
18142f86ba45SStephan Aßmus 	BGradientLinear gradient;
18152f86ba45SStephan Aßmus 	gradient.AddColor(edgeShadowColor, 0);
18162f86ba45SStephan Aßmus 	gradient.AddColor(edgeLightColor, 255);
18172f86ba45SStephan Aßmus 	gradient.SetStart(rect.LeftTop());
18182f86ba45SStephan Aßmus 	if (orientation == B_HORIZONTAL)
18192f86ba45SStephan Aßmus 		gradient.SetEnd(rect.LeftBottom());
18202f86ba45SStephan Aßmus 	else
18212f86ba45SStephan Aßmus 		gradient.SetEnd(rect.RightTop());
18222f86ba45SStephan Aßmus 
18232f86ba45SStephan Aßmus 	view->FillEllipse(rect, gradient);
18242f86ba45SStephan Aßmus 
18252f86ba45SStephan Aßmus 	rect.left += leftInset;
18262f86ba45SStephan Aßmus 	rect.top += topInset;
18272f86ba45SStephan Aßmus 	rect.right += rightInset;
18282f86ba45SStephan Aßmus 	rect.bottom += bottomInset;
18292f86ba45SStephan Aßmus 
18302f86ba45SStephan Aßmus 	gradient.MakeEmpty();
18312f86ba45SStephan Aßmus 	gradient.AddColor(frameShadowColor, 0);
18322f86ba45SStephan Aßmus 	gradient.AddColor(frameLightColor, 255);
18332f86ba45SStephan Aßmus 	gradient.SetStart(rect.LeftTop());
18342f86ba45SStephan Aßmus 	if (orientation == B_HORIZONTAL)
18352f86ba45SStephan Aßmus 		gradient.SetEnd(rect.LeftBottom());
18362f86ba45SStephan Aßmus 	else
18372f86ba45SStephan Aßmus 		gradient.SetEnd(rect.RightTop());
18382f86ba45SStephan Aßmus 
18392f86ba45SStephan Aßmus 	view->FillEllipse(rect, gradient);
18402f86ba45SStephan Aßmus 
18412f86ba45SStephan Aßmus 	rect.left += leftInset;
18422f86ba45SStephan Aßmus 	rect.top += topInset;
18432f86ba45SStephan Aßmus 	rect.right += rightInset;
18442f86ba45SStephan Aßmus 	rect.bottom += bottomInset;
18452f86ba45SStephan Aßmus 
18462f86ba45SStephan Aßmus 	gradient.MakeEmpty();
18472f86ba45SStephan Aßmus 	gradient.AddColor(fillShadowColor, 0);
18482f86ba45SStephan Aßmus 	gradient.AddColor(fillLightColor, 255);
18492f86ba45SStephan Aßmus 	gradient.SetStart(rect.LeftTop());
18502f86ba45SStephan Aßmus 	if (orientation == B_HORIZONTAL)
18512f86ba45SStephan Aßmus 		gradient.SetEnd(rect.LeftBottom());
18522f86ba45SStephan Aßmus 	else
18532f86ba45SStephan Aßmus 		gradient.SetEnd(rect.RightTop());
18542f86ba45SStephan Aßmus 
18552f86ba45SStephan Aßmus 	view->FillEllipse(rect, gradient);
18562f86ba45SStephan Aßmus }
18572f86ba45SStephan Aßmus 
18582f86ba45SStephan Aßmus 
18592f86ba45SStephan Aßmus void
18602f86ba45SStephan Aßmus BControlLook::_DrawRoundCornerLeftTop(BView* view, BRect& rect,
18612f86ba45SStephan Aßmus 	const BRect& updateRect, const rgb_color& base, const rgb_color& edgeColor,
18622f86ba45SStephan Aßmus 	const rgb_color& frameColor, const rgb_color& bevelColor,
18632f86ba45SStephan Aßmus 	const BGradientLinear& fillGradient)
18642f86ba45SStephan Aßmus {
18652f86ba45SStephan Aßmus 	if (!rect.IsValid() || !rect.Intersects(updateRect))
18662f86ba45SStephan Aßmus 		return;
18672f86ba45SStephan Aßmus 
18682f86ba45SStephan Aßmus 	BRegion clipping(rect);
18692f86ba45SStephan Aßmus 	view->ConstrainClippingRegion(&clipping);
18702f86ba45SStephan Aßmus 
18712f86ba45SStephan Aßmus 	// background
18722f86ba45SStephan Aßmus 	view->SetHighColor(base);
18732f86ba45SStephan Aßmus 	view->FillRect(rect);
18742f86ba45SStephan Aßmus 
18752f86ba45SStephan Aßmus 	// outer edge
18762f86ba45SStephan Aßmus 	BRect ellipseRect(rect);
18772f86ba45SStephan Aßmus 	ellipseRect.right = ellipseRect.left + ellipseRect.Width() * 2;
18782f86ba45SStephan Aßmus 	ellipseRect.bottom = ellipseRect.top + ellipseRect.Height() * 2;
18792f86ba45SStephan Aßmus 
18802f86ba45SStephan Aßmus 	view->SetHighColor(edgeColor);
18812f86ba45SStephan Aßmus 	view->FillEllipse(ellipseRect);
18822f86ba45SStephan Aßmus 
18832f86ba45SStephan Aßmus 	// frame
18842f86ba45SStephan Aßmus 	ellipseRect.InsetBy(1, 1);
18852f86ba45SStephan Aßmus 	view->SetHighColor(frameColor);
18862f86ba45SStephan Aßmus 	view->FillEllipse(ellipseRect);
18872f86ba45SStephan Aßmus 
18882f86ba45SStephan Aßmus 	// bevel
18892f86ba45SStephan Aßmus 	ellipseRect.InsetBy(1, 1);
18902f86ba45SStephan Aßmus 	view->SetHighColor(bevelColor);
18912f86ba45SStephan Aßmus 	view->FillEllipse(ellipseRect);
18922f86ba45SStephan Aßmus 
18932f86ba45SStephan Aßmus 	// fill
18942f86ba45SStephan Aßmus 	ellipseRect.InsetBy(1, 1);
18952f86ba45SStephan Aßmus 	view->FillEllipse(ellipseRect, fillGradient);
18962f86ba45SStephan Aßmus 
18972f86ba45SStephan Aßmus 	view->ConstrainClippingRegion(NULL);
18982f86ba45SStephan Aßmus }
18992f86ba45SStephan Aßmus 
19002f86ba45SStephan Aßmus void
19012f86ba45SStephan Aßmus BControlLook::_DrawRoundCornerRightTop(BView* view, BRect& rect,
19022f86ba45SStephan Aßmus 	const BRect& updateRect, const rgb_color& base,
19032f86ba45SStephan Aßmus 	const rgb_color& edgeTopColor, const rgb_color& edgeRightColor,
19042f86ba45SStephan Aßmus 	const rgb_color& frameTopColor, const rgb_color& frameRightColor,
19052f86ba45SStephan Aßmus 	const rgb_color& bevelTopColor, const rgb_color& bevelRightColor,
19062f86ba45SStephan Aßmus 	const BGradientLinear& fillGradient)
19072f86ba45SStephan Aßmus {
19082f86ba45SStephan Aßmus 	if (!rect.IsValid() || !rect.Intersects(updateRect))
19092f86ba45SStephan Aßmus 		return;
19102f86ba45SStephan Aßmus 
19112f86ba45SStephan Aßmus 	BRegion clipping(rect);
19122f86ba45SStephan Aßmus 	view->ConstrainClippingRegion(&clipping);
19132f86ba45SStephan Aßmus 
19142f86ba45SStephan Aßmus 	// background
19152f86ba45SStephan Aßmus 	view->SetHighColor(base);
19162f86ba45SStephan Aßmus 	view->FillRect(rect);
19172f86ba45SStephan Aßmus 
19182f86ba45SStephan Aßmus 	// outer edge
19192f86ba45SStephan Aßmus 	BRect ellipseRect(rect);
19202f86ba45SStephan Aßmus 	ellipseRect.left = ellipseRect.right - ellipseRect.Width() * 2;
19212f86ba45SStephan Aßmus 	ellipseRect.bottom = ellipseRect.top + ellipseRect.Height() * 2;
19222f86ba45SStephan Aßmus 
19232f86ba45SStephan Aßmus 	BGradientLinear gradient;
19242f86ba45SStephan Aßmus 	gradient.AddColor(edgeTopColor, 0);
19252f86ba45SStephan Aßmus 	gradient.AddColor(edgeRightColor, 255);
19262f86ba45SStephan Aßmus 	gradient.SetStart(rect.LeftTop());
19272f86ba45SStephan Aßmus 	gradient.SetEnd(rect.RightBottom());
19282f86ba45SStephan Aßmus 	view->FillEllipse(ellipseRect, gradient);
19292f86ba45SStephan Aßmus 
19302f86ba45SStephan Aßmus 	// frame
19312f86ba45SStephan Aßmus 	ellipseRect.InsetBy(1, 1);
19322f86ba45SStephan Aßmus 	rect.right--;
19332f86ba45SStephan Aßmus 	rect.top++;
19342f86ba45SStephan Aßmus 	if (frameTopColor == frameRightColor) {
19352f86ba45SStephan Aßmus 		view->SetHighColor(frameTopColor);
19362f86ba45SStephan Aßmus 		view->FillEllipse(ellipseRect);
19372f86ba45SStephan Aßmus 	} else {
19382f86ba45SStephan Aßmus 		gradient.SetColor(0, frameTopColor);
19392f86ba45SStephan Aßmus 		gradient.SetColor(1, frameRightColor);
19402f86ba45SStephan Aßmus 		gradient.SetStart(rect.LeftTop());
19412f86ba45SStephan Aßmus 		gradient.SetEnd(rect.RightBottom());
19422f86ba45SStephan Aßmus 		view->FillEllipse(ellipseRect, gradient);
19432f86ba45SStephan Aßmus 	}
19442f86ba45SStephan Aßmus 
19452f86ba45SStephan Aßmus 	// bevel
19462f86ba45SStephan Aßmus 	ellipseRect.InsetBy(1, 1);
19472f86ba45SStephan Aßmus 	rect.right--;
19482f86ba45SStephan Aßmus 	rect.top++;
19492f86ba45SStephan Aßmus 	gradient.SetColor(0, bevelTopColor);
19502f86ba45SStephan Aßmus 	gradient.SetColor(1, bevelRightColor);
19512f86ba45SStephan Aßmus 	gradient.SetStart(rect.LeftTop());
19522f86ba45SStephan Aßmus 	gradient.SetEnd(rect.RightBottom());
19532f86ba45SStephan Aßmus 	view->FillEllipse(ellipseRect, gradient);
19542f86ba45SStephan Aßmus 
19552f86ba45SStephan Aßmus 	// fill
19562f86ba45SStephan Aßmus 	ellipseRect.InsetBy(1, 1);
19572f86ba45SStephan Aßmus 	view->FillEllipse(ellipseRect, fillGradient);
19582f86ba45SStephan Aßmus 
19592f86ba45SStephan Aßmus 	view->ConstrainClippingRegion(NULL);
19602f86ba45SStephan Aßmus }
19612f86ba45SStephan Aßmus 
19622f86ba45SStephan Aßmus 
19632f86ba45SStephan Aßmus // NOTE: May come from a add-on in the future. Initialized in
19642f86ba45SStephan Aßmus // InterfaceDefs.cpp
19652f86ba45SStephan Aßmus BControlLook* be_control_look = NULL;
19662f86ba45SStephan Aßmus 
19672f86ba45SStephan Aßmus } // namespace BPrivate
1968