/*
 * Copyright 2010, Axel Dƶrfler, axeld@pinc-software.de.
 * Distributed under the terms of the MIT License.
 */


#include "WirelessNetworkMenuItem.h"

#include <string.h>

#include <Catalog.h>
#include <String.h>

#include "RadioView.h"


#undef B_TRANSLATION_CONTEXT
#define B_TRANSLATION_CONTEXT "WirelessNetworkMenuItem"


WirelessNetworkMenuItem::WirelessNetworkMenuItem(wireless_network network,
	BMessage* message)
	:
	BMenuItem(network.name, message),
	fNetwork(network)
{
	// Append authentication mode to label
	BString label = B_TRANSLATE("%name% (%authenticationMode%)");
	label.Replace("%name%", network.name, 1);
	label.Replace("%authenticationMode%",
		AuthenticationName(network.authentication_mode), 1);

	SetLabel(label.String());
}


WirelessNetworkMenuItem::~WirelessNetworkMenuItem()
{
}


BString
WirelessNetworkMenuItem::AuthenticationName(int32 mode)
{
	switch (mode) {
		default:
		case B_NETWORK_AUTHENTICATION_NONE:
			return B_TRANSLATE_CONTEXT("open", "Open network");
			break;
		case B_NETWORK_AUTHENTICATION_WEP:
			return B_TRANSLATE_CONTEXT("WEP", "WEP protected network");
			break;
		case B_NETWORK_AUTHENTICATION_WPA:
			return B_TRANSLATE_CONTEXT("WPA", "WPA protected network");
			break;
		case B_NETWORK_AUTHENTICATION_WPA2:
			return B_TRANSLATE_CONTEXT("WPA2", "WPA2 protected network");
			break;
		case B_NETWORK_AUTHENTICATION_EAP:
			return B_TRANSLATE_CONTEXT("EAP", "EAP protected network");
			break;
	}
}


void
WirelessNetworkMenuItem::DrawContent()
{
	DrawRadioIcon();
	BMenuItem::DrawContent();
}


void
WirelessNetworkMenuItem::Highlight(bool isHighlighted)
{
	BMenuItem::Highlight(isHighlighted);
}


void
WirelessNetworkMenuItem::GetContentSize(float* width, float* height)
{
	BMenuItem::GetContentSize(width, height);
	*width += *height + 4;
}


void
WirelessNetworkMenuItem::DrawRadioIcon()
{
	BRect bounds = Frame();
	bounds.left = bounds.right - 4 - bounds.Height();
	bounds.right -= 4;
	bounds.bottom -= 2;

	RadioView::Draw(Menu(), bounds, fNetwork.signal_strength,
		RadioView::DefaultMax());
}


/*static*/ int
WirelessNetworkMenuItem::CompareSignalStrength(const BMenuItem* a,
	const BMenuItem* b)
{
	WirelessNetworkMenuItem* aItem = *(WirelessNetworkMenuItem**)a;
	WirelessNetworkMenuItem* bItem = *(WirelessNetworkMenuItem**)b;

	wireless_network aNetwork = aItem->Network();
	wireless_network bNetwork = bItem->Network();

	if (aNetwork.signal_strength == bNetwork.signal_strength)
		return strncasecmp(aNetwork.name, bNetwork.name, 32);

	return bNetwork.signal_strength - aNetwork.signal_strength;
}