xref: /haiku/src/kits/interface/StatusBar.cpp (revision 30d242965db63ca6af29695a8422620ce146a9eb)
199f695c9SAxel Dörfler /*
299f695c9SAxel Dörfler  * Copyright 2001-2006, Haiku.
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)
799f695c9SAxel Dörfler  */
899f695c9SAxel Dörfler 
999f695c9SAxel Dörfler /*! BStatusBar displays a "percentage-of-completion" gauge. */
1052a38012Sejakowatz 
113583227cSStefano Ceccherini #include <Debug.h>
1252a38012Sejakowatz #include <Message.h>
133583227cSStefano Ceccherini #include <StatusBar.h>
1452a38012Sejakowatz 
1599f695c9SAxel Dörfler #include <stdlib.h>
1699f695c9SAxel Dörfler #include <string.h>
1799f695c9SAxel Dörfler 
1852a38012Sejakowatz 
1952a38012Sejakowatz BStatusBar::BStatusBar(BRect frame, const char *name, const char *label,
2052a38012Sejakowatz 					   const char *trailingLabel)
21eb997429SMarc Flerackers 	:	BView(frame, name, B_FOLLOW_LEFT | B_FOLLOW_TOP, B_WILL_DRAW),
225e959958SStefano Ceccherini 		fLabel(NULL),
235e959958SStefano Ceccherini 		fTrailingLabel(NULL),
2452a38012Sejakowatz 		fText(NULL),
2552a38012Sejakowatz 		fTrailingText(NULL),
2652a38012Sejakowatz 		fMax(100.0f),
2752a38012Sejakowatz 		fCurrent(0.0f),
2852a38012Sejakowatz 		fBarHeight(-1.0f),
2952a38012Sejakowatz 		fTrailingWidth(-1.0f),
3052a38012Sejakowatz 		fEraseText(-1.0f),
3152a38012Sejakowatz 		fEraseTrailingText(-1.0f),
3252a38012Sejakowatz 		fCustomBarHeight(false)
3352a38012Sejakowatz 
3452a38012Sejakowatz {
353583227cSStefano Ceccherini 	// TODO: Move initializer list and other stuff to InitObject
363583227cSStefano Ceccherini 	InitObject(label, trailingLabel);
3752a38012Sejakowatz 
38*30d24296SMarcus Overhagen 	fBarColor.set_to(50, 150, 255, 255);
3952a38012Sejakowatz }
403583227cSStefano Ceccherini 
413583227cSStefano Ceccherini 
4252a38012Sejakowatz BStatusBar::BStatusBar(BMessage *archive)
4352a38012Sejakowatz 	:	BView(archive),
445e959958SStefano Ceccherini 		fLabel(NULL),
455e959958SStefano Ceccherini 		fTrailingLabel(NULL),
46679d063bSStefano Ceccherini 		fText(NULL),
47679d063bSStefano Ceccherini 		fTrailingText(NULL),
48679d063bSStefano Ceccherini 		fMax(100.0f),
49679d063bSStefano Ceccherini 		fCurrent(0.0f),
50679d063bSStefano Ceccherini 		fBarHeight(-1.0f),
5152a38012Sejakowatz 		fTrailingWidth(-1.0f),
5252a38012Sejakowatz 		fEraseText(-1.0f),
5352a38012Sejakowatz 		fEraseTrailingText(-1.0f),
5452a38012Sejakowatz 		fCustomBarHeight(false)
5552a38012Sejakowatz {
563583227cSStefano Ceccherini 	const char *label = NULL;
573583227cSStefano Ceccherini 	const char *trailingLabel = NULL;
583583227cSStefano Ceccherini 	archive->FindString("_label", &label);
593583227cSStefano Ceccherini 	archive->FindString("_tlabel", &trailingLabel);
603583227cSStefano Ceccherini 
613583227cSStefano Ceccherini 	InitObject(label, trailingLabel);
623583227cSStefano Ceccherini 
6352a38012Sejakowatz 	if (archive->FindFloat("_high", &fBarHeight) != B_OK)
6452a38012Sejakowatz 		fBarHeight = -1.0f;
6552a38012Sejakowatz 
66*30d24296SMarcus Overhagen 	if (archive->FindInt32("_bcolor", (int32 *)&fBarColor) < B_OK)
67*30d24296SMarcus Overhagen 		fBarColor.set_to(50, 150, 255, 255);
6852a38012Sejakowatz 
693583227cSStefano Ceccherini 	if (archive->FindFloat("_val", &fCurrent) < B_OK)
7052a38012Sejakowatz 		fCurrent = 0.0f;
7152a38012Sejakowatz 
723583227cSStefano Ceccherini 	if (archive->FindFloat("_max", &fMax) < B_OK)
7352a38012Sejakowatz 		fMax = 100.0f;
7452a38012Sejakowatz 
7552a38012Sejakowatz 	const char *string;
7652a38012Sejakowatz 
773583227cSStefano Ceccherini 	if (archive->FindString("_text", &string) < B_OK)
7852a38012Sejakowatz 		fText = NULL;
7952a38012Sejakowatz 	else
8052a38012Sejakowatz 		fText = strdup(string);
8152a38012Sejakowatz 
823583227cSStefano Ceccherini 	if (archive->FindString("_ttext", &string) < B_OK)
8352a38012Sejakowatz 		fTrailingText = NULL;
8452a38012Sejakowatz 	else
8552a38012Sejakowatz 		fTrailingText = strdup(string);
8652a38012Sejakowatz 
8752a38012Sejakowatz }
883583227cSStefano Ceccherini 
893583227cSStefano Ceccherini 
9052a38012Sejakowatz BStatusBar::~BStatusBar()
9152a38012Sejakowatz {
92eb997429SMarc Flerackers 	free(fLabel);
93eb997429SMarc Flerackers 	free(fTrailingLabel);
94eb997429SMarc Flerackers 	free(fText);
95eb997429SMarc Flerackers 	free(fTrailingText);
9652a38012Sejakowatz }
973583227cSStefano Ceccherini 
983583227cSStefano Ceccherini 
993583227cSStefano Ceccherini BArchivable *
1003583227cSStefano Ceccherini BStatusBar::Instantiate(BMessage *archive)
10152a38012Sejakowatz {
10252a38012Sejakowatz 	if (validate_instantiation(archive, "BStatusBar"))
10352a38012Sejakowatz 		return new BStatusBar(archive);
10452a38012Sejakowatz 
10552a38012Sejakowatz 	return NULL;
10652a38012Sejakowatz }
1073583227cSStefano Ceccherini 
1083583227cSStefano Ceccherini 
1093583227cSStefano Ceccherini status_t
1103583227cSStefano Ceccherini BStatusBar::Archive(BMessage *archive, bool deep) const
11152a38012Sejakowatz {
1128f3e1554SMarc Flerackers 	status_t err = BView::Archive(archive, deep);
1138f3e1554SMarc Flerackers 
1143583227cSStefano Ceccherini 	if (err < B_OK)
1158f3e1554SMarc Flerackers 		return err;
11652a38012Sejakowatz 
11752a38012Sejakowatz 	if (fBarHeight != 16.0f)
1188f3e1554SMarc Flerackers 		err = archive->AddFloat("_high", fBarHeight);
1198f3e1554SMarc Flerackers 
1203583227cSStefano Ceccherini 	if (err < B_OK)
1218f3e1554SMarc Flerackers 		return err;
12252a38012Sejakowatz 
123b56e4e65SDarkWyrm 	// DW: I'm pretty sure we don't need to compare the color with (50, 150, 255) ?
124*30d24296SMarcus Overhagen 	err = archive->AddInt32("_bcolor", (const uint32 &)fBarColor);
1258f3e1554SMarc Flerackers 
1263583227cSStefano Ceccherini 	if (err < B_OK)
1278f3e1554SMarc Flerackers 		return err;
12852a38012Sejakowatz 
12952a38012Sejakowatz 	if (fCurrent != 0.0f)
1308f3e1554SMarc Flerackers 		err = archive->AddFloat("_val", fCurrent);
1318f3e1554SMarc Flerackers 
1323583227cSStefano Ceccherini 	if (err < B_OK)
1338f3e1554SMarc Flerackers 		return err;
13452a38012Sejakowatz 
13552a38012Sejakowatz 	if (fMax != 100.0f )
1368f3e1554SMarc Flerackers 		err = archive->AddFloat("_max", fMax);
1378f3e1554SMarc Flerackers 
1383583227cSStefano Ceccherini 	if (err < B_OK)
1398f3e1554SMarc Flerackers 		return err;
14052a38012Sejakowatz 
14152a38012Sejakowatz 	if (fText )
1428f3e1554SMarc Flerackers 		err = archive->AddString("_text", fText);
1438f3e1554SMarc Flerackers 
1443583227cSStefano Ceccherini 	if (err < B_OK)
1458f3e1554SMarc Flerackers 		return err;
14652a38012Sejakowatz 
14752a38012Sejakowatz 	if (fTrailingText)
1488f3e1554SMarc Flerackers 		err = archive->AddString("_ttext", fTrailingText);
1498f3e1554SMarc Flerackers 
1503583227cSStefano Ceccherini 	if (err < B_OK)
1518f3e1554SMarc Flerackers 		return err;
15252a38012Sejakowatz 
15352a38012Sejakowatz 	if (fLabel)
1548f3e1554SMarc Flerackers 		err = archive->AddString("_label", fLabel);
1558f3e1554SMarc Flerackers 
1563583227cSStefano Ceccherini 	if (err < B_OK)
1578f3e1554SMarc Flerackers 		return err;
15852a38012Sejakowatz 
15952a38012Sejakowatz 	if (fTrailingLabel)
1608f3e1554SMarc Flerackers 		err = archive->AddString ("_tlabel", fTrailingLabel);
16152a38012Sejakowatz 
1628f3e1554SMarc Flerackers 	return err;
16352a38012Sejakowatz }
1643583227cSStefano Ceccherini 
1653583227cSStefano Ceccherini 
1663583227cSStefano Ceccherini void
1673583227cSStefano Ceccherini BStatusBar::AttachedToWindow()
16852a38012Sejakowatz {
16952a38012Sejakowatz 	float width, height;
17052a38012Sejakowatz 	GetPreferredSize(&width, &height);
17152a38012Sejakowatz 	ResizeTo(Frame().Width(), height);
17252a38012Sejakowatz 
1733583227cSStefano Ceccherini 	if (Parent()) {
17452a38012Sejakowatz 		SetViewColor(Parent()->ViewColor());
175b7b28df0Shaydentech 		SetLowColor(Parent()->ViewColor());
176b7b28df0Shaydentech 	}
17752a38012Sejakowatz }
1783583227cSStefano Ceccherini 
1793583227cSStefano Ceccherini 
1803583227cSStefano Ceccherini void
1813583227cSStefano Ceccherini BStatusBar::MessageReceived(BMessage *message)
18252a38012Sejakowatz {
1833583227cSStefano Ceccherini 	switch(message->what) {
18452a38012Sejakowatz 		case B_UPDATE_STATUS_BAR:
18552a38012Sejakowatz 		{
18652a38012Sejakowatz 			float delta;
18752a38012Sejakowatz 			const char *text = NULL, *trailing_text = NULL;
18852a38012Sejakowatz 
18952a38012Sejakowatz 			message->FindFloat("delta", &delta);
19052a38012Sejakowatz 			message->FindString("text", &text);
191ec053666SStefano Ceccherini 			message->FindString("trailing_text", &trailing_text);
19252a38012Sejakowatz 
19352a38012Sejakowatz 			Update(delta, text, trailing_text);
19452a38012Sejakowatz 
19552a38012Sejakowatz 			break;
19652a38012Sejakowatz 		}
1973583227cSStefano Ceccherini 
19852a38012Sejakowatz 		case B_RESET_STATUS_BAR:
19952a38012Sejakowatz 		{
20052a38012Sejakowatz 			const char *label = NULL, *trailing_label = NULL;
20152a38012Sejakowatz 
20252a38012Sejakowatz 			message->FindString("label", &label);
203ec053666SStefano Ceccherini 			message->FindString("trailing_label", &trailing_label);
20452a38012Sejakowatz 
20552a38012Sejakowatz 			Reset(label, trailing_label);
20652a38012Sejakowatz 
20752a38012Sejakowatz 			break;
20852a38012Sejakowatz 		}
2093583227cSStefano Ceccherini 
21052a38012Sejakowatz 		default:
21152a38012Sejakowatz 			BView::MessageReceived(message);
2123583227cSStefano Ceccherini 			break;
21352a38012Sejakowatz 	}
21452a38012Sejakowatz }
2153583227cSStefano Ceccherini 
2163583227cSStefano Ceccherini 
2173583227cSStefano Ceccherini void
2183583227cSStefano Ceccherini BStatusBar::Draw(BRect updateRect)
21952a38012Sejakowatz {
22052a38012Sejakowatz 	float width = Frame().Width();
22152a38012Sejakowatz 	font_height fh;
22252a38012Sejakowatz 	GetFontHeight(&fh);
22352a38012Sejakowatz 
22452a38012Sejakowatz 	SetHighColor(0, 0, 0);
2250dc199a5SMarc Flerackers 	MovePenTo(2.0f, (float)ceil(fh.ascent) + 1.0f);
2260dc199a5SMarc Flerackers 
2270dc199a5SMarc Flerackers 	if (fLabel)
2280dc199a5SMarc Flerackers 		DrawString(fLabel);
2290dc199a5SMarc Flerackers 	if (fText)
2300dc199a5SMarc Flerackers 		DrawString(fText);
2310dc199a5SMarc Flerackers 
2323583227cSStefano Ceccherini 	if (fTrailingText) {
2333583227cSStefano Ceccherini 		if (fTrailingLabel) {
2340dc199a5SMarc Flerackers 			MovePenTo(width - StringWidth(fTrailingText) -
2350dc199a5SMarc Flerackers 			StringWidth(fTrailingLabel) - 2.0f,
2360dc199a5SMarc Flerackers 			(float)ceil(fh.ascent) + 1.0f);
2370dc199a5SMarc Flerackers 			DrawString(fTrailingText);
2380dc199a5SMarc Flerackers 			DrawString(fTrailingLabel);
2393583227cSStefano Ceccherini 		} else {
2400dc199a5SMarc Flerackers 			MovePenTo(width - StringWidth(fTrailingText) - 2.0f,
2410dc199a5SMarc Flerackers 			(float)ceil(fh.ascent) + 1.0f);
2420dc199a5SMarc Flerackers 			DrawString(fTrailingText);
24352a38012Sejakowatz 		}
24452a38012Sejakowatz 
2453583227cSStefano Ceccherini 	} else if (fTrailingLabel) {
2460dc199a5SMarc Flerackers 		MovePenTo(width - StringWidth(fTrailingLabel) - 2.0f,
2470dc199a5SMarc Flerackers 			(float)ceil(fh.ascent) + 1.0f);
2480dc199a5SMarc Flerackers 		DrawString(fTrailingLabel);
2490dc199a5SMarc Flerackers 	}
2500dc199a5SMarc Flerackers 
2510dc199a5SMarc Flerackers 	BRect rect(0.0f, (float)ceil(fh.ascent) + 4.0f, width,
2520dc199a5SMarc Flerackers 		(float)ceil(fh.ascent) + 4.0f + fBarHeight);
25352a38012Sejakowatz 
25452a38012Sejakowatz 	// First bevel
25552a38012Sejakowatz 	SetHighColor(tint_color(ui_color ( B_PANEL_BACKGROUND_COLOR ), B_DARKEN_1_TINT));
25652a38012Sejakowatz 	StrokeLine(BPoint(rect.left, rect.bottom), BPoint(rect.left, rect.top));
25752a38012Sejakowatz 	StrokeLine(BPoint(rect.right, rect.top));
25852a38012Sejakowatz 
25952a38012Sejakowatz 	SetHighColor(tint_color(ui_color(B_PANEL_BACKGROUND_COLOR), B_LIGHTEN_2_TINT));
26052a38012Sejakowatz 	StrokeLine(BPoint(rect.left + 1.0f, rect.bottom), BPoint(rect.right, rect.bottom));
26152a38012Sejakowatz 	StrokeLine(BPoint(rect.right, rect.top + 1.0f));
26252a38012Sejakowatz 
26352a38012Sejakowatz 	rect.InsetBy(1.0f, 1.0f);
26452a38012Sejakowatz 
26552a38012Sejakowatz 	// Second bevel
26652a38012Sejakowatz 	SetHighColor(tint_color(ui_color ( B_PANEL_BACKGROUND_COLOR ), B_DARKEN_4_TINT));
26752a38012Sejakowatz 	StrokeLine(BPoint(rect.left, rect.bottom), BPoint(rect.left, rect.top));
26852a38012Sejakowatz 	StrokeLine(BPoint(rect.right, rect.top));
26952a38012Sejakowatz 
27052a38012Sejakowatz 	SetHighColor(ui_color(B_PANEL_BACKGROUND_COLOR));
27152a38012Sejakowatz 	StrokeLine(BPoint(rect.left + 1.0f, rect.bottom), BPoint(rect.right, rect.bottom));
27252a38012Sejakowatz 	StrokeLine(BPoint(rect.right, rect.top + 1.0f));
27352a38012Sejakowatz 
27452a38012Sejakowatz 	rect.InsetBy(1.0f, 1.0f);
27552a38012Sejakowatz 
27652a38012Sejakowatz 	// Filling
27752a38012Sejakowatz 	SetHighColor(tint_color(ui_color(B_PANEL_BACKGROUND_COLOR), B_LIGHTEN_MAX_TINT));
27852a38012Sejakowatz 	FillRect(rect);
27952a38012Sejakowatz 
2803583227cSStefano Ceccherini 	if (fCurrent != 0.0f) {
28152a38012Sejakowatz 		rect.right = rect.left + (float)ceil(fCurrent * (width - 4) / fMax),
28252a38012Sejakowatz 
28352a38012Sejakowatz 		// Bevel
28452a38012Sejakowatz 		SetHighColor(tint_color(fBarColor, B_LIGHTEN_2_TINT));
28552a38012Sejakowatz 		StrokeLine(BPoint(rect.left, rect.bottom), BPoint(rect.left, rect.top));
28652a38012Sejakowatz 		StrokeLine(BPoint(rect.right, rect.top));
28752a38012Sejakowatz 
28852a38012Sejakowatz 		SetHighColor(tint_color(fBarColor, B_DARKEN_2_TINT));
28952a38012Sejakowatz 		StrokeLine(BPoint(rect.left, rect.bottom), BPoint(rect.right, rect.bottom));
29052a38012Sejakowatz 		StrokeLine(BPoint(rect.right, rect.top));
29152a38012Sejakowatz 
29252a38012Sejakowatz 		rect.InsetBy(1.0f, 1.0f);
29352a38012Sejakowatz 
29452a38012Sejakowatz 		// Filling
29552a38012Sejakowatz 		SetHighColor(fBarColor);
29652a38012Sejakowatz 		FillRect(rect);
29752a38012Sejakowatz 	}
29852a38012Sejakowatz }
2993583227cSStefano Ceccherini 
3003583227cSStefano Ceccherini 
3013583227cSStefano Ceccherini void
3023583227cSStefano Ceccherini BStatusBar::SetBarColor(rgb_color color)
30352a38012Sejakowatz {
304*30d24296SMarcus Overhagen 	fBarColor = color;
30552a38012Sejakowatz 
30652a38012Sejakowatz 	Invalidate();
30752a38012Sejakowatz }
3083583227cSStefano Ceccherini 
3093583227cSStefano Ceccherini 
3103583227cSStefano Ceccherini void
3113583227cSStefano Ceccherini BStatusBar::SetBarHeight(float height)
31252a38012Sejakowatz {
31352a38012Sejakowatz 	BRect frame = Frame();
31452a38012Sejakowatz 
31552a38012Sejakowatz 	fBarHeight = height;
31652a38012Sejakowatz 	fCustomBarHeight = true;
31752a38012Sejakowatz 	ResizeTo(frame.Width(), fBarHeight + 16);
31852a38012Sejakowatz }
31952a38012Sejakowatz 
3203583227cSStefano Ceccherini 
3213583227cSStefano Ceccherini void
3223583227cSStefano Ceccherini BStatusBar::SetText(const char *string)
3233583227cSStefano Ceccherini {
3243583227cSStefano Ceccherini 	SetTextData(&fText, string);
32552a38012Sejakowatz 
32652a38012Sejakowatz 	Invalidate();
32752a38012Sejakowatz }
32852a38012Sejakowatz 
3293583227cSStefano Ceccherini 
3303583227cSStefano Ceccherini void
3313583227cSStefano Ceccherini BStatusBar::SetTrailingText(const char *string)
3323583227cSStefano Ceccherini {
3333583227cSStefano Ceccherini 	SetTextData(&fTrailingText, string);
33452a38012Sejakowatz 
33552a38012Sejakowatz 	Invalidate();
33652a38012Sejakowatz }
3373583227cSStefano Ceccherini 
3383583227cSStefano Ceccherini 
3393583227cSStefano Ceccherini void
3403583227cSStefano Ceccherini BStatusBar::SetMaxValue(float max)
34152a38012Sejakowatz {
34252a38012Sejakowatz 	fMax = max;
34352a38012Sejakowatz 
34452a38012Sejakowatz 	Invalidate();
34552a38012Sejakowatz }
3463583227cSStefano Ceccherini 
3473583227cSStefano Ceccherini 
3483583227cSStefano Ceccherini void
3493583227cSStefano Ceccherini BStatusBar::Update(float delta, const char *text, const char *trailingText)
35052a38012Sejakowatz {
35152a38012Sejakowatz 	fCurrent += delta;
35252a38012Sejakowatz 
353f45d1cc7SMarc Flerackers 	if (fCurrent > fMax)
354f45d1cc7SMarc Flerackers 		fCurrent = fMax;
355f45d1cc7SMarc Flerackers 
35697c93182Shaydentech 	// Passing NULL for the text or trailingText argument retains the previous
35797c93182Shaydentech 	// text or trailing text string.
35897c93182Shaydentech 	if (text)
3593583227cSStefano Ceccherini 		SetTextData(&fText, text);
36052a38012Sejakowatz 
36197c93182Shaydentech 	if (trailingText)
3623583227cSStefano Ceccherini 		SetTextData(&fTrailingText, trailingText);
36352a38012Sejakowatz 
36452a38012Sejakowatz 	Invalidate();
36552a38012Sejakowatz }
3663583227cSStefano Ceccherini 
3673583227cSStefano Ceccherini 
3683583227cSStefano Ceccherini void
3693583227cSStefano Ceccherini BStatusBar::Reset(const char *label, const char *trailingLabel)
37052a38012Sejakowatz {
37197c93182Shaydentech 	// Reset replaces the label and trailing label with copies of the
37297c93182Shaydentech 	// strings passed as arguments. If either argument is NULL, the
37397c93182Shaydentech 	// label or trailing label will be deleted and erased.
3743583227cSStefano Ceccherini 	SetTextData(&fLabel, label);
3753583227cSStefano Ceccherini 	SetTextData(&fTrailingLabel, trailingLabel);
37652a38012Sejakowatz 
37797c93182Shaydentech 	// Reset deletes and erases any text or trailing text
3783583227cSStefano Ceccherini 	SetTextData(&fText, NULL);
3793583227cSStefano Ceccherini 	SetTextData(&fTrailingText, NULL);
380b7b28df0Shaydentech 
38152a38012Sejakowatz 	fCurrent = 0.0f;
382b7b28df0Shaydentech 	fMax = 100.0f;
38352a38012Sejakowatz 
38452a38012Sejakowatz 	Invalidate();
38552a38012Sejakowatz }
3863583227cSStefano Ceccherini 
3873583227cSStefano Ceccherini 
3883583227cSStefano Ceccherini float
3893583227cSStefano Ceccherini BStatusBar::CurrentValue() const
39052a38012Sejakowatz {
39152a38012Sejakowatz 	return fCurrent;
39252a38012Sejakowatz }
3933583227cSStefano Ceccherini 
3943583227cSStefano Ceccherini 
3953583227cSStefano Ceccherini float
3963583227cSStefano Ceccherini BStatusBar::MaxValue() const
39752a38012Sejakowatz {
39852a38012Sejakowatz 	return fMax;
39952a38012Sejakowatz }
4003583227cSStefano Ceccherini 
4013583227cSStefano Ceccherini 
4023583227cSStefano Ceccherini rgb_color
4033583227cSStefano Ceccherini BStatusBar::BarColor() const
40452a38012Sejakowatz {
40552a38012Sejakowatz 	return fBarColor;
40652a38012Sejakowatz }
4073583227cSStefano Ceccherini 
4083583227cSStefano Ceccherini 
4093583227cSStefano Ceccherini float
4103583227cSStefano Ceccherini BStatusBar::BarHeight() const
41152a38012Sejakowatz {
4123583227cSStefano Ceccherini 	if (!fCustomBarHeight && fBarHeight == -1.0f) {
41352a38012Sejakowatz 		font_height fh;
41452a38012Sejakowatz 		GetFontHeight(&fh);
4153583227cSStefano Ceccherini 		const_cast<BStatusBar *>(this)->fBarHeight = fh.ascent + fh.descent + 6.0f;
41652a38012Sejakowatz 	}
41752a38012Sejakowatz 
41852a38012Sejakowatz 	return fBarHeight;
41952a38012Sejakowatz }
4203583227cSStefano Ceccherini 
4213583227cSStefano Ceccherini 
4223583227cSStefano Ceccherini const char *
4233583227cSStefano Ceccherini BStatusBar::Text() const
42452a38012Sejakowatz {
42552a38012Sejakowatz 	return fText;
42652a38012Sejakowatz }
4273583227cSStefano Ceccherini 
4283583227cSStefano Ceccherini 
4293583227cSStefano Ceccherini const char *
4303583227cSStefano Ceccherini BStatusBar::TrailingText() const
43152a38012Sejakowatz {
43252a38012Sejakowatz 	return fTrailingText;
43352a38012Sejakowatz }
4343583227cSStefano Ceccherini 
4353583227cSStefano Ceccherini 
4363583227cSStefano Ceccherini const char *
4373583227cSStefano Ceccherini BStatusBar::Label() const
43852a38012Sejakowatz {
43952a38012Sejakowatz 	return fLabel;
44052a38012Sejakowatz }
4413583227cSStefano Ceccherini 
4423583227cSStefano Ceccherini 
4433583227cSStefano Ceccherini const char *
4443583227cSStefano Ceccherini BStatusBar::TrailingLabel() const
44552a38012Sejakowatz {
44652a38012Sejakowatz 	return fTrailingLabel;
44752a38012Sejakowatz }
4483583227cSStefano Ceccherini 
4493583227cSStefano Ceccherini 
4503583227cSStefano Ceccherini void
4513583227cSStefano Ceccherini BStatusBar::MouseDown(BPoint point)
45252a38012Sejakowatz {
45352a38012Sejakowatz 	BView::MouseDown(point);
45452a38012Sejakowatz }
4553583227cSStefano Ceccherini 
4563583227cSStefano Ceccherini 
4573583227cSStefano Ceccherini void
4583583227cSStefano Ceccherini BStatusBar::MouseUp(BPoint point)
45952a38012Sejakowatz {
46052a38012Sejakowatz 	BView::MouseUp(point);
46152a38012Sejakowatz }
4623583227cSStefano Ceccherini 
4633583227cSStefano Ceccherini 
4643583227cSStefano Ceccherini void
4653583227cSStefano Ceccherini BStatusBar::WindowActivated(bool state)
46652a38012Sejakowatz {
46752a38012Sejakowatz 	BView::WindowActivated(state);
46852a38012Sejakowatz }
4693583227cSStefano Ceccherini 
4703583227cSStefano Ceccherini 
4713583227cSStefano Ceccherini void
4723583227cSStefano Ceccherini BStatusBar::MouseMoved(BPoint point, uint32 transit, const BMessage *message)
47352a38012Sejakowatz {
47452a38012Sejakowatz 	BView::MouseMoved(point, transit, message);
47552a38012Sejakowatz }
4763583227cSStefano Ceccherini 
4773583227cSStefano Ceccherini 
4783583227cSStefano Ceccherini void
4793583227cSStefano Ceccherini BStatusBar::DetachedFromWindow()
48052a38012Sejakowatz {
48152a38012Sejakowatz 	BView::DetachedFromWindow();
48252a38012Sejakowatz }
4833583227cSStefano Ceccherini 
4843583227cSStefano Ceccherini 
4853583227cSStefano Ceccherini void
4863583227cSStefano Ceccherini BStatusBar::FrameMoved(BPoint newPosition)
48752a38012Sejakowatz {
4883583227cSStefano Ceccherini 	BView::FrameMoved(newPosition);
48952a38012Sejakowatz }
4903583227cSStefano Ceccherini 
4913583227cSStefano Ceccherini 
4923583227cSStefano Ceccherini void
4933583227cSStefano Ceccherini BStatusBar::FrameResized(float newWidth, float newHeight)
49452a38012Sejakowatz {
4953583227cSStefano Ceccherini 	BView::FrameResized(newWidth, newHeight);
49652a38012Sejakowatz }
4973583227cSStefano Ceccherini 
4983583227cSStefano Ceccherini 
4993583227cSStefano Ceccherini BHandler *
5003583227cSStefano Ceccherini BStatusBar::ResolveSpecifier(BMessage *message, int32 index,
50152a38012Sejakowatz 									   BMessage *specifier,
50252a38012Sejakowatz 									   int32 what, const char *property)
50352a38012Sejakowatz {
50452a38012Sejakowatz 	return BView::ResolveSpecifier(message, index, specifier, what, property);
50552a38012Sejakowatz }
5063583227cSStefano Ceccherini 
5073583227cSStefano Ceccherini 
5083583227cSStefano Ceccherini void
5093583227cSStefano Ceccherini BStatusBar::ResizeToPreferred()
51052a38012Sejakowatz {
51152a38012Sejakowatz 	BView::ResizeToPreferred();
51252a38012Sejakowatz }
5133583227cSStefano Ceccherini 
5143583227cSStefano Ceccherini 
5153583227cSStefano Ceccherini void
5168643b098SAxel Dörfler BStatusBar::GetPreferredSize(float* _width, float* _height)
51752a38012Sejakowatz {
5188643b098SAxel Dörfler 	if (_width) {
5198643b098SAxel Dörfler 		*_width = (fLabel ? (float)ceil(StringWidth(fLabel)) : 0.0f)
5208643b098SAxel Dörfler 			+ (fTrailingLabel ? (float)ceil(StringWidth(fTrailingLabel)) : 0.0f)
5218643b098SAxel Dörfler 			+ 7.0f;
5228643b098SAxel Dörfler 	}
52352a38012Sejakowatz 
5248643b098SAxel Dörfler 	if (_height) {
5258643b098SAxel Dörfler 		font_height fontHeight;
5268643b098SAxel Dörfler 		GetFontHeight(&fontHeight);
5278643b098SAxel Dörfler 
5288643b098SAxel Dörfler 		*_height = ceil(fontHeight.ascent + fontHeight.descent) + 5.0f + BarHeight();
5298643b098SAxel Dörfler 	}
53052a38012Sejakowatz }
5313583227cSStefano Ceccherini 
5323583227cSStefano Ceccherini 
5333583227cSStefano Ceccherini void
5343583227cSStefano Ceccherini BStatusBar::MakeFocus(bool state)
53552a38012Sejakowatz {
53652a38012Sejakowatz 	BView::MakeFocus(state);
53752a38012Sejakowatz }
5383583227cSStefano Ceccherini 
5393583227cSStefano Ceccherini 
5403583227cSStefano Ceccherini void
5413583227cSStefano Ceccherini BStatusBar::AllAttached()
54252a38012Sejakowatz {
54352a38012Sejakowatz 	BView::AllAttached();
54452a38012Sejakowatz }
5453583227cSStefano Ceccherini 
5463583227cSStefano Ceccherini 
5473583227cSStefano Ceccherini void
5483583227cSStefano Ceccherini BStatusBar::AllDetached()
54952a38012Sejakowatz {
55052a38012Sejakowatz 	BView::AllDetached();
55152a38012Sejakowatz }
5523583227cSStefano Ceccherini 
5533583227cSStefano Ceccherini 
5543583227cSStefano Ceccherini status_t
5553583227cSStefano Ceccherini BStatusBar::GetSupportedSuites(BMessage *data)
55652a38012Sejakowatz {
55752a38012Sejakowatz 	return BView::GetSupportedSuites(data);
55852a38012Sejakowatz }
5593583227cSStefano Ceccherini 
5603583227cSStefano Ceccherini 
5613583227cSStefano Ceccherini status_t
5623583227cSStefano Ceccherini BStatusBar::Perform(perform_code d, void *arg)
56352a38012Sejakowatz {
5643583227cSStefano Ceccherini 	return BView::Perform(d, arg);
56552a38012Sejakowatz }
5663583227cSStefano Ceccherini 
5673583227cSStefano Ceccherini 
56852a38012Sejakowatz void BStatusBar::_ReservedStatusBar1() {}
56952a38012Sejakowatz void BStatusBar::_ReservedStatusBar2() {}
57052a38012Sejakowatz void BStatusBar::_ReservedStatusBar3() {}
57152a38012Sejakowatz void BStatusBar::_ReservedStatusBar4() {}
57252a38012Sejakowatz 
5733583227cSStefano Ceccherini 
5743583227cSStefano Ceccherini BStatusBar &
5753583227cSStefano Ceccherini BStatusBar::operator=(const BStatusBar &)
57652a38012Sejakowatz {
57752a38012Sejakowatz 	return *this;
57852a38012Sejakowatz }
57952a38012Sejakowatz 
5803583227cSStefano Ceccherini 
5813583227cSStefano Ceccherini void
5823583227cSStefano Ceccherini BStatusBar::InitObject(const char *label, const char *trailingLabel)
5833583227cSStefano Ceccherini {
5843583227cSStefano Ceccherini 	SetTextData(&fLabel, label);
5853583227cSStefano Ceccherini 	SetTextData(&fTrailingLabel, trailingLabel);
5863583227cSStefano Ceccherini }
5873583227cSStefano Ceccherini 
5883583227cSStefano Ceccherini 
5893583227cSStefano Ceccherini void
5903583227cSStefano Ceccherini BStatusBar::SetTextData(char **dest, const char *source)
5913583227cSStefano Ceccherini {
5923583227cSStefano Ceccherini 	ASSERT(dest != NULL);
5933583227cSStefano Ceccherini 
5943583227cSStefano Ceccherini 	if (*dest != NULL) {
5953583227cSStefano Ceccherini 		free(*dest);
5963583227cSStefano Ceccherini 		*dest = NULL;
5973583227cSStefano Ceccherini 	}
5983583227cSStefano Ceccherini 
59999f695c9SAxel Dörfler 	if (source != NULL && source[0] != '\0')
6003583227cSStefano Ceccherini 		*dest = strdup(source);
6013583227cSStefano Ceccherini }
6023583227cSStefano Ceccherini 
6033583227cSStefano Ceccherini 
6043583227cSStefano Ceccherini void
6053583227cSStefano Ceccherini BStatusBar::FillBar(BRect rect)
6063583227cSStefano Ceccherini {
6073583227cSStefano Ceccherini 	// TODO:
6083583227cSStefano Ceccherini }
6093583227cSStefano Ceccherini 
6103583227cSStefano Ceccherini 
6113583227cSStefano Ceccherini void
6123583227cSStefano Ceccherini BStatusBar::Resize()
6133583227cSStefano Ceccherini {
6143583227cSStefano Ceccherini 	// TODO:
6153583227cSStefano Ceccherini }
6163583227cSStefano Ceccherini 
6173583227cSStefano Ceccherini 
6183583227cSStefano Ceccherini void
6193583227cSStefano Ceccherini BStatusBar::_Draw(BRect updateRect, bool barOnly)
6203583227cSStefano Ceccherini {
6213583227cSStefano Ceccherini 	// TODO:
6223583227cSStefano Ceccherini }
623