199f695c9SAxel Dörfler/*
27a96554cSlooncraz * 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>
97a96554cSlooncraz *		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>
1830fd5147Shaydentech
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
277a96554cSlooncrazenum internalFlags {
287a96554cSlooncraz	kCustomBarColor = 1
297a96554cSlooncraz};
30075e65c7SAxel Dörfler
31075e65c7SAxel Dörfler
3230fd5147ShaydentechBStatusBar::BStatusBar(BRect frame, const char *name, const char *label,
3389208c77SStephan Aßmus		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)
3830fd5147Shaydentech{
39075e65c7SAxel Dörfler	_InitObject();
4030fd5147Shaydentech}
413583227cSStefano Ceccherini
423583227cSStefano Ceccherini
43d23c4822SIngo WeinholdBStatusBar::BStatusBar(const char *name, const char *label,
4489208c77SStephan Aßmus		const char *trailingLabel)
4589208c77SStephan Aßmus	:
4680bc632aSAugustin Cavalier	BView(BRect(0, 0, -1, -1), name, B_FOLLOW_LEFT | B_FOLLOW_TOP,
4789208c77SStephan Aßmus		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
5530fd5147ShaydentechBStatusBar::BStatusBar(BMessage *archive)
5689208c77SStephan Aßmus	:
5789208c77SStephan Aßmus	BView(archive)
58075e65c7SAxel Dörfler{
59075e65c7SAxel Dörfler	_InitObject();
60075e65c7SAxel Dörfler
61075e65c7SAxel Dörfler	archive->FindString("_label", &fLabel);
62075e65c7SAxel Dörfler	archive->FindString("_tlabel", &fTrailingLabel);
6330fd5147Shaydentech
64075e65c7SAxel Dörfler	archive->FindString("_text", &fText);
65075e65c7SAxel Dörfler	archive->FindString("_ttext", &fTrailingText);
66075e65c7SAxel Dörfler
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	}
72075e65c7SAxel Dörfler
73075e65c7SAxel Dörfler	int32 color;
747a96554cSlooncraz	if (archive->FindInt32("_bcolor", (int32 *)&color) == B_OK) {
75075e65c7SAxel Dörfler		fBarColor = *(rgb_color *)&color;
767a96554cSlooncraz		fInternalFlags |= kCustomBarColor;
777a96554cSlooncraz	}
78075e65c7SAxel Dörfler
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;
8330fd5147Shaydentech}
843583227cSStefano Ceccherini
853583227cSStefano Ceccherini
8630fd5147ShaydentechBStatusBar::~BStatusBar()
8730fd5147Shaydentech{
88075e65c7SAxel Dörfler}
89075e65c7SAxel Dörfler
90075e65c7SAxel Dörfler
913583227cSStefano CeccheriniBArchivable *
923583227cSStefano CeccheriniBStatusBar::Instantiate(BMessage *archive)
9330fd5147Shaydentech{
9430fd5147Shaydentech	if (validate_instantiation(archive, "BStatusBar"))
9530fd5147Shaydentech		return new BStatusBar(archive);
9630fd5147Shaydentech
9730fd5147Shaydentech	return NULL;
9830fd5147Shaydentech}
993583227cSStefano Ceccherini
1003583227cSStefano Ceccherini
1013583227cSStefano Ceccherinistatus_t
1023583227cSStefano CeccheriniBStatusBar::Archive(BMessage *archive, bool deep) const
10330fd5147Shaydentech{
10430fd5147Shaydentech	status_t err = BView::Archive(archive, deep);
1053583227cSStefano Ceccherini	if (err < B_OK)
10630fd5147Shaydentech		return err;
10730fd5147Shaydentech
108075e65c7SAxel Dörfler	if (fCustomBarHeight)
10930fd5147Shaydentech		err = archive->AddFloat("_high", fBarHeight);
11030fd5147Shaydentech
1117a96554cSlooncraz	if (err == B_OK && fInternalFlags & kCustomBarColor)
112075e65c7SAxel Dörfler		err = archive->AddInt32("_bcolor", (const uint32 &)fBarColor);
11330fd5147Shaydentech
114f466d35dSStephan Aßmus	if (err == B_OK && fCurrent != 0)
11530fd5147Shaydentech		err = archive->AddFloat("_val", fCurrent);
116f466d35dSStephan Aßmus	if (err == B_OK && fMax != 100 )
11730fd5147Shaydentech		err = archive->AddFloat("_max", fMax);
11830fd5147Shaydentech
119075e65c7SAxel Dörfler	if (err == B_OK && fText.Length())
120075e65c7SAxel Dörfler		err = archive->AddString("_text", fText);
121075e65c7SAxel Dörfler	if (err == B_OK && fTrailingText.Length())
12230fd5147Shaydentech		err = archive->AddString("_ttext", fTrailingText);
12330fd5147Shaydentech
124075e65c7SAxel Dörfler	if (err == B_OK && fLabel.Length())
12530fd5147Shaydentech		err = archive->AddString("_label", fLabel);
126075e65c7SAxel Dörfler	if (err == B_OK && fTrailingLabel.Length())
12730fd5147Shaydentech		err = archive->AddString ("_tlabel", fTrailingLabel);
12830fd5147Shaydentech
12930fd5147Shaydentech	return err;
13030fd5147Shaydentech}
1313583227cSStefano Ceccherini
1323583227cSStefano Ceccherini
13389208c77SStephan Aßmus// #pragma mark -
13489208c77SStephan Aßmus
13589208c77SStephan Aßmus
1363583227cSStefano Ceccherinivoid
1373583227cSStefano CeccheriniBStatusBar::AttachedToWindow()
13830fd5147Shaydentech{
139075e65c7SAxel Dörfler	// resize so that the height fits
14030fd5147Shaydentech	float width, height;
14130fd5147Shaydentech	GetPreferredSize(&width, &height);
142075e65c7SAxel Dörfler	ResizeTo(Bounds().Width(), height);
14330fd5147Shaydentech
144075e65c7SAxel Dörfler	SetViewColor(B_TRANSPARENT_COLOR);
14554badb1fSStephan Aßmus
1467a96554cSlooncraz	AdoptParentColors();
147075e65c7SAxel Dörfler
148f466d35dSStephan Aßmus	fTextDivider = Bounds().Width();
1497a96554cSlooncraz
1507a96554cSlooncraz	if ((fInternalFlags & kCustomBarColor) == 0)
15180bc632aSAugustin Cavalier		fBarColor = ui_color(B_STATUS_BAR_COLOR);
15230fd5147Shaydentech}
1533583227cSStefano Ceccherini
1543583227cSStefano Ceccherini
1553583227cSStefano Ceccherinivoid
15689208c77SStephan AßmusBStatusBar::DetachedFromWindow()
15730fd5147Shaydentech{
15889208c77SStephan Aßmus	BView::DetachedFromWindow();
15989208c77SStephan Aßmus}
16030fd5147Shaydentech
16130fd5147Shaydentech
16289208c77SStephan Aßmusvoid
16389208c77SStephan AßmusBStatusBar::AllAttached()
16489208c77SStephan Aßmus{
16589208c77SStephan Aßmus	BView::AllAttached();
16689208c77SStephan Aßmus}
16730fd5147Shaydentech
1683583227cSStefano Ceccherini
16989208c77SStephan Aßmusvoid
17089208c77SStephan AßmusBStatusBar::AllDetached()
17189208c77SStephan Aßmus{
17289208c77SStephan Aßmus	BView::AllDetached();
17389208c77SStephan Aßmus}
17430fd5147Shaydentech
17530fd5147Shaydentech
17689208c77SStephan Aßmus// #pragma mark -
17730fd5147Shaydentech
1783583227cSStefano Ceccherini
17989208c77SStephan Aßmusvoid
18089208c77SStephan AßmusBStatusBar::WindowActivated(bool state)
18189208c77SStephan Aßmus{
18289208c77SStephan Aßmus	BView::WindowActivated(state);
18389208c77SStephan Aßmus}
18489208c77SStephan Aßmus
18589208c77SStephan Aßmus
18689208c77SStephan Aßmusvoid
18789208c77SStephan AßmusBStatusBar::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ßmusvoid
19789208c77SStephan AßmusBStatusBar::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()) {
211a487da80SStephan Aßmus			font_height fontHeight;
212a487da80SStephan 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();
21730fd5147Shaydentech	}
21830fd5147Shaydentech}
2193583227cSStefano Ceccherini
2203583227cSStefano Ceccherini
22189208c77SStephan AßmusBSize
22289208c77SStephan AßmusBStatusBar::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ßmusBSize
23289208c77SStephan AßmusBStatusBar::MaxSize()
23389208c77SStephan Aßmus{
23489208c77SStephan Aßmus	float width, height;
23589208c77SStephan Aßmus	GetPreferredSize(&width, &height);
23689208c77SStephan Aßmus
23780bc632aSAugustin Cavalier	return BLayoutUtils::ComposeSize(ExplicitMaxSize(),
2388e80f8ccSczeidler		BSize(B_SIZE_UNLIMITED, height));
23989208c77SStephan Aßmus}
24089208c77SStephan Aßmus
24189208c77SStephan Aßmus
24289208c77SStephan AßmusBSize
24389208c77SStephan AßmusBStatusBar::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ßmusvoid
25489208c77SStephan AßmusBStatusBar::ResizeToPreferred()
25589208c77SStephan Aßmus{
25689208c77SStephan Aßmus	BView::ResizeToPreferred();
25789208c77SStephan Aßmus}
25889208c77SStephan Aßmus
25989208c77SStephan Aßmus
26089208c77SStephan Aßmusvoid
26189208c77SStephan AßmusBStatusBar::FrameMoved(BPoint newPosition)
26289208c77SStephan Aßmus{
26389208c77SStephan Aßmus	BView::FrameMoved(newPosition);
26489208c77SStephan Aßmus}
26589208c77SStephan Aßmus
26689208c77SStephan Aßmus
26789208c77SStephan Aßmusvoid
26889208c77SStephan AßmusBStatusBar::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 Ceccherinivoid
2793583227cSStefano CeccheriniBStatusBar::Draw(BRect updateRect)
28030fd5147Shaydentech{
281861e4437SStephan Aßmus	rgb_color backgroundColor = LowColor();
282075e65c7SAxel Dörfler
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);
287075e65c7SAxel Dörfler
288075e65c7SAxel Dörfler	BRegion background(updateRect);
289075e65c7SAxel Dörfler	background.Exclude(outerFrame);
290075e65c7SAxel Dörfler	FillRegion(&background, B_SOLID_LOW);
291075e65c7SAxel Dörfler
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;
302f466d35dSStephan Aßmus
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()) {
3137a96554cSlooncraz			font.TruncateString(&rightText, B_TRUNCATE_BEGINNING,
3147a96554cSlooncraz				rect.Width());
315f466d35dSStephan Aßmus			fTextDivider -= StringWidth(rightText.String());
316f466d35dSStephan Aßmus		}
317075e65c7SAxel Dörfler
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);
32130fd5147Shaydentech		}
322f466d35dSStephan Aßmus
3237a96554cSlooncraz		rgb_color textColor = ui_color(B_PANEL_TEXT_COLOR);
3247a96554cSlooncraz
3257a96554cSlooncraz		if (backgroundColor != ui_color(B_PANEL_BACKGROUND_COLOR)) {
3267a96554cSlooncraz			if (backgroundColor.Brightness() > 100)
3277a96554cSlooncraz				textColor = make_color(0, 0, 0, 255);
3287a96554cSlooncraz			else
3297a96554cSlooncraz				textColor = make_color(255, 255, 255, 255);
3307a96554cSlooncraz		}
3317a96554cSlooncraz
3327a96554cSlooncraz		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));
33930fd5147Shaydentech	}
34030fd5147Shaydentech
341075e65c7SAxel Dörfler	// Draw bar
342075e65c7SAxel Dörfler
343075e65c7SAxel Dörfler	if (!updateRect.Intersects(outerFrame))
344075e65c7SAxel Dörfler		return;
345075e65c7SAxel Dörfler
346075e65c7SAxel Dörfler	rect = outerFrame;
34730fd5147Shaydentech
348bfbb9655SAugustin Cavalier	be_control_look->DrawStatusBar(this, rect, updateRect,
349bfbb9655SAugustin Cavalier		backgroundColor, fBarColor, _BarPosition(barFrame));
35030fd5147Shaydentech}
3513583227cSStefano Ceccherini
3523583227cSStefano Ceccherini
35389208c77SStephan Aßmusvoid
35489208c77SStephan AßmusBStatusBar::MessageReceived(BMessage *message)
35589208c77SStephan Aßmus{
35689208c77SStephan Aßmus	switch(message->what) {
35789208c77SStephan Aßmus		case B_UPDATE_STATUS_BAR:
35889208c77SStephan Aßmus		{
35989208c77SStephan Aßmus			float delta;
36089208c77SStephan Aßmus			const char *text = NULL, *trailing_text = NULL;
36189208c77SStephan Aßmus
36289208c77SStephan Aßmus			message->FindFloat("delta", &delta);
36389208c77SStephan Aßmus			message->FindString("text", &text);
36489208c77SStephan Aßmus			message->FindString("trailing_text", &trailing_text);
36589208c77SStephan Aßmus
36689208c77SStephan Aßmus			Update(delta, text, trailing_text);
36789208c77SStephan Aßmus
36889208c77SStephan Aßmus			break;
36989208c77SStephan Aßmus		}
37089208c77SStephan Aßmus
37180bc632aSAugustin Cavalier		case B_RESET_STATUS_BAR:
37289208c77SStephan Aßmus		{
37389208c77SStephan Aßmus			const char *label = NULL, *trailing_label = NULL;
37489208c77SStephan Aßmus
37589208c77SStephan Aßmus			message->FindString("label", &label);
37689208c77SStephan Aßmus			message->FindString("trailing_label", &trailing_label);
37789208c77SStephan Aßmus
37889208c77SStephan Aßmus			Reset(label, trailing_label);
37989208c77SStephan Aßmus
38089208c77SStephan Aßmus			break;
38189208c77SStephan Aßmus		}
38289208c77SStephan Aßmus
3837a96554cSlooncraz		case B_COLORS_UPDATED:
3847a96554cSlooncraz		{
3857a96554cSlooncraz			// Change the bar color IF we don't have an application-set color.
3867a96554cSlooncraz			if ((fInternalFlags & kCustomBarColor) == 0) {
38780bc632aSAugustin Cavalier				message->FindColor(ui_color_name(B_STATUS_BAR_COLOR),
3887a96554cSlooncraz					&fBarColor);
3897a96554cSlooncraz			}
3907a96554cSlooncraz
3917a96554cSlooncraz			break;
3927a96554cSlooncraz		}
3937a96554cSlooncraz
39489208c77SStephan Aßmus		default:
39589208c77SStephan Aßmus			BView::MessageReceived(message);
39689208c77SStephan Aßmus			break;
39789208c77SStephan Aßmus	}
39889208c77SStephan Aßmus}
39989208c77SStephan Aßmus
40089208c77SStephan Aßmus
40189208c77SStephan Aßmusvoid
40289208c77SStephan AßmusBStatusBar::MouseDown(BPoint point)
40389208c77SStephan Aßmus{
40489208c77SStephan Aßmus	BView::MouseDown(point);
40589208c77SStephan Aßmus}
40689208c77SStephan Aßmus
40789208c77SStephan Aßmus
40889208c77SStephan Aßmusvoid
40989208c77SStephan AßmusBStatusBar::MouseUp(BPoint point)
41089208c77SStephan Aßmus{
41189208c77SStephan Aßmus	BView::MouseUp(point);
41289208c77SStephan Aßmus}
41389208c77SStephan Aßmus
41489208c77SStephan Aßmus
41589208c77SStephan Aßmusvoid
41689208c77SStephan AßmusBStatusBar::MouseMoved(BPoint point, uint32 transit, const BMessage *message)
41789208c77SStephan Aßmus{
41889208c77SStephan Aßmus	BView::MouseMoved(point, transit, message);
41989208c77SStephan Aßmus}
42089208c77SStephan Aßmus
42189208c77SStephan Aßmus
42289208c77SStephan Aßmus// #pragma mark -
42389208c77SStephan Aßmus
42489208c77SStephan Aßmus
4253583227cSStefano Ceccherinivoid
4263583227cSStefano CeccheriniBStatusBar::SetBarColor(rgb_color color)
42730fd5147Shaydentech{
4287a96554cSlooncraz	fInternalFlags |= kCustomBarColor;
42930d24296SMarcus Overhagen	fBarColor = color;
43030fd5147Shaydentech
43130fd5147Shaydentech	Invalidate();
43230fd5147Shaydentech}
4333583227cSStefano Ceccherini
4343583227cSStefano Ceccherini
4353583227cSStefano Ceccherinivoid
436075e65c7SAxel DörflerBStatusBar::SetBarHeight(float barHeight)
43730fd5147Shaydentech{
438075e65c7SAxel Dörfler	float oldHeight = BarHeight();
43930fd5147Shaydentech
44030fd5147Shaydentech	fCustomBarHeight = true;
441075e65c7SAxel Dörfler	fBarHeight = barHeight;
442075e65c7SAxel Dörfler
443075e65c7SAxel Dörfler	if (barHeight == oldHeight)
444075e65c7SAxel Dörfler		return;
445075e65c7SAxel Dörfler
446075e65c7SAxel Dörfler	// resize so that the height fits
44726fe4141SStephan Aßmus	if ((Flags() & B_SUPPORTS_LAYOUT) != 0)
448a487da80SStephan Aßmus		InvalidateLayout();
44926fe4141SStephan Aßmus	else {
450a487da80SStephan Aßmus		float width, height;
451a487da80SStephan Aßmus		GetPreferredSize(&width, &height);
452a487da80SStephan Aßmus		ResizeTo(Bounds().Width(), height);
453a487da80SStephan Aßmus	}
45430fd5147Shaydentech}
45530fd5147Shaydentech
4563583227cSStefano Ceccherini
4573583227cSStefano Ceccherinivoid
458075e65c7SAxel DörflerBStatusBar::SetText(const char* string)
4593583227cSStefano Ceccherini{
460f466d35dSStephan Aßmus	_SetTextData(fText, string, fLabel, false);
46130fd5147Shaydentech}
46230fd5147Shaydentech
4633583227cSStefano Ceccherini
4643583227cSStefano Ceccherinivoid
465075e65c7SAxel DörflerBStatusBar::SetTrailingText(const char* string)
4663583227cSStefano Ceccherini{
467f466d35dSStephan Aßmus	_SetTextData(fTrailingText, string, fTrailingLabel, true);
46830fd5147Shaydentech}
4693583227cSStefano Ceccherini
4703583227cSStefano Ceccherini
4713583227cSStefano Ceccherinivoid
4723583227cSStefano CeccheriniBStatusBar::SetMaxValue(float max)
47330fd5147Shaydentech{
474e51a01a5SRene Gollent	// R5 and/or Zeta's SetMaxValue does not trigger an invalidate here.
47580bc632aSAugustin Cavalier	// this is probably not ideal behavior, but it does break apps in some cases
476e51a01a5SRene Gollent	// as observed with SpaceMonitor.
477e51a01a5SRene Gollent	// TODO: revisit this when we break binary compatibility
47830fd5147Shaydentech	fMax = max;
479075e65c7SAxel Dörfler}
48030fd5147Shaydentech
481075e65c7SAxel Dörfler
482075e65c7SAxel Dörflervoid
483075e65c7SAxel DörflerBStatusBar::Update(float delta, const char* text, const char* trailingText)
484075e65c7SAxel Dörfler{
485ea1b25f5SStephan Aßmus	// If any of these are NULL, the existing text remains (BeBook)
486ea1b25f5SStephan Aßmus	if (text == NULL)
487ea1b25f5SStephan Aßmus		text = fText.String();
488ea1b25f5SStephan Aßmus	if (trailingText == NULL)
489ea1b25f5SStephan Aßmus		trailingText = fTrailingText.String();
490075e65c7SAxel Dörfler	BStatusBar::SetTo(fCurrent + delta, text, trailingText);
49130fd5147Shaydentech}
4923583227cSStefano Ceccherini
4933583227cSStefano Ceccherini
49489208c77SStephan Aßmusvoid
49589208c77SStephan AßmusBStatusBar::Reset(const char *label, const char *trailingLabel)
49689208c77SStephan Aßmus{
49789208c77SStephan Aßmus	// Reset replaces the label and trailing label with copies of the
49889208c77SStephan Aßmus	// strings passed as arguments. If either argument is NULL, the
49989208c77SStephan Aßmus	// label or trailing label will be deleted and erased.
50089208c77SStephan Aßmus	fLabel = label ? label : "";
50189208c77SStephan Aßmus	fTrailingLabel = trailingLabel ? trailingLabel : "";
50289208c77SStephan Aßmus
50389208c77SStephan Aßmus	// Reset deletes and erases any text or trailing text
50489208c77SStephan Aßmus	fText = "";
50589208c77SStephan Aßmus	fTrailingText = "";
50689208c77SStephan Aßmus
50789208c77SStephan Aßmus	fCurrent = 0;
50889208c77SStephan Aßmus	fMax = 100;
50989208c77SStephan Aßmus
51089208c77SStephan Aßmus	Invalidate();
51189208c77SStephan Aßmus}
51289208c77SStephan Aßmus
51389208c77SStephan Aßmus
5143583227cSStefano Ceccherinivoid
515075e65c7SAxel DörflerBStatusBar::SetTo(float value, const char* text, const char* trailingText)
51630fd5147Shaydentech{
517a788be67SStephan Aßmus	SetText(text);
518a788be67SStephan Aßmus	SetTrailingText(trailingText);
51930fd5147Shaydentech
520075e65c7SAxel Dörfler	if (value > fMax)
521075e65c7SAxel Dörfler		value = fMax;
522f466d35dSStephan Aßmus	else if (value < 0)
523f466d35dSStephan Aßmus		value = 0;
524075e65c7SAxel Dörfler	if (value == fCurrent)
525075e65c7SAxel Dörfler		return;
52630fd5147Shaydentech
527075e65c7SAxel Dörfler	BRect barFrame = _BarFrame();
528075e65c7SAxel Dörfler	float oldPosition = _BarPosition(barFrame);
52930fd5147Shaydentech
530075e65c7SAxel Dörfler	fCurrent = value;
531075e65c7SAxel Dörfler
532f466d35dSStephan Aßmus	float newPosition = _BarPosition(barFrame);
533075e65c7SAxel Dörfler	if (oldPosition == newPosition)
534075e65c7SAxel Dörfler		return;
535075e65c7SAxel Dörfler
536f466d35dSStephan Aßmus	// update only the part of the status bar with actual changes
537075e65c7SAxel Dörfler	BRect update = barFrame;
538075e65c7SAxel Dörfler	if (oldPosition < newPosition) {
539f466d35dSStephan Aßmus		update.left = floorf(max_c(oldPosition - 1, update.left));
540f466d35dSStephan Aßmus		update.right = ceilf(newPosition);
541075e65c7SAxel Dörfler	} else {
542f466d35dSStephan Aßmus		update.left = floorf(max_c(newPosition - 1, update.left));
543f466d35dSStephan Aßmus		update.right = ceilf(oldPosition);
544075e65c7SAxel Dörfler	}
545075e65c7SAxel Dörfler
5462f86ba45SStephan Aßmus	// TODO: Ask the BControlLook in the first place about dirty rect.
547bfbb9655SAugustin Cavalier	update.InsetBy(-1, -1);
5482f86ba45SStephan Aßmus
549075e65c7SAxel Dörfler	Invalidate(update);
55030fd5147Shaydentech}
5513583227cSStefano Ceccherini
5523583227cSStefano Ceccherini
5533583227cSStefano Ceccherinifloat
5543583227cSStefano CeccheriniBStatusBar::CurrentValue() const
55530fd5147Shaydentech{
55630fd5147Shaydentech	return fCurrent;
55730fd5147Shaydentech}
5583583227cSStefano Ceccherini
5593583227cSStefano Ceccherini
5603583227cSStefano Ceccherinifloat
5613583227cSStefano CeccheriniBStatusBar::MaxValue() const
56230fd5147Shaydentech{
56330fd5147Shaydentech	return fMax;
56430fd5147Shaydentech}
5653583227cSStefano Ceccherini
5663583227cSStefano Ceccherini
5673583227cSStefano Ceccherinirgb_color
5683583227cSStefano CeccheriniBStatusBar::BarColor() const
56930fd5147Shaydentech{
57030fd5147Shaydentech	return fBarColor;
57130fd5147Shaydentech}
5723583227cSStefano Ceccherini
5733583227cSStefano Ceccherini
5743583227cSStefano Ceccherinifloat
5753583227cSStefano CeccheriniBStatusBar::BarHeight() const
57630fd5147Shaydentech{
577f466d35dSStephan Aßmus	if (!fCustomBarHeight && fBarHeight == -1) {
578075e65c7SAxel Dörfler		// the default bar height is as height as the label
579075e65c7SAxel Dörfler		font_height fontHeight;
580075e65c7SAxel Dörfler		GetFontHeight(&fontHeight);
581075e65c7SAxel Dörfler		const_cast<BStatusBar *>(this)->fBarHeight = fontHeight.ascent
582f466d35dSStephan Aßmus			+ fontHeight.descent + 5;
58330fd5147Shaydentech	}
584075e65c7SAxel Dörfler
585f466d35dSStephan Aßmus	return ceilf(fBarHeight);
58630fd5147Shaydentech}
5873583227cSStefano Ceccherini
5883583227cSStefano Ceccherini
5893583227cSStefano Ceccheriniconst char *
5903583227cSStefano CeccheriniBStatusBar::Text() const
59130fd5147Shaydentech{
592075e65c7SAxel Dörfler	return fText.String();
59330fd5147Shaydentech}
5943583227cSStefano Ceccherini
5953583227cSStefano Ceccherini
5963583227cSStefano Ceccheriniconst char *
5973583227cSStefano CeccheriniBStatusBar::TrailingText() const
59830fd5147Shaydentech{
599075e65c7SAxel Dörfler	return fTrailingText.String();
60030fd5147Shaydentech}
6013583227cSStefano Ceccherini
6023583227cSStefano Ceccherini
6033583227cSStefano Ceccheriniconst char *
6043583227cSStefano CeccheriniBStatusBar::Label() const
60530fd5147Shaydentech{
606075e65c7SAxel Dörfler	return fLabel.String();
60730fd5147Shaydentech}
6083583227cSStefano Ceccherini
6093583227cSStefano Ceccherini
6103583227cSStefano Ceccheriniconst char *
6113583227cSStefano CeccheriniBStatusBar::TrailingLabel() const
61230fd5147Shaydentech{
613075e65c7SAxel Dörfler	return fTrailingLabel.String();
61430fd5147Shaydentech}
6153583227cSStefano Ceccherini
6163583227cSStefano Ceccherini
61789208c77SStephan Aßmus// #pragma mark -
6183583227cSStefano Ceccherini
6193583227cSStefano Ceccherini
6203583227cSStefano CeccheriniBHandler *
621075e65c7SAxel DörflerBStatusBar::ResolveSpecifier(BMessage* message, int32 index,
622075e65c7SAxel Dörfler	BMessage* specifier, int32 what, const char *property)
62330fd5147Shaydentech{
62430fd5147Shaydentech	return BView::ResolveSpecifier(message, index, specifier, what, property);
62530fd5147Shaydentech}
6263583227cSStefano Ceccherini
6273583227cSStefano Ceccherini
6283583227cSStefano Ceccherinistatus_t
629075e65c7SAxel DörflerBStatusBar::GetSupportedSuites(BMessage* data)
63030fd5147Shaydentech{
63130fd5147Shaydentech	return BView::GetSupportedSuites(data);
63230fd5147Shaydentech}
6333583227cSStefano Ceccherini
6343583227cSStefano Ceccherini
6353583227cSStefano Ceccherinistatus_t
63639fbf550SOliver TappeBStatusBar::Perform(perform_code code, void* _data)
63739fbf550SOliver Tappe{
63839fbf550SOliver Tappe	switch (code) {
63939fbf550SOliver Tappe		case PERFORM_CODE_MIN_SIZE:
64039fbf550SOliver Tappe			((perform_data_min_size*)_data)->return_value
64139fbf550SOliver Tappe				= BStatusBar::MinSize();
64239fbf550SOliver Tappe			return B_OK;
64339fbf550SOliver Tappe		case PERFORM_CODE_MAX_SIZE:
64439fbf550SOliver Tappe			((perform_data_max_size*)_data)->return_value
64539fbf550SOliver Tappe				= BStatusBar::MaxSize();
64639fbf550SOliver Tappe			return B_OK;
64739fbf550SOliver Tappe		case PERFORM_CODE_PREFERRED_SIZE:
64839fbf550SOliver Tappe			((perform_data_preferred_size*)_data)->return_value
64939fbf550SOliver Tappe				= BStatusBar::PreferredSize();
65039fbf550SOliver Tappe			return B_OK;
65139fbf550SOliver Tappe		case PERFORM_CODE_LAYOUT_ALIGNMENT:
65239fbf550SOliver Tappe			((perform_data_layout_alignment*)_data)->return_value
65339fbf550SOliver Tappe				= BStatusBar::LayoutAlignment();
65439fbf550SOliver Tappe			return B_OK;
65539fbf550SOliver Tappe		case PERFORM_CODE_HAS_HEIGHT_FOR_WIDTH:
65639fbf550SOliver Tappe			((perform_data_has_height_for_width*)_data)->return_value
65739fbf550SOliver Tappe				= BStatusBar::HasHeightForWidth();
65839fbf550SOliver Tappe			return B_OK;
659