/*
 * Copyright 2009, Oliver Ruiz Dorantes, <oliver.ruiz.dorantes_at_gmail.com>
 * All rights reserved. Distributed under the terms of the MIT License.
 */
 
#include <Bitmap.h>
#include <View.h>
 
#include <bluetooth/bdaddrUtils.h>
#include <bluetooth/BluetoothDevice.h>
/*#include "../media/iconfile.h"*/
 
#include "DeviceListItem.h"
 
#define INSETS  5
#define TEXT_ROWS  2
 
namespace Bluetooth {
 
DeviceListItem::DeviceListItem(BluetoothDevice* bDevice)
	:
	BListItem(),
	fDevice(bDevice),
	fName("unknown")
{
	fAddress = bDevice->GetBluetoothAddress();
	fClass = bDevice->GetDeviceClass();
}
 
 
void
DeviceListItem::SetDevice(BluetoothDevice* bDevice)
{
	fAddress = bDevice->GetBluetoothAddress();
	fClass = bDevice->GetDeviceClass();
	fName = bDevice->GetFriendlyName();
	// AKAIR rssi we can just have it @ inquiry time...
}
 
 
DeviceListItem::~DeviceListItem()
{
 
}
 
 
void
DeviceListItem::DrawItem(BView* owner, BRect itemRect, bool	complete)
{
	rgb_color	kBlack = { 0, 0, 0, 0 };
	rgb_color	kHighlight = { 156, 154, 156, 0 };
 
	if (IsSelected() || complete) {
		rgb_color	color;
		if (IsSelected())
			color = kHighlight;
		else
			color = owner->ViewColor();
 
		owner->SetHighColor(color);
		owner->SetLowColor(color);
		owner->FillRect(itemRect);
		owner->SetHighColor(kBlack);
 
	} else {
		owner->SetLowColor(owner->ViewColor());
	}
 
	font_height	finfo;
	be_plain_font->GetHeight(&finfo);
 
	BPoint point = BPoint(itemRect.left	+ DeviceClass::PixelsForIcon
		+ 2 * INSETS, itemRect.bottom - finfo.descent + 1);
	owner->SetFont(be_fixed_font);
	owner->SetHighColor(kBlack);
	owner->MovePenTo(point);
 
	BString secondLine;
 
	secondLine << bdaddrUtils::ToString(fAddress) << "   ";
	fClass.GetMajorDeviceClass(secondLine);
	secondLine << " / ";
	fClass.GetMinorDeviceClass(secondLine);
 
	owner->DrawString(secondLine.String());
 
	point -= BPoint(0, (finfo.ascent + finfo.descent + finfo.leading) + INSETS);
 
	owner->SetFont(be_plain_font);
	owner->MovePenTo(point);
	owner->DrawString(fName.String());
 
	fClass.Draw(owner, BPoint(itemRect.left, itemRect.top));
 
#if 0
	switch (fClass.GetMajorDeviceClass()) {
		case 1:
		{
			BRect iconRect(0, 0, 15, 15);
			BBitmap* icon  = new BBitmap(iconRect, B_CMAP8);
			icon->SetBits(kTVBits, kTVWidth * kTVHeight, 0, kTVColorSpace);
			owner->DrawBitmap(icon, iconRect, BRect(itemRect.left + INSETS,
				itemRect.top + INSETS, itemRect.left + INSETS + PIXELS_FOR_ICON,
				itemRect.top + INSETS + PIXELS_FOR_ICON));
			break;
		}
		case 4:
		{
			BRect iconRect(0, 0, 15, 15);
			BBitmap* icon = new BBitmap(iconRect, B_CMAP8);
			icon->SetBits(kMixerBits, kMixerWidth * kMixerHeight, 0, kMixerColorSpace);
			owner->DrawBitmap(icon, iconRect, BRect(itemRect.left + INSETS,
				itemRect.top + INSETS, itemRect.left + INSETS + PIXELS_FOR_ICON,
				itemRect.top + INSETS + PIXELS_FOR_ICON));
			break;
		}
	}
#endif
 
	owner->SetHighColor(kBlack);
 
}
 
 
void
DeviceListItem::Update(BView* owner, const BFont* font)
{
	BListItem::Update(owner, font);
 
	font_height height;
	font->GetHeight(&height);
	SetHeight(MAX((height.ascent + height.descent + height.leading) * TEXT_ROWS
		+ (TEXT_ROWS + 1)*INSETS, DeviceClass::PixelsForIcon + 2 * INSETS));
 
}
 
 
int
DeviceListItem::Compare(const void	*firstArg, const void	*secondArg)
{
	const DeviceListItem* item1 = *static_cast<const DeviceListItem* const *>
		(firstArg);
	const DeviceListItem* item2 = *static_cast<const DeviceListItem* const *>
		(secondArg);
 
	return (int)bdaddrUtils::Compare(item1->fAddress, item2->fAddress);
}
 
 
BluetoothDevice*
DeviceListItem::Device() const
{
	return fDevice;
}
 
 
}

V730 Not all members of a class are initialized inside the constructor. Consider inspecting: fRSSI.