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 "ServiceView.h"
11
12#include <Button.h>
13#include <Catalog.h>
14#include <LayoutBuilder.h>
15#include <MessageRunner.h>
16#include <StringView.h>
17#include <TextView.h>
18
19
20static const uint32 kMsgToggleService = 'tgls';
21static const uint32 kMsgEnableToggleButton = 'entg';
22
23static const bigtime_t kDisableDuration = 500000;
24
25
26#undef B_TRANSLATION_CONTEXT
27#define B_TRANSLATION_CONTEXT "ServiceView"
28
29
30ServiceView::ServiceView(const char* name, const char* executable,
31	const char* title, const char* description, BNetworkSettings& settings)
32	:
33	BGroupView(B_VERTICAL),
34	fName(name),
35	fExecutable(executable),
36	fSettings(settings)
37{
38	BStringView* titleView = new BStringView("service", title);
39	titleView->SetFont(be_bold_font);
40	titleView->SetExplicitMaxSize(BSize(B_SIZE_UNLIMITED, B_SIZE_UNSET));
41
42	BTextView* descriptionView = new BTextView("description");
43	descriptionView->SetText(description);
44	descriptionView->SetViewUIColor(B_PANEL_BACKGROUND_COLOR);
45	descriptionView->MakeEditable(false);
46
47	fEnableButton = new BButton("toggler", B_TRANSLATE("Enable"),
48		new BMessage(kMsgToggleService));
49
50	BLayoutBuilder::Group<>(this, B_VERTICAL)
51		.Add(titleView)
52		.Add(descriptionView)
53		.AddGlue()
54		.AddGroup(B_HORIZONTAL)
55			.AddGlue()
56			.Add(fEnableButton);
57
58	SetExplicitMinSize(BSize(200, B_SIZE_UNSET));
59	_UpdateEnableButton();
60
61	fWasEnabled = IsEnabled();
62}
63
64
65ServiceView::~ServiceView()
66{
67}
68
69
70bool
71ServiceView::IsRevertable() const
72{
73	return IsEnabled() != fWasEnabled;
74}
75
76
77status_t
78ServiceView::Revert()
79{
80	if (IsRevertable())
81		_Toggle();
82
83	return B_OK;
84}
85
86
87void
88ServiceView::SettingsUpdated(uint32 which)
89{
90	if (which == BNetworkSettings::kMsgServiceSettingsUpdated)
91		_UpdateEnableButton();
92}
93
94
95void
96ServiceView::AttachedToWindow()
97{
98	fEnableButton->SetTarget(this);
99}
100
101
102void
103ServiceView::MessageReceived(BMessage* message)
104{
105	switch (message->what) {
106		case kMsgToggleService:
107			_Toggle();
108			break;
109
110		case kMsgEnableToggleButton:
111			fEnableButton->SetEnabled(true);
112			_UpdateEnableButton();
113			break;
114
115		default:
116			BView::MessageReceived(message);
117			break;
118	}
119}
120
121
122bool
123ServiceView::IsEnabled() const
124{
125	return fSettings.Service(fName).IsRunning();
126}
127
128
129void
130ServiceView::Enable()
131{
132	BNetworkServiceSettings settings;
133	settings.SetName(fName);
134	settings.AddArgument(fExecutable);
135
136	BMessage service;
137	if (settings.GetMessage(service) == B_OK)
138		fSettings.AddService(service);
139}
140
141
142void
143ServiceView::Disable()
144{
145	fSettings.RemoveService(fName);
146}
147
148
149void
150ServiceView::_Toggle()
151{
152	if (IsEnabled())
153		Disable();
154	else
155		Enable();
156
157	fEnableButton->SetEnabled(false);
158	BMessage reenable(kMsgEnableToggleButton);
159	BMessageRunner::StartSending(this, &reenable, kDisableDuration, 1);
160}
161
162
163void
164ServiceView::_UpdateEnableButton()
165{
166	fEnableButton->SetLabel(IsEnabled()
167		? B_TRANSLATE("Disable") : B_TRANSLATE("Enable"));
168}
169