/* * Copyright 2001-2009, Haiku, Inc. All Rights Reserved. * Distributed under the terms of the MIT License. * * Authors: * Ulrich Wimboeck * Marc Flerackers (mflerackers@androme.be) * Rene Gollent */ #include #include #include #include #include #include BStringItem::BStringItem(const char* text, uint32 level, bool expanded) : BListItem(level, expanded), fText(NULL), fBaselineOffset(0) { SetText(text); } BStringItem::BStringItem(BMessage* archive) : BListItem(archive), fText(NULL), fBaselineOffset(0) { const char* string; if (archive->FindString("_label", &string) == B_OK) SetText(string); } BStringItem::~BStringItem() { free(fText); } BArchivable* BStringItem::Instantiate(BMessage* archive) { if (validate_instantiation(archive, "BStringItem")) return new BStringItem(archive); return NULL; } status_t BStringItem::Archive(BMessage* archive, bool deep) const { status_t status = BListItem::Archive(archive); if (status == B_OK && fText != NULL) status = archive->AddString("_label", fText); return status; } void BStringItem::DrawItem(BView* owner, BRect frame, bool complete) { if (fText == NULL) return; rgb_color lowColor = owner->LowColor(); if (IsSelected() || complete) { rgb_color color; if (IsSelected()) color = ui_color(B_LIST_SELECTED_BACKGROUND_COLOR); else color = owner->ViewColor(); owner->SetLowColor(color); owner->FillRect(frame, B_SOLID_LOW); } else owner->SetLowColor(owner->ViewColor()); owner->MovePenTo(frame.left + be_control_look->DefaultLabelSpacing(), frame.top + fBaselineOffset); owner->DrawString(fText); owner->SetLowColor(lowColor); } void BStringItem::SetText(const char* text) { free(fText); fText = NULL; if (text) fText = strdup(text); } const char* BStringItem::Text() const { return fText; } void BStringItem::Update(BView* owner, const BFont* font) { if (fText != NULL) { SetWidth(font->StringWidth(fText) + be_control_look->DefaultLabelSpacing()); } font_height fheight; font->GetHeight(&fheight); fBaselineOffset = 2 + ceilf(fheight.ascent + fheight.leading / 2); SetHeight(ceilf(fheight.ascent) + ceilf(fheight.descent) + ceilf(fheight.leading) + 4); } status_t BStringItem::Perform(perform_code d, void* arg) { return BListItem::Perform(d, arg); } float BStringItem::BaselineOffset() const { return fBaselineOffset; } void BStringItem::_ReservedStringItem1() {} void BStringItem::_ReservedStringItem2() {} BStringItem::BStringItem(const BStringItem &) { } BStringItem & BStringItem::operator=(const BStringItem &) { return *this; }