1/*
2 * Copyright 2010, Haiku Inc. All rights reserved.
3 * Distributed under the terms of the MIT License.
4 *
5 * Authors:
6 *		Adrien Destugues <pulkomandy@pulkomandy.ath.cx>
7 *		Stephan Aßmus <superstippi@gmx.de>
8 *		Axel Dörfler, axeld@pinc-software.de
9 *		Oliver Tappe <zooey@hirschkaefer.de>
10*/
11
12
13#include "TimeZoneListItem.h"
14
15#include <new>
16
17#include <Bitmap.h>
18#include <Country.h>
19#include <String.h>
20#include <TimeZone.h>
21#include <Window.h>
22
23
24static const BString skDefaultString;
25
26
27TimeZoneListItem::TimeZoneListItem(const char* text, BCountry* country,
28	BTimeZone* timeZone)
29	:
30	BStringItem(text, 0, false),
31	fIcon(NULL),
32	fTimeZone(timeZone)
33{
34	if (country != NULL) {
35		fIcon = new(std::nothrow) BBitmap(BRect(0, 0, 15, 15), B_RGBA32);
36		if (fIcon != NULL && country->GetIcon(fIcon) != B_OK) {
37			delete fIcon;
38			fIcon = NULL;
39		}
40	}
41}
42
43
44TimeZoneListItem::~TimeZoneListItem()
45{
46	delete fIcon;
47	delete fTimeZone;
48}
49
50
51void
52TimeZoneListItem::DrawItem(BView* owner, BRect frame, bool complete)
53{
54	rgb_color kHighlight = {140, 140, 140, 0};
55	rgb_color kBlack = {0, 0, 0, 0};
56
57	if (IsSelected() || complete) {
58		rgb_color color;
59		if (IsSelected())
60			color = kHighlight;
61		else
62			color = owner->ViewColor();
63		owner->SetHighColor(color);
64		owner->SetLowColor(color);
65		owner->FillRect(frame);
66		owner->SetHighColor(kBlack);
67	} else
68		owner->SetLowColor(owner->ViewColor());
69
70	// Draw the text
71	BString text = Text();
72
73	BFont font = be_plain_font;
74	font_height	finfo;
75	font.GetHeight(&finfo);
76	owner->SetFont(&font);
77	// TODO: the position is unnecessarily complicated, and not correct either
78	owner->MovePenTo(frame.left + 8, frame.top
79		+ (frame.Height() - (finfo.ascent + finfo.descent + finfo.leading)) / 2
80		+ (finfo.ascent + finfo.descent) - 1);
81	owner->DrawString(text.String());
82
83	// Draw the icon
84	frame.left = frame.right - 16;
85	BRect iconFrame(frame);
86	iconFrame.Set(iconFrame.left, iconFrame.top + 1, iconFrame.left + 15,
87		iconFrame.top + 16);
88
89	if (fIcon != NULL && fIcon->IsValid()) {
90		owner->SetDrawingMode(B_OP_OVER);
91		owner->DrawBitmap(fIcon, iconFrame);
92		owner->SetDrawingMode(B_OP_COPY);
93	}
94}
95
96
97bool
98TimeZoneListItem::HasTimeZone() const
99{
100	return fTimeZone != NULL;
101}
102
103
104const BTimeZone&
105TimeZoneListItem::TimeZone() const
106{
107	return *fTimeZone;
108}
109
110
111const BString&
112TimeZoneListItem::ID() const
113{
114	if (fTimeZone == NULL)
115		return skDefaultString;
116
117	return fTimeZone->ID();
118}
119
120
121const BString&
122TimeZoneListItem::Name() const
123{
124	if (fTimeZone == NULL)
125		return skDefaultString;
126
127	return fTimeZone->Name();
128}
129
130
131int
132TimeZoneListItem::OffsetFromGMT() const
133{
134	if (fTimeZone == NULL)
135		return 0;
136
137	return fTimeZone->OffsetFromGMT();
138}
139