xref: /haiku/src/kits/interface/StatusBar.cpp (revision 7a96554cb32dc03c3a68b401a3d4083f9b866668)
199f695c9SAxel Dörfler /*
2*7a96554cSlooncraz  * Copyright 2001-2015, Haiku, Inc. All Rights Reserved.
399f695c9SAxel Dörfler  * Distributed under the terms of the MIT License.
499f695c9SAxel Dörfler  *
599f695c9SAxel Dörfler  * Authors:
699f695c9SAxel Dörfler  *		Marc Flerackers (mflerackers@androme.be)
7075e65c7SAxel Dörfler  *		Axel Dörfler, axeld@pinc-software.de
8f466d35dSStephan Aßmus  *		Stephan Aßmus <superstippi@gmx.de>
9*7a96554cSlooncraz  *		Joseph Groover <looncraz@looncraz.net>
1099f695c9SAxel Dörfler  */
1199f695c9SAxel Dörfler 
1299f695c9SAxel Dörfler /*! BStatusBar displays a "percentage-of-completion" gauge. */
13f466d35dSStephan Aßmus #include <StatusBar.h>
14f466d35dSStephan Aßmus 
15f466d35dSStephan Aßmus #include <stdio.h>
16f466d35dSStephan Aßmus #include <stdlib.h>
17f466d35dSStephan Aßmus #include <string.h>
1852a38012Sejakowatz 
192f86ba45SStephan Aßmus #include <ControlLook.h>
20d23c4822SIngo Weinhold #include <Layout.h>
21d23c4822SIngo Weinhold #include <LayoutUtils.h>
222f86ba45SStephan Aßmus #include <Message.h>
232f86ba45SStephan Aßmus #include <Region.h>
24d23c4822SIngo Weinhold 
2539fbf550SOliver Tappe #include <binary_compatibility/Interface.h>
2639fbf550SOliver Tappe 
27*7a96554cSlooncraz enum internalFlags {
28*7a96554cSlooncraz 	kCustomBarColor = 1
29*7a96554cSlooncraz };
30075e65c7SAxel Dörfler 
31075e65c7SAxel Dörfler 
3252a38012Sejakowatz BStatusBar::BStatusBar(BRect frame, const char *name, const char *label,
3352a38012Sejakowatz 		const char *trailingLabel)
3489208c77SStephan Aßmus 	:
3589208c77SStephan Aßmus 	BView(frame, name, B_FOLLOW_LEFT | B_FOLLOW_TOP, B_WILL_DRAW),
36075e65c7SAxel Dörfler 	fLabel(label),
37075e65c7SAxel Dörfler 	fTrailingLabel(trailingLabel)
3852a38012Sejakowatz {
39075e65c7SAxel Dörfler 	_InitObject();
4052a38012Sejakowatz }
413583227cSStefano Ceccherini 
423583227cSStefano Ceccherini 
43d23c4822SIngo Weinhold BStatusBar::BStatusBar(const char *name, const char *label,
44d23c4822SIngo Weinhold 		const char *trailingLabel)
4589208c77SStephan Aßmus 	:
4689208c77SStephan Aßmus 	BView(BRect(0, 0, -1, -1), name, B_FOLLOW_LEFT | B_FOLLOW_TOP,
47d23c4822SIngo Weinhold 		B_WILL_DRAW | B_SUPPORTS_LAYOUT),
48d23c4822SIngo Weinhold 	fLabel(label),
49d23c4822SIngo Weinhold 	fTrailingLabel(trailingLabel)
50d23c4822SIngo Weinhold {
51d23c4822SIngo Weinhold 	_InitObject();
52d23c4822SIngo Weinhold }
53d23c4822SIngo Weinhold 
54d23c4822SIngo Weinhold 
5552a38012Sejakowatz BStatusBar::BStatusBar(BMessage *archive)
5689208c77SStephan Aßmus 	:
5789208c77SStephan Aßmus 	BView(archive)
5852a38012Sejakowatz {
59075e65c7SAxel Dörfler 	_InitObject();
603583227cSStefano Ceccherini 
61075e65c7SAxel Dörfler 	archive->FindString("_label", &fLabel);
62075e65c7SAxel Dörfler 	archive->FindString("_tlabel", &fTrailingLabel);
633583227cSStefano Ceccherini 
64075e65c7SAxel Dörfler 	archive->FindString("_text", &fText);
65075e65c7SAxel Dörfler 	archive->FindString("_ttext", &fTrailingText);
6652a38012Sejakowatz 
67075e65c7SAxel Dörfler 	float floatValue;
68075e65c7SAxel Dörfler 	if (archive->FindFloat("_high", &floatValue) == B_OK) {
69075e65c7SAxel Dörfler 		fBarHeight = floatValue;
70075e65c7SAxel Dörfler 		fCustomBarHeight = true;
71075e65c7SAxel Dörfler 	}
7252a38012Sejakowatz 
73075e65c7SAxel Dörfler 	int32 color;
74*7a96554cSlooncraz 	if (archive->FindInt32("_bcolor", (int32 *)&color) == B_OK) {
75075e65c7SAxel Dörfler 		fBarColor = *(rgb_color *)&color;
76*7a96554cSlooncraz 		fInternalFlags |= kCustomBarColor;
77*7a96554cSlooncraz 	}
7852a38012Sejakowatz 
79075e65c7SAxel Dörfler 	if (archive->FindFloat("_val", &floatValue) == B_OK)
80075e65c7SAxel Dörfler 		fCurrent = floatValue;
81075e65c7SAxel Dörfler 	if (archive->FindFloat("_max", &floatValue) == B_OK)
82075e65c7SAxel Dörfler 		fMax = floatValue;
8352a38012Sejakowatz }
843583227cSStefano Ceccherini 
853583227cSStefano Ceccherini 
8652a38012Sejakowatz BStatusBar::~BStatusBar()
8752a38012Sejakowatz {
88075e65c7SAxel Dörfler }
89075e65c7SAxel Dörfler 
90075e65c7SAxel Dörfler 
913583227cSStefano Ceccherini BArchivable *
923583227cSStefano Ceccherini BStatusBar::Instantiate(BMessage *archive)
9352a38012Sejakowatz {
9452a38012Sejakowatz 	if (validate_instantiation(archive, "BStatusBar"))
9552a38012Sejakowatz 		return new BStatusBar(archive);
9652a38012Sejakowatz 
9752a38012Sejakowatz 	return NULL;
9852a38012Sejakowatz }
993583227cSStefano Ceccherini 
1003583227cSStefano Ceccherini 
1013583227cSStefano Ceccherini status_t
1023583227cSStefano Ceccherini BStatusBar::Archive(BMessage *archive, bool deep) const
10352a38012Sejakowatz {
1048f3e1554SMarc Flerackers 	status_t err = BView::Archive(archive, deep);
1053583227cSStefano Ceccherini 	if (err < B_OK)
1068f3e1554SMarc Flerackers 		return err;
10752a38012Sejakowatz 
108075e65c7SAxel Dörfler 	if (fCustomBarHeight)
1098f3e1554SMarc Flerackers 		err = archive->AddFloat("_high", fBarHeight);
1108f3e1554SMarc Flerackers 
111*7a96554cSlooncraz 	if (err == B_OK && fInternalFlags & kCustomBarColor)
11230d24296SMarcus Overhagen 		err = archive->AddInt32("_bcolor", (const uint32 &)fBarColor);
1138f3e1554SMarc Flerackers 
114f466d35dSStephan Aßmus 	if (err == B_OK && fCurrent != 0)
1158f3e1554SMarc Flerackers 		err = archive->AddFloat("_val", fCurrent);
116f466d35dSStephan Aßmus 	if (err == B_OK && fMax != 100 )
1178f3e1554SMarc Flerackers 		err = archive->AddFloat("_max", fMax);
1188f3e1554SMarc Flerackers 
119075e65c7SAxel Dörfler 	if (err == B_OK && fText.Length())
1208f3e1554SMarc Flerackers 		err = archive->AddString("_text", fText);
121075e65c7SAxel Dörfler 	if (err == B_OK && fTrailingText.Length())
1228f3e1554SMarc Flerackers 		err = archive->AddString("_ttext", fTrailingText);
1238f3e1554SMarc Flerackers 
124075e65c7SAxel Dörfler 	if (err == B_OK && fLabel.Length())
1258f3e1554SMarc Flerackers 		err = archive->AddString("_label", fLabel);
126075e65c7SAxel Dörfler 	if (err == B_OK && fTrailingLabel.Length())
1278f3e1554SMarc Flerackers 		err = archive->AddString ("_tlabel", fTrailingLabel);
12852a38012Sejakowatz 
1298f3e1554SMarc Flerackers 	return err;
13052a38012Sejakowatz }
1313583227cSStefano Ceccherini 
1323583227cSStefano Ceccherini 
13389208c77SStephan Aßmus // #pragma mark -
13489208c77SStephan Aßmus 
13589208c77SStephan Aßmus 
1363583227cSStefano Ceccherini void
1373583227cSStefano Ceccherini BStatusBar::AttachedToWindow()
13852a38012Sejakowatz {
139075e65c7SAxel Dörfler 	// resize so that the height fits
14052a38012Sejakowatz 	float width, height;
14152a38012Sejakowatz 	GetPreferredSize(&width, &height);
142075e65c7SAxel Dörfler 	ResizeTo(Bounds().Width(), height);
14352a38012Sejakowatz 
144075e65c7SAxel Dörfler 	SetViewColor(B_TRANSPARENT_COLOR);
145075e65c7SAxel Dörfler 
146*7a96554cSlooncraz 	AdoptParentColors();
147075e65c7SAxel Dörfler 
148f466d35dSStephan Aßmus 	fTextDivider = Bounds().Width();
149*7a96554cSlooncraz 
150*7a96554cSlooncraz 	if ((fInternalFlags & kCustomBarColor) == 0)
151*7a96554cSlooncraz 		fBarColor = ui_color(B_CONTROL_MARK_COLOR);
15252a38012Sejakowatz }
1533583227cSStefano Ceccherini 
1543583227cSStefano Ceccherini 
1553583227cSStefano Ceccherini void
15689208c77SStephan Aßmus BStatusBar::DetachedFromWindow()
15752a38012Sejakowatz {
15889208c77SStephan Aßmus 	BView::DetachedFromWindow();
15989208c77SStephan Aßmus }
16089208c77SStephan Aßmus 
16189208c77SStephan Aßmus 
16289208c77SStephan Aßmus void
16389208c77SStephan Aßmus BStatusBar::AllAttached()
16452a38012Sejakowatz {
16589208c77SStephan Aßmus 	BView::AllAttached();
16652a38012Sejakowatz }
1673583227cSStefano Ceccherini 
16889208c77SStephan Aßmus 
16989208c77SStephan Aßmus void
17089208c77SStephan Aßmus BStatusBar::AllDetached()
17152a38012Sejakowatz {
17289208c77SStephan Aßmus 	BView::AllDetached();
17352a38012Sejakowatz }
1743583227cSStefano Ceccherini 
17589208c77SStephan Aßmus 
17689208c77SStephan Aßmus // #pragma mark -
17789208c77SStephan Aßmus 
17889208c77SStephan Aßmus 
17989208c77SStephan Aßmus void
18089208c77SStephan Aßmus BStatusBar::WindowActivated(bool state)
18189208c77SStephan Aßmus {
18289208c77SStephan Aßmus 	BView::WindowActivated(state);
18389208c77SStephan Aßmus }
18489208c77SStephan Aßmus 
18589208c77SStephan Aßmus 
18689208c77SStephan Aßmus void
18789208c77SStephan Aßmus BStatusBar::MakeFocus(bool state)
18889208c77SStephan Aßmus {
18989208c77SStephan Aßmus 	BView::MakeFocus(state);
19089208c77SStephan Aßmus }
19189208c77SStephan Aßmus 
19289208c77SStephan Aßmus 
19389208c77SStephan Aßmus // #pragma mark -
19489208c77SStephan Aßmus 
19589208c77SStephan Aßmus 
19689208c77SStephan Aßmus void
19789208c77SStephan Aßmus BStatusBar::GetPreferredSize(float* _width, float* _height)
19889208c77SStephan Aßmus {
19989208c77SStephan Aßmus 	if (_width) {
20089208c77SStephan Aßmus 		// AttachedToWindow() might not have been called yet
20189208c77SStephan Aßmus 		*_width = ceilf(StringWidth(fLabel.String()))
20289208c77SStephan Aßmus 			+ ceilf(StringWidth(fTrailingLabel.String()))
20389208c77SStephan Aßmus 			+ ceilf(StringWidth(fText.String()))
20489208c77SStephan Aßmus 			+ ceilf(StringWidth(fTrailingText.String()))
20589208c77SStephan Aßmus 			+ 5;
20689208c77SStephan Aßmus 	}
20789208c77SStephan Aßmus 
20889208c77SStephan Aßmus 	if (_height) {
209a487da80SStephan Aßmus 		float labelHeight = 0;
210a487da80SStephan Aßmus 		if (_HasText()) {
21189208c77SStephan Aßmus 			font_height fontHeight;
21289208c77SStephan Aßmus 			GetFontHeight(&fontHeight);
213a487da80SStephan Aßmus 			labelHeight = ceilf(fontHeight.ascent + fontHeight.descent) + 6;
214a487da80SStephan Aßmus 		}
21589208c77SStephan Aßmus 
216a487da80SStephan Aßmus 		*_height = labelHeight + BarHeight();
21752a38012Sejakowatz 	}
21852a38012Sejakowatz }
2193583227cSStefano Ceccherini 
2203583227cSStefano Ceccherini 
22189208c77SStephan Aßmus BSize
22289208c77SStephan Aßmus BStatusBar::MinSize()
22389208c77SStephan Aßmus {
22489208c77SStephan Aßmus 	float width, height;
22589208c77SStephan Aßmus 	GetPreferredSize(&width, &height);
22689208c77SStephan Aßmus 
2278e80f8ccSczeidler 	return BLayoutUtils::ComposeSize(ExplicitMinSize(), BSize(width, height));
22889208c77SStephan Aßmus }
22989208c77SStephan Aßmus 
23089208c77SStephan Aßmus 
23189208c77SStephan Aßmus BSize
23289208c77SStephan Aßmus BStatusBar::MaxSize()
23389208c77SStephan Aßmus {
23489208c77SStephan Aßmus 	float width, height;
23589208c77SStephan Aßmus 	GetPreferredSize(&width, &height);
23689208c77SStephan Aßmus 
23789208c77SStephan Aßmus 	return BLayoutUtils::ComposeSize(ExplicitMaxSize(),
23889208c77SStephan Aßmus 		BSize(B_SIZE_UNLIMITED, height));
23989208c77SStephan Aßmus }
24089208c77SStephan Aßmus 
24189208c77SStephan Aßmus 
24289208c77SStephan Aßmus BSize
24389208c77SStephan Aßmus BStatusBar::PreferredSize()
24489208c77SStephan Aßmus {
24589208c77SStephan Aßmus 	float width, height;
24689208c77SStephan Aßmus 	GetPreferredSize(&width, &height);
24789208c77SStephan Aßmus 
2488e80f8ccSczeidler 	return BLayoutUtils::ComposeSize(ExplicitPreferredSize(),
2498e80f8ccSczeidler 		BSize(width, height));
25089208c77SStephan Aßmus }
25189208c77SStephan Aßmus 
25289208c77SStephan Aßmus 
25389208c77SStephan Aßmus void
25489208c77SStephan Aßmus BStatusBar::ResizeToPreferred()
25589208c77SStephan Aßmus {
25689208c77SStephan Aßmus 	BView::ResizeToPreferred();
25789208c77SStephan Aßmus }
25889208c77SStephan Aßmus 
25989208c77SStephan Aßmus 
26089208c77SStephan Aßmus void
26189208c77SStephan Aßmus BStatusBar::FrameMoved(BPoint newPosition)
26289208c77SStephan Aßmus {
26389208c77SStephan Aßmus 	BView::FrameMoved(newPosition);
26489208c77SStephan Aßmus }
26589208c77SStephan Aßmus 
26689208c77SStephan Aßmus 
26789208c77SStephan Aßmus void
26889208c77SStephan Aßmus BStatusBar::FrameResized(float newWidth, float newHeight)
26989208c77SStephan Aßmus {
27089208c77SStephan Aßmus 	BView::FrameResized(newWidth, newHeight);
27189208c77SStephan Aßmus 	Invalidate();
27289208c77SStephan Aßmus }
27389208c77SStephan Aßmus 
27489208c77SStephan Aßmus 
27589208c77SStephan Aßmus // #pragma mark -
27689208c77SStephan Aßmus 
27789208c77SStephan Aßmus 
2783583227cSStefano Ceccherini void
2793583227cSStefano Ceccherini BStatusBar::Draw(BRect updateRect)
28052a38012Sejakowatz {
281861e4437SStephan Aßmus 	rgb_color backgroundColor = LowColor();
28252a38012Sejakowatz 
283075e65c7SAxel Dörfler 	font_height fontHeight;
284075e65c7SAxel Dörfler 	GetFontHeight(&fontHeight);
285075e65c7SAxel Dörfler 	BRect barFrame = _BarFrame(&fontHeight);
286f466d35dSStephan Aßmus 	BRect outerFrame = barFrame.InsetByCopy(-2, -2);
2870dc199a5SMarc Flerackers 
288075e65c7SAxel Dörfler 	BRegion background(updateRect);
289075e65c7SAxel Dörfler 	background.Exclude(outerFrame);
290075e65c7SAxel Dörfler 	FillRegion(&background, B_SOLID_LOW);
2910dc199a5SMarc Flerackers 
292075e65c7SAxel Dörfler 	// Draw labels/texts
293075e65c7SAxel Dörfler 
294075e65c7SAxel Dörfler 	BRect rect = outerFrame;
295f466d35dSStephan Aßmus 	rect.top = 0;
296f466d35dSStephan Aßmus 	rect.bottom = outerFrame.top - 1;
297075e65c7SAxel Dörfler 
298075e65c7SAxel Dörfler 	if (updateRect.Intersects(rect)) {
299075e65c7SAxel Dörfler 		// update labels
300f466d35dSStephan Aßmus 		BString leftText;
301f466d35dSStephan Aßmus 		leftText << fLabel << fText;
302075e65c7SAxel Dörfler 
303f466d35dSStephan Aßmus 		BString rightText;
304f466d35dSStephan Aßmus 		rightText << fTrailingText << fTrailingLabel;
305075e65c7SAxel Dörfler 
306f466d35dSStephan Aßmus 		float baseLine = ceilf(fontHeight.ascent) + 1;
307f466d35dSStephan Aßmus 		fTextDivider = rect.right;
308075e65c7SAxel Dörfler 
309f466d35dSStephan Aßmus 		BFont font;
310f466d35dSStephan Aßmus 		GetFont(&font);
311075e65c7SAxel Dörfler 
312f466d35dSStephan Aßmus 		if (rightText.Length()) {
313*7a96554cSlooncraz 			font.TruncateString(&rightText, B_TRUNCATE_BEGINNING,
314*7a96554cSlooncraz 				rect.Width());
315f466d35dSStephan Aßmus 			fTextDivider -= StringWidth(rightText.String());
316075e65c7SAxel Dörfler 		}
317f466d35dSStephan Aßmus 
318f466d35dSStephan Aßmus 		if (leftText.Length()) {
319f466d35dSStephan Aßmus 			float width = max_c(0.0, fTextDivider - rect.left);
320f466d35dSStephan Aßmus 			font.TruncateString(&leftText, B_TRUNCATE_END, width);
321f466d35dSStephan Aßmus 		}
322f466d35dSStephan Aßmus 
323*7a96554cSlooncraz 		rgb_color textColor = ui_color(B_PANEL_TEXT_COLOR);
324*7a96554cSlooncraz 
325*7a96554cSlooncraz 		if (backgroundColor != ui_color(B_PANEL_BACKGROUND_COLOR)) {
326*7a96554cSlooncraz 			if (backgroundColor.Brightness() > 100)
327*7a96554cSlooncraz 				textColor = make_color(0, 0, 0, 255);
328*7a96554cSlooncraz 			else
329*7a96554cSlooncraz 				textColor = make_color(255, 255, 255, 255);
330*7a96554cSlooncraz 		}
331*7a96554cSlooncraz 
332*7a96554cSlooncraz 		SetHighColor(textColor);
333f466d35dSStephan Aßmus 
334f466d35dSStephan Aßmus 		if (leftText.Length())
335f466d35dSStephan Aßmus 			DrawString(leftText.String(), BPoint(rect.left, baseLine));
336f466d35dSStephan Aßmus 
337f466d35dSStephan Aßmus 		if (rightText.Length())
338f466d35dSStephan Aßmus 			DrawString(rightText.String(), BPoint(fTextDivider, baseLine));
33952a38012Sejakowatz 	}
34052a38012Sejakowatz 
341075e65c7SAxel Dörfler 	// Draw bar
3420dc199a5SMarc Flerackers 
343075e65c7SAxel Dörfler 	if (!updateRect.Intersects(outerFrame))
344075e65c7SAxel Dörfler 		return;
345075e65c7SAxel Dörfler 
346075e65c7SAxel Dörfler 	rect = outerFrame;
34752a38012Sejakowatz 
3482f86ba45SStephan Aßmus 	if (be_control_look != NULL) {
3492f86ba45SStephan Aßmus 		be_control_look->DrawStatusBar(this, rect, updateRect,
3502f86ba45SStephan Aßmus 			backgroundColor, fBarColor, _BarPosition(barFrame));
3512f86ba45SStephan Aßmus 		return;
3522f86ba45SStephan Aßmus 	}
3532f86ba45SStephan Aßmus 
35452a38012Sejakowatz 	// First bevel
355*7a96554cSlooncraz 	SetHighColor(tint_color(backgroundColor, B_DARKEN_1_TINT));
356075e65c7SAxel Dörfler 	StrokeLine(rect.LeftBottom(), rect.LeftTop());
357075e65c7SAxel Dörfler 	StrokeLine(rect.RightTop());
35852a38012Sejakowatz 
359*7a96554cSlooncraz 	SetHighColor(tint_color(backgroundColor, B_LIGHTEN_2_TINT));
360f466d35dSStephan Aßmus 	StrokeLine(BPoint(rect.left + 1, rect.bottom), rect.RightBottom());
361f466d35dSStephan Aßmus 	StrokeLine(BPoint(rect.right, rect.top + 1));
36252a38012Sejakowatz 
363f466d35dSStephan Aßmus 	rect.InsetBy(1, 1);
36452a38012Sejakowatz 
36552a38012Sejakowatz 	// Second bevel
366*7a96554cSlooncraz 	SetHighColor(tint_color(backgroundColor, B_DARKEN_4_TINT));
367075e65c7SAxel Dörfler 	StrokeLine(rect.LeftBottom(), rect.LeftTop());
368075e65c7SAxel Dörfler 	StrokeLine(rect.RightTop());
36952a38012Sejakowatz 
370*7a96554cSlooncraz 	SetHighColor(backgroundColor);
371f466d35dSStephan Aßmus 	StrokeLine(BPoint(rect.left + 1, rect.bottom), rect.RightBottom());
372f466d35dSStephan Aßmus 	StrokeLine(BPoint(rect.right, rect.top + 1));
37352a38012Sejakowatz 
374075e65c7SAxel Dörfler 	rect = barFrame;
375075e65c7SAxel Dörfler 	rect.right = _BarPosition(barFrame);
37652a38012Sejakowatz 
377075e65c7SAxel Dörfler 	// draw bar itself
37852a38012Sejakowatz 
379075e65c7SAxel Dörfler 	if (rect.right >= rect.left) {
38052a38012Sejakowatz 		// Bevel
38152a38012Sejakowatz 		SetHighColor(tint_color(fBarColor, B_LIGHTEN_2_TINT));
382075e65c7SAxel Dörfler 		StrokeLine(rect.LeftBottom(), rect.LeftTop());
383075e65c7SAxel Dörfler 		StrokeLine(rect.RightTop());
38452a38012Sejakowatz 
38552a38012Sejakowatz 		SetHighColor(tint_color(fBarColor, B_DARKEN_2_TINT));
386f466d35dSStephan Aßmus 		StrokeLine(BPoint(rect.left + 1, rect.bottom), rect.RightBottom());
387f466d35dSStephan Aßmus 		StrokeLine(BPoint(rect.right, rect.top + 1));
38852a38012Sejakowatz 
389075e65c7SAxel Dörfler 		// filling
39052a38012Sejakowatz 		SetHighColor(fBarColor);
391f466d35dSStephan Aßmus 		FillRect(rect.InsetByCopy(1, 1));
392075e65c7SAxel Dörfler 	}
393075e65c7SAxel Dörfler 
394075e65c7SAxel Dörfler 	if (rect.right < barFrame.right) {
395075e65c7SAxel Dörfler 		// empty space
396f466d35dSStephan Aßmus 		rect.left = rect.right + 1;
397075e65c7SAxel Dörfler 		rect.right = barFrame.right;
398*7a96554cSlooncraz 		SetHighColor(tint_color(backgroundColor, B_LIGHTEN_MAX_TINT));
39952a38012Sejakowatz 		FillRect(rect);
40052a38012Sejakowatz 	}
40152a38012Sejakowatz }
4023583227cSStefano Ceccherini 
4033583227cSStefano Ceccherini 
4043583227cSStefano Ceccherini void
40589208c77SStephan Aßmus BStatusBar::MessageReceived(BMessage *message)
40689208c77SStephan Aßmus {
40789208c77SStephan Aßmus 	switch(message->what) {
40889208c77SStephan Aßmus 		case B_UPDATE_STATUS_BAR:
40989208c77SStephan Aßmus 		{
41089208c77SStephan Aßmus 			float delta;
41189208c77SStephan Aßmus 			const char *text = NULL, *trailing_text = NULL;
41289208c77SStephan Aßmus 
41389208c77SStephan Aßmus 			message->FindFloat("delta", &delta);
41489208c77SStephan Aßmus 			message->FindString("text", &text);
41589208c77SStephan Aßmus 			message->FindString("trailing_text", &trailing_text);
41689208c77SStephan Aßmus 
41789208c77SStephan Aßmus 			Update(delta, text, trailing_text);
41889208c77SStephan Aßmus 
41989208c77SStephan Aßmus 			break;
42089208c77SStephan Aßmus 		}
42189208c77SStephan Aßmus 
42289208c77SStephan Aßmus 		case B_RESET_STATUS_BAR:
42389208c77SStephan Aßmus 		{
42489208c77SStephan Aßmus 			const char *label = NULL, *trailing_label = NULL;
42589208c77SStephan Aßmus 
42689208c77SStephan Aßmus 			message->FindString("label", &label);
42789208c77SStephan Aßmus 			message->FindString("trailing_label", &trailing_label);
42889208c77SStephan Aßmus 
42989208c77SStephan Aßmus 			Reset(label, trailing_label);
43089208c77SStephan Aßmus 
43189208c77SStephan Aßmus 			break;
43289208c77SStephan Aßmus 		}
43389208c77SStephan Aßmus 
434*7a96554cSlooncraz 		case B_COLORS_UPDATED:
435*7a96554cSlooncraz 		{
436*7a96554cSlooncraz 			// Change the bar color IF we don't have an application-set color.
437*7a96554cSlooncraz 			if ((fInternalFlags & kCustomBarColor) == 0) {
438*7a96554cSlooncraz 				message->FindColor(ui_color_name(B_CONTROL_MARK_COLOR),
439*7a96554cSlooncraz 					&fBarColor);
440*7a96554cSlooncraz 			}
441*7a96554cSlooncraz 
442*7a96554cSlooncraz 			break;
443*7a96554cSlooncraz 		}
444*7a96554cSlooncraz 
44589208c77SStephan Aßmus 		default:
44689208c77SStephan Aßmus 			BView::MessageReceived(message);
44789208c77SStephan Aßmus 			break;
44889208c77SStephan Aßmus 	}
44989208c77SStephan Aßmus }
45089208c77SStephan Aßmus 
45189208c77SStephan Aßmus 
45289208c77SStephan Aßmus void
45389208c77SStephan Aßmus BStatusBar::MouseDown(BPoint point)
45489208c77SStephan Aßmus {
45589208c77SStephan Aßmus 	BView::MouseDown(point);
45689208c77SStephan Aßmus }
45789208c77SStephan Aßmus 
45889208c77SStephan Aßmus 
45989208c77SStephan Aßmus void
46089208c77SStephan Aßmus BStatusBar::MouseUp(BPoint point)
46189208c77SStephan Aßmus {
46289208c77SStephan Aßmus 	BView::MouseUp(point);
46389208c77SStephan Aßmus }
46489208c77SStephan Aßmus 
46589208c77SStephan Aßmus 
46689208c77SStephan Aßmus void
46789208c77SStephan Aßmus BStatusBar::MouseMoved(BPoint point, uint32 transit, const BMessage *message)
46889208c77SStephan Aßmus {
46989208c77SStephan Aßmus 	BView::MouseMoved(point, transit, message);
47089208c77SStephan Aßmus }
47189208c77SStephan Aßmus 
47289208c77SStephan Aßmus 
47389208c77SStephan Aßmus // #pragma mark -
47489208c77SStephan Aßmus 
47589208c77SStephan Aßmus 
47689208c77SStephan Aßmus void
4773583227cSStefano Ceccherini BStatusBar::SetBarColor(rgb_color color)
47852a38012Sejakowatz {
479*7a96554cSlooncraz 	fInternalFlags |= kCustomBarColor;
48030d24296SMarcus Overhagen 	fBarColor = color;
48152a38012Sejakowatz 
48252a38012Sejakowatz 	Invalidate();
48352a38012Sejakowatz }
4843583227cSStefano Ceccherini 
4853583227cSStefano Ceccherini 
4863583227cSStefano Ceccherini void
487075e65c7SAxel Dörfler BStatusBar::SetBarHeight(float barHeight)
48852a38012Sejakowatz {
489075e65c7SAxel Dörfler 	float oldHeight = BarHeight();
49052a38012Sejakowatz 
49152a38012Sejakowatz 	fCustomBarHeight = true;
492075e65c7SAxel Dörfler 	fBarHeight = barHeight;
493075e65c7SAxel Dörfler 
494075e65c7SAxel Dörfler 	if (barHeight == oldHeight)
495075e65c7SAxel Dörfler 		return;
496075e65c7SAxel Dörfler 
497075e65c7SAxel Dörfler 	// resize so that the height fits
49826fe4141SStephan Aßmus 	if ((Flags() & B_SUPPORTS_LAYOUT) != 0)
499a487da80SStephan Aßmus 		InvalidateLayout();
50026fe4141SStephan Aßmus 	else {
501075e65c7SAxel Dörfler 		float width, height;
502075e65c7SAxel Dörfler 		GetPreferredSize(&width, &height);
503075e65c7SAxel Dörfler 		ResizeTo(Bounds().Width(), height);
50452a38012Sejakowatz 	}
505a487da80SStephan Aßmus }
50652a38012Sejakowatz 
5073583227cSStefano Ceccherini 
5083583227cSStefano Ceccherini void
5093583227cSStefano Ceccherini BStatusBar::SetText(const char* string)
5103583227cSStefano Ceccherini {
511f466d35dSStephan Aßmus 	_SetTextData(fText, string, fLabel, false);
51252a38012Sejakowatz }
51352a38012Sejakowatz 
5143583227cSStefano Ceccherini 
5153583227cSStefano Ceccherini void
5163583227cSStefano Ceccherini BStatusBar::SetTrailingText(const char* string)
5173583227cSStefano Ceccherini {
518f466d35dSStephan Aßmus 	_SetTextData(fTrailingText, string, fTrailingLabel, true);
51952a38012Sejakowatz }
5203583227cSStefano Ceccherini 
5213583227cSStefano Ceccherini 
5223583227cSStefano Ceccherini void
5233583227cSStefano Ceccherini BStatusBar::SetMaxValue(float max)
52452a38012Sejakowatz {
525e51a01a5SRene Gollent 	// R5 and/or Zeta's SetMaxValue does not trigger an invalidate here.
526e51a01a5SRene Gollent 	// this is probably not ideal behavior, but it does break apps in some cases
527e51a01a5SRene Gollent 	// as observed with SpaceMonitor.
528e51a01a5SRene Gollent 	// TODO: revisit this when we break binary compatibility
52952a38012Sejakowatz 	fMax = max;
53052a38012Sejakowatz }
5313583227cSStefano Ceccherini 
5323583227cSStefano Ceccherini 
5333583227cSStefano Ceccherini void
5343583227cSStefano Ceccherini BStatusBar::Update(float delta, const char* text, const char* trailingText)
53552a38012Sejakowatz {
536ea1b25f5SStephan Aßmus 	// If any of these are NULL, the existing text remains (BeBook)
537ea1b25f5SStephan Aßmus 	if (text == NULL)
538ea1b25f5SStephan Aßmus 		text = fText.String();
539ea1b25f5SStephan Aßmus 	if (trailingText == NULL)
540ea1b25f5SStephan Aßmus 		trailingText = fTrailingText.String();
541075e65c7SAxel Dörfler 	BStatusBar::SetTo(fCurrent + delta, text, trailingText);
542075e65c7SAxel Dörfler }
54352a38012Sejakowatz 
544f45d1cc7SMarc Flerackers 
545075e65c7SAxel Dörfler void
54689208c77SStephan Aßmus BStatusBar::Reset(const char *label, const char *trailingLabel)
54789208c77SStephan Aßmus {
54889208c77SStephan Aßmus 	// Reset replaces the label and trailing label with copies of the
54989208c77SStephan Aßmus 	// strings passed as arguments. If either argument is NULL, the
55089208c77SStephan Aßmus 	// label or trailing label will be deleted and erased.
55189208c77SStephan Aßmus 	fLabel = label ? label : "";
55289208c77SStephan Aßmus 	fTrailingLabel = trailingLabel ? trailingLabel : "";
55389208c77SStephan Aßmus 
55489208c77SStephan Aßmus 	// Reset deletes and erases any text or trailing text
55589208c77SStephan Aßmus 	fText = "";
55689208c77SStephan Aßmus 	fTrailingText = "";
55789208c77SStephan Aßmus 
55889208c77SStephan Aßmus 	fCurrent = 0;
55989208c77SStephan Aßmus 	fMax = 100;
56089208c77SStephan Aßmus 
56189208c77SStephan Aßmus 	Invalidate();
56289208c77SStephan Aßmus }
56389208c77SStephan Aßmus 
56489208c77SStephan Aßmus 
56589208c77SStephan Aßmus void
566075e65c7SAxel Dörfler BStatusBar::SetTo(float value, const char* text, const char* trailingText)
567075e65c7SAxel Dörfler {
568a788be67SStephan Aßmus 	SetText(text);
569a788be67SStephan Aßmus 	SetTrailingText(trailingText);
57052a38012Sejakowatz 
571075e65c7SAxel Dörfler 	if (value > fMax)
572075e65c7SAxel Dörfler 		value = fMax;
573f466d35dSStephan Aßmus 	else if (value < 0)
574f466d35dSStephan Aßmus 		value = 0;
575075e65c7SAxel Dörfler 	if (value == fCurrent)
576075e65c7SAxel Dörfler 		return;
57752a38012Sejakowatz 
578075e65c7SAxel Dörfler 	BRect barFrame = _BarFrame();
579075e65c7SAxel Dörfler 	float oldPosition = _BarPosition(barFrame);
580075e65c7SAxel Dörfler 
581075e65c7SAxel Dörfler 	fCurrent = value;
582f466d35dSStephan Aßmus 
583075e65c7SAxel Dörfler 	float newPosition = _BarPosition(barFrame);
584075e65c7SAxel Dörfler 	if (oldPosition == newPosition)
585075e65c7SAxel Dörfler 		return;
586075e65c7SAxel Dörfler 
587f466d35dSStephan Aßmus 	// update only the part of the status bar with actual changes
588075e65c7SAxel Dörfler 	BRect update = barFrame;
589075e65c7SAxel Dörfler 	if (oldPosition < newPosition) {
590f466d35dSStephan Aßmus 		update.left = floorf(max_c(oldPosition - 1, update.left));
591f466d35dSStephan Aßmus 		update.right = ceilf(newPosition);
592075e65c7SAxel Dörfler 	} else {
593f466d35dSStephan Aßmus 		update.left = floorf(max_c(newPosition - 1, update.left));
594f466d35dSStephan Aßmus 		update.right = ceilf(oldPosition);
595075e65c7SAxel Dörfler 	}
596075e65c7SAxel Dörfler 
5972f86ba45SStephan Aßmus 	// TODO: Ask the BControlLook in the first place about dirty rect.
59857c5b09eSRyan Leavengood 	if (be_control_look != NULL)
5992f86ba45SStephan Aßmus 		update.InsetBy(-1, -1);
6002f86ba45SStephan Aßmus 
601075e65c7SAxel Dörfler 	Invalidate(update);
60252a38012Sejakowatz }
6033583227cSStefano Ceccherini 
6043583227cSStefano Ceccherini 
6053583227cSStefano Ceccherini float
6063583227cSStefano Ceccherini BStatusBar::CurrentValue() const
60752a38012Sejakowatz {
60852a38012Sejakowatz 	return fCurrent;
60952a38012Sejakowatz }
6103583227cSStefano Ceccherini 
6113583227cSStefano Ceccherini 
6123583227cSStefano Ceccherini float
6133583227cSStefano Ceccherini BStatusBar::MaxValue() const
61452a38012Sejakowatz {
61552a38012Sejakowatz 	return fMax;
61652a38012Sejakowatz }
6173583227cSStefano Ceccherini 
6183583227cSStefano Ceccherini 
6193583227cSStefano Ceccherini rgb_color
6203583227cSStefano Ceccherini BStatusBar::BarColor() const
62152a38012Sejakowatz {
62252a38012Sejakowatz 	return fBarColor;
62352a38012Sejakowatz }
6243583227cSStefano Ceccherini 
6253583227cSStefano Ceccherini 
6263583227cSStefano Ceccherini float
6273583227cSStefano Ceccherini BStatusBar::BarHeight() const
62852a38012Sejakowatz {
629f466d35dSStephan Aßmus 	if (!fCustomBarHeight && fBarHeight == -1) {
630075e65c7SAxel Dörfler 		// the default bar height is as height as the label
631075e65c7SAxel Dörfler 		font_height fontHeight;
632075e65c7SAxel Dörfler 		GetFontHeight(&fontHeight);
633075e65c7SAxel Dörfler 		const_cast<BStatusBar *>(this)->fBarHeight = fontHeight.ascent
634f466d35dSStephan Aßmus 			+ fontHeight.descent + 5;
63552a38012Sejakowatz 	}
63652a38012Sejakowatz 
637f466d35dSStephan Aßmus 	return ceilf(fBarHeight);
63852a38012Sejakowatz }
6393583227cSStefano Ceccherini 
6403583227cSStefano Ceccherini 
6413583227cSStefano Ceccherini const char *
6423583227cSStefano Ceccherini BStatusBar::Text() const
64352a38012Sejakowatz {
644075e65c7SAxel Dörfler 	return fText.String();
64552a38012Sejakowatz }
6463583227cSStefano Ceccherini 
6473583227cSStefano Ceccherini 
6483583227cSStefano Ceccherini const char *
6493583227cSStefano Ceccherini BStatusBar::TrailingText() const
65052a38012Sejakowatz {
651075e65c7SAxel Dörfler 	return fTrailingText.String();
65252a38012Sejakowatz }
6533583227cSStefano Ceccherini 
6543583227cSStefano Ceccherini 
6553583227cSStefano Ceccherini const char *
6563583227cSStefano Ceccherini BStatusBar::Label() const
65752a38012Sejakowatz {
658075e65c7SAxel Dörfler 	return fLabel.String();
65952a38012Sejakowatz }
6603583227cSStefano Ceccherini 
6613583227cSStefano Ceccherini 
6623583227cSStefano Ceccherini const char *
6633583227cSStefano Ceccherini BStatusBar::TrailingLabel() const
66452a38012Sejakowatz {
665075e65c7SAxel Dörfler 	return fTrailingLabel.String();
66652a38012Sejakowatz }
6673583227cSStefano Ceccherini 
6683583227cSStefano Ceccherini 
66989208c77SStephan Aßmus // #pragma mark -
6703583227cSStefano Ceccherini 
6713583227cSStefano Ceccherini 
6723583227cSStefano Ceccherini BHandler *
6733583227cSStefano Ceccherini BStatusBar::ResolveSpecifier(BMessage* message, int32 index,
674075e65c7SAxel Dörfler 	BMessage* specifier, int32 what, const char *property)
67552a38012Sejakowatz {
67652a38012Sejakowatz 	return BView::ResolveSpecifier(message, index, specifier, what, property);
67752a38012Sejakowatz }
6783583227cSStefano Ceccherini 
6793583227cSStefano Ceccherini 
6803583227cSStefano Ceccherini status_t
6813583227cSStefano Ceccherini BStatusBar::GetSupportedSuites(BMessage* data)
68252a38012Sejakowatz {
68352a38012Sejakowatz 	return BView::GetSupportedSuites(data);
68452a38012Sejakowatz }
6853583227cSStefano Ceccherini 
6863583227cSStefano Ceccherini 
6873583227cSStefano Ceccherini status_t
68839fbf550SOliver Tappe BStatusBar::Perform(perform_code code, void* _data)
68952a38012Sejakowatz {
69039fbf550SOliver Tappe 	switch (code) {
69139fbf550SOliver Tappe 		case PERFORM_CODE_MIN_SIZE:
69239fbf550SOliver Tappe 			((perform_data_min_size*)_data)->return_value
69339fbf550SOliver Tappe 				= BStatusBar::MinSize();
69439fbf550SOliver Tappe 			return B_OK;
69539fbf550SOliver Tappe 		case PERFORM_CODE_MAX_SIZE:
69639fbf550SOliver Tappe 			((perform_data_max_size*)_data)->return_value
69739fbf550SOliver Tappe 				= BStatusBar::MaxSize();
69839fbf550SOliver Tappe 			return B_OK;
69939fbf550SOliver Tappe 		case PERFORM_CODE_PREFERRED_SIZE:
70039fbf550SOliver Tappe 			((perform_data_preferred_size*)_data)->return_value
70139fbf550SOliver Tappe 				= BStatusBar::PreferredSize();
70239fbf550SOliver Tappe 			return B_OK;
70339fbf550SOliver Tappe 		case PERFORM_CODE_LAYOUT_ALIGNMENT:
70439fbf550SOliver Tappe 			((perform_data_layout_alignment*)_data)->return_value
70539fbf550SOliver Tappe 				= BStatusBar::LayoutAlignment();
70639fbf550SOliver Tappe 			return B_OK;
70739fbf550SOliver Tappe 		case PERFORM_CODE_HAS_HEIGHT_FOR_WIDTH:
70839fbf550SOliver Tappe 			((perform_data_has_height_for_width*)_data)->return_value
70939fbf550SOliver Tappe 				= BStatusBar::HasHeightForWidth();
71039fbf550SOliver Tappe 			return B_OK;
71139fbf550SOliver Tappe 		case PERFORM_CODE_GET_HEIGHT_FOR_WIDTH:
71239fbf550SOliver Tappe 		{
71339fbf550SOliver Tappe 			perform_data_get_height_for_width* data
71439fbf550SOliver Tappe 				= (perform_data_get_height_for_width*)_data;
71539fbf550SOliver Tappe 			BStatusBar::GetHeightForWidth(data->width, &data->min, &data->max,
71639fbf550SOliver Tappe 				&data->preferred);
71739fbf550SOliver Tappe 			return B_OK;
71839fbf550SOliver Tappe 		}
71939fbf550SOliver Tappe 		case PERFORM_CODE_SET_LAYOUT:
72039fbf550SOliver Tappe 		{
72139fbf550SOliver Tappe 			perform_data_set_layout* data = (perform_data_set_layout*)_data;
72239fbf550SOliver Tappe 			BStatusBar::SetLayout(data->layout);
72339fbf550SOliver Tappe 			return B_OK;
72439fbf550SOliver Tappe 		}
725eee4243dSAlex Wilson 		case PERFORM_CODE_LAYOUT_INVALIDATED:
72639fbf550SOliver Tappe 		{
727eee4243dSAlex Wilson 			perform_data_layout_invalidated* data
728eee4243dSAlex Wilson 				= (perform_data_layout_invalidated*)_data;
729eee4243dSAlex Wilson 			BStatusBar::LayoutInvalidated(data->descendants);
73039fbf550SOliver Tappe 			return B_OK;
73139fbf550SOliver Tappe 		}
73239fbf550SOliver Tappe 		case PERFORM_CODE_DO_LAYOUT:
73339fbf550SOliver Tappe 		{
73439fbf550SOliver Tappe 			BStatusBar::DoLayout();
73539fbf550SOliver Tappe 			return B_OK;
73639fbf550SOliver Tappe 		}
73739fbf550SOliver Tappe 	}
73839fbf550SOliver Tappe 
73939fbf550SOliver Tappe 	return BView::Perform(code, _data);
74052a38012Sejakowatz }
7413583227cSStefano Ceccherini 
7423583227cSStefano Ceccherini 
74389208c77SStephan Aßmus // #pragma mark -
74489208c77SStephan Aßmus 
74589208c77SStephan Aßmus 
746b5a071bcSStephan Aßmus extern "C" void
747075e65c7SAxel Dörfler _ReservedStatusBar1__10BStatusBar(BStatusBar* self, float value,
748075e65c7SAxel Dörfler 	const char* text, const char* trailingText)
749075e65c7SAxel Dörfler {
750075e65c7SAxel Dörfler 	self->BStatusBar::SetTo(value, text, trailingText);
751075e65c7SAxel Dörfler }
752075e65c7SAxel Dörfler 
753075e65c7SAxel Dörfler 
75452a38012Sejakowatz void BStatusBar::_ReservedStatusBar2() {}
75552a38012Sejakowatz void BStatusBar::_ReservedStatusBar3() {}
75652a38012Sejakowatz void BStatusBar::_ReservedStatusBar4() {}
75752a38012Sejakowatz 
7583583227cSStefano Ceccherini 
7593583227cSStefano Ceccherini BStatusBar &
760075e65c7SAxel Dörfler BStatusBar::operator=(const BStatusBar& other)
76152a38012Sejakowatz {
76252a38012Sejakowatz 	return *this;
76352a38012Sejakowatz }
76452a38012Sejakowatz 
7653583227cSStefano Ceccherini 
76689208c77SStephan Aßmus // #pragma mark -
76789208c77SStephan Aßmus 
76889208c77SStephan Aßmus 
76989208c77SStephan Aßmus void
77089208c77SStephan Aßmus BStatusBar::_InitObject()
77189208c77SStephan Aßmus {
77289208c77SStephan Aßmus 	fMax = 100.0;
77389208c77SStephan Aßmus 	fCurrent = 0.0;
77489208c77SStephan Aßmus 
77589208c77SStephan Aßmus 	fBarHeight = -1.0;
77689208c77SStephan Aßmus 	fTextDivider = Bounds().Width();
77789208c77SStephan Aßmus 
77889208c77SStephan Aßmus 	fCustomBarHeight = false;
779*7a96554cSlooncraz 	fInternalFlags = 0;
78089208c77SStephan Aßmus 
78189208c77SStephan Aßmus 	SetFlags(Flags() | B_FRAME_EVENTS);
78289208c77SStephan Aßmus }
78389208c77SStephan Aßmus 
78489208c77SStephan Aßmus 
7853583227cSStefano Ceccherini void
786f466d35dSStephan Aßmus BStatusBar::_SetTextData(BString& text, const char* source,
787f466d35dSStephan Aßmus 	const BString& combineWith, bool rightAligned)
7883583227cSStefano Ceccherini {
789a788be67SStephan Aßmus 	if (source == NULL)
790a788be67SStephan Aßmus 		source = "";
791a788be67SStephan Aßmus 
792075e65c7SAxel Dörfler 	// If there were no changes, we don't have to do anything
793075e65c7SAxel Dörfler 	if (text == source)
794075e65c7SAxel Dörfler 		return;
795075e65c7SAxel Dörfler 
7967ee23666SStephan Aßmus 	bool oldHasText = _HasText();
797075e65c7SAxel Dörfler 	text = source;
798f466d35dSStephan Aßmus 
799f466d35dSStephan Aßmus 	BString newString;
800f466d35dSStephan Aßmus 	if (rightAligned)
801f466d35dSStephan Aßmus 		newString << text << combineWith;
802f466d35dSStephan Aßmus 	else
803f466d35dSStephan Aßmus 		newString << combineWith << text;
804f466d35dSStephan Aßmus 
8057ee23666SStephan Aßmus 	if (oldHasText != _HasText())
8067ee23666SStephan Aßmus 		InvalidateLayout();
8077ee23666SStephan Aßmus 
808075e65c7SAxel Dörfler 	font_height fontHeight;
809075e65c7SAxel Dörfler 	GetFontHeight(&fontHeight);
810075e65c7SAxel Dörfler 
811f466d35dSStephan Aßmus //	Invalidate(BRect(position, 0, position + invalidateWidth,
812f466d35dSStephan Aßmus //		ceilf(fontHeight.ascent) + ceilf(fontHeight.descent)));
813f466d35dSStephan Aßmus // TODO: redrawing the entire area takes care of the edge case
814f466d35dSStephan Aßmus // where the left side string changes because of truncation and
815f466d35dSStephan Aßmus // part of it needs to be redrawn as well.
816f466d35dSStephan Aßmus 	Invalidate(BRect(0, 0, Bounds().right,
817f466d35dSStephan Aßmus 		ceilf(fontHeight.ascent) + ceilf(fontHeight.descent)));
8183583227cSStefano Ceccherini }
8193583227cSStefano Ceccherini 
8203583227cSStefano Ceccherini 
821075e65c7SAxel Dörfler /*!
822075e65c7SAxel Dörfler 	Returns the inner bar frame without the surrounding bevel.
823075e65c7SAxel Dörfler */
824075e65c7SAxel Dörfler BRect
825075e65c7SAxel Dörfler BStatusBar::_BarFrame(const font_height* fontHeight) const
8263583227cSStefano Ceccherini {
827a487da80SStephan Aßmus 	float top = 2;
828a487da80SStephan Aßmus 	if (_HasText()) {
829075e65c7SAxel Dörfler 		if (fontHeight == NULL) {
830075e65c7SAxel Dörfler 			font_height height;
831075e65c7SAxel Dörfler 			GetFontHeight(&height);
832f466d35dSStephan Aßmus 			top = ceilf(height.ascent + height.descent) + 6;
833075e65c7SAxel Dörfler 		} else
834f466d35dSStephan Aßmus 			top = ceilf(fontHeight->ascent + fontHeight->descent) + 6;
835a487da80SStephan Aßmus 	}
8363583227cSStefano Ceccherini 
837f466d35dSStephan Aßmus 	return BRect(2, top, Bounds().right - 2, top + BarHeight() - 4);
8383583227cSStefano Ceccherini }
8393583227cSStefano Ceccherini 
8403583227cSStefano Ceccherini 
841075e65c7SAxel Dörfler float
842075e65c7SAxel Dörfler BStatusBar::_BarPosition(const BRect& barFrame) const
8433583227cSStefano Ceccherini {
844f466d35dSStephan Aßmus 	if (fCurrent == 0)
845f466d35dSStephan Aßmus 		return barFrame.left - 1;
846075e65c7SAxel Dörfler 
8472f86ba45SStephan Aßmus 	return roundf(barFrame.left - 1
8482f86ba45SStephan Aßmus 		+ (fCurrent * (barFrame.Width() + 3) / fMax));
8493583227cSStefano Ceccherini }
8503583227cSStefano Ceccherini 
851a487da80SStephan Aßmus 
852a487da80SStephan Aßmus bool
853a487da80SStephan Aßmus BStatusBar::_HasText() const
854a487da80SStephan Aßmus {
8557ee23666SStephan Aßmus 	// Force BeOS behavior where the size of the BStatusBar always included
8567ee23666SStephan Aßmus 	// room for labels, even when there weren't any.
8577ee23666SStephan Aßmus 	if ((Flags() & B_SUPPORTS_LAYOUT) == 0)
8587ee23666SStephan Aßmus 		return true;
859a487da80SStephan Aßmus 	return fLabel.Length() > 0 || fTrailingLabel.Length() > 0
860a487da80SStephan Aßmus 		|| fTrailingText.Length() > 0 || fText.Length() > 0;
861a487da80SStephan Aßmus }
862