1/*
2 * Copyright 2004-2011 Haiku, Inc. All rights reserved.
3 * Distributed under the terms of the MIT License.
4 *
5 * Authors:
6 *		Andre Alves Garzia, andre@andregarzia.com
7 *		Stephan Assmu��
8 *		Axel D��rfler
9 *		Philippe Houdoin
10 * 		Fredrik Mod��en
11 *		Hugo Santos
12 *		Philippe Saint-Pierre
13 *		Alexander von Gluck, kallisti5@unixzen.com
14 */
15
16
17#include "InterfacesAddOn.h"
18#include "InterfaceWindow.h"
19
20#include <stdio.h>
21
22#include <Alert.h>
23#include <GroupLayout.h>
24#include <GroupLayoutBuilder.h>
25#include <ScrollView.h>
26
27
28NetworkSetupAddOn*
29get_nth_addon(image_id image, int index)
30{
31	if (index == 0)
32		return new InterfacesAddOn(image);
33	return NULL;
34}
35
36
37// #pragma mark -
38
39
40InterfacesAddOn::InterfacesAddOn(image_id image)
41	:
42	NetworkSetupAddOn(image),
43	BBox(BRect(0, 0, 0, 0), NULL, B_FOLLOW_ALL, B_NAVIGABLE_JUMP, B_NO_BORDER)
44{
45}
46
47
48InterfacesAddOn::~InterfacesAddOn()
49{
50}
51
52
53const char*
54InterfacesAddOn::Name()
55{
56	return "Interfaces";
57}
58
59
60BView*
61InterfacesAddOn::CreateView(BRect *bounds)
62{
63	BRect intViewRect = *bounds;
64
65	// Construct the ListView
66	fListview = new InterfacesListView(intViewRect,
67		"interfaces", B_FOLLOW_ALL_SIDES);
68	fListview->SetSelectionMessage(new BMessage(kMsgInterfaceSelected));
69	fListview->SetInvocationMessage(new BMessage(kMsgInterfaceConfigure));
70
71	BScrollView* scrollView = new BScrollView(NULL, fListview,
72		B_FOLLOW_ALL_SIDES, B_WILL_DRAW | B_FRAME_EVENTS, false, true);
73
74	// Construct the BButtons
75	fConfigure = new BButton(intViewRect, "configure",
76		"Configure" B_UTF8_ELLIPSIS, new BMessage(kMsgInterfaceConfigure));
77	fConfigure->SetEnabled(false);
78
79	fOnOff = new BButton(intViewRect, "onoff", "Disable",
80		new BMessage(kMsgInterfaceToggle));
81	fOnOff->SetEnabled(false);
82
83	fRenegotiate = new BButton(intViewRect, "heal",
84		"Renegotiate", new BMessage(kMsgInterfaceRenegotiate));
85	fRenegotiate->SetEnabled(false);
86
87	// Build the layout
88	SetLayout(new BGroupLayout(B_VERTICAL));
89
90	AddChild(BGroupLayoutBuilder(B_VERTICAL, 10)
91		.Add(scrollView)
92		.AddGroup(B_HORIZONTAL, 5)
93			.Add(fConfigure)
94			.Add(fOnOff)
95			.AddGlue()
96			.Add(fRenegotiate)
97		.End()
98		.SetInsets(10, 10, 10, 10)
99	);
100
101	*bounds = Bounds();
102	return this;
103}
104
105
106void
107InterfacesAddOn::AttachedToWindow()
108{
109	fListview->SetTarget(this);
110	fConfigure->SetTarget(this);
111	fOnOff->SetTarget(this);
112	fRenegotiate->SetTarget(this);
113}
114
115
116status_t
117InterfacesAddOn::Save()
118{
119	// TODO : Profile?
120	return fListview->SaveItems();
121}
122
123
124void
125InterfacesAddOn::MessageReceived(BMessage* msg)
126{
127	int nr = fListview->CurrentSelection();
128	InterfaceListItem *item = NULL;
129	if (nr != -1) {
130		item = dynamic_cast<InterfaceListItem*>(fListview->ItemAt(nr));
131	}
132
133	switch (msg->what) {
134		case kMsgInterfaceSelected:
135		{
136			fConfigure->SetEnabled(item != NULL);
137			fOnOff->SetEnabled(item != NULL);
138			fRenegotiate->SetEnabled(item != NULL);
139			if (!item)
140				break;
141			fConfigure->SetEnabled(!item->IsDisabled());
142			fRenegotiate->SetEnabled(!item->IsDisabled());
143			fOnOff->SetLabel(item->IsDisabled() ? "Enable" : "Disable");
144			break;
145		}
146
147		case kMsgInterfaceConfigure:
148		{
149			if (!item)
150				break;
151
152			InterfaceWindow* sw = new InterfaceWindow(item->GetSettings());
153			sw->Show();
154			break;
155		}
156
157		case kMsgInterfaceToggle:
158		{
159			if (!item)
160				break;
161
162			item->SetDisabled(!item->IsDisabled());
163			fConfigure->SetEnabled(!item->IsDisabled());
164			fOnOff->SetLabel(item->IsDisabled() ? "Enable" : "Disable");
165			fRenegotiate->SetEnabled(!item->IsDisabled());
166			fListview->Invalidate();
167			break;
168		}
169
170		case kMsgInterfaceRenegotiate:
171		{
172			if (!item)
173				break;
174
175			NetworkSettings* ns = item->GetSettings();
176			ns->RenegotiateAddresses();
177			break;
178		}
179
180		default:
181			BBox::MessageReceived(msg);
182	}
183}
184