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