1/*
2 * Copyright 2004-2015 Haiku Inc. All rights reserved.
3 * Distributed under the terms of the MIT License.
4 */
5
6
7#include <NetworkSettingsAddOn.h>
8
9#include <stdio.h>
10#include <stdlib.h>
11
12#include <ControlLook.h>
13#include <NetworkAddress.h>
14#include <NetworkInterface.h>
15#include <NetworkSettings.h>
16
17#include "NetworkWindow.h"
18
19
20using namespace BNetworkKit;
21
22
23BNetworkSettingsItem::BNetworkSettingsItem()
24	:
25	fProfile(NULL)
26{
27}
28
29
30BNetworkSettingsItem::~BNetworkSettingsItem()
31{
32}
33
34
35status_t
36BNetworkSettingsItem::ProfileChanged(const BNetworkProfile* newProfile)
37{
38	fProfile = newProfile;
39	return B_OK;
40}
41
42
43const BNetworkProfile*
44BNetworkSettingsItem::Profile() const
45{
46	return fProfile;
47}
48
49
50void
51BNetworkSettingsItem::SettingsUpdated(uint32 type)
52{
53}
54
55
56void
57BNetworkSettingsItem::ConfigurationUpdated(const BMessage& message)
58{
59}
60
61
62void
63BNetworkSettingsItem::NotifySettingsUpdated()
64{
65	// TODO: post to network window
66	BMessage updated(kMsgSettingsItemUpdated);
67	updated.AddPointer("item", this);
68	gNetworkWindow.SendMessage(&updated);
69}
70
71
72// #pragma mark -
73
74
75BNetworkSettingsInterfaceItem::BNetworkSettingsInterfaceItem(
76	const char* interface)
77	:
78	fInterface(interface)
79{
80}
81
82
83BNetworkSettingsInterfaceItem::~BNetworkSettingsInterfaceItem()
84{
85}
86
87
88BNetworkSettingsType
89BNetworkSettingsInterfaceItem::Type() const
90{
91	return B_NETWORK_SETTINGS_TYPE_INTERFACE;
92}
93
94
95const char*
96BNetworkSettingsInterfaceItem::Interface() const
97{
98	return fInterface;
99}
100
101
102// #pragma mark -
103
104
105BNetworkInterfaceListItem::BNetworkInterfaceListItem(int family,
106	const char* interface, const char* label, BNetworkSettings& settings)
107	:
108	fSettings(settings),
109	fFamily(family),
110	fInterface(interface),
111	fLabel(label),
112	fDisabled(false),
113	fLineOffset(0),
114	fSpacing(0)
115{
116}
117
118
119BNetworkInterfaceListItem::~BNetworkInterfaceListItem()
120{
121}
122
123
124const char*
125BNetworkInterfaceListItem::Label() const
126{
127	return fLabel;
128}
129
130
131void
132BNetworkInterfaceListItem::DrawItem(BView* owner, BRect bounds, bool complete)
133{
134	owner->PushState();
135
136	if (IsSelected() || complete) {
137		if (IsSelected()) {
138			owner->SetHighColor(ui_color(B_LIST_SELECTED_BACKGROUND_COLOR));
139			owner->SetLowColor(owner->HighColor());
140		} else
141			owner->SetHighColor(owner->LowColor());
142
143		owner->FillRect(bounds);
144	}
145
146	// Set the initial bounds of item contents
147	BPoint labelLocation = bounds.LeftTop() + BPoint(fSpacing, fLineOffset);
148
149	if (fDisabled) {
150		rgb_color textColor;
151		if (IsSelected())
152			textColor = ui_color(B_LIST_SELECTED_ITEM_TEXT_COLOR);
153		else
154			textColor = ui_color(B_LIST_ITEM_TEXT_COLOR);
155
156		if (textColor.red + textColor.green + textColor.blue > 128 * 3)
157			owner->SetHighColor(tint_color(textColor, B_DARKEN_1_TINT));
158		else
159			owner->SetHighColor(tint_color(textColor, B_LIGHTEN_1_TINT));
160	} else {
161		if (IsSelected())
162			owner->SetHighColor(ui_color(B_LIST_SELECTED_ITEM_TEXT_COLOR));
163		else
164			owner->SetHighColor(ui_color(B_LIST_ITEM_TEXT_COLOR));
165	}
166
167	owner->SetFont(be_plain_font);
168	owner->DrawString(fLabel, labelLocation);
169
170	if (!fAddress.IsEmpty()) {
171		BFont font = _AddressFont();
172		owner->MovePenBy(fSpacing, 0);
173		owner->SetFont(&font);
174		owner->DrawString(fAddress);
175	}
176
177	owner->PopState();
178}
179
180
181void
182BNetworkInterfaceListItem::Update(BView* owner, const BFont* font)
183{
184	_UpdateState();
185
186	fSpacing = be_control_look->DefaultLabelSpacing();
187
188	BListItem::Update(owner, font);
189	font_height height;
190	font->GetHeight(&height);
191
192	float lineHeight = ceilf(height.ascent) + ceilf(height.descent)
193		+ ceilf(height.leading);
194	fLineOffset = 2 + ceilf(height.ascent + height.leading / 2);
195
196	SetWidth(owner->StringWidth(fLabel) + 2 * fSpacing
197		+ _AddressFont().StringWidth(fAddress.String()));
198	SetHeight(lineHeight + 4);
199}
200
201
202void
203BNetworkInterfaceListItem::ConfigurationUpdated(const BMessage& message)
204{
205	_UpdateState();
206}
207
208
209BFont
210BNetworkInterfaceListItem::_AddressFont()
211{
212	BFont font;
213	font.SetFace(B_ITALIC_FACE);
214	font.SetSize(font.Size() * 0.9f);
215	return font;
216}
217
218
219void
220BNetworkInterfaceListItem::_UpdateState()
221{
222	BNetworkInterfaceAddress address;
223	BNetworkInterface interface(fInterface);
224
225	bool autoConfigure = fSettings.Interface(fInterface).IsAutoConfigure(
226		fFamily);
227
228	fAddress = "";
229	fDisabled = !autoConfigure;
230
231	int32 index = interface.FindFirstAddress(fFamily);
232	if (index < 0)
233		return;
234
235	interface.GetAddressAt(index, address);
236
237	fDisabled = address.Address().IsEmpty() && !autoConfigure;
238	if (!address.Address().IsEmpty())
239		fAddress << "(" << address.Address().ToString() << ")";
240}
241
242
243// #pragma mark -
244
245
246BNetworkSettingsAddOn::BNetworkSettingsAddOn(image_id image,
247	BNetworkSettings& settings)
248	:
249	fImage(image),
250	fResources(NULL),
251	fSettings(settings)
252{
253}
254
255
256BNetworkSettingsAddOn::~BNetworkSettingsAddOn()
257{
258	delete fResources;
259}
260
261
262BNetworkSettingsInterfaceItem*
263BNetworkSettingsAddOn::CreateNextInterfaceItem(uint32& cookie,
264	const char* interface)
265{
266	return NULL;
267}
268
269
270BNetworkSettingsItem*
271BNetworkSettingsAddOn::CreateNextItem(uint32& cookie)
272{
273	return NULL;
274}
275
276
277image_id
278BNetworkSettingsAddOn::Image()
279{
280	return fImage;
281}
282
283
284BResources*
285BNetworkSettingsAddOn::Resources()
286{
287	if (fResources == NULL) {
288		image_info info;
289		if (get_image_info(fImage, &info) != B_OK)
290			return NULL;
291
292		BResources* resources = new BResources();
293		BFile file(info.name, B_READ_ONLY);
294		if (resources->SetTo(&file) == B_OK)
295			fResources = resources;
296		else
297			delete resources;
298	}
299	return fResources;
300}
301
302
303BNetworkSettings&
304BNetworkSettingsAddOn::Settings()
305{
306	return fSettings;
307}
308