xref: /haiku/src/kits/interface/StatusBar.cpp (revision 679d063bdca2490a4f9c5a32a62679fe6b2d4665)
152a38012Sejakowatz //------------------------------------------------------------------------------
252a38012Sejakowatz //	Copyright (c) 2001-2002, OpenBeOS
352a38012Sejakowatz //
452a38012Sejakowatz //	Permission is hereby granted, free of charge, to any person obtaining a
552a38012Sejakowatz //	copy of this software and associated documentation files (the "Software"),
652a38012Sejakowatz //	to deal in the Software without restriction, including without limitation
752a38012Sejakowatz //	the rights to use, copy, modify, merge, publish, distribute, sublicense,
852a38012Sejakowatz //	and/or sell copies of the Software, and to permit persons to whom the
952a38012Sejakowatz //	Software is furnished to do so, subject to the following conditions:
1052a38012Sejakowatz //
1152a38012Sejakowatz //	The above copyright notice and this permission notice shall be included in
1252a38012Sejakowatz //	all copies or substantial portions of the Software.
1352a38012Sejakowatz //
1452a38012Sejakowatz //	THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1552a38012Sejakowatz //	IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1652a38012Sejakowatz //	FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
1752a38012Sejakowatz //	AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
1852a38012Sejakowatz //	LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
1952a38012Sejakowatz //	FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
2052a38012Sejakowatz //	DEALINGS IN THE SOFTWARE.
2152a38012Sejakowatz //
2252a38012Sejakowatz //	File Name:		StatusBar.cpp
2352a38012Sejakowatz //	Author:			Marc Flerackers (mflerackers@androme.be)
2452a38012Sejakowatz //	Description:	BStatusBar displays a "percentage-of-completion" gauge.
2552a38012Sejakowatz //------------------------------------------------------------------------------
2652a38012Sejakowatz #include <string.h>
2730fd5147Shaydentech #include <stdlib.h>
2852a38012Sejakowatz 
293583227cSStefano Ceccherini #include <Debug.h>
3052a38012Sejakowatz #include <Message.h>
313583227cSStefano Ceccherini #include <StatusBar.h>
3252a38012Sejakowatz 
3352a38012Sejakowatz 
3452a38012Sejakowatz BStatusBar::BStatusBar(BRect frame, const char *name, const char *label,
3552a38012Sejakowatz 					   const char *trailingLabel)
36eb997429SMarc Flerackers 	:	BView(frame, name, B_FOLLOW_LEFT | B_FOLLOW_TOP, B_WILL_DRAW),
375e959958SStefano Ceccherini 		fLabel(NULL),
385e959958SStefano Ceccherini 		fTrailingLabel(NULL),
3952a38012Sejakowatz 		fText(NULL),
4052a38012Sejakowatz 		fTrailingText(NULL),
4152a38012Sejakowatz 		fMax(100.0f),
4252a38012Sejakowatz 		fCurrent(0.0f),
4352a38012Sejakowatz 		fBarHeight(-1.0f),
4452a38012Sejakowatz 		fTrailingWidth(-1.0f),
4552a38012Sejakowatz 		fEraseText(-1.0f),
4652a38012Sejakowatz 		fEraseTrailingText(-1.0f),
4752a38012Sejakowatz 		fCustomBarHeight(false)
4852a38012Sejakowatz 
4952a38012Sejakowatz {
503583227cSStefano Ceccherini 	// TODO: Move initializer list and other stuff to InitObject
513583227cSStefano Ceccherini 	InitObject(label, trailingLabel);
5252a38012Sejakowatz 
5352a38012Sejakowatz 	fBarColor.red = 50;
5452a38012Sejakowatz 	fBarColor.green = 150;
5552a38012Sejakowatz 	fBarColor.blue = 255;
5652a38012Sejakowatz 	fBarColor.alpha = 255;
5752a38012Sejakowatz }
583583227cSStefano Ceccherini 
593583227cSStefano Ceccherini 
6052a38012Sejakowatz BStatusBar::BStatusBar(BMessage *archive)
6152a38012Sejakowatz 	:	BView(archive),
625e959958SStefano Ceccherini 		fLabel(NULL),
635e959958SStefano Ceccherini 		fTrailingLabel(NULL),
64*679d063bSStefano Ceccherini 		fText(NULL),
65*679d063bSStefano Ceccherini 		fTrailingText(NULL),
66*679d063bSStefano Ceccherini 		fMax(100.0f),
67*679d063bSStefano Ceccherini 		fCurrent(0.0f),
68*679d063bSStefano Ceccherini 		fBarHeight(-1.0f),
6952a38012Sejakowatz 		fTrailingWidth(-1.0f),
7052a38012Sejakowatz 		fEraseText(-1.0f),
7152a38012Sejakowatz 		fEraseTrailingText(-1.0f),
7252a38012Sejakowatz 		fCustomBarHeight(false)
7352a38012Sejakowatz {
743583227cSStefano Ceccherini 	const char *label = NULL;
753583227cSStefano Ceccherini 	const char *trailingLabel = NULL;
763583227cSStefano Ceccherini 	archive->FindString("_label", &label);
773583227cSStefano Ceccherini 	archive->FindString("_tlabel", &trailingLabel);
783583227cSStefano Ceccherini 
793583227cSStefano Ceccherini 	InitObject(label, trailingLabel);
803583227cSStefano Ceccherini 
8152a38012Sejakowatz 	if (archive->FindFloat("_high", &fBarHeight) != B_OK)
8252a38012Sejakowatz 		fBarHeight = -1.0f;
8352a38012Sejakowatz 
8452a38012Sejakowatz 	const void *ptr;
8552a38012Sejakowatz 
863583227cSStefano Ceccherini 	if (archive->FindData("_bcolor", B_INT32_TYPE, &ptr, NULL ) < B_OK) {
8752a38012Sejakowatz 		fBarColor.red = 50;
8852a38012Sejakowatz 		fBarColor.green = 150;
8952a38012Sejakowatz 		fBarColor.blue = 255;
9052a38012Sejakowatz 		fBarColor.alpha = 255;
913583227cSStefano Ceccherini 	} else
9252a38012Sejakowatz 		memcpy(&fBarColor, ptr, sizeof(rgb_color));
9352a38012Sejakowatz 
943583227cSStefano Ceccherini 	if (archive->FindFloat("_val", &fCurrent) < B_OK)
9552a38012Sejakowatz 		fCurrent = 0.0f;
9652a38012Sejakowatz 
973583227cSStefano Ceccherini 	if (archive->FindFloat("_max", &fMax) < B_OK)
9852a38012Sejakowatz 		fMax = 100.0f;
9952a38012Sejakowatz 
10052a38012Sejakowatz 	const char *string;
10152a38012Sejakowatz 
1023583227cSStefano Ceccherini 	if (archive->FindString("_text", &string) < B_OK)
10352a38012Sejakowatz 		fText = NULL;
10452a38012Sejakowatz 	else
10552a38012Sejakowatz 		fText = strdup(string);
10652a38012Sejakowatz 
1073583227cSStefano Ceccherini 	if (archive->FindString("_ttext", &string) < B_OK)
10852a38012Sejakowatz 		fTrailingText = NULL;
10952a38012Sejakowatz 	else
11052a38012Sejakowatz 		fTrailingText = strdup(string);
11152a38012Sejakowatz 
11252a38012Sejakowatz }
1133583227cSStefano Ceccherini 
1143583227cSStefano Ceccherini 
11552a38012Sejakowatz BStatusBar::~BStatusBar()
11652a38012Sejakowatz {
117eb997429SMarc Flerackers 	free(fLabel);
118eb997429SMarc Flerackers 	free(fTrailingLabel);
119eb997429SMarc Flerackers 	free(fText);
120eb997429SMarc Flerackers 	free(fTrailingText);
12152a38012Sejakowatz }
1223583227cSStefano Ceccherini 
1233583227cSStefano Ceccherini 
1243583227cSStefano Ceccherini BArchivable *
1253583227cSStefano Ceccherini BStatusBar::Instantiate(BMessage *archive)
12652a38012Sejakowatz {
12752a38012Sejakowatz 	if (validate_instantiation(archive, "BStatusBar"))
12852a38012Sejakowatz 		return new BStatusBar(archive);
12952a38012Sejakowatz 
13052a38012Sejakowatz 	return NULL;
13152a38012Sejakowatz }
1323583227cSStefano Ceccherini 
1333583227cSStefano Ceccherini 
1343583227cSStefano Ceccherini status_t
1353583227cSStefano Ceccherini BStatusBar::Archive(BMessage *archive, bool deep) const
13652a38012Sejakowatz {
1378f3e1554SMarc Flerackers 	status_t err = BView::Archive(archive, deep);
1388f3e1554SMarc Flerackers 
1393583227cSStefano Ceccherini 	if (err < B_OK)
1408f3e1554SMarc Flerackers 		return err;
14152a38012Sejakowatz 
14252a38012Sejakowatz 	if (fBarHeight != 16.0f)
1438f3e1554SMarc Flerackers 		err = archive->AddFloat("_high", fBarHeight);
1448f3e1554SMarc Flerackers 
1453583227cSStefano Ceccherini 	if (err < B_OK)
1468f3e1554SMarc Flerackers 		return err;
14752a38012Sejakowatz 
148b56e4e65SDarkWyrm 	// DW: I'm pretty sure we don't need to compare the color with (50, 150, 255) ?
1498f3e1554SMarc Flerackers 	err = archive->AddData("_bcolor", B_INT32_TYPE, &fBarColor, sizeof( int32 ));
1508f3e1554SMarc Flerackers 
1513583227cSStefano Ceccherini 	if (err < B_OK)
1528f3e1554SMarc Flerackers 		return err;
15352a38012Sejakowatz 
15452a38012Sejakowatz 	if (fCurrent != 0.0f)
1558f3e1554SMarc Flerackers 		err = archive->AddFloat("_val", fCurrent);
1568f3e1554SMarc Flerackers 
1573583227cSStefano Ceccherini 	if (err < B_OK)
1588f3e1554SMarc Flerackers 		return err;
15952a38012Sejakowatz 
16052a38012Sejakowatz 	if (fMax != 100.0f )
1618f3e1554SMarc Flerackers 		err = archive->AddFloat("_max", fMax);
1628f3e1554SMarc Flerackers 
1633583227cSStefano Ceccherini 	if (err < B_OK)
1648f3e1554SMarc Flerackers 		return err;
16552a38012Sejakowatz 
16652a38012Sejakowatz 	if (fText )
1678f3e1554SMarc Flerackers 		err = archive->AddString("_text", fText);
1688f3e1554SMarc Flerackers 
1693583227cSStefano Ceccherini 	if (err < B_OK)
1708f3e1554SMarc Flerackers 		return err;
17152a38012Sejakowatz 
17252a38012Sejakowatz 	if (fTrailingText)
1738f3e1554SMarc Flerackers 		err = archive->AddString("_ttext", fTrailingText);
1748f3e1554SMarc Flerackers 
1753583227cSStefano Ceccherini 	if (err < B_OK)
1768f3e1554SMarc Flerackers 		return err;
17752a38012Sejakowatz 
17852a38012Sejakowatz 	if (fLabel)
1798f3e1554SMarc Flerackers 		err = archive->AddString("_label", fLabel);
1808f3e1554SMarc Flerackers 
1813583227cSStefano Ceccherini 	if (err < B_OK)
1828f3e1554SMarc Flerackers 		return err;
18352a38012Sejakowatz 
18452a38012Sejakowatz 	if (fTrailingLabel)
1858f3e1554SMarc Flerackers 		err = archive->AddString ("_tlabel", fTrailingLabel);
18652a38012Sejakowatz 
1878f3e1554SMarc Flerackers 	return err;
18852a38012Sejakowatz }
1893583227cSStefano Ceccherini 
1903583227cSStefano Ceccherini 
1913583227cSStefano Ceccherini void
1923583227cSStefano Ceccherini BStatusBar::AttachedToWindow()
19352a38012Sejakowatz {
19452a38012Sejakowatz 	float width, height;
19552a38012Sejakowatz 	GetPreferredSize(&width, &height);
19652a38012Sejakowatz 	ResizeTo(Frame().Width(), height);
19752a38012Sejakowatz 
1983583227cSStefano Ceccherini 	if (Parent()) {
19952a38012Sejakowatz 		SetViewColor(Parent()->ViewColor());
200b7b28df0Shaydentech 		SetLowColor(Parent()->ViewColor());
201b7b28df0Shaydentech 	}
20252a38012Sejakowatz }
2033583227cSStefano Ceccherini 
2043583227cSStefano Ceccherini 
2053583227cSStefano Ceccherini void
2063583227cSStefano Ceccherini BStatusBar::MessageReceived(BMessage *message)
20752a38012Sejakowatz {
2083583227cSStefano Ceccherini 	switch(message->what) {
20952a38012Sejakowatz 		case B_UPDATE_STATUS_BAR:
21052a38012Sejakowatz 		{
21152a38012Sejakowatz 			float delta;
21252a38012Sejakowatz 			const char *text = NULL, *trailing_text = NULL;
21352a38012Sejakowatz 
21452a38012Sejakowatz 			message->FindFloat("delta", &delta);
21552a38012Sejakowatz 			message->FindString("text", &text);
216ec053666SStefano Ceccherini 			message->FindString("trailing_text", &trailing_text);
21752a38012Sejakowatz 
21852a38012Sejakowatz 			Update(delta, text, trailing_text);
21952a38012Sejakowatz 
22052a38012Sejakowatz 			break;
22152a38012Sejakowatz 		}
2223583227cSStefano Ceccherini 
22352a38012Sejakowatz 		case B_RESET_STATUS_BAR:
22452a38012Sejakowatz 		{
22552a38012Sejakowatz 			const char *label = NULL, *trailing_label = NULL;
22652a38012Sejakowatz 
22752a38012Sejakowatz 			message->FindString("label", &label);
228ec053666SStefano Ceccherini 			message->FindString("trailing_label", &trailing_label);
22952a38012Sejakowatz 
23052a38012Sejakowatz 			Reset(label, trailing_label);
23152a38012Sejakowatz 
23252a38012Sejakowatz 			break;
23352a38012Sejakowatz 		}
2343583227cSStefano Ceccherini 
23552a38012Sejakowatz 		default:
23652a38012Sejakowatz 			BView::MessageReceived(message);
2373583227cSStefano Ceccherini 			break;
23852a38012Sejakowatz 	}
23952a38012Sejakowatz }
2403583227cSStefano Ceccherini 
2413583227cSStefano Ceccherini 
2423583227cSStefano Ceccherini void
2433583227cSStefano Ceccherini BStatusBar::Draw(BRect updateRect)
24452a38012Sejakowatz {
24552a38012Sejakowatz 	float width = Frame().Width();
24652a38012Sejakowatz 	font_height fh;
24752a38012Sejakowatz 	GetFontHeight(&fh);
24852a38012Sejakowatz 
24952a38012Sejakowatz 	SetHighColor(0, 0, 0);
2500dc199a5SMarc Flerackers 	MovePenTo(2.0f, (float)ceil(fh.ascent) + 1.0f);
2510dc199a5SMarc Flerackers 
2520dc199a5SMarc Flerackers 	if (fLabel)
2530dc199a5SMarc Flerackers 		DrawString(fLabel);
2540dc199a5SMarc Flerackers 	if (fText)
2550dc199a5SMarc Flerackers 		DrawString(fText);
2560dc199a5SMarc Flerackers 
2573583227cSStefano Ceccherini 	if (fTrailingText) {
2583583227cSStefano Ceccherini 		if (fTrailingLabel) {
2590dc199a5SMarc Flerackers 			MovePenTo(width - StringWidth(fTrailingText) -
2600dc199a5SMarc Flerackers 			StringWidth(fTrailingLabel) - 2.0f,
2610dc199a5SMarc Flerackers 			(float)ceil(fh.ascent) + 1.0f);
2620dc199a5SMarc Flerackers 			DrawString(fTrailingText);
2630dc199a5SMarc Flerackers 			DrawString(fTrailingLabel);
2643583227cSStefano Ceccherini 		} else {
2650dc199a5SMarc Flerackers 			MovePenTo(width - StringWidth(fTrailingText) - 2.0f,
2660dc199a5SMarc Flerackers 			(float)ceil(fh.ascent) + 1.0f);
2670dc199a5SMarc Flerackers 			DrawString(fTrailingText);
26852a38012Sejakowatz 		}
26952a38012Sejakowatz 
2703583227cSStefano Ceccherini 	} else if (fTrailingLabel) {
2710dc199a5SMarc Flerackers 		MovePenTo(width - StringWidth(fTrailingLabel) - 2.0f,
2720dc199a5SMarc Flerackers 			(float)ceil(fh.ascent) + 1.0f);
2730dc199a5SMarc Flerackers 		DrawString(fTrailingLabel);
2740dc199a5SMarc Flerackers 	}
2750dc199a5SMarc Flerackers 
2760dc199a5SMarc Flerackers 	BRect rect(0.0f, (float)ceil(fh.ascent) + 4.0f, width,
2770dc199a5SMarc Flerackers 		(float)ceil(fh.ascent) + 4.0f + fBarHeight);
27852a38012Sejakowatz 
27952a38012Sejakowatz 	// First bevel
28052a38012Sejakowatz 	SetHighColor(tint_color(ui_color ( B_PANEL_BACKGROUND_COLOR ), B_DARKEN_1_TINT));
28152a38012Sejakowatz 	StrokeLine(BPoint(rect.left, rect.bottom), BPoint(rect.left, rect.top));
28252a38012Sejakowatz 	StrokeLine(BPoint(rect.right, rect.top));
28352a38012Sejakowatz 
28452a38012Sejakowatz 	SetHighColor(tint_color(ui_color(B_PANEL_BACKGROUND_COLOR), B_LIGHTEN_2_TINT));
28552a38012Sejakowatz 	StrokeLine(BPoint(rect.left + 1.0f, rect.bottom), BPoint(rect.right, rect.bottom));
28652a38012Sejakowatz 	StrokeLine(BPoint(rect.right, rect.top + 1.0f));
28752a38012Sejakowatz 
28852a38012Sejakowatz 	rect.InsetBy(1.0f, 1.0f);
28952a38012Sejakowatz 
29052a38012Sejakowatz 	// Second bevel
29152a38012Sejakowatz 	SetHighColor(tint_color(ui_color ( B_PANEL_BACKGROUND_COLOR ), B_DARKEN_4_TINT));
29252a38012Sejakowatz 	StrokeLine(BPoint(rect.left, rect.bottom), BPoint(rect.left, rect.top));
29352a38012Sejakowatz 	StrokeLine(BPoint(rect.right, rect.top));
29452a38012Sejakowatz 
29552a38012Sejakowatz 	SetHighColor(ui_color(B_PANEL_BACKGROUND_COLOR));
29652a38012Sejakowatz 	StrokeLine(BPoint(rect.left + 1.0f, rect.bottom), BPoint(rect.right, rect.bottom));
29752a38012Sejakowatz 	StrokeLine(BPoint(rect.right, rect.top + 1.0f));
29852a38012Sejakowatz 
29952a38012Sejakowatz 	rect.InsetBy(1.0f, 1.0f);
30052a38012Sejakowatz 
30152a38012Sejakowatz 	// Filling
30252a38012Sejakowatz 	SetHighColor(tint_color(ui_color(B_PANEL_BACKGROUND_COLOR), B_LIGHTEN_MAX_TINT));
30352a38012Sejakowatz 	FillRect(rect);
30452a38012Sejakowatz 
3053583227cSStefano Ceccherini 	if (fCurrent != 0.0f) {
30652a38012Sejakowatz 		rect.right = rect.left + (float)ceil(fCurrent * (width - 4) / fMax),
30752a38012Sejakowatz 
30852a38012Sejakowatz 		// Bevel
30952a38012Sejakowatz 		SetHighColor(tint_color(fBarColor, B_LIGHTEN_2_TINT));
31052a38012Sejakowatz 		StrokeLine(BPoint(rect.left, rect.bottom), BPoint(rect.left, rect.top));
31152a38012Sejakowatz 		StrokeLine(BPoint(rect.right, rect.top));
31252a38012Sejakowatz 
31352a38012Sejakowatz 		SetHighColor(tint_color(fBarColor, B_DARKEN_2_TINT));
31452a38012Sejakowatz 		StrokeLine(BPoint(rect.left, rect.bottom), BPoint(rect.right, rect.bottom));
31552a38012Sejakowatz 		StrokeLine(BPoint(rect.right, rect.top));
31652a38012Sejakowatz 
31752a38012Sejakowatz 		rect.InsetBy(1.0f, 1.0f);
31852a38012Sejakowatz 
31952a38012Sejakowatz 		// Filling
32052a38012Sejakowatz 		SetHighColor(fBarColor);
32152a38012Sejakowatz 		FillRect(rect);
32252a38012Sejakowatz 	}
32352a38012Sejakowatz }
3243583227cSStefano Ceccherini 
3253583227cSStefano Ceccherini 
3263583227cSStefano Ceccherini void
3273583227cSStefano Ceccherini BStatusBar::SetBarColor(rgb_color color)
32852a38012Sejakowatz {
32952a38012Sejakowatz 	memcpy(&fBarColor, &color, sizeof(rgb_color));
33052a38012Sejakowatz 
33152a38012Sejakowatz 	Invalidate();
33252a38012Sejakowatz }
3333583227cSStefano Ceccherini 
3343583227cSStefano Ceccherini 
3353583227cSStefano Ceccherini void
3363583227cSStefano Ceccherini BStatusBar::SetBarHeight(float height)
33752a38012Sejakowatz {
33852a38012Sejakowatz 	BRect frame = Frame();
33952a38012Sejakowatz 
34052a38012Sejakowatz 	fBarHeight = height;
34152a38012Sejakowatz 	fCustomBarHeight = true;
34252a38012Sejakowatz 	ResizeTo(frame.Width(), fBarHeight + 16);
34352a38012Sejakowatz }
34452a38012Sejakowatz 
3453583227cSStefano Ceccherini 
3463583227cSStefano Ceccherini void
3473583227cSStefano Ceccherini BStatusBar::SetText(const char *string)
3483583227cSStefano Ceccherini {
3493583227cSStefano Ceccherini 	SetTextData(&fText, string);
35052a38012Sejakowatz 
35152a38012Sejakowatz 	Invalidate();
35252a38012Sejakowatz }
35352a38012Sejakowatz 
3543583227cSStefano Ceccherini 
3553583227cSStefano Ceccherini void
3563583227cSStefano Ceccherini BStatusBar::SetTrailingText(const char *string)
3573583227cSStefano Ceccherini {
3583583227cSStefano Ceccherini 	SetTextData(&fTrailingText, string);
35952a38012Sejakowatz 
36052a38012Sejakowatz 	Invalidate();
36152a38012Sejakowatz }
3623583227cSStefano Ceccherini 
3633583227cSStefano Ceccherini 
3643583227cSStefano Ceccherini void
3653583227cSStefano Ceccherini BStatusBar::SetMaxValue(float max)
36652a38012Sejakowatz {
36752a38012Sejakowatz 	fMax = max;
36852a38012Sejakowatz 
36952a38012Sejakowatz 	Invalidate();
37052a38012Sejakowatz }
3713583227cSStefano Ceccherini 
3723583227cSStefano Ceccherini 
3733583227cSStefano Ceccherini void
3743583227cSStefano Ceccherini BStatusBar::Update(float delta, const char *text, const char *trailingText)
37552a38012Sejakowatz {
37652a38012Sejakowatz 	fCurrent += delta;
37752a38012Sejakowatz 
378f45d1cc7SMarc Flerackers 	if (fCurrent > fMax)
379f45d1cc7SMarc Flerackers 		fCurrent = fMax;
380f45d1cc7SMarc Flerackers 
38197c93182Shaydentech 	// Passing NULL for the text or trailingText argument retains the previous
38297c93182Shaydentech 	// text or trailing text string.
38397c93182Shaydentech 	if (text)
3843583227cSStefano Ceccherini 		SetTextData(&fText, text);
38552a38012Sejakowatz 
38697c93182Shaydentech 	if (trailingText)
3873583227cSStefano Ceccherini 		SetTextData(&fTrailingText, trailingText);
38852a38012Sejakowatz 
38952a38012Sejakowatz 	Invalidate();
39052a38012Sejakowatz }
3913583227cSStefano Ceccherini 
3923583227cSStefano Ceccherini 
3933583227cSStefano Ceccherini void
3943583227cSStefano Ceccherini BStatusBar::Reset(const char *label, const char *trailingLabel)
39552a38012Sejakowatz {
39697c93182Shaydentech 	// Reset replaces the label and trailing label with copies of the
39797c93182Shaydentech 	// strings passed as arguments. If either argument is NULL, the
39897c93182Shaydentech 	// label or trailing label will be deleted and erased.
3993583227cSStefano Ceccherini 	SetTextData(&fLabel, label);
4003583227cSStefano Ceccherini 	SetTextData(&fTrailingLabel, trailingLabel);
40152a38012Sejakowatz 
40297c93182Shaydentech 	// Reset deletes and erases any text or trailing text
4033583227cSStefano Ceccherini 	SetTextData(&fText, NULL);
4043583227cSStefano Ceccherini 	SetTextData(&fTrailingText, NULL);
405b7b28df0Shaydentech 
40652a38012Sejakowatz 	fCurrent = 0.0f;
407b7b28df0Shaydentech 	fMax = 100.0f;
40852a38012Sejakowatz 
40952a38012Sejakowatz 	Invalidate();
41052a38012Sejakowatz }
4113583227cSStefano Ceccherini 
4123583227cSStefano Ceccherini 
4133583227cSStefano Ceccherini float
4143583227cSStefano Ceccherini BStatusBar::CurrentValue() const
41552a38012Sejakowatz {
41652a38012Sejakowatz 	return fCurrent;
41752a38012Sejakowatz }
4183583227cSStefano Ceccherini 
4193583227cSStefano Ceccherini 
4203583227cSStefano Ceccherini float
4213583227cSStefano Ceccherini BStatusBar::MaxValue() const
42252a38012Sejakowatz {
42352a38012Sejakowatz 	return fMax;
42452a38012Sejakowatz }
4253583227cSStefano Ceccherini 
4263583227cSStefano Ceccherini 
4273583227cSStefano Ceccherini rgb_color
4283583227cSStefano Ceccherini BStatusBar::BarColor() const
42952a38012Sejakowatz {
43052a38012Sejakowatz 	return fBarColor;
43152a38012Sejakowatz }
4323583227cSStefano Ceccherini 
4333583227cSStefano Ceccherini 
4343583227cSStefano Ceccherini float
4353583227cSStefano Ceccherini BStatusBar::BarHeight() const
43652a38012Sejakowatz {
4373583227cSStefano Ceccherini 	if (!fCustomBarHeight && fBarHeight == -1.0f) {
43852a38012Sejakowatz 		font_height fh;
43952a38012Sejakowatz 		GetFontHeight(&fh);
4403583227cSStefano Ceccherini 		const_cast<BStatusBar *>(this)->fBarHeight = fh.ascent + fh.descent + 6.0f;
44152a38012Sejakowatz 	}
44252a38012Sejakowatz 
44352a38012Sejakowatz 	return fBarHeight;
44452a38012Sejakowatz }
4453583227cSStefano Ceccherini 
4463583227cSStefano Ceccherini 
4473583227cSStefano Ceccherini const char *
4483583227cSStefano Ceccherini BStatusBar::Text() const
44952a38012Sejakowatz {
45052a38012Sejakowatz 	return fText;
45152a38012Sejakowatz }
4523583227cSStefano Ceccherini 
4533583227cSStefano Ceccherini 
4543583227cSStefano Ceccherini const char *
4553583227cSStefano Ceccherini BStatusBar::TrailingText() const
45652a38012Sejakowatz {
45752a38012Sejakowatz 	return fTrailingText;
45852a38012Sejakowatz }
4593583227cSStefano Ceccherini 
4603583227cSStefano Ceccherini 
4613583227cSStefano Ceccherini const char *
4623583227cSStefano Ceccherini BStatusBar::Label() const
46352a38012Sejakowatz {
46452a38012Sejakowatz 	return fLabel;
46552a38012Sejakowatz }
4663583227cSStefano Ceccherini 
4673583227cSStefano Ceccherini 
4683583227cSStefano Ceccherini const char *
4693583227cSStefano Ceccherini BStatusBar::TrailingLabel() const
47052a38012Sejakowatz {
47152a38012Sejakowatz 	return fTrailingLabel;
47252a38012Sejakowatz }
4733583227cSStefano Ceccherini 
4743583227cSStefano Ceccherini 
4753583227cSStefano Ceccherini void
4763583227cSStefano Ceccherini BStatusBar::MouseDown(BPoint point)
47752a38012Sejakowatz {
47852a38012Sejakowatz 	BView::MouseDown(point);
47952a38012Sejakowatz }
4803583227cSStefano Ceccherini 
4813583227cSStefano Ceccherini 
4823583227cSStefano Ceccherini void
4833583227cSStefano Ceccherini BStatusBar::MouseUp(BPoint point)
48452a38012Sejakowatz {
48552a38012Sejakowatz 	BView::MouseUp(point);
48652a38012Sejakowatz }
4873583227cSStefano Ceccherini 
4883583227cSStefano Ceccherini 
4893583227cSStefano Ceccherini void
4903583227cSStefano Ceccherini BStatusBar::WindowActivated(bool state)
49152a38012Sejakowatz {
49252a38012Sejakowatz 	BView::WindowActivated(state);
49352a38012Sejakowatz }
4943583227cSStefano Ceccherini 
4953583227cSStefano Ceccherini 
4963583227cSStefano Ceccherini void
4973583227cSStefano Ceccherini BStatusBar::MouseMoved(BPoint point, uint32 transit, const BMessage *message)
49852a38012Sejakowatz {
49952a38012Sejakowatz 	BView::MouseMoved(point, transit, message);
50052a38012Sejakowatz }
5013583227cSStefano Ceccherini 
5023583227cSStefano Ceccherini 
5033583227cSStefano Ceccherini void
5043583227cSStefano Ceccherini BStatusBar::DetachedFromWindow()
50552a38012Sejakowatz {
50652a38012Sejakowatz 	BView::DetachedFromWindow();
50752a38012Sejakowatz }
5083583227cSStefano Ceccherini 
5093583227cSStefano Ceccherini 
5103583227cSStefano Ceccherini void
5113583227cSStefano Ceccherini BStatusBar::FrameMoved(BPoint newPosition)
51252a38012Sejakowatz {
5133583227cSStefano Ceccherini 	BView::FrameMoved(newPosition);
51452a38012Sejakowatz }
5153583227cSStefano Ceccherini 
5163583227cSStefano Ceccherini 
5173583227cSStefano Ceccherini void
5183583227cSStefano Ceccherini BStatusBar::FrameResized(float newWidth, float newHeight)
51952a38012Sejakowatz {
5203583227cSStefano Ceccherini 	BView::FrameResized(newWidth, newHeight);
52152a38012Sejakowatz }
5223583227cSStefano Ceccherini 
5233583227cSStefano Ceccherini 
5243583227cSStefano Ceccherini BHandler *
5253583227cSStefano Ceccherini BStatusBar::ResolveSpecifier(BMessage *message, int32 index,
52652a38012Sejakowatz 									   BMessage *specifier,
52752a38012Sejakowatz 									   int32 what, const char *property)
52852a38012Sejakowatz {
52952a38012Sejakowatz 	return BView::ResolveSpecifier(message, index, specifier, what, property);
53052a38012Sejakowatz }
5313583227cSStefano Ceccherini 
5323583227cSStefano Ceccherini 
5333583227cSStefano Ceccherini void
5343583227cSStefano Ceccherini BStatusBar::ResizeToPreferred()
53552a38012Sejakowatz {
53652a38012Sejakowatz 	BView::ResizeToPreferred();
53752a38012Sejakowatz }
5383583227cSStefano Ceccherini 
5393583227cSStefano Ceccherini 
5403583227cSStefano Ceccherini void
5418643b098SAxel Dörfler BStatusBar::GetPreferredSize(float* _width, float* _height)
54252a38012Sejakowatz {
5438643b098SAxel Dörfler 	if (_width) {
5448643b098SAxel Dörfler 		*_width = (fLabel ? (float)ceil(StringWidth(fLabel)) : 0.0f)
5458643b098SAxel Dörfler 			+ (fTrailingLabel ? (float)ceil(StringWidth(fTrailingLabel)) : 0.0f)
5468643b098SAxel Dörfler 			+ 7.0f;
5478643b098SAxel Dörfler 	}
54852a38012Sejakowatz 
5498643b098SAxel Dörfler 	if (_height) {
5508643b098SAxel Dörfler 		font_height fontHeight;
5518643b098SAxel Dörfler 		GetFontHeight(&fontHeight);
5528643b098SAxel Dörfler 
5538643b098SAxel Dörfler 		*_height = ceil(fontHeight.ascent + fontHeight.descent) + 5.0f + BarHeight();
5548643b098SAxel Dörfler 	}
55552a38012Sejakowatz }
5563583227cSStefano Ceccherini 
5573583227cSStefano Ceccherini 
5583583227cSStefano Ceccherini void
5593583227cSStefano Ceccherini BStatusBar::MakeFocus(bool state)
56052a38012Sejakowatz {
56152a38012Sejakowatz 	BView::MakeFocus(state);
56252a38012Sejakowatz }
5633583227cSStefano Ceccherini 
5643583227cSStefano Ceccherini 
5653583227cSStefano Ceccherini void
5663583227cSStefano Ceccherini BStatusBar::AllAttached()
56752a38012Sejakowatz {
56852a38012Sejakowatz 	BView::AllAttached();
56952a38012Sejakowatz }
5703583227cSStefano Ceccherini 
5713583227cSStefano Ceccherini 
5723583227cSStefano Ceccherini void
5733583227cSStefano Ceccherini BStatusBar::AllDetached()
57452a38012Sejakowatz {
57552a38012Sejakowatz 	BView::AllDetached();
57652a38012Sejakowatz }
5773583227cSStefano Ceccherini 
5783583227cSStefano Ceccherini 
5793583227cSStefano Ceccherini status_t
5803583227cSStefano Ceccherini BStatusBar::GetSupportedSuites(BMessage *data)
58152a38012Sejakowatz {
58252a38012Sejakowatz 	return BView::GetSupportedSuites(data);
58352a38012Sejakowatz }
5843583227cSStefano Ceccherini 
5853583227cSStefano Ceccherini 
5863583227cSStefano Ceccherini status_t
5873583227cSStefano Ceccherini BStatusBar::Perform(perform_code d, void *arg)
58852a38012Sejakowatz {
5893583227cSStefano Ceccherini 	return BView::Perform(d, arg);
59052a38012Sejakowatz }
5913583227cSStefano Ceccherini 
5923583227cSStefano Ceccherini 
59352a38012Sejakowatz void BStatusBar::_ReservedStatusBar1() {}
59452a38012Sejakowatz void BStatusBar::_ReservedStatusBar2() {}
59552a38012Sejakowatz void BStatusBar::_ReservedStatusBar3() {}
59652a38012Sejakowatz void BStatusBar::_ReservedStatusBar4() {}
59752a38012Sejakowatz 
5983583227cSStefano Ceccherini 
5993583227cSStefano Ceccherini BStatusBar &
6003583227cSStefano Ceccherini BStatusBar::operator=(const BStatusBar &)
60152a38012Sejakowatz {
60252a38012Sejakowatz 	return *this;
60352a38012Sejakowatz }
60452a38012Sejakowatz 
6053583227cSStefano Ceccherini 
6063583227cSStefano Ceccherini void
6073583227cSStefano Ceccherini BStatusBar::InitObject(const char *label, const char *trailingLabel)
6083583227cSStefano Ceccherini {
6093583227cSStefano Ceccherini 	SetTextData(&fLabel, label);
6103583227cSStefano Ceccherini 	SetTextData(&fTrailingLabel, trailingLabel);
6113583227cSStefano Ceccherini }
6123583227cSStefano Ceccherini 
6133583227cSStefano Ceccherini 
6143583227cSStefano Ceccherini void
6153583227cSStefano Ceccherini BStatusBar::SetTextData(char **dest, const char *source)
6163583227cSStefano Ceccherini {
6173583227cSStefano Ceccherini 	ASSERT(dest != NULL);
6183583227cSStefano Ceccherini 
6193583227cSStefano Ceccherini 	if (*dest != NULL) {
6203583227cSStefano Ceccherini 		free(*dest);
6213583227cSStefano Ceccherini 		*dest = NULL;
6223583227cSStefano Ceccherini 	}
6233583227cSStefano Ceccherini 
62477e45e57SStefano Ceccherini 	if (source != NULL && source[0] != NULL)
6253583227cSStefano Ceccherini 		*dest = strdup(source);
6263583227cSStefano Ceccherini }
6273583227cSStefano Ceccherini 
6283583227cSStefano Ceccherini 
6293583227cSStefano Ceccherini void
6303583227cSStefano Ceccherini BStatusBar::FillBar(BRect rect)
6313583227cSStefano Ceccherini {
6323583227cSStefano Ceccherini 	// TODO:
6333583227cSStefano Ceccherini }
6343583227cSStefano Ceccherini 
6353583227cSStefano Ceccherini 
6363583227cSStefano Ceccherini void
6373583227cSStefano Ceccherini BStatusBar::Resize()
6383583227cSStefano Ceccherini {
6393583227cSStefano Ceccherini 	// TODO:
6403583227cSStefano Ceccherini }
6413583227cSStefano Ceccherini 
6423583227cSStefano Ceccherini 
6433583227cSStefano Ceccherini void
6443583227cSStefano Ceccherini BStatusBar::_Draw(BRect updateRect, bool barOnly)
6453583227cSStefano Ceccherini {
6463583227cSStefano Ceccherini 	// TODO:
6473583227cSStefano Ceccherini }
648