xref: /haiku/src/preferences/bluetooth/DeviceListItem.cpp (revision 3af8011358bd4c624a0979336d48dabb466171ed)
1 /*
2  * Copyright 2009, Oliver Ruiz Dorantes, <oliver.ruiz.dorantes_at_gmail.com>
3  * All rights reserved. Distributed under the terms of the MIT License.
4  */
5 
6 #include <Bitmap.h>
7 #include <View.h>
8 
9 #include <bluetooth/bdaddrUtils.h>
10 #include <bluetooth/BluetoothDevice.h>
11 
12 #include "DeviceListItem.h"
13 
14 #define INSETS  5
15 #define TEXT_ROWS  2
16 
17 namespace Bluetooth {
18 
19 DeviceListItem::DeviceListItem(BluetoothDevice* bDevice)
20 	:
21 	BListItem(),
22 	fDevice(bDevice),
23 	fName("unknown")
24 {
25 	fAddress = bDevice->GetBluetoothAddress();
26 	fClass = bDevice->GetDeviceClass();
27 }
28 
29 
30 void
31 DeviceListItem::SetDevice(BluetoothDevice* bDevice)
32 {
33 	fAddress = bDevice->GetBluetoothAddress();
34 	fClass = bDevice->GetDeviceClass();
35 	fName = bDevice->GetFriendlyName();
36 	// AKAIR rssi we can just have it @ inquiry time...
37 }
38 
39 
40 DeviceListItem::~DeviceListItem()
41 {
42 
43 }
44 
45 
46 void
47 DeviceListItem::DrawItem(BView* owner, BRect itemRect, bool	complete)
48 {
49 	rgb_color	kBlack = { 0, 0, 0, 0 };
50 	rgb_color	kHighlight = { 156, 154, 156, 0 };
51 
52 	if (IsSelected() || complete) {
53 		rgb_color	color;
54 		if (IsSelected())
55 			color = kHighlight;
56 		else
57 			color = owner->ViewColor();
58 
59 		owner->SetHighColor(color);
60 		owner->SetLowColor(color);
61 		owner->FillRect(itemRect);
62 		owner->SetHighColor(kBlack);
63 
64 	} else {
65 		owner->SetLowColor(owner->ViewColor());
66 	}
67 
68 	font_height	finfo;
69 	be_plain_font->GetHeight(&finfo);
70 
71 	BPoint point = BPoint(itemRect.left	+ DeviceClass::PixelsForIcon
72 		+ 2 * INSETS, itemRect.bottom - finfo.descent + 1);
73 	owner->SetFont(be_fixed_font);
74 	owner->SetHighColor(kBlack);
75 	owner->MovePenTo(point);
76 
77 	BString secondLine;
78 
79 	secondLine << bdaddrUtils::ToString(fAddress) << "   ";
80 	fClass.GetMajorDeviceClass(secondLine);
81 	secondLine << " / ";
82 	fClass.GetMinorDeviceClass(secondLine);
83 
84 	owner->DrawString(secondLine.String());
85 
86 	point -= BPoint(0, (finfo.ascent + finfo.descent + finfo.leading) + INSETS);
87 
88 	owner->SetFont(be_plain_font);
89 	owner->MovePenTo(point);
90 	owner->DrawString(fName.String());
91 
92 	fClass.Draw(owner, BPoint(itemRect.left, itemRect.top));
93 
94 #if 0
95 	switch (fClass.GetMajorDeviceClass()) {
96 		case 1:
97 		{
98 			BRect iconRect(0, 0, 15, 15);
99 			BBitmap* icon  = new BBitmap(iconRect, B_CMAP8);
100 			icon->SetBits(kTVBits, kTVWidth * kTVHeight, 0, kTVColorSpace);
101 			owner->DrawBitmap(icon, iconRect, BRect(itemRect.left + INSETS,
102 				itemRect.top + INSETS, itemRect.left + INSETS + PIXELS_FOR_ICON,
103 				itemRect.top + INSETS + PIXELS_FOR_ICON));
104 			break;
105 		}
106 		case 4:
107 		{
108 			BRect iconRect(0, 0, 15, 15);
109 			BBitmap* icon = new BBitmap(iconRect, B_CMAP8);
110 			icon->SetBits(kMixerBits, kMixerWidth * kMixerHeight, 0, kMixerColorSpace);
111 			owner->DrawBitmap(icon, iconRect, BRect(itemRect.left + INSETS,
112 				itemRect.top + INSETS, itemRect.left + INSETS + PIXELS_FOR_ICON,
113 				itemRect.top + INSETS + PIXELS_FOR_ICON));
114 			break;
115 		}
116 	}
117 #endif
118 
119 	owner->SetHighColor(kBlack);
120 
121 }
122 
123 
124 void
125 DeviceListItem::Update(BView* owner, const BFont* font)
126 {
127 	BListItem::Update(owner, font);
128 
129 	font_height height;
130 	font->GetHeight(&height);
131 	SetHeight(MAX((height.ascent + height.descent + height.leading) * TEXT_ROWS
132 		+ (TEXT_ROWS + 1)*INSETS, DeviceClass::PixelsForIcon + 2 * INSETS));
133 
134 }
135 
136 
137 int
138 DeviceListItem::Compare(const void	*firstArg, const void	*secondArg)
139 {
140 	const DeviceListItem* item1 = *static_cast<const DeviceListItem* const *>
141 		(firstArg);
142 	const DeviceListItem* item2 = *static_cast<const DeviceListItem* const *>
143 		(secondArg);
144 
145 	return (int)bdaddrUtils::Compare(item1->fAddress, item2->fAddress);
146 }
147 
148 
149 BluetoothDevice*
150 DeviceListItem::Device() const
151 {
152 	return fDevice;
153 }
154 
155 
156 }
157