⛏️ index : haiku.git

/*
 * Copyright 2015 Haiku, Inc. All rights reserved.
 * Distributed under the terms of the MIT License.
 *
 * Authors:
 *		Axel DΓΆrfler, <axeld@pinc-software.de>
 */


#include "ServiceView.h"

#include <Button.h>
#include <Catalog.h>
#include <LayoutBuilder.h>
#include <MessageRunner.h>
#include <StringView.h>
#include <TextView.h>


static const uint32 kMsgToggleService = 'tgls';
static const uint32 kMsgEnableToggleButton = 'entg';

static const bigtime_t kDisableDuration = 500000;


#undef B_TRANSLATION_CONTEXT
#define B_TRANSLATION_CONTEXT "ServiceView"


ServiceView::ServiceView(const char* name, const char* executable,
	const char* title, const char* description, BNetworkSettings& settings)
	:
	BGroupView(B_VERTICAL),
	fName(name),
	fExecutable(executable),
	fSettings(settings)
{
	BStringView* titleView = new BStringView("service", title);
	titleView->SetFont(be_bold_font);
	titleView->SetExplicitMaxSize(BSize(B_SIZE_UNLIMITED, B_SIZE_UNSET));

	BTextView* descriptionView = new BTextView("description");
	descriptionView->SetText(description);
	descriptionView->SetViewUIColor(B_PANEL_BACKGROUND_COLOR);
	descriptionView->MakeEditable(false);

	fEnableButton = new BButton("toggler", B_TRANSLATE("Enable"),
		new BMessage(kMsgToggleService));

	BLayoutBuilder::Group<>(this, B_VERTICAL)
		.Add(titleView)
		.Add(descriptionView)
		.AddGlue()
		.AddGroup(B_HORIZONTAL)
			.AddGlue()
			.Add(fEnableButton);

	SetExplicitMinSize(BSize(200, B_SIZE_UNSET));
	_UpdateEnableButton();

	fWasEnabled = IsEnabled();
}


ServiceView::~ServiceView()
{
}


bool
ServiceView::IsRevertable() const
{
	return IsEnabled() != fWasEnabled;
}


status_t
ServiceView::Revert()
{
	if (IsRevertable())
		_Toggle();

	return B_OK;
}


void
ServiceView::SettingsUpdated(uint32 which)
{
	if (which == BNetworkSettings::kMsgServiceSettingsUpdated)
		_UpdateEnableButton();
}


void
ServiceView::AttachedToWindow()
{
	fEnableButton->SetTarget(this);
}


void
ServiceView::MessageReceived(BMessage* message)
{
	switch (message->what) {
		case kMsgToggleService:
			_Toggle();
			break;

		case kMsgEnableToggleButton:
			fEnableButton->SetEnabled(true);
			_UpdateEnableButton();
			break;

		default:
			BView::MessageReceived(message);
			break;
	}
}


bool
ServiceView::IsEnabled() const
{
	return fSettings.Service(fName).IsRunning();
}


void
ServiceView::Enable()
{
	BNetworkServiceSettings settings;
	settings.SetName(fName);
	settings.AddArgument(fExecutable);

	BMessage service;
	if (settings.GetMessage(service) == B_OK)
		fSettings.AddService(service);
}


void
ServiceView::Disable()
{
	fSettings.RemoveService(fName);
}


void
ServiceView::_Toggle()
{
	if (IsEnabled())
		Disable();
	else
		Enable();

	fEnableButton->SetEnabled(false);
	BMessage reenable(kMsgEnableToggleButton);
	BMessageRunner::StartSending(this, &reenable, kDisableDuration, 1);
}


void
ServiceView::_UpdateEnableButton()
{
	fEnableButton->SetLabel(IsEnabled()
		? B_TRANSLATE("Disable") : B_TRANSLATE("Enable"));
}