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