1/*
2 * Copyright 2015 Haiku, Inc. All rights reserved.
3 * Distributed under the terms of the MIT License.
4 *
5 * Authors:
6 *		Axel D��rfler, <axeld@pinc-software.de>
7 */
8
9
10#include "ServiceListItem.h"
11
12#include <Catalog.h>
13#include <ControlLook.h>
14
15
16#undef B_TRANSLATION_CONTEXT
17#define B_TRANSLATION_CONTEXT "ServiceListItem"
18
19
20static const char* kEnabledState = B_TRANSLATE_MARK("on");
21static const char* kDisabledState = B_TRANSLATE_MARK("off");
22
23
24ServiceListItem::ServiceListItem(const char* name, const char* label,
25	const BNetworkSettings& settings)
26	:
27	fName(name),
28	fLabel(label),
29	fSettings(settings),
30	fOwner(NULL),
31	fLineOffset(0),
32	fEnabled(false)
33{
34}
35
36
37ServiceListItem::~ServiceListItem()
38{
39}
40
41
42void
43ServiceListItem::DrawItem(BView* owner, BRect bounds, bool complete)
44{
45	owner->PushState();
46
47	rgb_color lowColor = owner->LowColor();
48
49	if (IsSelected() || complete) {
50		if (IsSelected()) {
51			owner->SetHighColor(ui_color(B_LIST_SELECTED_BACKGROUND_COLOR));
52			owner->SetLowColor(owner->HighColor());
53		} else
54			owner->SetHighColor(lowColor);
55
56		owner->FillRect(bounds);
57	}
58
59	const char* stateText = fEnabled ? B_TRANSLATE(kEnabledState)
60		: B_TRANSLATE(kDisabledState);
61
62	// Set the initial bounds of item contents
63	BPoint statePoint = bounds.RightTop() + BPoint(0, fLineOffset)
64		- BPoint(be_plain_font->StringWidth(stateText)
65			+ be_control_look->DefaultLabelSpacing(), 0);
66	BPoint namePoint = bounds.LeftTop()
67		+ BPoint(be_control_look->DefaultLabelSpacing(), fLineOffset);
68
69	owner->SetDrawingMode(B_OP_OVER);
70
71	rgb_color textColor;
72	if (IsSelected())
73		textColor = ui_color(B_LIST_SELECTED_ITEM_TEXT_COLOR);
74	else
75		textColor = ui_color(B_LIST_ITEM_TEXT_COLOR);
76
77	owner->SetHighColor(textColor);
78	owner->DrawString(fLabel, namePoint);
79
80	if (!fEnabled) {
81		if (textColor.red + textColor.green + textColor.blue > 128 * 3)
82			owner->SetHighColor(tint_color(textColor, B_DARKEN_1_TINT));
83		else
84			owner->SetHighColor(tint_color(textColor, B_LIGHTEN_1_TINT));
85	}
86	owner->DrawString(stateText, statePoint);
87
88	owner->PopState();
89}
90
91
92void
93ServiceListItem::Update(BView* owner, const BFont* font)
94{
95	fOwner = owner;
96	fEnabled = IsEnabled();
97
98	BListItem::Update(owner, font);
99	font_height height;
100	font->GetHeight(&height);
101
102	fLineOffset = 2 + ceilf(height.ascent + height.leading / 2);
103
104	float maxStateWidth = std::max(font->StringWidth(B_TRANSLATE(kEnabledState)),
105		font->StringWidth(B_TRANSLATE(kDisabledState)));
106	SetWidth(font->StringWidth(fLabel)
107		+ 3 * be_control_look->DefaultLabelSpacing() + maxStateWidth);
108	SetHeight(4 + ceilf(height.ascent + height.leading + height.descent));
109}
110
111
112void
113ServiceListItem::SettingsUpdated(uint32 type)
114{
115	if (type == BNetworkSettings::kMsgServiceSettingsUpdated) {
116		bool wasEnabled = fEnabled;
117		fEnabled = IsEnabled();
118		if (wasEnabled != fEnabled)
119			fOwner->Invalidate();
120	}
121}
122
123
124bool
125ServiceListItem::IsEnabled()
126{
127	return fSettings.Service(fName).IsRunning();
128}
129