1 /* 2 * Copyright 2001-2009, Haiku, Inc. All Rights Reserved. 3 * Distributed under the terms of the MIT License. 4 * 5 * Authors: 6 * Ulrich Wimboeck 7 * Marc Flerackers (mflerackers@androme.be) 8 * Rene Gollent 9 */ 10 11 12 #include <StringItem.h> 13 14 #include <stdlib.h> 15 #include <string.h> 16 17 #include <ControlLook.h> 18 #include <Message.h> 19 #include <View.h> 20 21 22 BStringItem::BStringItem(const char* text, uint32 level, bool expanded) 23 : 24 BListItem(level, expanded), 25 fText(NULL), 26 fBaselineOffset(0) 27 { 28 SetText(text); 29 } 30 31 32 BStringItem::BStringItem(BMessage* archive) 33 : 34 BListItem(archive), 35 fText(NULL), 36 fBaselineOffset(0) 37 { 38 const char* string; 39 if (archive->FindString("_label", &string) == B_OK) 40 SetText(string); 41 } 42 43 44 BStringItem::~BStringItem() 45 { 46 free(fText); 47 } 48 49 50 BArchivable* 51 BStringItem::Instantiate(BMessage* archive) 52 { 53 if (validate_instantiation(archive, "BStringItem")) 54 return new BStringItem(archive); 55 56 return NULL; 57 } 58 59 60 status_t 61 BStringItem::Archive(BMessage* archive, bool deep) const 62 { 63 status_t status = BListItem::Archive(archive); 64 65 if (status == B_OK && fText != NULL) 66 status = archive->AddString("_label", fText); 67 68 return status; 69 } 70 71 72 void 73 BStringItem::DrawItem(BView* owner, BRect frame, bool complete) 74 { 75 if (fText == NULL) 76 return; 77 78 rgb_color lowColor = owner->LowColor(); 79 80 if (IsSelected() || complete) { 81 rgb_color color; 82 if (IsSelected()) 83 color = ui_color(B_LIST_SELECTED_BACKGROUND_COLOR); 84 else 85 color = owner->ViewColor(); 86 87 owner->SetLowColor(color); 88 owner->FillRect(frame, B_SOLID_LOW); 89 } else 90 owner->SetLowColor(owner->ViewColor()); 91 92 owner->MovePenTo(frame.left + be_control_look->DefaultLabelSpacing(), 93 frame.top + fBaselineOffset); 94 95 owner->DrawString(fText); 96 97 owner->SetLowColor(lowColor); 98 } 99 100 101 void 102 BStringItem::SetText(const char* text) 103 { 104 free(fText); 105 fText = NULL; 106 107 if (text) 108 fText = strdup(text); 109 } 110 111 112 const char* 113 BStringItem::Text() const 114 { 115 return fText; 116 } 117 118 119 void 120 BStringItem::Update(BView* owner, const BFont* font) 121 { 122 if (fText != NULL) { 123 SetWidth(font->StringWidth(fText) 124 + be_control_look->DefaultLabelSpacing()); 125 } 126 127 font_height fheight; 128 font->GetHeight(&fheight); 129 130 fBaselineOffset = 2 + ceilf(fheight.ascent + fheight.leading / 2); 131 132 SetHeight(ceilf(fheight.ascent) + ceilf(fheight.descent) 133 + ceilf(fheight.leading) + 4); 134 } 135 136 137 status_t 138 BStringItem::Perform(perform_code d, void* arg) 139 { 140 return BListItem::Perform(d, arg); 141 } 142 143 144 float 145 BStringItem::BaselineOffset() const 146 { 147 return fBaselineOffset; 148 } 149 150 151 void BStringItem::_ReservedStringItem1() {} 152 void BStringItem::_ReservedStringItem2() {} 153 154 155 BStringItem::BStringItem(const BStringItem &) 156 { 157 } 158 159 160 BStringItem & 161 BStringItem::operator=(const BStringItem &) 162 { 163 return *this; 164 } 165