1 /* 2 * Copyright 2010-2013 Haiku, Inc. All rights reserved. 3 * Distributed under the terms of the MIT License. 4 * 5 * Authors: 6 * Stephan Aßmus, superstippi@gmx.de 7 * Adrien Destugues, pulkomandy@pulkomandy.ath.cx 8 * Axel Dörfler, axeld@pinc-software.de 9 * John Scipione, jscipione@gmail.com 10 * Oliver Tappe, zooey@hirschkaefer.de 11 */ 12 13 14 #include "TimeZoneListItem.h" 15 16 #include <new> 17 18 #include <Bitmap.h> 19 #include <Country.h> 20 #include <ControlLook.h> 21 #include <String.h> 22 #include <TimeZone.h> 23 #include <Window.h> 24 25 26 static const BString skDefaultString; 27 28 29 TimeZoneListItem::TimeZoneListItem(const char* text, BCountry* country, 30 BTimeZone* timeZone) 31 : 32 BStringItem(text, 0, false), 33 fCountry(country), 34 fTimeZone(timeZone), 35 fIcon(NULL) 36 { 37 } 38 39 40 TimeZoneListItem::~TimeZoneListItem() 41 { 42 delete fCountry; 43 delete fTimeZone; 44 delete fIcon; 45 } 46 47 48 void 49 TimeZoneListItem::DrawItem(BView* owner, BRect frame, bool complete) 50 { 51 if (fIcon != NULL && fIcon->IsValid()) { 52 float iconSize = fIcon->Bounds().Width(); 53 _DrawItemWithTextOffset(owner, frame, complete, 54 iconSize + be_control_look->DefaultLabelSpacing()); 55 56 BRect iconFrame(frame.left + be_control_look->DefaultLabelSpacing(), 57 frame.top, 58 frame.left + iconSize - 1 + be_control_look->DefaultLabelSpacing(), 59 frame.top + iconSize - 1); 60 owner->SetDrawingMode(B_OP_OVER); 61 owner->DrawBitmap(fIcon, iconFrame); 62 owner->SetDrawingMode(B_OP_COPY); 63 } else 64 _DrawItemWithTextOffset(owner, frame, complete, 0); 65 } 66 67 68 void 69 TimeZoneListItem::Update(BView* owner, const BFont* font) 70 { 71 float oldIconSize = Height(); 72 BStringItem::Update(owner, font); 73 if (!HasCountry()) 74 return; 75 76 float iconSize = Height(); 77 if (iconSize == oldIconSize && fIcon != NULL) 78 return; 79 80 SetWidth(Width() + iconSize + be_control_look->DefaultLabelSpacing()); 81 82 delete fIcon; 83 fIcon = new(std::nothrow) BBitmap(BRect(0, 0, iconSize - 1, iconSize - 1), 84 B_RGBA32); 85 if (fIcon != NULL && fCountry->GetIcon(fIcon) != B_OK) { 86 delete fIcon; 87 fIcon = NULL; 88 } 89 } 90 91 92 void 93 TimeZoneListItem::SetCountry(BCountry* country) 94 { 95 delete fCountry; 96 fCountry = country; 97 } 98 99 100 void 101 TimeZoneListItem::SetTimeZone(BTimeZone* timeZone) 102 { 103 delete fTimeZone; 104 fTimeZone = timeZone; 105 } 106 107 108 const BString& 109 TimeZoneListItem::ID() const 110 { 111 if (!HasTimeZone()) 112 return skDefaultString; 113 114 return fTimeZone->ID(); 115 } 116 117 118 const BString& 119 TimeZoneListItem::Name() const 120 { 121 if (!HasTimeZone()) 122 return skDefaultString; 123 124 return fTimeZone->Name(); 125 } 126 127 128 int 129 TimeZoneListItem::OffsetFromGMT() const 130 { 131 if (!HasTimeZone()) 132 return 0; 133 134 return fTimeZone->OffsetFromGMT(); 135 } 136 137 138 void 139 TimeZoneListItem::_DrawItemWithTextOffset(BView* owner, BRect frame, 140 bool complete, float textOffset) 141 { 142 rgb_color highColor = owner->HighColor(); 143 rgb_color lowColor = owner->LowColor(); 144 145 if (IsSelected() || complete) { 146 rgb_color color; 147 if (IsSelected()) 148 color = ui_color(B_LIST_SELECTED_BACKGROUND_COLOR); 149 else 150 color = owner->ViewColor(); 151 152 owner->SetHighColor(color); 153 owner->SetLowColor(color); 154 owner->FillRect(frame); 155 } else 156 owner->SetLowColor(owner->ViewColor()); 157 158 if (!IsEnabled()) { 159 rgb_color textColor = ui_color(B_LIST_ITEM_TEXT_COLOR); 160 if (textColor.red + textColor.green + textColor.blue > 128 * 3) 161 owner->SetHighColor(tint_color(textColor, B_DARKEN_2_TINT)); 162 else 163 owner->SetHighColor(tint_color(textColor, B_LIGHTEN_2_TINT)); 164 } else { 165 if (IsSelected()) 166 owner->SetHighColor(ui_color(B_LIST_SELECTED_ITEM_TEXT_COLOR)); 167 else 168 owner->SetHighColor(ui_color(B_LIST_ITEM_TEXT_COLOR)); 169 } 170 171 owner->MovePenTo( 172 frame.left + be_control_look->DefaultLabelSpacing() + textOffset, 173 frame.top + BaselineOffset()); 174 owner->DrawString(Text()); 175 176 owner->SetHighColor(highColor); 177 owner->SetLowColor(lowColor); 178 } 179