xref: /haiku/src/kits/interface/ControlLook.cpp (revision 1f9fd6d866bff084e6792bccc52d6eefd9470f7e)
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,
69681c2e44SStephan Aßmus 	const rgb_color& base, const rgb_color& background, uint32 flags,
70681c2e44SStephan Aßmus 	uint32 borders)
712f86ba45SStephan Aßmus {
72681c2e44SStephan Aßmus 	_DrawButtonFrame(view, rect, updateRect, base, background, 1.0, 1.0, flags,
73681c2e44SStephan Aßmus 		borders);
742f86ba45SStephan Aßmus }
752f86ba45SStephan Aßmus 
762f86ba45SStephan Aßmus 
772f86ba45SStephan Aßmus void
782f86ba45SStephan Aßmus BControlLook::DrawButtonBackground(BView* view, BRect& rect,
792f86ba45SStephan Aßmus 	const BRect& updateRect, const rgb_color& base, uint32 flags,
802f86ba45SStephan Aßmus 	uint32 borders, enum orientation orientation)
812f86ba45SStephan Aßmus {
822f86ba45SStephan Aßmus 	if (!rect.IsValid() || !updateRect.Intersects(rect))
832f86ba45SStephan Aßmus 		return;
842f86ba45SStephan Aßmus 
852f86ba45SStephan Aßmus 	// the surface edges
862f86ba45SStephan Aßmus 
872f86ba45SStephan Aßmus 	// colors
882f86ba45SStephan Aßmus 	rgb_color buttonBgColor = tint_color(base, B_LIGHTEN_1_TINT);
892f86ba45SStephan Aßmus 	rgb_color maxLightColor;
902f86ba45SStephan Aßmus 
912f86ba45SStephan Aßmus 	rgb_color bevelColor1;
922f86ba45SStephan Aßmus 	rgb_color bevelColor2;
932f86ba45SStephan Aßmus 
942f86ba45SStephan Aßmus 	if ((flags & B_DISABLED) == 0) {
952f86ba45SStephan Aßmus 		maxLightColor = tint_color(base, 0.2);
962f86ba45SStephan Aßmus 		bevelColor1 = tint_color(base, 1.08);
972f86ba45SStephan Aßmus 		bevelColor2 = base;
982f86ba45SStephan Aßmus 	} else {
992f86ba45SStephan Aßmus 		maxLightColor = tint_color(base, 0.7);
1002f86ba45SStephan Aßmus 		bevelColor1 = base;
1012f86ba45SStephan Aßmus 		bevelColor2 = buttonBgColor;
1022f86ba45SStephan Aßmus 		buttonBgColor = maxLightColor;
1032f86ba45SStephan Aßmus 	}
1042f86ba45SStephan Aßmus 
1052f86ba45SStephan Aßmus 	if (flags & B_ACTIVATED) {
1062f86ba45SStephan Aßmus 		view->BeginLineArray(4);
1072f86ba45SStephan Aßmus 
1082f86ba45SStephan Aßmus 		bevelColor1 = tint_color(bevelColor1, B_DARKEN_1_TINT);
1092f86ba45SStephan Aßmus 		bevelColor2 = tint_color(bevelColor2, B_DARKEN_1_TINT);
1102f86ba45SStephan Aßmus 
1112f86ba45SStephan Aßmus 		// shadow along left/top borders
1122f86ba45SStephan Aßmus 		if (borders & B_LEFT_BORDER) {
1132f86ba45SStephan Aßmus 			view->AddLine(BPoint(rect.left, rect.top),
1142f86ba45SStephan Aßmus 				BPoint(rect.left, rect.bottom), bevelColor1);
1152f86ba45SStephan Aßmus 			rect.left++;
1162f86ba45SStephan Aßmus 		}
1172f86ba45SStephan Aßmus 		if (borders & B_TOP_BORDER) {
1182f86ba45SStephan Aßmus 			view->AddLine(BPoint(rect.left, rect.top),
1192f86ba45SStephan Aßmus 				BPoint(rect.right, rect.top), bevelColor1);
1202f86ba45SStephan Aßmus 			rect.top++;
1212f86ba45SStephan Aßmus 		}
1222f86ba45SStephan Aßmus 
1232f86ba45SStephan Aßmus 		// softer shadow along left/top borders
1242f86ba45SStephan Aßmus 		if (borders & B_LEFT_BORDER) {
1252f86ba45SStephan Aßmus 			view->AddLine(BPoint(rect.left, rect.top),
1262f86ba45SStephan Aßmus 				BPoint(rect.left, rect.bottom), bevelColor2);
1272f86ba45SStephan Aßmus 			rect.left++;
1282f86ba45SStephan Aßmus 		}
1292f86ba45SStephan Aßmus 		if (borders & B_TOP_BORDER) {
1302f86ba45SStephan Aßmus 			view->AddLine(BPoint(rect.left, rect.top),
1312f86ba45SStephan Aßmus 				BPoint(rect.right, rect.top), bevelColor2);
1322f86ba45SStephan Aßmus 			rect.top++;
1332f86ba45SStephan Aßmus 		}
1342f86ba45SStephan Aßmus 
1352f86ba45SStephan Aßmus 		view->EndLineArray();
1362f86ba45SStephan Aßmus 	} else {
1372f86ba45SStephan Aßmus 		_DrawFrame(view, rect,
1382f86ba45SStephan Aßmus 			maxLightColor, maxLightColor,
1392f86ba45SStephan Aßmus 			bevelColor1, bevelColor1,
1402f86ba45SStephan Aßmus 			buttonBgColor, buttonBgColor, borders);
1412f86ba45SStephan Aßmus 	}
1422f86ba45SStephan Aßmus 
1432f86ba45SStephan Aßmus 	// the actual surface top
1442f86ba45SStephan Aßmus 
1452f86ba45SStephan Aßmus 	float topTint = 0.49;
1462f86ba45SStephan Aßmus 	float middleTint1 = 0.62;
1472f86ba45SStephan Aßmus 	float middleTint2 = 0.76;
1482f86ba45SStephan Aßmus 	float bottomTint = 0.90;
1492f86ba45SStephan Aßmus 
1502f86ba45SStephan Aßmus 	if (flags & B_ACTIVATED) {
1512f86ba45SStephan Aßmus 		topTint = 1.11;
1522f86ba45SStephan Aßmus 		bottomTint = 1.08;
1532f86ba45SStephan Aßmus 	}
1542f86ba45SStephan Aßmus 
1552f86ba45SStephan Aßmus 	if (flags & B_DISABLED) {
1562f86ba45SStephan Aßmus 		topTint = (topTint + B_NO_TINT) / 2;
1572f86ba45SStephan Aßmus 		middleTint1 = (middleTint1 + B_NO_TINT) / 2;
1582f86ba45SStephan Aßmus 		middleTint2 = (middleTint2 + B_NO_TINT) / 2;
1592f86ba45SStephan Aßmus 		bottomTint = (bottomTint + B_NO_TINT) / 2;
1602f86ba45SStephan Aßmus 	} else if (flags & B_HOVER) {
1612f86ba45SStephan Aßmus 		static const float kHoverTintFactor = 0.85;
1622f86ba45SStephan Aßmus 		topTint *= kHoverTintFactor;
1632f86ba45SStephan Aßmus 		middleTint1 *= kHoverTintFactor;
1642f86ba45SStephan Aßmus 		middleTint2 *= kHoverTintFactor;
1652f86ba45SStephan Aßmus 		bottomTint *= kHoverTintFactor;
1662f86ba45SStephan Aßmus 	}
1672f86ba45SStephan Aßmus 
1682f86ba45SStephan Aßmus 	if (flags & B_ACTIVATED) {
1692f86ba45SStephan Aßmus 		_FillGradient(view, rect, base, topTint, bottomTint, orientation);
1702f86ba45SStephan Aßmus 	} else {
1712f86ba45SStephan Aßmus 		_FillGlossyGradient(view, rect, base, topTint, middleTint1,
1722f86ba45SStephan Aßmus 			middleTint2, bottomTint, orientation);
1732f86ba45SStephan Aßmus 	}
1742f86ba45SStephan Aßmus }
1752f86ba45SStephan Aßmus 
1762f86ba45SStephan Aßmus 
1772f86ba45SStephan Aßmus void
1782f86ba45SStephan Aßmus BControlLook::DrawMenuBarBackground(BView* view, BRect& rect,
1791a72cb41SStephan Aßmus 	const BRect& updateRect, const rgb_color& base, uint32 flags,
1801a72cb41SStephan Aßmus 	uint32 borders)
1812f86ba45SStephan Aßmus {
1822f86ba45SStephan Aßmus 	if (!rect.IsValid() || !updateRect.Intersects(rect))
1832f86ba45SStephan Aßmus 		return;
1842f86ba45SStephan Aßmus 
1852f86ba45SStephan Aßmus 	// the surface edges
1862f86ba45SStephan Aßmus 
1872f86ba45SStephan Aßmus 	// colors
1881a72cb41SStephan Aßmus 	float topTint;
1891a72cb41SStephan Aßmus 	float bottomTint;
1901a72cb41SStephan Aßmus 
1911a72cb41SStephan Aßmus 	if (flags & B_ACTIVATED) {
1921a72cb41SStephan Aßmus 		rgb_color bevelColor1 = tint_color(base, 1.40);
1931a72cb41SStephan Aßmus 		rgb_color bevelColor2 = tint_color(base, 1.25);
1941a72cb41SStephan Aßmus 
1951a72cb41SStephan Aßmus 		topTint = 1.25;
1961a72cb41SStephan Aßmus 		bottomTint = 1.20;
1972f86ba45SStephan Aßmus 
1982f86ba45SStephan Aßmus 		_DrawFrame(view, rect,
1991a72cb41SStephan Aßmus 			bevelColor1, bevelColor1,
2001a72cb41SStephan Aßmus 			bevelColor2, bevelColor2,
2011a72cb41SStephan Aßmus 			borders & B_TOP_BORDER);
2021a72cb41SStephan Aßmus 	} else {
2031a72cb41SStephan Aßmus 		rgb_color cornerColor = tint_color(base, 0.9);
2041a72cb41SStephan Aßmus 		rgb_color bevelColorTop = tint_color(base, 0.5);
2051a72cb41SStephan Aßmus 		rgb_color bevelColorLeft = tint_color(base, 0.7);
2061a72cb41SStephan Aßmus 		rgb_color bevelColorRightBottom = tint_color(base, 1.08);
2071a72cb41SStephan Aßmus 
2081a72cb41SStephan Aßmus 		topTint = 0.69;
2091a72cb41SStephan Aßmus 		bottomTint = 1.03;
2101a72cb41SStephan Aßmus 
2111a72cb41SStephan Aßmus 		_DrawFrame(view, rect,
2121a72cb41SStephan Aßmus 			bevelColorLeft, bevelColorTop,
2131a72cb41SStephan Aßmus 			bevelColorRightBottom, bevelColorRightBottom,
2142f86ba45SStephan Aßmus 			cornerColor, cornerColor,
2152f86ba45SStephan Aßmus 			borders);
2161a72cb41SStephan Aßmus 	}
2172f86ba45SStephan Aßmus 
2182f86ba45SStephan Aßmus 	// the actual surface top
2192f86ba45SStephan Aßmus 
2202f86ba45SStephan Aßmus 	_FillGradient(view, rect, base, topTint, bottomTint);
2212f86ba45SStephan Aßmus }
2222f86ba45SStephan Aßmus 
2232f86ba45SStephan Aßmus 
2242f86ba45SStephan Aßmus void
225681c2e44SStephan Aßmus BControlLook::DrawMenuFieldFrame(BView* view, BRect& rect,
226681c2e44SStephan Aßmus 	const BRect& updateRect, const rgb_color& base,
227681c2e44SStephan Aßmus 	const rgb_color& background, uint32 flags, uint32 borders)
22813cd46dfSStephan Aßmus {
229681c2e44SStephan Aßmus 	_DrawButtonFrame(view, rect, updateRect, base, background, 0.6, 1.0, flags,
230681c2e44SStephan Aßmus 		borders);
23113cd46dfSStephan Aßmus }
23213cd46dfSStephan Aßmus 
23313cd46dfSStephan Aßmus 
23413cd46dfSStephan Aßmus void
2352f86ba45SStephan Aßmus BControlLook::DrawMenuFieldBackground(BView* view, BRect& rect,
2362f86ba45SStephan Aßmus 	const BRect& updateRect, const rgb_color& base, bool popupIndicator,
2372f86ba45SStephan Aßmus 	uint32 flags)
2382f86ba45SStephan Aßmus {
2392f86ba45SStephan Aßmus 	if (popupIndicator) {
2402f86ba45SStephan Aßmus 		BRect leftRect(rect);
2412f86ba45SStephan Aßmus 		leftRect.right -= 10;
2422f86ba45SStephan Aßmus 
2432f86ba45SStephan Aßmus 		BRect rightRect(rect);
2442f86ba45SStephan Aßmus 		rightRect.left = rightRect.right - 9;
2452f86ba45SStephan Aßmus 
2462f86ba45SStephan Aßmus 		DrawMenuFieldBackground(view, leftRect, updateRect, base, flags,
2472f86ba45SStephan Aßmus 			B_LEFT_BORDER | B_TOP_BORDER | B_BOTTOM_BORDER);
2482f86ba45SStephan Aßmus 
2492f86ba45SStephan Aßmus 		rgb_color indicatorBase;
2502f86ba45SStephan Aßmus 		rgb_color markColor;
2512f86ba45SStephan Aßmus 		if (flags & B_DISABLED) {
2522f86ba45SStephan Aßmus 			indicatorBase = tint_color(base, 1.05);
25313cd46dfSStephan Aßmus 			markColor = tint_color(base, 1.35);
2542f86ba45SStephan Aßmus 		} else {
25513cd46dfSStephan Aßmus 			indicatorBase = tint_color(base, 1.12);
25613cd46dfSStephan Aßmus 			markColor = tint_color(base, 1.65);
2572f86ba45SStephan Aßmus 		}
2582f86ba45SStephan Aßmus 
2592f86ba45SStephan Aßmus 		DrawMenuFieldBackground(view, rightRect, updateRect, indicatorBase,
2602f86ba45SStephan Aßmus 			flags, B_RIGHT_BORDER | B_TOP_BORDER | B_BOTTOM_BORDER);
2612f86ba45SStephan Aßmus 
2622f86ba45SStephan Aßmus 		// popup marker
2632f86ba45SStephan Aßmus 		BPoint center(roundf((rightRect.left + rightRect.right) / 2.0),
2642f86ba45SStephan Aßmus 					  roundf((rightRect.top + rightRect.bottom) / 2.0));
2652f86ba45SStephan Aßmus 		BPoint triangle[3];
2662f86ba45SStephan Aßmus 		triangle[0] = center + BPoint(-2.5, -0.5);
2672f86ba45SStephan Aßmus 		triangle[1] = center + BPoint(2.5, -0.5);
2682f86ba45SStephan Aßmus 		triangle[2] = center + BPoint(0.0, 2.0);
2692f86ba45SStephan Aßmus 
2702f86ba45SStephan Aßmus 		uint32 viewFlags = view->Flags();
2712f86ba45SStephan Aßmus 		view->SetFlags(viewFlags | B_SUBPIXEL_PRECISE);
2722f86ba45SStephan Aßmus 
2732f86ba45SStephan Aßmus 		view->SetHighColor(markColor);
2742f86ba45SStephan Aßmus 		view->FillTriangle(triangle[0], triangle[1], triangle[2]);
2752f86ba45SStephan Aßmus 
2762f86ba45SStephan Aßmus 		view->SetFlags(viewFlags);
2772f86ba45SStephan Aßmus 
2782f86ba45SStephan Aßmus 		rect = leftRect;
2792f86ba45SStephan Aßmus 	} else {
2802f86ba45SStephan Aßmus 		DrawMenuFieldBackground(view, rect, updateRect, base, flags);
2812f86ba45SStephan Aßmus 	}
2822f86ba45SStephan Aßmus }
2832f86ba45SStephan Aßmus 
2842f86ba45SStephan Aßmus void
2852f86ba45SStephan Aßmus BControlLook::DrawMenuFieldBackground(BView* view, BRect& rect,
2862f86ba45SStephan Aßmus 	const BRect& updateRect, const rgb_color& base, uint32 flags,
2872f86ba45SStephan Aßmus 	uint32 borders)
2882f86ba45SStephan Aßmus {
2892f86ba45SStephan Aßmus 	if (!rect.IsValid() || !updateRect.Intersects(rect))
2902f86ba45SStephan Aßmus 		return;
2912f86ba45SStephan Aßmus 
2922f86ba45SStephan Aßmus 	// the surface edges
2932f86ba45SStephan Aßmus 
2942f86ba45SStephan Aßmus 	// colors
2952f86ba45SStephan Aßmus 	rgb_color cornerColor = tint_color(base, 0.85);
2962f86ba45SStephan Aßmus 	rgb_color bevelColor1 = tint_color(base, 0.3);
2972f86ba45SStephan Aßmus 	rgb_color bevelColor2 = tint_color(base, 0.5);
2982f86ba45SStephan Aßmus 	rgb_color bevelColor3 = tint_color(base, 1.03);
2992f86ba45SStephan Aßmus 
3002f86ba45SStephan Aßmus 	if (flags & B_DISABLED) {
3012f86ba45SStephan Aßmus 		cornerColor = tint_color(base, 0.8);
3022f86ba45SStephan Aßmus 		bevelColor1 = tint_color(base, 0.7);
3032f86ba45SStephan Aßmus 		bevelColor2 = tint_color(base, 0.8);
3042f86ba45SStephan Aßmus 		bevelColor3 = tint_color(base, 1.01);
3052f86ba45SStephan Aßmus 	} else {
3062f86ba45SStephan Aßmus 		cornerColor = tint_color(base, 0.85);
3072f86ba45SStephan Aßmus 		bevelColor1 = tint_color(base, 0.3);
3082f86ba45SStephan Aßmus 		bevelColor2 = tint_color(base, 0.5);
3092f86ba45SStephan Aßmus 		bevelColor3 = tint_color(base, 1.03);
3102f86ba45SStephan Aßmus 	}
3112f86ba45SStephan Aßmus 
3122f86ba45SStephan Aßmus 	_DrawFrame(view, rect,
3132f86ba45SStephan Aßmus 		bevelColor2, bevelColor1,
3142f86ba45SStephan Aßmus 		bevelColor3, bevelColor3,
3152f86ba45SStephan Aßmus 		cornerColor, cornerColor,
3162f86ba45SStephan Aßmus 		borders);
3172f86ba45SStephan Aßmus 
3182f86ba45SStephan Aßmus 	// the actual surface top
3192f86ba45SStephan Aßmus 
3202f86ba45SStephan Aßmus 	float topTint = 0.49;
3212f86ba45SStephan Aßmus 	float middleTint1 = 0.62;
3222f86ba45SStephan Aßmus 	float middleTint2 = 0.76;
3232f86ba45SStephan Aßmus 	float bottomTint = 0.90;
3242f86ba45SStephan Aßmus 
3252f86ba45SStephan Aßmus 	if (flags & B_DISABLED) {
3262f86ba45SStephan Aßmus 		topTint = (topTint + B_NO_TINT) / 2;
3272f86ba45SStephan Aßmus 		middleTint1 = (middleTint1 + B_NO_TINT) / 2;
3282f86ba45SStephan Aßmus 		middleTint2 = (middleTint2 + B_NO_TINT) / 2;
3292f86ba45SStephan Aßmus 		bottomTint = (bottomTint + B_NO_TINT) / 2;
3302f86ba45SStephan Aßmus 	} else if (flags & B_HOVER) {
3312f86ba45SStephan Aßmus 		static const float kHoverTintFactor = 0.85;
3322f86ba45SStephan Aßmus 		topTint *= kHoverTintFactor;
3332f86ba45SStephan Aßmus 		middleTint1 *= kHoverTintFactor;
3342f86ba45SStephan Aßmus 		middleTint2 *= kHoverTintFactor;
3352f86ba45SStephan Aßmus 		bottomTint *= kHoverTintFactor;
3362f86ba45SStephan Aßmus 	}
3372f86ba45SStephan Aßmus 
3382f86ba45SStephan Aßmus 	_FillGlossyGradient(view, rect, base, topTint, middleTint1,
3392f86ba45SStephan Aßmus 		middleTint2, bottomTint);
3402f86ba45SStephan Aßmus }
3412f86ba45SStephan Aßmus 
3422f86ba45SStephan Aßmus void
3432f86ba45SStephan Aßmus BControlLook::DrawMenuBackground(BView* view, BRect& rect,
3442f86ba45SStephan Aßmus 	const BRect& updateRect, const rgb_color& base, uint32 flags,
3452f86ba45SStephan Aßmus 	uint32 borders)
3462f86ba45SStephan Aßmus {
3472f86ba45SStephan Aßmus 	if (!rect.IsValid() || !updateRect.Intersects(rect))
3482f86ba45SStephan Aßmus 		return;
3492f86ba45SStephan Aßmus 
3502f86ba45SStephan Aßmus 	// the surface edges
3512f86ba45SStephan Aßmus 
3522f86ba45SStephan Aßmus 	rgb_color bevelLightColor;
3532f86ba45SStephan Aßmus 	rgb_color bevelShadowColor;
3542f86ba45SStephan Aßmus 	rgb_color background = tint_color(base, 0.75);
3552f86ba45SStephan Aßmus 
3562f86ba45SStephan Aßmus 	if (flags & B_DISABLED) {
3572f86ba45SStephan Aßmus 		bevelLightColor = tint_color(background, 0.80);
3582f86ba45SStephan Aßmus 		bevelShadowColor = tint_color(background, 1.07);
3592f86ba45SStephan Aßmus 	} else {
3602f86ba45SStephan Aßmus 		bevelLightColor = tint_color(background, 0.6);
3612f86ba45SStephan Aßmus 		bevelShadowColor = tint_color(background, 1.12);
3622f86ba45SStephan Aßmus 	}
3632f86ba45SStephan Aßmus 
3642f86ba45SStephan Aßmus 	_DrawFrame(view, rect,
3652f86ba45SStephan Aßmus 		bevelLightColor, bevelLightColor,
3662f86ba45SStephan Aßmus 		bevelShadowColor, bevelShadowColor,
3672f86ba45SStephan Aßmus 		borders);
3682f86ba45SStephan Aßmus 
3692f86ba45SStephan Aßmus 	// the actual surface top
3702f86ba45SStephan Aßmus 
3712f86ba45SStephan Aßmus 	view->SetHighColor(background);
3722f86ba45SStephan Aßmus 	view->FillRect(rect);
3732f86ba45SStephan Aßmus }
3742f86ba45SStephan Aßmus 
3752f86ba45SStephan Aßmus 
3762f86ba45SStephan Aßmus void
3772f86ba45SStephan Aßmus BControlLook::DrawMenuItemBackground(BView* view, BRect& rect,
3782f86ba45SStephan Aßmus 	const BRect& updateRect, const rgb_color& base, uint32 flags,
3792f86ba45SStephan Aßmus 	uint32 borders)
3802f86ba45SStephan Aßmus {
3812f86ba45SStephan Aßmus 	if (!rect.IsValid() || !updateRect.Intersects(rect))
3822f86ba45SStephan Aßmus 		return;
3832f86ba45SStephan Aßmus 
3842f86ba45SStephan Aßmus 	// the surface edges
3852f86ba45SStephan Aßmus 
3862f86ba45SStephan Aßmus 	float topTint;
3872f86ba45SStephan Aßmus 	float bottomTint;
3882f86ba45SStephan Aßmus 	rgb_color selectedColor = base;
3892f86ba45SStephan Aßmus 
3902f86ba45SStephan Aßmus 	if (flags & B_ACTIVATED) {
3912f86ba45SStephan Aßmus 		topTint = 0.9;
3922f86ba45SStephan Aßmus 		bottomTint = 1.05;
3932f86ba45SStephan Aßmus 		selectedColor = tint_color(base, 1.26);
3942f86ba45SStephan Aßmus 	} else if (flags & B_DISABLED) {
3952f86ba45SStephan Aßmus 		topTint = 0.80;
3962f86ba45SStephan Aßmus 		bottomTint = 1.07;
3972f86ba45SStephan Aßmus 	} else {
3982f86ba45SStephan Aßmus 		topTint = 0.6;
3992f86ba45SStephan Aßmus 		bottomTint = 1.12;
4002f86ba45SStephan Aßmus 	}
4012f86ba45SStephan Aßmus 
4022f86ba45SStephan Aßmus 	rgb_color bevelLightColor = tint_color(selectedColor, topTint);
4032f86ba45SStephan Aßmus 	rgb_color bevelShadowColor = tint_color(selectedColor, bottomTint);
4042f86ba45SStephan Aßmus 
4052f86ba45SStephan Aßmus 	_DrawFrame(view, rect,
4062f86ba45SStephan Aßmus 		bevelLightColor, bevelLightColor,
4072f86ba45SStephan Aßmus 		bevelShadowColor, bevelShadowColor,
4082f86ba45SStephan Aßmus 		borders);
4092f86ba45SStephan Aßmus 
4102f86ba45SStephan Aßmus 	// the actual surface top
4112f86ba45SStephan Aßmus 
4122f86ba45SStephan Aßmus 	view->SetLowColor(selectedColor);
4132f86ba45SStephan Aßmus //	_FillGradient(view, rect, selectedColor, topTint, bottomTint);
4142f86ba45SStephan Aßmus 	_FillGradient(view, rect, selectedColor, bottomTint, topTint);
4152f86ba45SStephan Aßmus }
4162f86ba45SStephan Aßmus 
4172f86ba45SStephan Aßmus 
4182f86ba45SStephan Aßmus void
4192f86ba45SStephan Aßmus BControlLook::DrawStatusBar(BView* view, BRect& rect, const BRect& updateRect,
4202f86ba45SStephan Aßmus 	const rgb_color& base, const rgb_color& barColor, float progressPosition)
4212f86ba45SStephan Aßmus {
4222f86ba45SStephan Aßmus 	if (!rect.Intersects(updateRect))
4232f86ba45SStephan Aßmus 		return;
4242f86ba45SStephan Aßmus 
4252f86ba45SStephan Aßmus 	_DrawOuterResessedFrame(view, rect, base, 0.6);
4262f86ba45SStephan Aßmus 
4272f86ba45SStephan Aßmus 	// colors
4282f86ba45SStephan Aßmus 	rgb_color dark1BorderColor = tint_color(base, 1.3);
4292f86ba45SStephan Aßmus 	rgb_color dark2BorderColor = tint_color(base, 1.2);
4302f86ba45SStephan Aßmus 	rgb_color dark1FilledBorderColor = tint_color(barColor, 1.20);
4312f86ba45SStephan Aßmus 	rgb_color dark2FilledBorderColor = tint_color(barColor, 1.45);
4322f86ba45SStephan Aßmus 
4332f86ba45SStephan Aßmus 	BRect filledRect(rect);
4342f86ba45SStephan Aßmus 	filledRect.right = progressPosition - 1;
4352f86ba45SStephan Aßmus 
4362f86ba45SStephan Aßmus 	BRect nonfilledRect(rect);
4372f86ba45SStephan Aßmus 	nonfilledRect.left = progressPosition;
4382f86ba45SStephan Aßmus 
4392f86ba45SStephan Aßmus 	bool filledSurface = filledRect.Width() > 0;
4402f86ba45SStephan Aßmus 	bool nonfilledSurface = nonfilledRect.Width() > 0;
4412f86ba45SStephan Aßmus 
4422f86ba45SStephan Aßmus 	if (filledSurface) {
4432f86ba45SStephan Aßmus 		_DrawFrame(view, filledRect,
4442f86ba45SStephan Aßmus 			dark1FilledBorderColor, dark1FilledBorderColor,
4452f86ba45SStephan Aßmus 			dark2FilledBorderColor, dark2FilledBorderColor);
4462f86ba45SStephan Aßmus 
4472f86ba45SStephan Aßmus 		_FillGlossyGradient(view, filledRect, barColor, 0.55, 0.68, 0.76, 0.90);
4482f86ba45SStephan Aßmus 	}
4492f86ba45SStephan Aßmus 
4502f86ba45SStephan Aßmus 	if (nonfilledSurface) {
4512f86ba45SStephan Aßmus 		_DrawFrame(view, nonfilledRect, dark1BorderColor, dark1BorderColor,
4522f86ba45SStephan Aßmus 			dark2BorderColor, dark2BorderColor,
4532f86ba45SStephan Aßmus 			B_TOP_BORDER | B_BOTTOM_BORDER | B_RIGHT_BORDER);
4542f86ba45SStephan Aßmus 
4552f86ba45SStephan Aßmus 		if (nonfilledRect.left < nonfilledRect.right) {
4562f86ba45SStephan Aßmus 			// shadow from fill bar, or left border
4572f86ba45SStephan Aßmus 			rgb_color leftBorder = dark1BorderColor;
4582f86ba45SStephan Aßmus 			if (filledSurface)
4592f86ba45SStephan Aßmus 				leftBorder = tint_color(base, 0.50);
4602f86ba45SStephan Aßmus 			view->SetHighColor(leftBorder);
4612f86ba45SStephan Aßmus 			view->StrokeLine(nonfilledRect.LeftTop(),
4622f86ba45SStephan Aßmus 				nonfilledRect.LeftBottom());
4632f86ba45SStephan Aßmus 			nonfilledRect.left++;
4642f86ba45SStephan Aßmus 		}
4652f86ba45SStephan Aßmus 
4662f86ba45SStephan Aßmus 		_FillGradient(view, nonfilledRect, base, 0.25, 0.06);
4672f86ba45SStephan Aßmus 	}
4682f86ba45SStephan Aßmus }
4692f86ba45SStephan Aßmus 
4702f86ba45SStephan Aßmus 
4712f86ba45SStephan Aßmus void
4722f86ba45SStephan Aßmus BControlLook::DrawCheckBox(BView* view, BRect& rect, const BRect& updateRect,
4732f86ba45SStephan Aßmus 	const rgb_color& base, uint32 flags)
4742f86ba45SStephan Aßmus {
4752f86ba45SStephan Aßmus 	if (!rect.Intersects(updateRect))
4762f86ba45SStephan Aßmus 		return;
4772f86ba45SStephan Aßmus 
4782f86ba45SStephan Aßmus 	rgb_color dark1BorderColor;
4792f86ba45SStephan Aßmus 	rgb_color dark2BorderColor;
4802f86ba45SStephan Aßmus 	rgb_color navigationColor = ui_color(B_KEYBOARD_NAVIGATION_COLOR);
4812f86ba45SStephan Aßmus 
4822f86ba45SStephan Aßmus 	if (flags & B_DISABLED) {
4834f579098SStephan Aßmus 		_DrawOuterResessedFrame(view, rect, base, 0.0, 1.0, flags);
4842f86ba45SStephan Aßmus 
4852f86ba45SStephan Aßmus 		dark1BorderColor = tint_color(base, 1.15);
4862f86ba45SStephan Aßmus 		dark2BorderColor = tint_color(base, 1.15);
4872f86ba45SStephan Aßmus 	} else if (flags & B_CLICKED) {
4882f86ba45SStephan Aßmus 		dark1BorderColor = tint_color(base, 1.50);
4892f86ba45SStephan Aßmus 		dark2BorderColor = tint_color(base, 1.48);
4902f86ba45SStephan Aßmus 
4912f86ba45SStephan Aßmus 		_DrawFrame(view, rect,
4922f86ba45SStephan Aßmus 			dark1BorderColor, dark1BorderColor,
4932f86ba45SStephan Aßmus 			dark2BorderColor, dark2BorderColor);
4942f86ba45SStephan Aßmus 
4952f86ba45SStephan Aßmus 		dark2BorderColor = dark1BorderColor;
4962f86ba45SStephan Aßmus 	} else {
4974f579098SStephan Aßmus 		_DrawOuterResessedFrame(view, rect, base, 0.6, 1.0, flags);
4982f86ba45SStephan Aßmus 
4992f86ba45SStephan Aßmus 		dark1BorderColor = tint_color(base, 1.40);
5002f86ba45SStephan Aßmus 		dark2BorderColor = tint_color(base, 1.38);
5012f86ba45SStephan Aßmus 	}
5022f86ba45SStephan Aßmus 
5032f86ba45SStephan Aßmus 	if (flags & B_FOCUSED) {
5042f86ba45SStephan Aßmus 		dark1BorderColor = navigationColor;
5052f86ba45SStephan Aßmus 		dark2BorderColor = navigationColor;
5062f86ba45SStephan Aßmus 	}
5072f86ba45SStephan Aßmus 
5082f86ba45SStephan Aßmus 	_DrawFrame(view, rect,
5092f86ba45SStephan Aßmus 		dark1BorderColor, dark1BorderColor,
5102f86ba45SStephan Aßmus 		dark2BorderColor, dark2BorderColor);
5112f86ba45SStephan Aßmus 
5122f86ba45SStephan Aßmus 	if (flags & B_DISABLED) {
5132f86ba45SStephan Aßmus 		_FillGradient(view, rect, base, 0.4, 0.2);
5142f86ba45SStephan Aßmus 	} else {
5152f86ba45SStephan Aßmus 		_FillGradient(view, rect, base, 0.15, 0.0);
5162f86ba45SStephan Aßmus 	}
5172f86ba45SStephan Aßmus 
5182f86ba45SStephan Aßmus 	rgb_color markColor;
5192f86ba45SStephan Aßmus 	if (_RadioButtonAndCheckBoxMarkColor(base, markColor, flags)) {
5202f86ba45SStephan Aßmus 		view->SetHighColor(markColor);
5212f86ba45SStephan Aßmus 
5222f86ba45SStephan Aßmus 		rect.InsetBy(2, 2);
5232f86ba45SStephan Aßmus 		view->SetPenSize(max_c(1.0, ceilf(rect.Width() / 3.5)));
5242f86ba45SStephan Aßmus 		view->SetDrawingMode(B_OP_OVER);
5252f86ba45SStephan Aßmus 
5262f86ba45SStephan Aßmus 		view->StrokeLine(rect.LeftTop(), rect.RightBottom());
5272f86ba45SStephan Aßmus 		view->StrokeLine(rect.LeftBottom(), rect.RightTop());
5282f86ba45SStephan Aßmus 	}
5292f86ba45SStephan Aßmus }
5302f86ba45SStephan Aßmus 
5312f86ba45SStephan Aßmus 
5322f86ba45SStephan Aßmus void
5332f86ba45SStephan Aßmus BControlLook::DrawRadioButton(BView* view, BRect& rect, const BRect& updateRect,
5342f86ba45SStephan Aßmus 	const rgb_color& base, uint32 flags)
5352f86ba45SStephan Aßmus {
5362f86ba45SStephan Aßmus 	if (!rect.Intersects(updateRect))
5372f86ba45SStephan Aßmus 		return;
5382f86ba45SStephan Aßmus 
5392f86ba45SStephan Aßmus 	rgb_color borderColor;
5402f86ba45SStephan Aßmus 	rgb_color bevelLight;
5412f86ba45SStephan Aßmus 	rgb_color bevelShadow;
5422f86ba45SStephan Aßmus 	rgb_color navigationColor = ui_color(B_KEYBOARD_NAVIGATION_COLOR);
5432f86ba45SStephan Aßmus 
5442f86ba45SStephan Aßmus 	if (flags & B_DISABLED) {
5452f86ba45SStephan Aßmus 		borderColor = tint_color(base, 1.15);
5462f86ba45SStephan Aßmus 		bevelLight = base;
5472f86ba45SStephan Aßmus 		bevelShadow = base;
5482f86ba45SStephan Aßmus 	} else if (flags & B_CLICKED) {
5492f86ba45SStephan Aßmus 		borderColor = tint_color(base, 1.50);
5502f86ba45SStephan Aßmus 		bevelLight = borderColor;
5512f86ba45SStephan Aßmus 		bevelShadow = borderColor;
5522f86ba45SStephan Aßmus 	} else {
5532f86ba45SStephan Aßmus 		borderColor = tint_color(base, 1.45);
5542f86ba45SStephan Aßmus 		bevelLight = tint_color(base, 0.55);
5552f86ba45SStephan Aßmus 		bevelShadow = tint_color(base, 1.11);
5562f86ba45SStephan Aßmus 	}
5572f86ba45SStephan Aßmus 
5582f86ba45SStephan Aßmus 	if (flags & B_FOCUSED) {
5592f86ba45SStephan Aßmus 		borderColor = navigationColor;
5602f86ba45SStephan Aßmus 	}
5612f86ba45SStephan Aßmus 
5622f86ba45SStephan Aßmus 	BGradientLinear bevelGradient;
5632f86ba45SStephan Aßmus 	bevelGradient.AddColor(bevelShadow, 0);
5642f86ba45SStephan Aßmus 	bevelGradient.AddColor(bevelLight, 255);
5652f86ba45SStephan Aßmus 	bevelGradient.SetStart(rect.LeftTop());
5662f86ba45SStephan Aßmus 	bevelGradient.SetEnd(rect.RightBottom());
5672f86ba45SStephan Aßmus 
5682f86ba45SStephan Aßmus 	view->FillEllipse(rect, bevelGradient);
5692f86ba45SStephan Aßmus 	rect.InsetBy(1, 1);
5702f86ba45SStephan Aßmus 
5712f86ba45SStephan Aßmus 	bevelGradient.MakeEmpty();
5722f86ba45SStephan Aßmus 	bevelGradient.AddColor(borderColor, 0);
5732f86ba45SStephan Aßmus 	bevelGradient.AddColor(tint_color(borderColor, 0.8), 255);
5742f86ba45SStephan Aßmus 	view->FillEllipse(rect, bevelGradient);
5752f86ba45SStephan Aßmus 	rect.InsetBy(1, 1);
5762f86ba45SStephan Aßmus 
5772f86ba45SStephan Aßmus 	float topTint;
5782f86ba45SStephan Aßmus 	float bottomTint;
5792f86ba45SStephan Aßmus 	if (flags & B_DISABLED) {
5802f86ba45SStephan Aßmus 		topTint = 0.4;
5812f86ba45SStephan Aßmus 		bottomTint = 0.2;
5822f86ba45SStephan Aßmus 	} else {
5832f86ba45SStephan Aßmus 		topTint = 0.15;
5842f86ba45SStephan Aßmus 		bottomTint = 0.0;
5852f86ba45SStephan Aßmus 	}
5862f86ba45SStephan Aßmus 
5872f86ba45SStephan Aßmus 	BGradientLinear gradient;
5882f86ba45SStephan Aßmus 	_MakeGradient(gradient, rect, base, topTint, bottomTint);
5892f86ba45SStephan Aßmus 	view->FillEllipse(rect, gradient);
5902f86ba45SStephan Aßmus 
5912f86ba45SStephan Aßmus 	rgb_color markColor;
5922f86ba45SStephan Aßmus 	if (_RadioButtonAndCheckBoxMarkColor(base, markColor, flags)) {
5932f86ba45SStephan Aßmus 		view->SetHighColor(markColor);
5942f86ba45SStephan Aßmus 		rect.InsetBy(3, 3);
5952f86ba45SStephan Aßmus 		view->FillEllipse(rect);
5962f86ba45SStephan Aßmus 	}
5972f86ba45SStephan Aßmus }
5982f86ba45SStephan Aßmus 
5992f86ba45SStephan Aßmus 
6002f86ba45SStephan Aßmus void
6012f86ba45SStephan Aßmus BControlLook::DrawScrollBarBackground(BView* view, BRect& rect1, BRect& rect2,
6022f86ba45SStephan Aßmus 	const BRect& updateRect, const rgb_color& base, uint32 flags,
6032f86ba45SStephan Aßmus 	enum orientation orientation)
6042f86ba45SStephan Aßmus {
6052f86ba45SStephan Aßmus 	DrawScrollBarBackground(view, rect1, updateRect, base, flags, orientation);
6062f86ba45SStephan Aßmus 	DrawScrollBarBackground(view, rect2, updateRect, base, flags, orientation);
6072f86ba45SStephan Aßmus }
6082f86ba45SStephan Aßmus 
6092f86ba45SStephan Aßmus void
6102f86ba45SStephan Aßmus BControlLook::DrawScrollBarBackground(BView* view, BRect& rect,
6112f86ba45SStephan Aßmus 	const BRect& updateRect, const rgb_color& base, uint32 flags,
6122f86ba45SStephan Aßmus 	enum orientation orientation)
6132f86ba45SStephan Aßmus {
6142f86ba45SStephan Aßmus 	if (!rect.IsValid() || !rect.Intersects(updateRect))
6152f86ba45SStephan Aßmus 		return;
6162f86ba45SStephan Aßmus 
6172f86ba45SStephan Aßmus 	float gradient1Tint;
6182f86ba45SStephan Aßmus 	float gradient2Tint;
6192f86ba45SStephan Aßmus 	float darkEdge1Tint;
6202f86ba45SStephan Aßmus 	float darkEdge2Tint;
6212f86ba45SStephan Aßmus 	float shadowTint;
6222f86ba45SStephan Aßmus 
6232f86ba45SStephan Aßmus 	if (flags & B_DISABLED) {
6242f86ba45SStephan Aßmus 		gradient1Tint = 0.9;
6252f86ba45SStephan Aßmus 		gradient2Tint = 0.8;
6262f86ba45SStephan Aßmus 		darkEdge1Tint = B_DARKEN_2_TINT;
6272f86ba45SStephan Aßmus 		darkEdge2Tint = B_DARKEN_2_TINT;
6282f86ba45SStephan Aßmus 		shadowTint = gradient1Tint;
6292f86ba45SStephan Aßmus 	} else {
6302f86ba45SStephan Aßmus 		gradient1Tint = 1.10;
6312f86ba45SStephan Aßmus 		gradient2Tint = 1.05;
6322f86ba45SStephan Aßmus 		darkEdge1Tint = B_DARKEN_3_TINT;
6332f86ba45SStephan Aßmus 		darkEdge2Tint = B_DARKEN_2_TINT;
6342f86ba45SStephan Aßmus 		shadowTint = gradient1Tint;
6352f86ba45SStephan Aßmus 	}
6362f86ba45SStephan Aßmus 
6372f86ba45SStephan Aßmus 	rgb_color darkEdge1 = tint_color(base, darkEdge1Tint);
6382f86ba45SStephan Aßmus 	rgb_color darkEdge2 = tint_color(base, darkEdge2Tint);
6392f86ba45SStephan Aßmus 	rgb_color shadow = tint_color(base, shadowTint);
6402f86ba45SStephan Aßmus 
6412f86ba45SStephan Aßmus 	if (orientation == B_HORIZONTAL) {
6422f86ba45SStephan Aßmus 		// dark vertical line on left edge
6432f86ba45SStephan Aßmus 		if (rect.Width() > 0) {
6442f86ba45SStephan Aßmus 			view->SetHighColor(darkEdge1);
6452f86ba45SStephan Aßmus 			view->StrokeLine(rect.LeftTop(), rect.LeftBottom());
6462f86ba45SStephan Aßmus 			rect.left++;
6472f86ba45SStephan Aßmus 		}
6482f86ba45SStephan Aßmus 		// dark vertical line on right edge
6492f86ba45SStephan Aßmus 		if (rect.Width() >= 0) {
6502f86ba45SStephan Aßmus 			view->SetHighColor(darkEdge2);
6512f86ba45SStephan Aßmus 			view->StrokeLine(rect.RightTop(), rect.RightBottom());
6522f86ba45SStephan Aßmus 			rect.right--;
6532f86ba45SStephan Aßmus 		}
6542f86ba45SStephan Aßmus 		// vertical shadow line after left edge
6552f86ba45SStephan Aßmus 		if (rect.Width() >= 0) {
6562f86ba45SStephan Aßmus 			view->SetHighColor(shadow);
6572f86ba45SStephan Aßmus 			view->StrokeLine(rect.LeftTop(), rect.LeftBottom());
6582f86ba45SStephan Aßmus 			rect.left++;
6592f86ba45SStephan Aßmus 		}
6602f86ba45SStephan Aßmus 		// fill
6612f86ba45SStephan Aßmus 		if (rect.Width() >= 0) {
6622f86ba45SStephan Aßmus 			_FillGradient(view, rect, base, gradient1Tint, gradient2Tint,
6632f86ba45SStephan Aßmus 				orientation);
6642f86ba45SStephan Aßmus 		}
6652f86ba45SStephan Aßmus 	} else {
6662f86ba45SStephan Aßmus 		// dark vertical line on top edge
6672f86ba45SStephan Aßmus 		if (rect.Height() > 0) {
6682f86ba45SStephan Aßmus 			view->SetHighColor(darkEdge1);
6692f86ba45SStephan Aßmus 			view->StrokeLine(rect.LeftTop(), rect.RightTop());
6702f86ba45SStephan Aßmus 			rect.top++;
6712f86ba45SStephan Aßmus 		}
6722f86ba45SStephan Aßmus 		// dark vertical line on bottom edge
6732f86ba45SStephan Aßmus 		if (rect.Height() >= 0) {
6742f86ba45SStephan Aßmus 			view->SetHighColor(darkEdge2);
6752f86ba45SStephan Aßmus 			view->StrokeLine(rect.LeftBottom(), rect.RightBottom());
6762f86ba45SStephan Aßmus 			rect.bottom--;
6772f86ba45SStephan Aßmus 		}
6782f86ba45SStephan Aßmus 		// horizontal shadow line after top edge
6792f86ba45SStephan Aßmus 		if (rect.Height() >= 0) {
6802f86ba45SStephan Aßmus 			view->SetHighColor(shadow);
6812f86ba45SStephan Aßmus 			view->StrokeLine(rect.LeftTop(), rect.RightTop());
6822f86ba45SStephan Aßmus 			rect.top++;
6832f86ba45SStephan Aßmus 		}
6842f86ba45SStephan Aßmus 		// fill
6852f86ba45SStephan Aßmus 		if (rect.Height() >= 0) {
6862f86ba45SStephan Aßmus 			_FillGradient(view, rect, base, gradient1Tint, gradient2Tint,
6872f86ba45SStephan Aßmus 				orientation);
6882f86ba45SStephan Aßmus 		}
6892f86ba45SStephan Aßmus 	}
6902f86ba45SStephan Aßmus }
6912f86ba45SStephan Aßmus 
6922f86ba45SStephan Aßmus 
69340a10e1cSStephan Aßmus void
69474bb70aeSStephan Aßmus BControlLook::DrawScrollViewFrame(BView* view, BRect& rect,
69574bb70aeSStephan Aßmus 	const BRect& updateRect, BRect verticalScrollBarFrame,
69674bb70aeSStephan Aßmus 	BRect horizontalScrollBarFrame, const rgb_color& base,
69774bb70aeSStephan Aßmus 	border_style border, uint32 flags, uint32 _borders)
69874bb70aeSStephan Aßmus {
699ce955579SStephan Aßmus 	// calculate scroll corner rect before messing with the "rect"
700ce955579SStephan Aßmus 	BRect scrollCornerFillRect(rect.right, rect.bottom,
701ce955579SStephan Aßmus 		rect.right, rect.bottom);
702ce955579SStephan Aßmus 	if (horizontalScrollBarFrame.IsValid())
703ce955579SStephan Aßmus 		scrollCornerFillRect.left = horizontalScrollBarFrame.right + 1;
704ce955579SStephan Aßmus 	if (verticalScrollBarFrame.IsValid())
705ce955579SStephan Aßmus 		scrollCornerFillRect.top = verticalScrollBarFrame.bottom + 1;
706ce955579SStephan Aßmus 
707c44aa833SStephan Aßmus 	if (border == B_NO_BORDER) {
708c44aa833SStephan Aßmus 		if (scrollCornerFillRect.IsValid()) {
709c44aa833SStephan Aßmus 			view->SetHighColor(base);
710c44aa833SStephan Aßmus 			view->FillRect(scrollCornerFillRect);
711c44aa833SStephan Aßmus 		}
712c44aa833SStephan Aßmus 		return;
713c44aa833SStephan Aßmus 	}
714c44aa833SStephan Aßmus 
715c44aa833SStephan Aßmus 	bool excludeScrollCorner = border == B_FANCY_BORDER
716c44aa833SStephan Aßmus 		&& horizontalScrollBarFrame.IsValid()
717c44aa833SStephan Aßmus 		&& verticalScrollBarFrame.IsValid();
718c44aa833SStephan Aßmus 
71974bb70aeSStephan Aßmus 	uint32 borders = _borders;
72074bb70aeSStephan Aßmus 	if (excludeScrollCorner) {
72174bb70aeSStephan Aßmus 		rect.bottom = horizontalScrollBarFrame.top;
72274bb70aeSStephan Aßmus 		rect.right = verticalScrollBarFrame.left;
72374bb70aeSStephan Aßmus 		borders &= ~(B_RIGHT_BORDER | B_BOTTOM_BORDER);
72474bb70aeSStephan Aßmus 	}
72574bb70aeSStephan Aßmus 
72674bb70aeSStephan Aßmus 	rgb_color scrollbarFrameColor = tint_color(base, B_DARKEN_2_TINT);
72774bb70aeSStephan Aßmus 
72874bb70aeSStephan Aßmus 	if (border == B_FANCY_BORDER)
7294f579098SStephan Aßmus 		_DrawOuterResessedFrame(view, rect, base, 1.0, 1.0, flags, borders);
73074bb70aeSStephan Aßmus 
73174bb70aeSStephan Aßmus 	if (flags & B_FOCUSED) {
73274bb70aeSStephan Aßmus 		rgb_color focusColor = ui_color(B_KEYBOARD_NAVIGATION_COLOR);
73374bb70aeSStephan Aßmus 		_DrawFrame(view, rect, focusColor, focusColor, focusColor, focusColor,
73474bb70aeSStephan Aßmus 			borders);
73574bb70aeSStephan Aßmus 	} else {
73674bb70aeSStephan Aßmus 		_DrawFrame(view, rect, scrollbarFrameColor, scrollbarFrameColor,
73774bb70aeSStephan Aßmus 			scrollbarFrameColor, scrollbarFrameColor, borders);
73874bb70aeSStephan Aßmus 	}
73974bb70aeSStephan Aßmus 
74074bb70aeSStephan Aßmus 	if (excludeScrollCorner) {
74174bb70aeSStephan Aßmus 		horizontalScrollBarFrame.InsetBy(-1, -1);
74274bb70aeSStephan Aßmus 		// do not overdraw the top edge
74374bb70aeSStephan Aßmus 		horizontalScrollBarFrame.top += 2;
74474bb70aeSStephan Aßmus 		borders = _borders;
74574bb70aeSStephan Aßmus 		borders &= ~B_TOP_BORDER;
74674bb70aeSStephan Aßmus 		_DrawOuterResessedFrame(view, horizontalScrollBarFrame, base,
7474f579098SStephan Aßmus 			1.0, 1.0, flags, borders);
74874bb70aeSStephan Aßmus 		_DrawFrame(view, horizontalScrollBarFrame, scrollbarFrameColor,
74974bb70aeSStephan Aßmus 			scrollbarFrameColor, scrollbarFrameColor, scrollbarFrameColor,
75074bb70aeSStephan Aßmus 			borders);
75174bb70aeSStephan Aßmus 
75274bb70aeSStephan Aßmus 
75374bb70aeSStephan Aßmus 		verticalScrollBarFrame.InsetBy(-1, -1);
75474bb70aeSStephan Aßmus 		// do not overdraw the left edge
75574bb70aeSStephan Aßmus 		verticalScrollBarFrame.left += 2;
75674bb70aeSStephan Aßmus 		borders = _borders;
75774bb70aeSStephan Aßmus 		borders &= ~B_LEFT_BORDER;
75874bb70aeSStephan Aßmus 		_DrawOuterResessedFrame(view, verticalScrollBarFrame, base,
7594f579098SStephan Aßmus 			1.0, 1.0, flags, borders);
76074bb70aeSStephan Aßmus 		_DrawFrame(view, verticalScrollBarFrame, scrollbarFrameColor,
76174bb70aeSStephan Aßmus 			scrollbarFrameColor, scrollbarFrameColor, scrollbarFrameColor,
76274bb70aeSStephan Aßmus 			borders);
763ce955579SStephan Aßmus 
764ce955579SStephan Aßmus 		// exclude recessed frame
765ce955579SStephan Aßmus 		scrollCornerFillRect.top++;
766ce955579SStephan Aßmus 		scrollCornerFillRect.left++;
767ce955579SStephan Aßmus 	}
768ce955579SStephan Aßmus 
769ce955579SStephan Aßmus 	if (scrollCornerFillRect.IsValid()) {
770ce955579SStephan Aßmus 		view->SetHighColor(base);
771ce955579SStephan Aßmus 		view->FillRect(scrollCornerFillRect);
77274bb70aeSStephan Aßmus 	}
77374bb70aeSStephan Aßmus }
77474bb70aeSStephan Aßmus 
77574bb70aeSStephan Aßmus 
77674bb70aeSStephan Aßmus void
77740a10e1cSStephan Aßmus BControlLook::DrawArrowShape(BView* view, BRect& rect, const BRect& updateRect,
77840a10e1cSStephan Aßmus 	const rgb_color& base, uint32 direction, uint32 flags, float tint)
77940a10e1cSStephan Aßmus {
78040a10e1cSStephan Aßmus 	BPoint tri1, tri2, tri3;
78140a10e1cSStephan Aßmus 	float hInset = rect.Width() / 3;
78240a10e1cSStephan Aßmus 	float vInset = rect.Height() / 3;
78340a10e1cSStephan Aßmus 	rect.InsetBy(hInset, vInset);
78440a10e1cSStephan Aßmus 
78540a10e1cSStephan Aßmus 	switch (direction) {
78640a10e1cSStephan Aßmus 		case B_LEFT_ARROW:
78740a10e1cSStephan Aßmus 			tri1.Set(rect.right, rect.top);
78840a10e1cSStephan Aßmus 			tri2.Set(rect.right - rect.Width() / 1.33,
78940a10e1cSStephan Aßmus 				(rect.top + rect.bottom + 1) /2 );
79040a10e1cSStephan Aßmus 			tri3.Set(rect.right, rect.bottom + 1);
79140a10e1cSStephan Aßmus 			break;
79240a10e1cSStephan Aßmus 		case B_RIGHT_ARROW:
79340a10e1cSStephan Aßmus 			tri1.Set(rect.left, rect.bottom + 1);
79440a10e1cSStephan Aßmus 			tri2.Set(rect.left + rect.Width() / 1.33,
79540a10e1cSStephan Aßmus 				(rect.top + rect.bottom + 1) / 2);
79640a10e1cSStephan Aßmus 			tri3.Set(rect.left, rect.top);
79740a10e1cSStephan Aßmus 			break;
79840a10e1cSStephan Aßmus 		case B_UP_ARROW:
79940a10e1cSStephan Aßmus 			tri1.Set(rect.left, rect.bottom);
80040a10e1cSStephan Aßmus 			tri2.Set((rect.left + rect.right + 1) / 2,
80140a10e1cSStephan Aßmus 				rect.bottom - rect.Height() / 1.33);
80240a10e1cSStephan Aßmus 			tri3.Set(rect.right + 1, rect.bottom);
80340a10e1cSStephan Aßmus 			break;
80440a10e1cSStephan Aßmus 		case B_DOWN_ARROW:
80540a10e1cSStephan Aßmus 		default:
80640a10e1cSStephan Aßmus 			tri1.Set(rect.left, rect.top);
80740a10e1cSStephan Aßmus 			tri2.Set((rect.left + rect.right + 1) / 2,
80840a10e1cSStephan Aßmus 				rect.top + rect.Height() / 1.33);
80940a10e1cSStephan Aßmus 			tri3.Set(rect.right + 1, rect.top);
81040a10e1cSStephan Aßmus 			break;
81140a10e1cSStephan Aßmus 	}
81240a10e1cSStephan Aßmus 	// offset triangle if down
81340a10e1cSStephan Aßmus 	if (flags & B_ACTIVATED)
81440a10e1cSStephan Aßmus 		view->MovePenTo(BPoint(1, 1));
81540a10e1cSStephan Aßmus 	else
81640a10e1cSStephan Aßmus 		view->MovePenTo(BPoint(0, 0));
81740a10e1cSStephan Aßmus 
81840a10e1cSStephan Aßmus 	BShape arrowShape;
81940a10e1cSStephan Aßmus 	arrowShape.MoveTo(tri1);
82040a10e1cSStephan Aßmus 	arrowShape.LineTo(tri2);
82140a10e1cSStephan Aßmus 	arrowShape.LineTo(tri3);
82240a10e1cSStephan Aßmus 
82340a10e1cSStephan Aßmus 	if (flags & B_DISABLED)
82440a10e1cSStephan Aßmus 		tint = (tint + B_NO_TINT + B_NO_TINT) / 3;
82540a10e1cSStephan Aßmus 
82640a10e1cSStephan Aßmus 	view->SetHighColor(tint_color(base, tint));
82740a10e1cSStephan Aßmus 
82840a10e1cSStephan Aßmus 	float penSize = view->PenSize();
82940a10e1cSStephan Aßmus 	drawing_mode mode = view->DrawingMode();
83040a10e1cSStephan Aßmus 
83140a10e1cSStephan Aßmus 	view->SetPenSize(ceilf(hInset / 2.0));
83240a10e1cSStephan Aßmus 	view->SetDrawingMode(B_OP_OVER);
83340a10e1cSStephan Aßmus 	view->StrokeShape(&arrowShape);
83440a10e1cSStephan Aßmus 
83540a10e1cSStephan Aßmus 	view->SetPenSize(penSize);
83640a10e1cSStephan Aßmus 	view->SetDrawingMode(mode);
83740a10e1cSStephan Aßmus }
83840a10e1cSStephan Aßmus 
83940a10e1cSStephan Aßmus 
8402f86ba45SStephan Aßmus rgb_color
8412f86ba45SStephan Aßmus BControlLook::SliderBarColor(const rgb_color& base)
8422f86ba45SStephan Aßmus {
8432f86ba45SStephan Aßmus 	return tint_color(ui_color(B_PANEL_BACKGROUND_COLOR), B_DARKEN_1_TINT);
8442f86ba45SStephan Aßmus }
8452f86ba45SStephan Aßmus 
8462f86ba45SStephan Aßmus 
8472f86ba45SStephan Aßmus void
8482f86ba45SStephan Aßmus BControlLook::DrawSliderBar(BView* view, BRect rect, const BRect& updateRect,
8492f86ba45SStephan Aßmus 	const rgb_color& base, rgb_color leftFillColor, rgb_color rightFillColor,
8502f86ba45SStephan Aßmus 	float sliderScale, uint32 flags, enum orientation orientation)
8512f86ba45SStephan Aßmus {
8522f86ba45SStephan Aßmus 	if (!rect.IsValid() || !rect.Intersects(updateRect))
8532f86ba45SStephan Aßmus 		return;
8542f86ba45SStephan Aßmus 
8552f86ba45SStephan Aßmus 	// separate the bar in two sides
8562f86ba45SStephan Aßmus 	float sliderPosition;
8572f86ba45SStephan Aßmus 	BRect leftBarSide = rect;
8582f86ba45SStephan Aßmus 	BRect rightBarSide = rect;
8592f86ba45SStephan Aßmus 
8602f86ba45SStephan Aßmus 	if (orientation == B_HORIZONTAL) {
8612f86ba45SStephan Aßmus 		sliderPosition = floorf(rect.left + 2 + (rect.Width() - 2)
8622f86ba45SStephan Aßmus 			* sliderScale);
8632f86ba45SStephan Aßmus 		leftBarSide.right = sliderPosition - 1;
8642f86ba45SStephan Aßmus 		rightBarSide.left = sliderPosition;
8652f86ba45SStephan Aßmus 	} else {
8662f86ba45SStephan Aßmus 		sliderPosition = floorf(rect.top + 2 + (rect.Height() - 2)
8672f86ba45SStephan Aßmus 			* sliderScale);
8682f86ba45SStephan Aßmus 		leftBarSide.bottom = sliderPosition - 1;
8692f86ba45SStephan Aßmus 		rightBarSide.top = sliderPosition;
8702f86ba45SStephan Aßmus 	}
8712f86ba45SStephan Aßmus 
8722f86ba45SStephan Aßmus 	// fill the background for the corners, exclude the middle bar for now
8732f86ba45SStephan Aßmus 	BRegion region(rect);
8742f86ba45SStephan Aßmus 	region.Exclude(rightBarSide);
8752f86ba45SStephan Aßmus 	view->ConstrainClippingRegion(&region);
8762f86ba45SStephan Aßmus 
8772f86ba45SStephan Aßmus 	view->PushState();
8782f86ba45SStephan Aßmus 
8792f86ba45SStephan Aßmus 	DrawSliderBar(view, rect, updateRect, base, leftFillColor, flags,
8802f86ba45SStephan Aßmus 		orientation);
8812f86ba45SStephan Aßmus 
8822f86ba45SStephan Aßmus 	view->PopState();
8832f86ba45SStephan Aßmus 
8842f86ba45SStephan Aßmus 	region.Set(rect);
8852f86ba45SStephan Aßmus 	region.Exclude(leftBarSide);
8862f86ba45SStephan Aßmus 	view->ConstrainClippingRegion(&region);
8872f86ba45SStephan Aßmus 
8882f86ba45SStephan Aßmus 	view->PushState();
8892f86ba45SStephan Aßmus 
8902f86ba45SStephan Aßmus 	DrawSliderBar(view, rect, updateRect, base, rightFillColor, flags,
8912f86ba45SStephan Aßmus 		orientation);
8922f86ba45SStephan Aßmus 
8932f86ba45SStephan Aßmus 	view->PopState();
8942f86ba45SStephan Aßmus 
8952f86ba45SStephan Aßmus 	view->ConstrainClippingRegion(NULL);
8962f86ba45SStephan Aßmus }
8972f86ba45SStephan Aßmus 
8982f86ba45SStephan Aßmus 
8992f86ba45SStephan Aßmus void
9002f86ba45SStephan Aßmus BControlLook::DrawSliderBar(BView* view, BRect rect, const BRect& updateRect,
9012f86ba45SStephan Aßmus 	const rgb_color& base, rgb_color fillColor, uint32 flags,
9022f86ba45SStephan Aßmus 	enum orientation orientation)
9032f86ba45SStephan Aßmus {
9042f86ba45SStephan Aßmus 	if (!rect.IsValid() || !rect.Intersects(updateRect))
9052f86ba45SStephan Aßmus 		return;
9062f86ba45SStephan Aßmus 
9072f86ba45SStephan Aßmus 	// separate the rect into corners
9082f86ba45SStephan Aßmus 	BRect leftCorner(rect);
9092f86ba45SStephan Aßmus 	BRect rightCorner(rect);
9102f86ba45SStephan Aßmus 	BRect barRect(rect);
9112f86ba45SStephan Aßmus 
9122f86ba45SStephan Aßmus 	if (orientation == B_HORIZONTAL) {
9132f86ba45SStephan Aßmus 		leftCorner.right = leftCorner.left + leftCorner.Height();
9142f86ba45SStephan Aßmus 		rightCorner.left = rightCorner.right - rightCorner.Height();
9152f86ba45SStephan Aßmus 		barRect.left += ceilf(barRect.Height() / 2);
9162f86ba45SStephan Aßmus 		barRect.right -= ceilf(barRect.Height() / 2);
9172f86ba45SStephan Aßmus 	} else {
9182f86ba45SStephan Aßmus 		leftCorner.bottom = leftCorner.top + leftCorner.Width();
9192f86ba45SStephan Aßmus 		rightCorner.top = rightCorner.bottom - rightCorner.Width();
9202f86ba45SStephan Aßmus 		barRect.top += ceilf(barRect.Width() / 2);
9212f86ba45SStephan Aßmus 		barRect.bottom -= ceilf(barRect.Width() / 2);
9222f86ba45SStephan Aßmus 	}
9232f86ba45SStephan Aßmus 
9242f86ba45SStephan Aßmus 	// fill the background for the corners, exclude the middle bar for now
9252f86ba45SStephan Aßmus 	BRegion region(rect);
9262f86ba45SStephan Aßmus 	region.Exclude(barRect);
9272f86ba45SStephan Aßmus 	view->ConstrainClippingRegion(&region);
9282f86ba45SStephan Aßmus 
9292f86ba45SStephan Aßmus 	view->SetHighColor(base);
9302f86ba45SStephan Aßmus 	view->FillRect(rect);
9312f86ba45SStephan Aßmus 
9322f86ba45SStephan Aßmus 	// figure out the tints to be used
9332f86ba45SStephan Aßmus 	float edgeLightTint;
9342f86ba45SStephan Aßmus 	float edgeShadowTint;
9352f86ba45SStephan Aßmus 	float frameLightTint;
9362f86ba45SStephan Aßmus 	float frameShadowTint;
9372f86ba45SStephan Aßmus 	float fillLightTint;
9382f86ba45SStephan Aßmus 	float fillShadowTint;
9392f86ba45SStephan Aßmus 
9402f86ba45SStephan Aßmus 	if (flags & B_DISABLED) {
9412f86ba45SStephan Aßmus 		edgeLightTint = 1.0;
9422f86ba45SStephan Aßmus 		edgeShadowTint = 1.0;
9432f86ba45SStephan Aßmus 		frameLightTint = 1.20;
9442f86ba45SStephan Aßmus 		frameShadowTint = 1.25;
9452f86ba45SStephan Aßmus 		fillLightTint = 0.9;
9462f86ba45SStephan Aßmus 		fillShadowTint = 1.05;
9472f86ba45SStephan Aßmus 
9482f86ba45SStephan Aßmus 		fillColor.red = uint8(fillColor.red * 0.4 + base.red * 0.6);
9492f86ba45SStephan Aßmus 		fillColor.green = uint8(fillColor.green * 0.4 + base.green * 0.6);
9502f86ba45SStephan Aßmus 		fillColor.blue = uint8(fillColor.blue * 0.4 + base.blue * 0.6);
9512f86ba45SStephan Aßmus 	} else {
9522f86ba45SStephan Aßmus 		edgeLightTint = 0.65;
9532f86ba45SStephan Aßmus 		edgeShadowTint = 1.07;
9542f86ba45SStephan Aßmus 		frameLightTint = 1.40;
9552f86ba45SStephan Aßmus 		frameShadowTint = 1.50;
9562f86ba45SStephan Aßmus 		fillLightTint = 0.8;
9572f86ba45SStephan Aßmus 		fillShadowTint = 1.1;
9582f86ba45SStephan Aßmus 	}
9592f86ba45SStephan Aßmus 
9602f86ba45SStephan Aßmus 	rgb_color edgeLightColor = tint_color(base, edgeLightTint);
9612f86ba45SStephan Aßmus 	rgb_color edgeShadowColor = tint_color(base, edgeShadowTint);
9622f86ba45SStephan Aßmus 	rgb_color frameLightColor = tint_color(fillColor, frameLightTint);
9632f86ba45SStephan Aßmus 	rgb_color frameShadowColor = tint_color(fillColor, frameShadowTint);
9642f86ba45SStephan Aßmus 	rgb_color fillLightColor = tint_color(fillColor, fillLightTint);
9652f86ba45SStephan Aßmus 	rgb_color fillShadowColor = tint_color(fillColor, fillShadowTint);
9662f86ba45SStephan Aßmus 
9672f86ba45SStephan Aßmus 	if (orientation == B_HORIZONTAL) {
9682f86ba45SStephan Aßmus 		_DrawRoundBarCorner(view, leftCorner, updateRect, edgeLightColor,
9692f86ba45SStephan Aßmus 			edgeShadowColor, frameLightColor, frameShadowColor, fillLightColor,
9702f86ba45SStephan Aßmus 			fillShadowColor, 1.0, 1.0, 0.0, -1.0, orientation);
9712f86ba45SStephan Aßmus 
9722f86ba45SStephan Aßmus 		_DrawRoundBarCorner(view, rightCorner, updateRect, edgeLightColor,
9732f86ba45SStephan Aßmus 			edgeShadowColor, frameLightColor, frameShadowColor, fillLightColor,
9742f86ba45SStephan Aßmus 			fillShadowColor, 0.0, 1.0, -1.0, -1.0, orientation);
9752f86ba45SStephan Aßmus 	} else {
9762f86ba45SStephan Aßmus 		_DrawRoundBarCorner(view, leftCorner, updateRect, edgeLightColor,
9772f86ba45SStephan Aßmus 			edgeShadowColor, frameLightColor, frameShadowColor, fillLightColor,
9782f86ba45SStephan Aßmus 			fillShadowColor, 1.0, 1.0, -1.0, 0.0, orientation);
9792f86ba45SStephan Aßmus 
9802f86ba45SStephan Aßmus 		_DrawRoundBarCorner(view, rightCorner, updateRect, edgeLightColor,
9812f86ba45SStephan Aßmus 			edgeShadowColor, frameLightColor, frameShadowColor, fillLightColor,
9822f86ba45SStephan Aßmus 			fillShadowColor, 1.0, 0.0, -1.0, -1.0, orientation);
9832f86ba45SStephan Aßmus 	}
9842f86ba45SStephan Aßmus 
9852f86ba45SStephan Aßmus 	view->ConstrainClippingRegion(NULL);
9862f86ba45SStephan Aßmus 
9872f86ba45SStephan Aßmus 	view->BeginLineArray(4);
9882f86ba45SStephan Aßmus 	if (orientation == B_HORIZONTAL) {
9892f86ba45SStephan Aßmus 		view->AddLine(barRect.LeftTop(), barRect.RightTop(), edgeShadowColor);
9902f86ba45SStephan Aßmus 		view->AddLine(barRect.LeftBottom(), barRect.RightBottom(),
9912f86ba45SStephan Aßmus 			edgeLightColor);
9922f86ba45SStephan Aßmus 		barRect.InsetBy(0, 1);
9932f86ba45SStephan Aßmus 		view->AddLine(barRect.LeftTop(), barRect.RightTop(), frameShadowColor);
9942f86ba45SStephan Aßmus 		view->AddLine(barRect.LeftBottom(), barRect.RightBottom(),
9952f86ba45SStephan Aßmus 			frameLightColor);
9962f86ba45SStephan Aßmus 		barRect.InsetBy(0, 1);
9972f86ba45SStephan Aßmus 	} else {
9982f86ba45SStephan Aßmus 		view->AddLine(barRect.LeftTop(), barRect.LeftBottom(), edgeShadowColor);
9992f86ba45SStephan Aßmus 		view->AddLine(barRect.RightTop(), barRect.RightBottom(),
10002f86ba45SStephan Aßmus 			edgeLightColor);
10012f86ba45SStephan Aßmus 		barRect.InsetBy(1, 0);
10022f86ba45SStephan Aßmus 		view->AddLine(barRect.LeftTop(), barRect.LeftBottom(), frameShadowColor);
10032f86ba45SStephan Aßmus 		view->AddLine(barRect.RightTop(), barRect.RightBottom(),
10042f86ba45SStephan Aßmus 			frameLightColor);
10052f86ba45SStephan Aßmus 		barRect.InsetBy(1, 0);
10062f86ba45SStephan Aßmus 	}
10072f86ba45SStephan Aßmus 	view->EndLineArray();
10082f86ba45SStephan Aßmus 
10092f86ba45SStephan Aßmus 	_FillGradient(view, barRect, fillColor, fillShadowTint, fillLightTint,
10102f86ba45SStephan Aßmus 		orientation);
10112f86ba45SStephan Aßmus }
10122f86ba45SStephan Aßmus 
10132f86ba45SStephan Aßmus 
10142f86ba45SStephan Aßmus void
10152f86ba45SStephan Aßmus BControlLook::DrawSliderThumb(BView* view, BRect& rect, const BRect& updateRect,
10162f86ba45SStephan Aßmus 	const rgb_color& base, uint32 flags, enum orientation orientation)
10172f86ba45SStephan Aßmus {
10182f86ba45SStephan Aßmus 	if (!rect.IsValid() || !rect.Intersects(updateRect))
10192f86ba45SStephan Aßmus 		return;
10202f86ba45SStephan Aßmus 
10212f86ba45SStephan Aßmus 	// figure out frame color
10222f86ba45SStephan Aßmus 	rgb_color frameLightColor;
10232f86ba45SStephan Aßmus 	rgb_color frameShadowColor;
10242f86ba45SStephan Aßmus 	rgb_color shadowColor = (rgb_color){ 0, 0, 0, 60 };
10252f86ba45SStephan Aßmus 
10262f86ba45SStephan Aßmus 	if (flags & B_FOCUSED) {
10272f86ba45SStephan Aßmus 		// focused
10282f86ba45SStephan Aßmus 		frameLightColor = ui_color(B_KEYBOARD_NAVIGATION_COLOR);
10292f86ba45SStephan Aßmus 		frameShadowColor = frameLightColor;
10302f86ba45SStephan Aßmus 	} else {
10312f86ba45SStephan Aßmus 		// figure out the tints to be used
10322f86ba45SStephan Aßmus 		float frameLightTint;
10332f86ba45SStephan Aßmus 		float frameShadowTint;
10342f86ba45SStephan Aßmus 
10352f86ba45SStephan Aßmus 		if (flags & B_DISABLED) {
10362f86ba45SStephan Aßmus 			frameLightTint = 1.30;
10372f86ba45SStephan Aßmus 			frameShadowTint = 1.35;
10382f86ba45SStephan Aßmus 			shadowColor.alpha = 30;
10392f86ba45SStephan Aßmus 		} else {
10402f86ba45SStephan Aßmus 			frameLightTint = 1.6;
10412f86ba45SStephan Aßmus 			frameShadowTint = 1.65;
10422f86ba45SStephan Aßmus 		}
10432f86ba45SStephan Aßmus 
10442f86ba45SStephan Aßmus 		frameLightColor = tint_color(base, frameLightTint);
10452f86ba45SStephan Aßmus 		frameShadowColor = tint_color(base, frameShadowTint);
10462f86ba45SStephan Aßmus 	}
10472f86ba45SStephan Aßmus 
10482f86ba45SStephan Aßmus 	BRect originalRect(rect);
10492f86ba45SStephan Aßmus 	rect.right--;
10502f86ba45SStephan Aßmus 	rect.bottom--;
10512f86ba45SStephan Aßmus 
10522f86ba45SStephan Aßmus 	_DrawFrame(view, rect, frameLightColor, frameLightColor,
10532f86ba45SStephan Aßmus 		frameShadowColor, frameShadowColor);
10542f86ba45SStephan Aßmus 
10552f86ba45SStephan Aßmus 	flags &= ~B_ACTIVATED;
10562f86ba45SStephan Aßmus 	DrawButtonBackground(view, rect, updateRect, base, flags);
10572f86ba45SStephan Aßmus 
10582f86ba45SStephan Aßmus 	// thumb shadow
10592f86ba45SStephan Aßmus 	view->SetDrawingMode(B_OP_ALPHA);
10602f86ba45SStephan Aßmus 	view->SetHighColor(shadowColor);
10612f86ba45SStephan Aßmus 	originalRect.left++;
10622f86ba45SStephan Aßmus 	originalRect.top++;
10632f86ba45SStephan Aßmus 	view->StrokeLine(originalRect.LeftBottom(), originalRect.RightBottom());
10642f86ba45SStephan Aßmus 	originalRect.bottom--;
10652f86ba45SStephan Aßmus 	view->StrokeLine(originalRect.RightTop(), originalRect.RightBottom());
10662f86ba45SStephan Aßmus 
10672f86ba45SStephan Aßmus 	// thumb edge
10682f86ba45SStephan Aßmus 	if (orientation == B_HORIZONTAL) {
10692f86ba45SStephan Aßmus 		rect.InsetBy(0, floorf(rect.Height() / 4));
10702f86ba45SStephan Aßmus 		rect.left = floorf((rect.left + rect.right) / 2);
10712f86ba45SStephan Aßmus 		rect.right = rect.left + 1;
10722f86ba45SStephan Aßmus 		shadowColor = tint_color(base, B_DARKEN_2_TINT);
10732f86ba45SStephan Aßmus 		shadowColor.alpha = 128;
10742f86ba45SStephan Aßmus 		view->SetHighColor(shadowColor);
10752f86ba45SStephan Aßmus 		view->StrokeLine(rect.LeftTop(), rect.LeftBottom());
10762f86ba45SStephan Aßmus 		rgb_color lightColor = tint_color(base, B_LIGHTEN_2_TINT);
10772f86ba45SStephan Aßmus 		lightColor.alpha = 128;
10782f86ba45SStephan Aßmus 		view->SetHighColor(lightColor);
10792f86ba45SStephan Aßmus 		view->StrokeLine(rect.RightTop(), rect.RightBottom());
10802f86ba45SStephan Aßmus 	} else {
10812f86ba45SStephan Aßmus 		rect.InsetBy(floorf(rect.Width() / 4), 0);
10822f86ba45SStephan Aßmus 		rect.top = floorf((rect.top + rect.bottom) / 2);
10832f86ba45SStephan Aßmus 		rect.bottom = rect.top + 1;
10842f86ba45SStephan Aßmus 		shadowColor = tint_color(base, B_DARKEN_2_TINT);
10852f86ba45SStephan Aßmus 		shadowColor.alpha = 128;
10862f86ba45SStephan Aßmus 		view->SetHighColor(shadowColor);
10872f86ba45SStephan Aßmus 		view->StrokeLine(rect.LeftTop(), rect.RightTop());
10882f86ba45SStephan Aßmus 		rgb_color lightColor = tint_color(base, B_LIGHTEN_2_TINT);
10892f86ba45SStephan Aßmus 		lightColor.alpha = 128;
10902f86ba45SStephan Aßmus 		view->SetHighColor(lightColor);
10912f86ba45SStephan Aßmus 		view->StrokeLine(rect.LeftBottom(), rect.RightBottom());
10922f86ba45SStephan Aßmus 	}
10932f86ba45SStephan Aßmus 
10942f86ba45SStephan Aßmus 	view->SetDrawingMode(B_OP_COPY);
10952f86ba45SStephan Aßmus }
10962f86ba45SStephan Aßmus 
10972f86ba45SStephan Aßmus 
10982f86ba45SStephan Aßmus void
10992f86ba45SStephan Aßmus BControlLook::DrawSliderTriangle(BView* view, BRect& rect,
11002f86ba45SStephan Aßmus 	const BRect& updateRect, const rgb_color& base, uint32 flags,
11012f86ba45SStephan Aßmus 	enum orientation orientation)
11022f86ba45SStephan Aßmus {
11038ee9217eSStephan Aßmus 	DrawSliderTriangle(view, rect, updateRect, base, base, flags, orientation);
11048ee9217eSStephan Aßmus }
11058ee9217eSStephan Aßmus 
11068ee9217eSStephan Aßmus 
11078ee9217eSStephan Aßmus void
11088ee9217eSStephan Aßmus BControlLook::DrawSliderTriangle(BView* view, BRect& rect,
11098ee9217eSStephan Aßmus 	const BRect& updateRect, const rgb_color& base, const rgb_color& fill,
11108ee9217eSStephan Aßmus 	uint32 flags, enum orientation orientation)
11118ee9217eSStephan Aßmus {
11122f86ba45SStephan Aßmus 	if (!rect.IsValid() || !rect.Intersects(updateRect))
11132f86ba45SStephan Aßmus 		return;
11142f86ba45SStephan Aßmus 
11152f86ba45SStephan Aßmus 	// figure out frame color
11162f86ba45SStephan Aßmus 	rgb_color frameLightColor;
11172f86ba45SStephan Aßmus 	rgb_color frameShadowColor;
11182f86ba45SStephan Aßmus 	rgb_color shadowColor = (rgb_color){ 0, 0, 0, 60 };
11192f86ba45SStephan Aßmus 
11202f86ba45SStephan Aßmus 	float topTint = 0.49;
11212f86ba45SStephan Aßmus 	float middleTint1 = 0.62;
11222f86ba45SStephan Aßmus 	float middleTint2 = 0.76;
11232f86ba45SStephan Aßmus 	float bottomTint = 0.90;
11242f86ba45SStephan Aßmus 
11252f86ba45SStephan Aßmus 	if (flags & B_DISABLED) {
11262f86ba45SStephan Aßmus 		topTint = (topTint + B_NO_TINT) / 2;
11272f86ba45SStephan Aßmus 		middleTint1 = (middleTint1 + B_NO_TINT) / 2;
11282f86ba45SStephan Aßmus 		middleTint2 = (middleTint2 + B_NO_TINT) / 2;
11292f86ba45SStephan Aßmus 		bottomTint = (bottomTint + B_NO_TINT) / 2;
11302f86ba45SStephan Aßmus 	} else if (flags & B_HOVER) {
11312f86ba45SStephan Aßmus 		static const float kHoverTintFactor = 0.85;
11322f86ba45SStephan Aßmus 		topTint *= kHoverTintFactor;
11332f86ba45SStephan Aßmus 		middleTint1 *= kHoverTintFactor;
11342f86ba45SStephan Aßmus 		middleTint2 *= kHoverTintFactor;
11352f86ba45SStephan Aßmus 		bottomTint *= kHoverTintFactor;
11362f86ba45SStephan Aßmus 	}
11372f86ba45SStephan Aßmus 
11382f86ba45SStephan Aßmus 	if (flags & B_FOCUSED) {
11392f86ba45SStephan Aßmus 		// focused
11402f86ba45SStephan Aßmus 		frameLightColor = ui_color(B_KEYBOARD_NAVIGATION_COLOR);
11412f86ba45SStephan Aßmus 		frameShadowColor = frameLightColor;
11422f86ba45SStephan Aßmus 	} else {
11432f86ba45SStephan Aßmus 		// figure out the tints to be used
11442f86ba45SStephan Aßmus 		float frameLightTint;
11452f86ba45SStephan Aßmus 		float frameShadowTint;
11462f86ba45SStephan Aßmus 
11472f86ba45SStephan Aßmus 		if (flags & B_DISABLED) {
11482f86ba45SStephan Aßmus 			frameLightTint = 1.30;
11492f86ba45SStephan Aßmus 			frameShadowTint = 1.35;
11502f86ba45SStephan Aßmus 			shadowColor.alpha = 30;
11512f86ba45SStephan Aßmus 		} else {
11522f86ba45SStephan Aßmus 			frameLightTint = 1.6;
11532f86ba45SStephan Aßmus 			frameShadowTint = 1.65;
11542f86ba45SStephan Aßmus 		}
11552f86ba45SStephan Aßmus 
11562f86ba45SStephan Aßmus 		frameLightColor = tint_color(base, frameLightTint);
11572f86ba45SStephan Aßmus 		frameShadowColor = tint_color(base, frameShadowTint);
11582f86ba45SStephan Aßmus 	}
11592f86ba45SStephan Aßmus 
11608ee9217eSStephan Aßmus 	// make room for the shadow
11618ee9217eSStephan Aßmus 	rect.right--;
11628ee9217eSStephan Aßmus 	rect.bottom--;
11632f86ba45SStephan Aßmus 
11642f86ba45SStephan Aßmus 	uint32 viewFlags = view->Flags();
11652f86ba45SStephan Aßmus 	view->SetFlags(viewFlags | B_SUBPIXEL_PRECISE);
11662f86ba45SStephan Aßmus 	view->SetLineMode(B_ROUND_CAP, B_ROUND_JOIN);
11672f86ba45SStephan Aßmus 
11688ee9217eSStephan Aßmus 	float center = (rect.left + rect.right) / 2;
11692f86ba45SStephan Aßmus 
11708ee9217eSStephan Aßmus 	BShape shape;
11718ee9217eSStephan Aßmus 	shape.MoveTo(BPoint(rect.left + 0.5, rect.bottom + 0.5));
11728ee9217eSStephan Aßmus 	shape.LineTo(BPoint(rect.right + 0.5, rect.bottom + 0.5));
11738ee9217eSStephan Aßmus 	shape.LineTo(BPoint(rect.right + 0.5, rect.bottom - 1 + 0.5));
11748ee9217eSStephan Aßmus 	shape.LineTo(BPoint(center + 0.5, rect.top + 0.5));
11758ee9217eSStephan Aßmus 	shape.LineTo(BPoint(rect.left + 0.5, rect.bottom - 1 + 0.5));
11768ee9217eSStephan Aßmus 	shape.Close();
11778ee9217eSStephan Aßmus 
11788ee9217eSStephan Aßmus 	view->MovePenTo(BPoint(1, 1));
11798ee9217eSStephan Aßmus 
11808ee9217eSStephan Aßmus 	view->SetDrawingMode(B_OP_ALPHA);
11818ee9217eSStephan Aßmus 	view->SetHighColor(shadowColor);
11828ee9217eSStephan Aßmus 	view->StrokeShape(&shape);
11838ee9217eSStephan Aßmus 
11848ee9217eSStephan Aßmus 	view->MovePenTo(B_ORIGIN);
11858ee9217eSStephan Aßmus 
11868ee9217eSStephan Aßmus 	view->SetDrawingMode(B_OP_COPY);
11872f86ba45SStephan Aßmus 	view->SetHighColor(frameLightColor);
11888ee9217eSStephan Aßmus 	view->StrokeShape(&shape);
11892f86ba45SStephan Aßmus 
11902f86ba45SStephan Aßmus 	rect.InsetBy(1, 1);
11918ee9217eSStephan Aßmus 	shape.Clear();
11928ee9217eSStephan Aßmus 	shape.MoveTo(BPoint(rect.left, rect.bottom + 1));
11938ee9217eSStephan Aßmus 	shape.LineTo(BPoint(rect.right + 1, rect.bottom + 1));
11948ee9217eSStephan Aßmus 	shape.LineTo(BPoint(center + 0.5, rect.top));
11958ee9217eSStephan Aßmus 	shape.Close();
11962f86ba45SStephan Aßmus 
11972f86ba45SStephan Aßmus 	BGradientLinear gradient;
11982f86ba45SStephan Aßmus 	if (flags & B_DISABLED) {
11998ee9217eSStephan Aßmus 		_MakeGradient(gradient, rect, fill, topTint, bottomTint);
12002f86ba45SStephan Aßmus 	} else {
12018ee9217eSStephan Aßmus 		_MakeGlossyGradient(gradient, rect, fill, topTint, middleTint1,
12022f86ba45SStephan Aßmus 			middleTint2, bottomTint);
12032f86ba45SStephan Aßmus 	}
12042f86ba45SStephan Aßmus 
12058ee9217eSStephan Aßmus 	view->FillShape(&shape, gradient);
12062f86ba45SStephan Aßmus 
12072f86ba45SStephan Aßmus 	view->SetFlags(viewFlags);
12082f86ba45SStephan Aßmus }
12092f86ba45SStephan Aßmus 
12102f86ba45SStephan Aßmus 
12112f86ba45SStephan Aßmus void
12122f86ba45SStephan Aßmus BControlLook::DrawSliderHashMarks(BView* view, BRect& rect,
12132f86ba45SStephan Aßmus 	const BRect& updateRect, const rgb_color& base, int32 count,
12142f86ba45SStephan Aßmus 	hash_mark_location location, uint32 flags, enum orientation orientation)
12152f86ba45SStephan Aßmus {
12162f86ba45SStephan Aßmus 	if (!rect.IsValid() || !rect.Intersects(updateRect))
12172f86ba45SStephan Aßmus 		return;
12182f86ba45SStephan Aßmus 
12192f86ba45SStephan Aßmus 	rgb_color lightColor;
12202f86ba45SStephan Aßmus 	rgb_color darkColor;
12212f86ba45SStephan Aßmus 
12222f86ba45SStephan Aßmus 	if (flags & B_DISABLED) {
12232f86ba45SStephan Aßmus 		lightColor = tint_color(base, 0.9);
12242f86ba45SStephan Aßmus 		darkColor = tint_color(base, 1.07);
12252f86ba45SStephan Aßmus 	} else {
12262f86ba45SStephan Aßmus 		lightColor = tint_color(base, 0.8);
12272f86ba45SStephan Aßmus 		darkColor = tint_color(base, 1.14);
12282f86ba45SStephan Aßmus 	}
12292f86ba45SStephan Aßmus 
12302f86ba45SStephan Aßmus 	int32 hashMarkCount = max_c(count, 2);
12312f86ba45SStephan Aßmus 		// draw at least two hashmarks at min/max if
12322f86ba45SStephan Aßmus 		// fHashMarks != B_HASH_MARKS_NONE
12332f86ba45SStephan Aßmus 	float factor;
12342f86ba45SStephan Aßmus 	float startPos;
12352f86ba45SStephan Aßmus 	if (orientation == B_HORIZONTAL) {
12362f86ba45SStephan Aßmus 		factor = (rect.Width() - 2) / (hashMarkCount - 1);
12372f86ba45SStephan Aßmus 		startPos = rect.left + 1;
12382f86ba45SStephan Aßmus 	} else {
12392f86ba45SStephan Aßmus 		factor = (rect.Height() - 2) / (hashMarkCount - 1);
12402f86ba45SStephan Aßmus 		startPos = rect.top + 1;
12412f86ba45SStephan Aßmus 	}
12422f86ba45SStephan Aßmus 
12432f86ba45SStephan Aßmus 	if (location & B_HASH_MARKS_TOP) {
12442f86ba45SStephan Aßmus 		view->BeginLineArray(hashMarkCount * 2);
12452f86ba45SStephan Aßmus 
12462f86ba45SStephan Aßmus 		if (orientation == B_HORIZONTAL) {
12472f86ba45SStephan Aßmus 			float pos = startPos;
12482f86ba45SStephan Aßmus 			for (int32 i = 0; i < hashMarkCount; i++) {
12492f86ba45SStephan Aßmus 				view->AddLine(BPoint(pos, rect.top),
12502f86ba45SStephan Aßmus 							  BPoint(pos, rect.top + 4), darkColor);
12512f86ba45SStephan Aßmus 				view->AddLine(BPoint(pos + 1, rect.top),
12522f86ba45SStephan Aßmus 							  BPoint(pos + 1, rect.top + 4), lightColor);
12532f86ba45SStephan Aßmus 
12542f86ba45SStephan Aßmus 				pos += factor;
12552f86ba45SStephan Aßmus 			}
12562f86ba45SStephan Aßmus 		} else {
12572f86ba45SStephan Aßmus 			float pos = startPos;
12582f86ba45SStephan Aßmus 			for (int32 i = 0; i < hashMarkCount; i++) {
12592f86ba45SStephan Aßmus 				view->AddLine(BPoint(rect.left, pos),
12602f86ba45SStephan Aßmus 							  BPoint(rect.left + 4, pos), darkColor);
12612f86ba45SStephan Aßmus 				view->AddLine(BPoint(rect.left, pos + 1),
12622f86ba45SStephan Aßmus 							  BPoint(rect.left + 4, pos + 1), lightColor);
12632f86ba45SStephan Aßmus 
12642f86ba45SStephan Aßmus 				pos += factor;
12652f86ba45SStephan Aßmus 			}
12662f86ba45SStephan Aßmus 		}
12672f86ba45SStephan Aßmus 
12682f86ba45SStephan Aßmus 		view->EndLineArray();
12692f86ba45SStephan Aßmus 	}
12702f86ba45SStephan Aßmus 
12712f86ba45SStephan Aßmus 	if (location & B_HASH_MARKS_BOTTOM) {
12722f86ba45SStephan Aßmus 
12732f86ba45SStephan Aßmus 		view->BeginLineArray(hashMarkCount * 2);
12742f86ba45SStephan Aßmus 
12752f86ba45SStephan Aßmus 		if (orientation == B_HORIZONTAL) {
12762f86ba45SStephan Aßmus 			float pos = startPos;
12772f86ba45SStephan Aßmus 			for (int32 i = 0; i < hashMarkCount; i++) {
12782f86ba45SStephan Aßmus 				view->AddLine(BPoint(pos, rect.bottom - 4),
12792f86ba45SStephan Aßmus 							  BPoint(pos, rect.bottom), darkColor);
12802f86ba45SStephan Aßmus 				view->AddLine(BPoint(pos + 1, rect.bottom - 4),
12812f86ba45SStephan Aßmus 							  BPoint(pos + 1, rect.bottom), lightColor);
12822f86ba45SStephan Aßmus 
12832f86ba45SStephan Aßmus 				pos += factor;
12842f86ba45SStephan Aßmus 			}
12852f86ba45SStephan Aßmus 		} else {
12862f86ba45SStephan Aßmus 			float pos = startPos;
12872f86ba45SStephan Aßmus 			for (int32 i = 0; i < hashMarkCount; i++) {
12882f86ba45SStephan Aßmus 				view->AddLine(BPoint(rect.right - 4, pos),
12892f86ba45SStephan Aßmus 							  BPoint(rect.right, pos), darkColor);
12902f86ba45SStephan Aßmus 				view->AddLine(BPoint(rect.right - 4, pos + 1),
12912f86ba45SStephan Aßmus 							  BPoint(rect.right, pos + 1), lightColor);
12922f86ba45SStephan Aßmus 
12932f86ba45SStephan Aßmus 				pos += factor;
12942f86ba45SStephan Aßmus 			}
12952f86ba45SStephan Aßmus 		}
12962f86ba45SStephan Aßmus 
12972f86ba45SStephan Aßmus 		view->EndLineArray();
12982f86ba45SStephan Aßmus 	}
12992f86ba45SStephan Aßmus }
13002f86ba45SStephan Aßmus 
13012f86ba45SStephan Aßmus 
13022f86ba45SStephan Aßmus void
13032f86ba45SStephan Aßmus BControlLook::DrawActiveTab(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);
13332f86ba45SStephan Aßmus 		bevelShadowColor = tint_color(base, 1.07);
13342f86ba45SStephan Aßmus 		bevelLightColor = tint_color(base, 0.6);
13352f86ba45SStephan Aßmus 		fillGradient.AddColor(tint_color(base, 0.75), 0);
13362f86ba45SStephan Aßmus 		fillGradient.AddColor(tint_color(base, 1.03), 255);
13372f86ba45SStephan Aßmus 	}
133812ea5a2cSStephan Aßmus 
13392f86ba45SStephan Aßmus 	static const float kRoundCornerRadius = 4;
13402f86ba45SStephan Aßmus 
13412f86ba45SStephan Aßmus 	// left/top corner
13422f86ba45SStephan Aßmus 	BRect cornerRect(rect);
13432f86ba45SStephan Aßmus 	cornerRect.right = cornerRect.left + kRoundCornerRadius;
13442f86ba45SStephan Aßmus 	cornerRect.bottom = cornerRect.top + kRoundCornerRadius;
13452f86ba45SStephan Aßmus 
13462f86ba45SStephan Aßmus 	BRegion clipping(rect);
13472f86ba45SStephan Aßmus 	clipping.Exclude(cornerRect);
13482f86ba45SStephan Aßmus 
13492f86ba45SStephan Aßmus 	_DrawRoundCornerLeftTop(view, cornerRect, updateRect, base, edgeShadowColor,
13502f86ba45SStephan Aßmus 		frameLightColor, bevelLightColor, fillGradient);
13512f86ba45SStephan Aßmus 
13522f86ba45SStephan Aßmus 	// left/top corner
13532f86ba45SStephan Aßmus 	cornerRect.right = rect.right;
13542f86ba45SStephan Aßmus 	cornerRect.left = cornerRect.right - kRoundCornerRadius;
13552f86ba45SStephan Aßmus 
13562f86ba45SStephan Aßmus 	clipping.Exclude(cornerRect);
13572f86ba45SStephan Aßmus 
13582f86ba45SStephan Aßmus 	_DrawRoundCornerRightTop(view, cornerRect, updateRect, base, edgeShadowColor,
13592f86ba45SStephan Aßmus 		edgeLightColor, frameLightColor, frameShadowColor, bevelLightColor,
13602f86ba45SStephan Aßmus 		bevelShadowColor, fillGradient);
13612f86ba45SStephan Aßmus 
13622f86ba45SStephan Aßmus 	// rest of frame and fill
13632f86ba45SStephan Aßmus 	view->ConstrainClippingRegion(&clipping);
13642f86ba45SStephan Aßmus 
13652f86ba45SStephan Aßmus 	_DrawFrame(view, rect, edgeShadowColor, edgeShadowColor, edgeLightColor,
13662f86ba45SStephan Aßmus 		edgeLightColor,
13672f86ba45SStephan Aßmus 		borders & (B_LEFT_BORDER | B_TOP_BORDER | B_RIGHT_BORDER));
13682f86ba45SStephan Aßmus 	if ((borders & B_LEFT_BORDER) == 0)
13692f86ba45SStephan Aßmus 		rect.left++;
13702f86ba45SStephan Aßmus 	if ((borders & B_RIGHT_BORDER) == 0)
13712f86ba45SStephan Aßmus 		rect.right--;
13722f86ba45SStephan Aßmus 
13732f86ba45SStephan Aßmus 	_DrawFrame(view, rect, frameLightColor, frameLightColor, frameShadowColor,
13742f86ba45SStephan Aßmus 		frameShadowColor, B_LEFT_BORDER | B_TOP_BORDER | B_RIGHT_BORDER);
13752f86ba45SStephan Aßmus 
13762f86ba45SStephan Aßmus 	_DrawFrame(view, rect, bevelLightColor, bevelLightColor, bevelShadowColor,
13772f86ba45SStephan Aßmus 		bevelShadowColor);
13782f86ba45SStephan Aßmus 
13792f86ba45SStephan Aßmus 	view->FillRect(rect, fillGradient);
13802f86ba45SStephan Aßmus 
13812f86ba45SStephan Aßmus 	view->ConstrainClippingRegion(NULL);
13822f86ba45SStephan Aßmus }
13832f86ba45SStephan Aßmus 
13842f86ba45SStephan Aßmus 
13852f86ba45SStephan Aßmus void
138683aff015SPhilippe Houdoin BControlLook::DrawInactiveTab(BView* view, BRect& rect, const BRect& updateRect,
13872f86ba45SStephan Aßmus 	const rgb_color& base, uint32 flags, uint32 borders)
13882f86ba45SStephan Aßmus {
13892f86ba45SStephan Aßmus 	if (!rect.IsValid() || !rect.Intersects(updateRect))
13902f86ba45SStephan Aßmus 		return;
13912f86ba45SStephan Aßmus 
13922f86ba45SStephan Aßmus 	rgb_color edgeShadowColor;
13932f86ba45SStephan Aßmus 	rgb_color edgeLightColor;
13942f86ba45SStephan Aßmus 	rgb_color frameShadowColor;
13952f86ba45SStephan Aßmus 	rgb_color frameLightColor;
13962f86ba45SStephan Aßmus 	rgb_color bevelShadowColor;
13972f86ba45SStephan Aßmus 	rgb_color bevelLightColor;
13982f86ba45SStephan Aßmus 	BGradientLinear fillGradient;
13992f86ba45SStephan Aßmus 	fillGradient.SetStart(rect.LeftTop() + BPoint(3, 3));
14002f86ba45SStephan Aßmus 	fillGradient.SetEnd(rect.LeftBottom() + BPoint(3, -3));
14012f86ba45SStephan Aßmus 
14022f86ba45SStephan Aßmus 	if (flags & B_DISABLED) {
14032f86ba45SStephan Aßmus 		edgeShadowColor = base;
14042f86ba45SStephan Aßmus 		edgeLightColor = base;
14052f86ba45SStephan Aßmus 		frameShadowColor = tint_color(base, 1.30);
14062f86ba45SStephan Aßmus 		frameLightColor = tint_color(base, 1.25);
14072f86ba45SStephan Aßmus 		bevelShadowColor = tint_color(base, 1.07);
14082f86ba45SStephan Aßmus 		bevelLightColor = tint_color(base, 0.8);
14092f86ba45SStephan Aßmus 		fillGradient.AddColor(tint_color(base, 0.85), 0);
14102f86ba45SStephan Aßmus 		fillGradient.AddColor(base, 255);
14112f86ba45SStephan Aßmus 	} else {
14122f86ba45SStephan Aßmus 		edgeShadowColor = tint_color(base, 1.03);
14132f86ba45SStephan Aßmus 		edgeLightColor = tint_color(base, 0.80);
14142f86ba45SStephan Aßmus 		frameShadowColor = tint_color(base, 1.30);
14152f86ba45SStephan Aßmus 		frameLightColor = tint_color(base, 1.30);
141612ea5a2cSStephan Aßmus 		bevelShadowColor = tint_color(base, 1.17);
14172f86ba45SStephan Aßmus 		bevelLightColor = tint_color(base, 1.10);
14182f86ba45SStephan Aßmus 		fillGradient.AddColor(tint_color(base, 1.12), 0);
14192f86ba45SStephan Aßmus 		fillGradient.AddColor(tint_color(base, 1.08), 255);
14202f86ba45SStephan Aßmus 	}
14212f86ba45SStephan Aßmus 
14222f86ba45SStephan Aßmus 	// active tabs stand out at the top, but this is an inactive tab
14232f86ba45SStephan Aßmus 	view->SetHighColor(base);
14242f86ba45SStephan Aßmus 	view->FillRect(BRect(rect.left, rect.top, rect.right, rect.top + 4));
14252f86ba45SStephan Aßmus 	rect.top += 4;
14262f86ba45SStephan Aßmus 
14272f86ba45SStephan Aßmus 	// frame and fill
14282f86ba45SStephan Aßmus 	_DrawFrame(view, rect, edgeShadowColor, edgeShadowColor, edgeLightColor,
14292f86ba45SStephan Aßmus 		edgeLightColor,
14302f86ba45SStephan Aßmus 		borders & (B_LEFT_BORDER | B_TOP_BORDER | B_RIGHT_BORDER));
14312f86ba45SStephan Aßmus 
14322f86ba45SStephan Aßmus 	_DrawFrame(view, rect, frameLightColor, frameLightColor, frameShadowColor,
14332f86ba45SStephan Aßmus 		frameShadowColor,
14342f86ba45SStephan Aßmus 		borders & (B_LEFT_BORDER | B_TOP_BORDER | B_RIGHT_BORDER));
14352f86ba45SStephan Aßmus 
143612ea5a2cSStephan Aßmus 	_DrawFrame(view, rect, bevelShadowColor, bevelShadowColor, bevelLightColor,
143712ea5a2cSStephan Aßmus 		bevelLightColor, B_LEFT_BORDER & ~borders);
14382f86ba45SStephan Aßmus 
14392f86ba45SStephan Aßmus 	view->FillRect(rect, fillGradient);
14402f86ba45SStephan Aßmus }
14412f86ba45SStephan Aßmus 
14422f86ba45SStephan Aßmus 
1443*1f9fd6d8SStephan Aßmus void
1444*1f9fd6d8SStephan Aßmus BControlLook::DrawSplitter(BView* view, BRect& rect, const BRect& updateRect,
1445*1f9fd6d8SStephan Aßmus 	const rgb_color& base, enum orientation orientation, uint32 flags,
1446*1f9fd6d8SStephan Aßmus 	uint32 borders)
1447*1f9fd6d8SStephan Aßmus {
1448*1f9fd6d8SStephan Aßmus 	rgb_color background;
1449*1f9fd6d8SStephan Aßmus 	if ((flags & (B_CLICKED | B_ACTIVATED)) != 0)
1450*1f9fd6d8SStephan Aßmus 		background = tint_color(base, B_DARKEN_1_TINT);
1451*1f9fd6d8SStephan Aßmus 	else
1452*1f9fd6d8SStephan Aßmus 		background = base;
1453*1f9fd6d8SStephan Aßmus 
1454*1f9fd6d8SStephan Aßmus 	rgb_color light = tint_color(background, 0.6);
1455*1f9fd6d8SStephan Aßmus 	rgb_color shadow = tint_color(background, 1.21);
1456*1f9fd6d8SStephan Aßmus 
1457*1f9fd6d8SStephan Aßmus 	// frame
1458*1f9fd6d8SStephan Aßmus 	if (borders != 0 && rect.Width() > 3 && rect.Height() > 3)
1459*1f9fd6d8SStephan Aßmus 		DrawRaisedBorder(view, rect, updateRect, background, flags, borders);
1460*1f9fd6d8SStephan Aßmus 
1461*1f9fd6d8SStephan Aßmus 	// dots and rest of background
1462*1f9fd6d8SStephan Aßmus 	if (orientation == B_HORIZONTAL) {
1463*1f9fd6d8SStephan Aßmus 		if (rect.Width() > 2) {
1464*1f9fd6d8SStephan Aßmus 			// background on left/right
1465*1f9fd6d8SStephan Aßmus 			BRegion region(rect);
1466*1f9fd6d8SStephan Aßmus 			rect.left = floorf((rect.left + rect.right) / 2.0 - 0.5);
1467*1f9fd6d8SStephan Aßmus 			rect.right = rect.left + 1;
1468*1f9fd6d8SStephan Aßmus 			region.Exclude(rect);
1469*1f9fd6d8SStephan Aßmus 			view->SetHighColor(background);
1470*1f9fd6d8SStephan Aßmus 			view->FillRegion(&region);
1471*1f9fd6d8SStephan Aßmus 		}
1472*1f9fd6d8SStephan Aßmus 
1473*1f9fd6d8SStephan Aßmus 		BPoint dot = rect.LeftTop();
1474*1f9fd6d8SStephan Aßmus 		BPoint stop = rect.LeftBottom();
1475*1f9fd6d8SStephan Aßmus 		int32 num = 1;
1476*1f9fd6d8SStephan Aßmus 		while (dot.y <= stop.y) {
1477*1f9fd6d8SStephan Aßmus 			rgb_color col1;
1478*1f9fd6d8SStephan Aßmus 			rgb_color col2;
1479*1f9fd6d8SStephan Aßmus 			switch (num) {
1480*1f9fd6d8SStephan Aßmus 				case 1:
1481*1f9fd6d8SStephan Aßmus 					col1 = background;
1482*1f9fd6d8SStephan Aßmus 					col2 = background;
1483*1f9fd6d8SStephan Aßmus 					break;
1484*1f9fd6d8SStephan Aßmus 				case 2:
1485*1f9fd6d8SStephan Aßmus 					col1 = shadow;
1486*1f9fd6d8SStephan Aßmus 					col2 = background;
1487*1f9fd6d8SStephan Aßmus 					break;
1488*1f9fd6d8SStephan Aßmus 				case 3:
1489*1f9fd6d8SStephan Aßmus 					col1 = background;
1490*1f9fd6d8SStephan Aßmus 					col2 = light;
1491*1f9fd6d8SStephan Aßmus 					num = 0;
1492*1f9fd6d8SStephan Aßmus 					break;
1493*1f9fd6d8SStephan Aßmus 			}
1494*1f9fd6d8SStephan Aßmus 			view->SetHighColor(col1);
1495*1f9fd6d8SStephan Aßmus 			view->StrokeLine(dot, dot, B_SOLID_HIGH);
1496*1f9fd6d8SStephan Aßmus 			view->SetHighColor(col2);
1497*1f9fd6d8SStephan Aßmus 			dot.x++;
1498*1f9fd6d8SStephan Aßmus 			view->StrokeLine(dot, dot, B_SOLID_HIGH);
1499*1f9fd6d8SStephan Aßmus 			dot.x -= 1.0;
1500*1f9fd6d8SStephan Aßmus 			// next pixel
1501*1f9fd6d8SStephan Aßmus 			num++;
1502*1f9fd6d8SStephan Aßmus 			dot.y++;
1503*1f9fd6d8SStephan Aßmus 		}
1504*1f9fd6d8SStephan Aßmus 	} else {
1505*1f9fd6d8SStephan Aßmus 		if (rect.Height() > 2) {
1506*1f9fd6d8SStephan Aßmus 			// background on left/right
1507*1f9fd6d8SStephan Aßmus 			BRegion region(rect);
1508*1f9fd6d8SStephan Aßmus 			rect.top = floorf((rect.top + rect.bottom) / 2.0 - 0.5);
1509*1f9fd6d8SStephan Aßmus 			rect.bottom = rect.top + 1;
1510*1f9fd6d8SStephan Aßmus 			region.Exclude(rect);
1511*1f9fd6d8SStephan Aßmus 			view->SetHighColor(background);
1512*1f9fd6d8SStephan Aßmus 			view->FillRegion(&region);
1513*1f9fd6d8SStephan Aßmus 		}
1514*1f9fd6d8SStephan Aßmus 
1515*1f9fd6d8SStephan Aßmus 		BPoint dot = rect.LeftTop();
1516*1f9fd6d8SStephan Aßmus 		BPoint stop = rect.RightTop();
1517*1f9fd6d8SStephan Aßmus 		int32 num = 1;
1518*1f9fd6d8SStephan Aßmus 		while (dot.x <= stop.x) {
1519*1f9fd6d8SStephan Aßmus 			rgb_color col1;
1520*1f9fd6d8SStephan Aßmus 			rgb_color col2;
1521*1f9fd6d8SStephan Aßmus 			switch (num) {
1522*1f9fd6d8SStephan Aßmus 				case 1:
1523*1f9fd6d8SStephan Aßmus 					col1 = background;
1524*1f9fd6d8SStephan Aßmus 					col2 = background;
1525*1f9fd6d8SStephan Aßmus 					break;
1526*1f9fd6d8SStephan Aßmus 				case 2:
1527*1f9fd6d8SStephan Aßmus 					col1 = shadow;
1528*1f9fd6d8SStephan Aßmus 					col2 = background;
1529*1f9fd6d8SStephan Aßmus 					break;
1530*1f9fd6d8SStephan Aßmus 				case 3:
1531*1f9fd6d8SStephan Aßmus 					col1 = background;
1532*1f9fd6d8SStephan Aßmus 					col2 = light;
1533*1f9fd6d8SStephan Aßmus 					num = 0;
1534*1f9fd6d8SStephan Aßmus 					break;
1535*1f9fd6d8SStephan Aßmus 			}
1536*1f9fd6d8SStephan Aßmus 			view->SetHighColor(col1);
1537*1f9fd6d8SStephan Aßmus 			view->StrokeLine(dot, dot, B_SOLID_HIGH);
1538*1f9fd6d8SStephan Aßmus 			view->SetHighColor(col2);
1539*1f9fd6d8SStephan Aßmus 			dot.y++;
1540*1f9fd6d8SStephan Aßmus 			view->StrokeLine(dot, dot, B_SOLID_HIGH);
1541*1f9fd6d8SStephan Aßmus 			dot.y -= 1.0;
1542*1f9fd6d8SStephan Aßmus 			// next pixel
1543*1f9fd6d8SStephan Aßmus 			num++;
1544*1f9fd6d8SStephan Aßmus 			dot.x++;
1545*1f9fd6d8SStephan Aßmus 		}
1546*1f9fd6d8SStephan Aßmus 	}
1547*1f9fd6d8SStephan Aßmus }
1548*1f9fd6d8SStephan Aßmus 
1549*1f9fd6d8SStephan Aßmus 
15502f86ba45SStephan Aßmus // #pragma mark -
15512f86ba45SStephan Aßmus 
15522f86ba45SStephan Aßmus 
15532f86ba45SStephan Aßmus void
15542f86ba45SStephan Aßmus BControlLook::DrawBorder(BView* view, BRect& rect, const BRect& updateRect,
15552f86ba45SStephan Aßmus 	const rgb_color& base, border_style border, uint32 flags, uint32 borders)
15562f86ba45SStephan Aßmus {
15572f86ba45SStephan Aßmus 	if (border == B_NO_BORDER)
15582f86ba45SStephan Aßmus 		return;
15592f86ba45SStephan Aßmus 
15602f86ba45SStephan Aßmus 	rgb_color scrollbarFrameColor = tint_color(base, B_DARKEN_2_TINT);
15612f86ba45SStephan Aßmus 	if (flags & B_FOCUSED)
15622f86ba45SStephan Aßmus 		scrollbarFrameColor = ui_color(B_KEYBOARD_NAVIGATION_COLOR);
15632f86ba45SStephan Aßmus 
15642f86ba45SStephan Aßmus 	if (border == B_FANCY_BORDER)
15654f579098SStephan Aßmus 		_DrawOuterResessedFrame(view, rect, base, 1.0, 1.0, flags, borders);
15662f86ba45SStephan Aßmus 
15672f86ba45SStephan Aßmus 	_DrawFrame(view, rect, scrollbarFrameColor, scrollbarFrameColor,
15682f86ba45SStephan Aßmus 		scrollbarFrameColor, scrollbarFrameColor, borders);
15692f86ba45SStephan Aßmus }
15702f86ba45SStephan Aßmus 
15712f86ba45SStephan Aßmus 
15722f86ba45SStephan Aßmus void
15732f86ba45SStephan Aßmus BControlLook::DrawRaisedBorder(BView* view, BRect& rect,
15742f86ba45SStephan Aßmus 	const BRect& updateRect, const rgb_color& base, uint32 flags,
15752f86ba45SStephan Aßmus 	uint32 borders)
15762f86ba45SStephan Aßmus {
15772f86ba45SStephan Aßmus 	rgb_color lightColor;
15782f86ba45SStephan Aßmus 	rgb_color shadowColor;
15792f86ba45SStephan Aßmus 
15802f86ba45SStephan Aßmus 	if (flags & B_DISABLED) {
15812f86ba45SStephan Aßmus 		lightColor = base;
15822f86ba45SStephan Aßmus 		shadowColor = base;
15832f86ba45SStephan Aßmus 	} else {
15842f86ba45SStephan Aßmus 		lightColor = tint_color(base, 0.85);
15852f86ba45SStephan Aßmus 		shadowColor = tint_color(base, 1.07);
15862f86ba45SStephan Aßmus 	}
15872f86ba45SStephan Aßmus 
15882f86ba45SStephan Aßmus 	_DrawFrame(view, rect, lightColor, lightColor, shadowColor, shadowColor,
15892f86ba45SStephan Aßmus 		borders);
15902f86ba45SStephan Aßmus }
15912f86ba45SStephan Aßmus 
15922f86ba45SStephan Aßmus 
15932f86ba45SStephan Aßmus void
15942f86ba45SStephan Aßmus BControlLook::DrawTextControlBorder(BView* view, BRect& rect,
15952f86ba45SStephan Aßmus 	const BRect& updateRect, const rgb_color& base, uint32 flags,
15962f86ba45SStephan Aßmus 	uint32 borders)
15972f86ba45SStephan Aßmus {
15982f86ba45SStephan Aßmus 	if (!rect.Intersects(updateRect))
15992f86ba45SStephan Aßmus 		return;
16002f86ba45SStephan Aßmus 
16012f86ba45SStephan Aßmus 	rgb_color dark1BorderColor;
16022f86ba45SStephan Aßmus 	rgb_color dark2BorderColor;
16032f86ba45SStephan Aßmus 	rgb_color navigationColor = ui_color(B_KEYBOARD_NAVIGATION_COLOR);
16042f86ba45SStephan Aßmus 
16052f86ba45SStephan Aßmus 	if (flags & B_DISABLED) {
16064f579098SStephan Aßmus 		_DrawOuterResessedFrame(view, rect, base, 0.0, 1.0, flags, borders);
16072f86ba45SStephan Aßmus 
16084f579098SStephan Aßmus 		if (flags & B_BLEND_FRAME)
16094f579098SStephan Aßmus 			dark1BorderColor = (rgb_color){ 0, 0, 0, 40 };
16104f579098SStephan Aßmus 		else
16112f86ba45SStephan Aßmus 			dark1BorderColor = tint_color(base, 1.15);
16124f579098SStephan Aßmus 		dark2BorderColor = dark1BorderColor;
16132f86ba45SStephan Aßmus 	} else if (flags & B_CLICKED) {
16142f86ba45SStephan Aßmus 		dark1BorderColor = tint_color(base, 1.50);
16152f86ba45SStephan Aßmus 		dark2BorderColor = tint_color(base, 1.49);
16162f86ba45SStephan Aßmus 
16174f579098SStephan Aßmus 		// BCheckBox uses this to indicate the clicked state...
16182f86ba45SStephan Aßmus 		_DrawFrame(view, rect,
16192f86ba45SStephan Aßmus 			dark1BorderColor, dark1BorderColor,
16202f86ba45SStephan Aßmus 			dark2BorderColor, dark2BorderColor);
16212f86ba45SStephan Aßmus 
16222f86ba45SStephan Aßmus 		dark2BorderColor = dark1BorderColor;
16232f86ba45SStephan Aßmus 	} else {
16244f579098SStephan Aßmus 		_DrawOuterResessedFrame(view, rect, base, 0.6, 1.0, flags, borders);
16252f86ba45SStephan Aßmus 
16264f579098SStephan Aßmus 		if (flags & B_BLEND_FRAME) {
16274f579098SStephan Aßmus 			dark1BorderColor = (rgb_color){ 0, 0, 0, 102 };
16284f579098SStephan Aßmus 			dark2BorderColor = (rgb_color){ 0, 0, 0, 97 };
16294f579098SStephan Aßmus 		} else {
16302f86ba45SStephan Aßmus 			dark1BorderColor = tint_color(base, 1.40);
16312f86ba45SStephan Aßmus 			dark2BorderColor = tint_color(base, 1.38);
16322f86ba45SStephan Aßmus 		}
16334f579098SStephan Aßmus 	}
16342f86ba45SStephan Aßmus 
16352f86ba45SStephan Aßmus 	if ((flags & B_DISABLED) == 0 && (flags & B_FOCUSED)) {
16362f86ba45SStephan Aßmus 		dark1BorderColor = navigationColor;
16372f86ba45SStephan Aßmus 		dark2BorderColor = navigationColor;
16382f86ba45SStephan Aßmus 	}
16392f86ba45SStephan Aßmus 
16404f579098SStephan Aßmus 	if (flags & B_BLEND_FRAME) {
16414f579098SStephan Aßmus 		drawing_mode oldMode = view->DrawingMode();
16424f579098SStephan Aßmus 		view->SetDrawingMode(B_OP_ALPHA);
16434f579098SStephan Aßmus 
16442f86ba45SStephan Aßmus 		_DrawFrame(view, rect,
16452f86ba45SStephan Aßmus 			dark1BorderColor, dark1BorderColor,
16462f86ba45SStephan Aßmus 			dark2BorderColor, dark2BorderColor, borders);
16474f579098SStephan Aßmus 
16484f579098SStephan Aßmus 		view->SetDrawingMode(oldMode);
16494f579098SStephan Aßmus 	} else {
16504f579098SStephan Aßmus 		_DrawFrame(view, rect,
16514f579098SStephan Aßmus 			dark1BorderColor, dark1BorderColor,
16524f579098SStephan Aßmus 			dark2BorderColor, dark2BorderColor, borders);
16534f579098SStephan Aßmus 	}
16542f86ba45SStephan Aßmus }
16552f86ba45SStephan Aßmus 
16562f86ba45SStephan Aßmus 
16572f86ba45SStephan Aßmus void
16582f86ba45SStephan Aßmus BControlLook::DrawGroupFrame(BView* view, BRect& rect, const BRect& updateRect,
16592f86ba45SStephan Aßmus 	const rgb_color& base, uint32 borders)
16602f86ba45SStephan Aßmus {
16612f86ba45SStephan Aßmus 	rgb_color frameColor = tint_color(base, 1.30);
16622f86ba45SStephan Aßmus 	rgb_color bevelLight = tint_color(base, 0.8);
16632f86ba45SStephan Aßmus 	rgb_color bevelShadow = tint_color(base, 1.03);
16642f86ba45SStephan Aßmus 
16652f86ba45SStephan Aßmus 	_DrawFrame(view, rect, bevelShadow, bevelShadow, bevelLight, bevelLight,
16662f86ba45SStephan Aßmus 		borders);
16672f86ba45SStephan Aßmus 
16682f86ba45SStephan Aßmus 	_DrawFrame(view, rect, frameColor, frameColor, frameColor, frameColor,
16692f86ba45SStephan Aßmus 		borders);
16702f86ba45SStephan Aßmus 
16712f86ba45SStephan Aßmus 	_DrawFrame(view, rect, bevelLight, bevelLight, bevelShadow, bevelShadow,
16722f86ba45SStephan Aßmus 		borders);
16732f86ba45SStephan Aßmus }
16742f86ba45SStephan Aßmus 
16752f86ba45SStephan Aßmus 
16762f86ba45SStephan Aßmus void
16772f86ba45SStephan Aßmus BControlLook::DrawLabel(BView* view, const char* label, BRect rect,
16782f86ba45SStephan Aßmus 	const BRect& updateRect, const rgb_color& base, uint32 flags)
16792f86ba45SStephan Aßmus {
16802f86ba45SStephan Aßmus 	DrawLabel(view, label, rect, updateRect, base, flags,
16812f86ba45SStephan Aßmus 		DefaultLabelAlignment());
16822f86ba45SStephan Aßmus }
16832f86ba45SStephan Aßmus 
16842f86ba45SStephan Aßmus 
16852f86ba45SStephan Aßmus void
16862f86ba45SStephan Aßmus BControlLook::DrawLabel(BView* view, const char* label, BRect rect,
16872f86ba45SStephan Aßmus 	const BRect& updateRect, const rgb_color& base, uint32 flags,
16882f86ba45SStephan Aßmus 	const BAlignment& alignment)
16892f86ba45SStephan Aßmus {
16902f86ba45SStephan Aßmus 	if (!rect.Intersects(updateRect))
16912f86ba45SStephan Aßmus 		return;
16922f86ba45SStephan Aßmus 
16932f86ba45SStephan Aßmus 	// setup the text color
16942f86ba45SStephan Aßmus 	rgb_color color;
16952f86ba45SStephan Aßmus 	if (base.red + base.green + base.blue > 128 * 3)
16962f86ba45SStephan Aßmus 		color = tint_color(base, B_DARKEN_MAX_TINT);
16972f86ba45SStephan Aßmus 	else
16982f86ba45SStephan Aßmus 		color = tint_color(base, B_LIGHTEN_MAX_TINT);
16992f86ba45SStephan Aßmus 
17002f86ba45SStephan Aßmus 	if (flags & B_DISABLED) {
17012f86ba45SStephan Aßmus 		color.red = (uint8)(((int32)base.red + color.red + 1) / 2);
17022f86ba45SStephan Aßmus 		color.green = (uint8)(((int32)base.green + color.green + 1) / 2);
17032f86ba45SStephan Aßmus 		color.blue = (uint8)(((int32)base.blue + color.blue + 1) / 2);
17042f86ba45SStephan Aßmus 	}
17052f86ba45SStephan Aßmus 
17062f86ba45SStephan Aßmus 	view->SetHighColor(color);
17072f86ba45SStephan Aßmus 	view->SetDrawingMode(B_OP_OVER);
17082f86ba45SStephan Aßmus 
17092f86ba45SStephan Aßmus 	// truncate the label if necessary and get the width and height
17102f86ba45SStephan Aßmus 	BString truncatedLabel(label);
17112f86ba45SStephan Aßmus 
17122f86ba45SStephan Aßmus 	BFont font;
17132f86ba45SStephan Aßmus 	view->GetFont(&font);
17142f86ba45SStephan Aßmus 
17152f86ba45SStephan Aßmus 	float width = rect.Width();
17162f86ba45SStephan Aßmus 	font.TruncateString(&truncatedLabel, B_TRUNCATE_END, width);
17172f86ba45SStephan Aßmus 	width = font.StringWidth(truncatedLabel.String());
17182f86ba45SStephan Aßmus 
17192f86ba45SStephan Aßmus 	font_height fontHeight;
17202f86ba45SStephan Aßmus 	font.GetHeight(&fontHeight);
17212f86ba45SStephan Aßmus 	float height = ceilf(fontHeight.ascent) + ceilf(fontHeight.descent);
17222f86ba45SStephan Aßmus 
17232f86ba45SStephan Aßmus 	// handle alignment
17242f86ba45SStephan Aßmus 	BPoint location;
17252f86ba45SStephan Aßmus 
17262f86ba45SStephan Aßmus 	switch (alignment.horizontal) {
17272f86ba45SStephan Aßmus 	default:
17282f86ba45SStephan Aßmus 		case B_ALIGN_LEFT:
17292f86ba45SStephan Aßmus 			location.x = rect.left;
17302f86ba45SStephan Aßmus 			break;
17312f86ba45SStephan Aßmus 		case B_ALIGN_RIGHT:
17322f86ba45SStephan Aßmus 			location.x = rect.right - width;
17332f86ba45SStephan Aßmus 			break;
17342f86ba45SStephan Aßmus 		case B_ALIGN_CENTER:
17352f86ba45SStephan Aßmus 			location.x = (rect.left + rect.right - width) / 2.0f;
17362f86ba45SStephan Aßmus 			break;
17372f86ba45SStephan Aßmus 	}
17382f86ba45SStephan Aßmus 
17392f86ba45SStephan Aßmus 	switch (alignment.vertical) {
17402f86ba45SStephan Aßmus 		case B_ALIGN_TOP:
17412f86ba45SStephan Aßmus 			location.y = rect.top + ceilf(fontHeight.ascent);
17422f86ba45SStephan Aßmus 			break;
17432f86ba45SStephan Aßmus 		default:
17442f86ba45SStephan Aßmus 		case B_ALIGN_MIDDLE:
17452f86ba45SStephan Aßmus 			location.y = floorf((rect.top + rect.bottom - height) / 2.0f + 0.5f)
17462f86ba45SStephan Aßmus 				+ ceilf(fontHeight.ascent);
17472f86ba45SStephan Aßmus 			break;
17482f86ba45SStephan Aßmus 		case B_ALIGN_BOTTOM:
17492f86ba45SStephan Aßmus 			location.y = rect.bottom - ceilf(fontHeight.descent);
17502f86ba45SStephan Aßmus 			break;
17512f86ba45SStephan Aßmus 	}
17522f86ba45SStephan Aßmus 
17532f86ba45SStephan Aßmus 	view->DrawString(truncatedLabel.String(), location);
17542f86ba45SStephan Aßmus }
17552f86ba45SStephan Aßmus 
17562f86ba45SStephan Aßmus 
17572f86ba45SStephan Aßmus // #pragma mark -
17582f86ba45SStephan Aßmus 
17592f86ba45SStephan Aßmus 
17602f86ba45SStephan Aßmus void
176113cd46dfSStephan Aßmus BControlLook::_DrawButtonFrame(BView* view, BRect& rect,
1762681c2e44SStephan Aßmus 	const BRect& updateRect, const rgb_color& base, const rgb_color& background,
176313cd46dfSStephan Aßmus 	float contrast, float brightness, uint32 flags, uint32 borders)
176413cd46dfSStephan Aßmus {
176513cd46dfSStephan Aßmus 	// colors
176613cd46dfSStephan Aßmus 	rgb_color dark1BorderColor;
176713cd46dfSStephan Aßmus 	rgb_color dark2BorderColor;
176813cd46dfSStephan Aßmus 
176913cd46dfSStephan Aßmus 	if ((flags & B_DISABLED) == 0) {
17704f579098SStephan Aßmus 		if (flags & B_BLEND_FRAME) {
17714f579098SStephan Aßmus 			dark1BorderColor = (rgb_color){ 0, 0, 0, 75 };
17724f579098SStephan Aßmus 			dark2BorderColor = (rgb_color){ 0, 0, 0, 95 };
17734f579098SStephan Aßmus 		} else {
177413cd46dfSStephan Aßmus 			dark1BorderColor = tint_color(base, 1.33);
177513cd46dfSStephan Aßmus 			dark2BorderColor = tint_color(base, 1.45);
17764f579098SStephan Aßmus 		}
177713cd46dfSStephan Aßmus 
177813cd46dfSStephan Aßmus 		if (flags & B_DEFAULT_BUTTON) {
17794f579098SStephan Aßmus 			// TODO: B_BLEND_FRAME
178013cd46dfSStephan Aßmus 			dark2BorderColor = tint_color(dark1BorderColor, 1.5);
178113cd46dfSStephan Aßmus 			dark1BorderColor = tint_color(dark1BorderColor, 1.35);
178213cd46dfSStephan Aßmus 		}
178313cd46dfSStephan Aßmus 	} else {
17844f579098SStephan Aßmus 		// TODO: B_BLEND_FRAME
178513cd46dfSStephan Aßmus 		dark1BorderColor = tint_color(base, 1.147);
178613cd46dfSStephan Aßmus 		dark2BorderColor = tint_color(base, 1.24);
178713cd46dfSStephan Aßmus 
178813cd46dfSStephan Aßmus 		if (flags & B_DEFAULT_BUTTON) {
178974bb70aeSStephan Aßmus 			dark1BorderColor = tint_color(dark1BorderColor, 1.14);
179074bb70aeSStephan Aßmus 			dark2BorderColor = tint_color(dark1BorderColor, 1.12);
179113cd46dfSStephan Aßmus 		}
179213cd46dfSStephan Aßmus 	}
179313cd46dfSStephan Aßmus 
179413cd46dfSStephan Aßmus 	if (flags & B_ACTIVATED) {
179513cd46dfSStephan Aßmus 		rgb_color temp = dark2BorderColor;
179613cd46dfSStephan Aßmus 		dark2BorderColor = dark1BorderColor;
179713cd46dfSStephan Aßmus 		dark1BorderColor = temp;
179813cd46dfSStephan Aßmus 	}
179913cd46dfSStephan Aßmus 
180013cd46dfSStephan Aßmus 	// indicate focus by changing main button border
180113cd46dfSStephan Aßmus 	if (flags & B_FOCUSED) {
180213cd46dfSStephan Aßmus 		dark1BorderColor = ui_color(B_KEYBOARD_NAVIGATION_COLOR);
180313cd46dfSStephan Aßmus 		dark2BorderColor = dark1BorderColor;
180413cd46dfSStephan Aßmus 	}
180513cd46dfSStephan Aßmus 
180613cd46dfSStephan Aßmus 	if (flags & B_DEFAULT_BUTTON) {
18074f579098SStephan Aßmus 		// TODO: B_BLEND_FRAME
180813cd46dfSStephan Aßmus 		float focusTint = 1.2;
180913cd46dfSStephan Aßmus 		if (flags & B_DISABLED)
181013cd46dfSStephan Aßmus 			focusTint = (B_NO_TINT + focusTint) / 2;
181113cd46dfSStephan Aßmus 
181213cd46dfSStephan Aßmus 		rgb_color focusColor = tint_color(base, focusTint);
181313cd46dfSStephan Aßmus 		view->SetHighColor(base);
181413cd46dfSStephan Aßmus 
181513cd46dfSStephan Aßmus 		view->StrokeRect(rect);
181613cd46dfSStephan Aßmus 		rect.InsetBy(1.0, 1.0);
181713cd46dfSStephan Aßmus 
181813cd46dfSStephan Aßmus 		view->SetHighColor(focusColor);
181913cd46dfSStephan Aßmus 		view->StrokeRect(rect);
182013cd46dfSStephan Aßmus 		rect.InsetBy(1.0, 1.0);
182113cd46dfSStephan Aßmus 		view->StrokeRect(rect);
182213cd46dfSStephan Aßmus 		rect.InsetBy(1.0, 1.0);
182313cd46dfSStephan Aßmus 
182413cd46dfSStephan Aßmus 		// bevel around external border
182513cd46dfSStephan Aßmus 		_DrawOuterResessedFrame(view, rect, focusColor,
182674bb70aeSStephan Aßmus 			contrast * (((flags & B_DISABLED) ? 0.3 : 0.8)),
182774bb70aeSStephan Aßmus 			brightness * (((flags & B_DISABLED) ? 1.0 : 0.9)),
18284f579098SStephan Aßmus 			flags, borders);
182913cd46dfSStephan Aßmus 	} else {
183013cd46dfSStephan Aßmus 		// bevel around external border
1831681c2e44SStephan Aßmus 		_DrawOuterResessedFrame(view, rect, background,
183213cd46dfSStephan Aßmus 			contrast * ((flags & B_DISABLED) ? 0.0 : 1.0), brightness * 1.0,
18334f579098SStephan Aßmus 			flags, borders);
183413cd46dfSStephan Aßmus 	}
183513cd46dfSStephan Aßmus 
18364f579098SStephan Aßmus 	if (flags & B_BLEND_FRAME) {
18374f579098SStephan Aßmus 		drawing_mode oldDrawingMode = view->DrawingMode();
18384f579098SStephan Aßmus 		view->SetDrawingMode(B_OP_ALPHA);
18394f579098SStephan Aßmus 
184013cd46dfSStephan Aßmus 		_DrawFrame(view, rect, dark1BorderColor, dark1BorderColor,
184113cd46dfSStephan Aßmus 			dark2BorderColor, dark2BorderColor, borders);
18424f579098SStephan Aßmus 
18434f579098SStephan Aßmus 		view->SetDrawingMode(oldDrawingMode);
18444f579098SStephan Aßmus 	} else {
18454f579098SStephan Aßmus 		_DrawFrame(view, rect, dark1BorderColor, dark1BorderColor,
18464f579098SStephan Aßmus 			dark2BorderColor, dark2BorderColor, borders);
18474f579098SStephan Aßmus 	}
184813cd46dfSStephan Aßmus }
184913cd46dfSStephan Aßmus 
185013cd46dfSStephan Aßmus 
185113cd46dfSStephan Aßmus void
18522f86ba45SStephan Aßmus BControlLook::_DrawOuterResessedFrame(BView* view, BRect& rect,
18534f579098SStephan Aßmus 	const rgb_color& base, float contrast, float brightness, uint32 flags,
18544f579098SStephan Aßmus 	uint32 borders)
18552f86ba45SStephan Aßmus {
18564f579098SStephan Aßmus 	if (flags & B_BLEND_FRAME) {
18574f579098SStephan Aßmus 		// assumes the background has already been painted
18584f579098SStephan Aßmus 		drawing_mode oldDrawingMode = view->DrawingMode();
18594f579098SStephan Aßmus 		view->SetDrawingMode(B_OP_ALPHA);
18604f579098SStephan Aßmus 
18614f579098SStephan Aßmus 		uint8 alpha = uint8(20 * contrast);
18624f579098SStephan Aßmus 		uint32 white = uint8(255 * brightness);
18634f579098SStephan Aßmus 
18644f579098SStephan Aßmus 		rgb_color borderBevelShadow = (rgb_color){ 0, 0, 0, alpha };
18654f579098SStephan Aßmus 		rgb_color borderBevelLight = (rgb_color){ white, white, white, alpha };
18664f579098SStephan Aßmus 
18674f579098SStephan Aßmus 		_DrawFrame(view, rect, borderBevelShadow, borderBevelShadow,
18684f579098SStephan Aßmus 			borderBevelLight, borderBevelLight, borders);
18694f579098SStephan Aßmus 
18704f579098SStephan Aßmus 		view->SetDrawingMode(oldDrawingMode);
18714f579098SStephan Aßmus 	} else {
18722f86ba45SStephan Aßmus 		// colors
18732f86ba45SStephan Aßmus 		float tintLight = kEdgeBevelLightTint;
18742f86ba45SStephan Aßmus 		float tintShadow = kEdgeBevelShadowTint;
18752f86ba45SStephan Aßmus 
18762f86ba45SStephan Aßmus 		if (contrast == 0.0) {
18772f86ba45SStephan Aßmus 			tintLight = B_NO_TINT;
18782f86ba45SStephan Aßmus 			tintShadow = B_NO_TINT;
18792f86ba45SStephan Aßmus 		} else if (contrast != 1.0) {
18802f86ba45SStephan Aßmus 			tintLight = B_NO_TINT + (tintLight - B_NO_TINT) * contrast;
18812f86ba45SStephan Aßmus 			tintShadow = B_NO_TINT + (tintShadow - B_NO_TINT) * contrast;
18822f86ba45SStephan Aßmus 		}
18832f86ba45SStephan Aßmus 
18842f86ba45SStephan Aßmus 		rgb_color borderBevelShadow = tint_color(base, tintShadow);
18852f86ba45SStephan Aßmus 		rgb_color borderBevelLight = tint_color(base, tintLight);
18862f86ba45SStephan Aßmus 
18872f86ba45SStephan Aßmus 		if (brightness < 1.0) {
18882f86ba45SStephan Aßmus 			borderBevelShadow.red = uint8(borderBevelShadow.red * brightness);
18892f86ba45SStephan Aßmus 			borderBevelShadow.green = uint8(borderBevelShadow.green * brightness);
18902f86ba45SStephan Aßmus 			borderBevelShadow.blue = uint8(borderBevelShadow.blue * brightness);
18912f86ba45SStephan Aßmus 			borderBevelLight.red = uint8(borderBevelLight.red * brightness);
18922f86ba45SStephan Aßmus 			borderBevelLight.green = uint8(borderBevelLight.green * brightness);
18932f86ba45SStephan Aßmus 			borderBevelLight.blue = uint8(borderBevelLight.blue * brightness);
18942f86ba45SStephan Aßmus 		}
18952f86ba45SStephan Aßmus 
18962f86ba45SStephan Aßmus 		_DrawFrame(view, rect, borderBevelShadow, borderBevelShadow,
18972f86ba45SStephan Aßmus 			borderBevelLight, borderBevelLight, borders);
18982f86ba45SStephan Aßmus 	}
18994f579098SStephan Aßmus }
19002f86ba45SStephan Aßmus 
19012f86ba45SStephan Aßmus 
19022f86ba45SStephan Aßmus void
19032f86ba45SStephan Aßmus BControlLook::_DrawFrame(BView* view, BRect& rect, const rgb_color& left,
19042f86ba45SStephan Aßmus 	const rgb_color& top, const rgb_color& right, const rgb_color& bottom,
19052f86ba45SStephan Aßmus 	uint32 borders)
19062f86ba45SStephan Aßmus {
19072f86ba45SStephan Aßmus 	view->BeginLineArray(4);
19082f86ba45SStephan Aßmus 
19092f86ba45SStephan Aßmus 	if (borders & B_LEFT_BORDER) {
19102f86ba45SStephan Aßmus 		view->AddLine(
19112f86ba45SStephan Aßmus 			BPoint(rect.left, rect.bottom),
19122f86ba45SStephan Aßmus 			BPoint(rect.left, rect.top), left);
19132f86ba45SStephan Aßmus 		rect.left++;
19142f86ba45SStephan Aßmus 	}
19152f86ba45SStephan Aßmus 	if (borders & B_TOP_BORDER) {
19162f86ba45SStephan Aßmus 		view->AddLine(
19172f86ba45SStephan Aßmus 			BPoint(rect.left, rect.top),
19182f86ba45SStephan Aßmus 			BPoint(rect.right, rect.top), top);
19192f86ba45SStephan Aßmus 		rect.top++;
19202f86ba45SStephan Aßmus 	}
19212f86ba45SStephan Aßmus 	if (borders & B_RIGHT_BORDER) {
19222f86ba45SStephan Aßmus 		view->AddLine(
19232f86ba45SStephan Aßmus 			BPoint(rect.right, rect.top),
19242f86ba45SStephan Aßmus 			BPoint(rect.right, rect.bottom), right);
19252f86ba45SStephan Aßmus 		rect.right--;
19262f86ba45SStephan Aßmus 	}
19272f86ba45SStephan Aßmus 	if (borders & B_BOTTOM_BORDER) {
19282f86ba45SStephan Aßmus 		view->AddLine(
19292f86ba45SStephan Aßmus 			BPoint(rect.left, rect.bottom),
19302f86ba45SStephan Aßmus 			BPoint(rect.right, rect.bottom), bottom);
19312f86ba45SStephan Aßmus 		rect.bottom--;
19322f86ba45SStephan Aßmus 	}
19332f86ba45SStephan Aßmus 
19342f86ba45SStephan Aßmus 	view->EndLineArray();
19352f86ba45SStephan Aßmus }
19362f86ba45SStephan Aßmus 
19372f86ba45SStephan Aßmus 
19382f86ba45SStephan Aßmus void
19392f86ba45SStephan Aßmus BControlLook::_DrawFrame(BView* view, BRect& rect, const rgb_color& left,
19402f86ba45SStephan Aßmus 	const rgb_color& top, const rgb_color& right, const rgb_color& bottom,
19412f86ba45SStephan Aßmus 	const rgb_color& rightTop, const rgb_color& leftBottom, uint32 borders)
19422f86ba45SStephan Aßmus {
19432f86ba45SStephan Aßmus 	view->BeginLineArray(6);
19442f86ba45SStephan Aßmus 
19452f86ba45SStephan Aßmus 	if (borders & B_TOP_BORDER) {
19462f86ba45SStephan Aßmus 		if (borders & B_RIGHT_BORDER) {
19472f86ba45SStephan Aßmus 			view->AddLine(
19482f86ba45SStephan Aßmus 				BPoint(rect.left, rect.top),
19492f86ba45SStephan Aßmus 				BPoint(rect.right - 1, rect.top), top);
19502f86ba45SStephan Aßmus 			view->AddLine(
19512f86ba45SStephan Aßmus 				BPoint(rect.right, rect.top),
19522f86ba45SStephan Aßmus 				BPoint(rect.right, rect.top), rightTop);
19532f86ba45SStephan Aßmus 		} else {
19542f86ba45SStephan Aßmus 			view->AddLine(
19552f86ba45SStephan Aßmus 				BPoint(rect.left, rect.top),
19562f86ba45SStephan Aßmus 				BPoint(rect.right, rect.top), top);
19572f86ba45SStephan Aßmus 		}
19582f86ba45SStephan Aßmus 		rect.top++;
19592f86ba45SStephan Aßmus 	}
19602f86ba45SStephan Aßmus 
19612f86ba45SStephan Aßmus 	if (borders & B_LEFT_BORDER) {
19622f86ba45SStephan Aßmus 		view->AddLine(
19632f86ba45SStephan Aßmus 			BPoint(rect.left, rect.top),
19642f86ba45SStephan Aßmus 			BPoint(rect.left, rect.bottom - 1), left);
19652f86ba45SStephan Aßmus 		view->AddLine(
19662f86ba45SStephan Aßmus 			BPoint(rect.left, rect.bottom),
19672f86ba45SStephan Aßmus 			BPoint(rect.left, rect.bottom), leftBottom);
19682f86ba45SStephan Aßmus 		rect.left++;
19692f86ba45SStephan Aßmus 	}
19702f86ba45SStephan Aßmus 
19712f86ba45SStephan Aßmus 	if (borders & B_BOTTOM_BORDER) {
19722f86ba45SStephan Aßmus 		view->AddLine(
19732f86ba45SStephan Aßmus 			BPoint(rect.left, rect.bottom),
19742f86ba45SStephan Aßmus 			BPoint(rect.right, rect.bottom), bottom);
19752f86ba45SStephan Aßmus 		rect.bottom--;
19762f86ba45SStephan Aßmus 	}
19772f86ba45SStephan Aßmus 
19782f86ba45SStephan Aßmus 	if (borders & B_RIGHT_BORDER) {
19792f86ba45SStephan Aßmus 		view->AddLine(
19802f86ba45SStephan Aßmus 			BPoint(rect.right, rect.bottom),
19812f86ba45SStephan Aßmus 			BPoint(rect.right, rect.top), right);
19822f86ba45SStephan Aßmus 		rect.right--;
19832f86ba45SStephan Aßmus 	}
19842f86ba45SStephan Aßmus 
19852f86ba45SStephan Aßmus 	view->EndLineArray();
19862f86ba45SStephan Aßmus }
19872f86ba45SStephan Aßmus 
19882f86ba45SStephan Aßmus 
19892f86ba45SStephan Aßmus //void
19902f86ba45SStephan Aßmus //BControlLook::_DrawShadowFrame(BView* view, BRect& rect, const rgb_color& base,
19912f86ba45SStephan Aßmus //	uint32 borders)
19922f86ba45SStephan Aßmus //{
19932f86ba45SStephan Aßmus //	view->BeginLineArray(4);
19942f86ba45SStephan Aßmus //
19952f86ba45SStephan Aßmus //	bevelColor1 = tint_color(base, 1.2);
19962f86ba45SStephan Aßmus //	bevelColor2 = tint_color(base, 1.1);
19972f86ba45SStephan Aßmus //
19982f86ba45SStephan Aßmus //	// shadow along left/top borders
19992f86ba45SStephan Aßmus //	if (rect.Height() > 0 && borders & B_LEFT_BORDER) {
20002f86ba45SStephan Aßmus //		view->AddLine(BPoint(rect.left, rect.top),
20012f86ba45SStephan Aßmus //			BPoint(rect.left, rect.bottom), bevelColor1);
20022f86ba45SStephan Aßmus //		rect.left++;
20032f86ba45SStephan Aßmus //	}
20042f86ba45SStephan Aßmus //	if (rect.Width() > 0 && borders & B_TOP_BORDER) {
20052f86ba45SStephan Aßmus //		view->AddLine(BPoint(rect.left, rect.top),
20062f86ba45SStephan Aßmus //			BPoint(rect.right, rect.top), bevelColor1);
20072f86ba45SStephan Aßmus //		rect.top++;
20082f86ba45SStephan Aßmus //	}
20092f86ba45SStephan Aßmus //
20102f86ba45SStephan Aßmus //	// softer shadow along left/top borders
20112f86ba45SStephan Aßmus //	if (rect.Height() > 0 && borders & B_LEFT_BORDER) {
20122f86ba45SStephan Aßmus //		view->AddLine(BPoint(rect.left, rect.top),
20132f86ba45SStephan Aßmus //			BPoint(rect.left, rect.bottom), bevelColor2);
20142f86ba45SStephan Aßmus //		rect.left++;
20152f86ba45SStephan Aßmus //	}
20162f86ba45SStephan Aßmus //	if (rect.Width() > 0 && borders & B_TOP_BORDER) {
20172f86ba45SStephan Aßmus //		view->AddLine(BPoint(rect.left, rect.top),
20182f86ba45SStephan Aßmus //			BPoint(rect.right, rect.top), bevelColor2);
20192f86ba45SStephan Aßmus //		rect.top++;
20202f86ba45SStephan Aßmus //	}
20212f86ba45SStephan Aßmus //
20222f86ba45SStephan Aßmus //	view->EndLineArray();
20232f86ba45SStephan Aßmus //}
20242f86ba45SStephan Aßmus 
20252f86ba45SStephan Aßmus 
20262f86ba45SStephan Aßmus void
20272f86ba45SStephan Aßmus BControlLook::_FillGradient(BView* view, const BRect& rect,
20282f86ba45SStephan Aßmus 	const rgb_color& base, float topTint, float bottomTint,
20292f86ba45SStephan Aßmus 	enum orientation orientation)
20302f86ba45SStephan Aßmus {
20312f86ba45SStephan Aßmus 	BGradientLinear gradient;
20322f86ba45SStephan Aßmus 	_MakeGradient(gradient, rect, base, topTint, bottomTint, orientation);
20332f86ba45SStephan Aßmus 	view->FillRect(rect, gradient);
20342f86ba45SStephan Aßmus }
20352f86ba45SStephan Aßmus 
20362f86ba45SStephan Aßmus 
20372f86ba45SStephan Aßmus void
20382f86ba45SStephan Aßmus BControlLook::_FillGlossyGradient(BView* view, const BRect& rect,
20392f86ba45SStephan Aßmus 	const rgb_color& base, float topTint, float middle1Tint,
20402f86ba45SStephan Aßmus 	float middle2Tint, float bottomTint, enum orientation orientation)
20412f86ba45SStephan Aßmus {
20422f86ba45SStephan Aßmus 	BGradientLinear gradient;
20432f86ba45SStephan Aßmus 	_MakeGlossyGradient(gradient, rect, base, topTint, middle1Tint,
20442f86ba45SStephan Aßmus 		middle2Tint, bottomTint, orientation);
20452f86ba45SStephan Aßmus 	view->FillRect(rect, gradient);
20462f86ba45SStephan Aßmus }
20472f86ba45SStephan Aßmus 
20482f86ba45SStephan Aßmus 
20492f86ba45SStephan Aßmus void
20502f86ba45SStephan Aßmus BControlLook::_MakeGradient(BGradientLinear& gradient, const BRect& rect,
20512f86ba45SStephan Aßmus 	const rgb_color& base, float topTint, float bottomTint,
20522f86ba45SStephan Aßmus 	enum orientation orientation) const
20532f86ba45SStephan Aßmus {
20542f86ba45SStephan Aßmus 	gradient.AddColor(tint_color(base, topTint), 0);
20552f86ba45SStephan Aßmus 	gradient.AddColor(tint_color(base, bottomTint), 255);
20562f86ba45SStephan Aßmus 	gradient.SetStart(rect.LeftTop());
20572f86ba45SStephan Aßmus 	if (orientation == B_HORIZONTAL)
20582f86ba45SStephan Aßmus 		gradient.SetEnd(rect.LeftBottom());
20592f86ba45SStephan Aßmus 	else
20602f86ba45SStephan Aßmus 		gradient.SetEnd(rect.RightTop());
20612f86ba45SStephan Aßmus }
20622f86ba45SStephan Aßmus 
20632f86ba45SStephan Aßmus 
20642f86ba45SStephan Aßmus void
20652f86ba45SStephan Aßmus BControlLook::_MakeGlossyGradient(BGradientLinear& gradient, const BRect& rect,
20662f86ba45SStephan Aßmus 	const rgb_color& base, float topTint, float middle1Tint,
20672f86ba45SStephan Aßmus 	float middle2Tint, float bottomTint,
20682f86ba45SStephan Aßmus 	enum orientation orientation) const
20692f86ba45SStephan Aßmus {
20702f86ba45SStephan Aßmus 	gradient.AddColor(tint_color(base, topTint), 0);
20712f86ba45SStephan Aßmus 	gradient.AddColor(tint_color(base, middle1Tint), 132);
20722f86ba45SStephan Aßmus 	gradient.AddColor(tint_color(base, middle2Tint), 136);
20732f86ba45SStephan Aßmus 	gradient.AddColor(tint_color(base, bottomTint), 255);
20742f86ba45SStephan Aßmus 	gradient.SetStart(rect.LeftTop());
20752f86ba45SStephan Aßmus 	if (orientation == B_HORIZONTAL)
20762f86ba45SStephan Aßmus 		gradient.SetEnd(rect.LeftBottom());
20772f86ba45SStephan Aßmus 	else
20782f86ba45SStephan Aßmus 		gradient.SetEnd(rect.RightTop());
20792f86ba45SStephan Aßmus }
20802f86ba45SStephan Aßmus 
20812f86ba45SStephan Aßmus 
20822f86ba45SStephan Aßmus bool
20832f86ba45SStephan Aßmus BControlLook::_RadioButtonAndCheckBoxMarkColor(const rgb_color& base,
20842f86ba45SStephan Aßmus 	rgb_color& color, uint32 flags) const
20852f86ba45SStephan Aßmus {
20862f86ba45SStephan Aßmus 	if ((flags & (B_ACTIVATED | B_CLICKED)) == 0) {
20872f86ba45SStephan Aßmus 		// no mark to be drawn at all
20882f86ba45SStephan Aßmus 		return false;
20892f86ba45SStephan Aßmus 	}
20902f86ba45SStephan Aßmus 
20912f86ba45SStephan Aßmus 	// TODO: Get from UI settings
20922f86ba45SStephan Aßmus 	color.red = 27;
20932f86ba45SStephan Aßmus 	color.green = 82;
20942f86ba45SStephan Aßmus 	color.blue = 140;
20952f86ba45SStephan Aßmus 
20962f86ba45SStephan Aßmus 	float mix = 1.0;
20972f86ba45SStephan Aßmus 
20982f86ba45SStephan Aßmus 	if (flags & B_DISABLED) {
20992f86ba45SStephan Aßmus 		// activated, but disabled
21002f86ba45SStephan Aßmus 		mix = 0.4;
21012f86ba45SStephan Aßmus 	} else if (flags & B_CLICKED) {
21022f86ba45SStephan Aßmus 		if (flags & B_ACTIVATED) {
21032f86ba45SStephan Aßmus 			// loosing activation
21042f86ba45SStephan Aßmus 			mix = 0.7;
21052f86ba45SStephan Aßmus 		} else {
21062f86ba45SStephan Aßmus 			// becoming activated
21072f86ba45SStephan Aßmus 			mix = 0.3;
21082f86ba45SStephan Aßmus 		}
21092f86ba45SStephan Aßmus 	} else {
21102f86ba45SStephan Aßmus 		// simply activated
21112f86ba45SStephan Aßmus 	}
21122f86ba45SStephan Aßmus 
21132f86ba45SStephan Aßmus 	color.red = uint8(color.red * mix + base.red * (1.0 - mix));
21142f86ba45SStephan Aßmus 	color.green = uint8(color.green * mix + base.green * (1.0 - mix));
21152f86ba45SStephan Aßmus 	color.blue = uint8(color.blue * mix + base.blue * (1.0 - mix));
21162f86ba45SStephan Aßmus 
21172f86ba45SStephan Aßmus 	return true;
21182f86ba45SStephan Aßmus }
21192f86ba45SStephan Aßmus 
21202f86ba45SStephan Aßmus 
21212f86ba45SStephan Aßmus void
21222f86ba45SStephan Aßmus BControlLook::_DrawRoundBarCorner(BView* view, BRect& rect,
21232f86ba45SStephan Aßmus 	const BRect& updateRect,
21242f86ba45SStephan Aßmus 	const rgb_color& edgeLightColor, const rgb_color& edgeShadowColor,
21252f86ba45SStephan Aßmus 	const rgb_color& frameLightColor, const rgb_color& frameShadowColor,
21262f86ba45SStephan Aßmus 	const rgb_color& fillLightColor, const rgb_color& fillShadowColor,
21272f86ba45SStephan Aßmus 	float leftInset, float topInset, float rightInset, float bottomInset,
21282f86ba45SStephan Aßmus 	enum orientation orientation)
21292f86ba45SStephan Aßmus {
21302f86ba45SStephan Aßmus 	if (!rect.IsValid() || !rect.Intersects(updateRect))
21312f86ba45SStephan Aßmus 		return;
21322f86ba45SStephan Aßmus 
21332f86ba45SStephan Aßmus 	BGradientLinear gradient;
21342f86ba45SStephan Aßmus 	gradient.AddColor(edgeShadowColor, 0);
21352f86ba45SStephan Aßmus 	gradient.AddColor(edgeLightColor, 255);
21362f86ba45SStephan Aßmus 	gradient.SetStart(rect.LeftTop());
21372f86ba45SStephan Aßmus 	if (orientation == B_HORIZONTAL)
21382f86ba45SStephan Aßmus 		gradient.SetEnd(rect.LeftBottom());
21392f86ba45SStephan Aßmus 	else
21402f86ba45SStephan Aßmus 		gradient.SetEnd(rect.RightTop());
21412f86ba45SStephan Aßmus 
21422f86ba45SStephan Aßmus 	view->FillEllipse(rect, gradient);
21432f86ba45SStephan Aßmus 
21442f86ba45SStephan Aßmus 	rect.left += leftInset;
21452f86ba45SStephan Aßmus 	rect.top += topInset;
21462f86ba45SStephan Aßmus 	rect.right += rightInset;
21472f86ba45SStephan Aßmus 	rect.bottom += bottomInset;
21482f86ba45SStephan Aßmus 
21492f86ba45SStephan Aßmus 	gradient.MakeEmpty();
21502f86ba45SStephan Aßmus 	gradient.AddColor(frameShadowColor, 0);
21512f86ba45SStephan Aßmus 	gradient.AddColor(frameLightColor, 255);
21522f86ba45SStephan Aßmus 	gradient.SetStart(rect.LeftTop());
21532f86ba45SStephan Aßmus 	if (orientation == B_HORIZONTAL)
21542f86ba45SStephan Aßmus 		gradient.SetEnd(rect.LeftBottom());
21552f86ba45SStephan Aßmus 	else
21562f86ba45SStephan Aßmus 		gradient.SetEnd(rect.RightTop());
21572f86ba45SStephan Aßmus 
21582f86ba45SStephan Aßmus 	view->FillEllipse(rect, gradient);
21592f86ba45SStephan Aßmus 
21602f86ba45SStephan Aßmus 	rect.left += leftInset;
21612f86ba45SStephan Aßmus 	rect.top += topInset;
21622f86ba45SStephan Aßmus 	rect.right += rightInset;
21632f86ba45SStephan Aßmus 	rect.bottom += bottomInset;
21642f86ba45SStephan Aßmus 
21652f86ba45SStephan Aßmus 	gradient.MakeEmpty();
21662f86ba45SStephan Aßmus 	gradient.AddColor(fillShadowColor, 0);
21672f86ba45SStephan Aßmus 	gradient.AddColor(fillLightColor, 255);
21682f86ba45SStephan Aßmus 	gradient.SetStart(rect.LeftTop());
21692f86ba45SStephan Aßmus 	if (orientation == B_HORIZONTAL)
21702f86ba45SStephan Aßmus 		gradient.SetEnd(rect.LeftBottom());
21712f86ba45SStephan Aßmus 	else
21722f86ba45SStephan Aßmus 		gradient.SetEnd(rect.RightTop());
21732f86ba45SStephan Aßmus 
21742f86ba45SStephan Aßmus 	view->FillEllipse(rect, gradient);
21752f86ba45SStephan Aßmus }
21762f86ba45SStephan Aßmus 
21772f86ba45SStephan Aßmus 
21782f86ba45SStephan Aßmus void
21792f86ba45SStephan Aßmus BControlLook::_DrawRoundCornerLeftTop(BView* view, BRect& rect,
21802f86ba45SStephan Aßmus 	const BRect& updateRect, const rgb_color& base, const rgb_color& edgeColor,
21812f86ba45SStephan Aßmus 	const rgb_color& frameColor, const rgb_color& bevelColor,
21822f86ba45SStephan Aßmus 	const BGradientLinear& fillGradient)
21832f86ba45SStephan Aßmus {
21842f86ba45SStephan Aßmus 	if (!rect.IsValid() || !rect.Intersects(updateRect))
21852f86ba45SStephan Aßmus 		return;
21862f86ba45SStephan Aßmus 
21872f86ba45SStephan Aßmus 	BRegion clipping(rect);
21882f86ba45SStephan Aßmus 	view->ConstrainClippingRegion(&clipping);
21892f86ba45SStephan Aßmus 
21902f86ba45SStephan Aßmus 	// background
21912f86ba45SStephan Aßmus 	view->SetHighColor(base);
21922f86ba45SStephan Aßmus 	view->FillRect(rect);
21932f86ba45SStephan Aßmus 
21942f86ba45SStephan Aßmus 	// outer edge
21952f86ba45SStephan Aßmus 	BRect ellipseRect(rect);
21962f86ba45SStephan Aßmus 	ellipseRect.right = ellipseRect.left + ellipseRect.Width() * 2;
21972f86ba45SStephan Aßmus 	ellipseRect.bottom = ellipseRect.top + ellipseRect.Height() * 2;
21982f86ba45SStephan Aßmus 
21992f86ba45SStephan Aßmus 	view->SetHighColor(edgeColor);
22002f86ba45SStephan Aßmus 	view->FillEllipse(ellipseRect);
22012f86ba45SStephan Aßmus 
22022f86ba45SStephan Aßmus 	// frame
22032f86ba45SStephan Aßmus 	ellipseRect.InsetBy(1, 1);
22042f86ba45SStephan Aßmus 	view->SetHighColor(frameColor);
22052f86ba45SStephan Aßmus 	view->FillEllipse(ellipseRect);
22062f86ba45SStephan Aßmus 
22072f86ba45SStephan Aßmus 	// bevel
22082f86ba45SStephan Aßmus 	ellipseRect.InsetBy(1, 1);
22092f86ba45SStephan Aßmus 	view->SetHighColor(bevelColor);
22102f86ba45SStephan Aßmus 	view->FillEllipse(ellipseRect);
22112f86ba45SStephan Aßmus 
22122f86ba45SStephan Aßmus 	// fill
22132f86ba45SStephan Aßmus 	ellipseRect.InsetBy(1, 1);
22142f86ba45SStephan Aßmus 	view->FillEllipse(ellipseRect, fillGradient);
22152f86ba45SStephan Aßmus 
22162f86ba45SStephan Aßmus 	view->ConstrainClippingRegion(NULL);
22172f86ba45SStephan Aßmus }
22182f86ba45SStephan Aßmus 
22192f86ba45SStephan Aßmus void
22202f86ba45SStephan Aßmus BControlLook::_DrawRoundCornerRightTop(BView* view, BRect& rect,
22212f86ba45SStephan Aßmus 	const BRect& updateRect, const rgb_color& base,
22222f86ba45SStephan Aßmus 	const rgb_color& edgeTopColor, const rgb_color& edgeRightColor,
22232f86ba45SStephan Aßmus 	const rgb_color& frameTopColor, const rgb_color& frameRightColor,
22242f86ba45SStephan Aßmus 	const rgb_color& bevelTopColor, const rgb_color& bevelRightColor,
22252f86ba45SStephan Aßmus 	const BGradientLinear& fillGradient)
22262f86ba45SStephan Aßmus {
22272f86ba45SStephan Aßmus 	if (!rect.IsValid() || !rect.Intersects(updateRect))
22282f86ba45SStephan Aßmus 		return;
22292f86ba45SStephan Aßmus 
22302f86ba45SStephan Aßmus 	BRegion clipping(rect);
22312f86ba45SStephan Aßmus 	view->ConstrainClippingRegion(&clipping);
22322f86ba45SStephan Aßmus 
22332f86ba45SStephan Aßmus 	// background
22342f86ba45SStephan Aßmus 	view->SetHighColor(base);
22352f86ba45SStephan Aßmus 	view->FillRect(rect);
22362f86ba45SStephan Aßmus 
22372f86ba45SStephan Aßmus 	// outer edge
22382f86ba45SStephan Aßmus 	BRect ellipseRect(rect);
22392f86ba45SStephan Aßmus 	ellipseRect.left = ellipseRect.right - ellipseRect.Width() * 2;
22402f86ba45SStephan Aßmus 	ellipseRect.bottom = ellipseRect.top + ellipseRect.Height() * 2;
22412f86ba45SStephan Aßmus 
22422f86ba45SStephan Aßmus 	BGradientLinear gradient;
22432f86ba45SStephan Aßmus 	gradient.AddColor(edgeTopColor, 0);
22442f86ba45SStephan Aßmus 	gradient.AddColor(edgeRightColor, 255);
22452f86ba45SStephan Aßmus 	gradient.SetStart(rect.LeftTop());
22462f86ba45SStephan Aßmus 	gradient.SetEnd(rect.RightBottom());
22472f86ba45SStephan Aßmus 	view->FillEllipse(ellipseRect, gradient);
22482f86ba45SStephan Aßmus 
22492f86ba45SStephan Aßmus 	// frame
22502f86ba45SStephan Aßmus 	ellipseRect.InsetBy(1, 1);
22512f86ba45SStephan Aßmus 	rect.right--;
22522f86ba45SStephan Aßmus 	rect.top++;
22532f86ba45SStephan Aßmus 	if (frameTopColor == frameRightColor) {
22542f86ba45SStephan Aßmus 		view->SetHighColor(frameTopColor);
22552f86ba45SStephan Aßmus 		view->FillEllipse(ellipseRect);
22562f86ba45SStephan Aßmus 	} else {
22572f86ba45SStephan Aßmus 		gradient.SetColor(0, frameTopColor);
22582f86ba45SStephan Aßmus 		gradient.SetColor(1, frameRightColor);
22592f86ba45SStephan Aßmus 		gradient.SetStart(rect.LeftTop());
22602f86ba45SStephan Aßmus 		gradient.SetEnd(rect.RightBottom());
22612f86ba45SStephan Aßmus 		view->FillEllipse(ellipseRect, gradient);
22622f86ba45SStephan Aßmus 	}
22632f86ba45SStephan Aßmus 
22642f86ba45SStephan Aßmus 	// bevel
22652f86ba45SStephan Aßmus 	ellipseRect.InsetBy(1, 1);
22662f86ba45SStephan Aßmus 	rect.right--;
22672f86ba45SStephan Aßmus 	rect.top++;
22682f86ba45SStephan Aßmus 	gradient.SetColor(0, bevelTopColor);
22692f86ba45SStephan Aßmus 	gradient.SetColor(1, bevelRightColor);
22702f86ba45SStephan Aßmus 	gradient.SetStart(rect.LeftTop());
22712f86ba45SStephan Aßmus 	gradient.SetEnd(rect.RightBottom());
22722f86ba45SStephan Aßmus 	view->FillEllipse(ellipseRect, gradient);
22732f86ba45SStephan Aßmus 
22742f86ba45SStephan Aßmus 	// fill
22752f86ba45SStephan Aßmus 	ellipseRect.InsetBy(1, 1);
22762f86ba45SStephan Aßmus 	view->FillEllipse(ellipseRect, fillGradient);
22772f86ba45SStephan Aßmus 
22782f86ba45SStephan Aßmus 	view->ConstrainClippingRegion(NULL);
22792f86ba45SStephan Aßmus }
22802f86ba45SStephan Aßmus 
22812f86ba45SStephan Aßmus 
22822f86ba45SStephan Aßmus // NOTE: May come from a add-on in the future. Initialized in
22832f86ba45SStephan Aßmus // InterfaceDefs.cpp
22842f86ba45SStephan Aßmus BControlLook* be_control_look = NULL;
22852f86ba45SStephan Aßmus 
22862f86ba45SStephan Aßmus } // namespace BPrivate
2287