Implement functionality to the InquiryPanel

git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@29263 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Oliver Ruiz Dorantes
2009-02-20 17:32:48 +00:00
parent dae3adab03
commit b36b65f92c
7 changed files with 305 additions and 90 deletions
@@ -10,6 +10,8 @@
#include "BluetoothWindow.h" #include "BluetoothWindow.h"
#include "defs.h" #include "defs.h"
BluetoothApplication::BluetoothApplication(void) BluetoothApplication::BluetoothApplication(void)
: BApplication(BLUETOOTH_APP_SIGNATURE) : BApplication(BLUETOOTH_APP_SIGNATURE)
{ {
@@ -21,6 +21,7 @@
#include <bluetooth/LocalDevice.h> #include <bluetooth/LocalDevice.h>
#include "ExtendedLocalDeviceView.h" #include "ExtendedLocalDeviceView.h"
#include "defs.h"
#include "BluetoothWindow.h" #include "BluetoothWindow.h"
static const int32 kMsgSetAntialiasing = 'anti'; static const int32 kMsgSetAntialiasing = 'anti';
@@ -119,35 +120,13 @@ void
BluetoothSettingsView::MessageReceived(BMessage *msg) BluetoothSettingsView::MessageReceived(BMessage *msg)
{ {
switch (msg->what) { switch (msg->what) {
case kMsgSetAntialiasing:
{
/* bool subpixelAntialiasing;
if (msg->FindBool("antialiasing", &subpixelAntialiasing) != B_OK
|| subpixelAntialiasing == fCurrentSubpixelAntialiasing)
break;
fCurrentSubpixelAntialiasing = subpixelAntialiasing;
fAverageWeightControl->SetEnabled(fCurrentSubpixelAntialiasing);
Window()->PostMessage(kMsgUpdate);
*/ break;
}
case kMsgSetHinting:
{
/* bool hinting;
if (msg->FindBool("hinting", &hinting) != B_OK
|| hinting == fCurrentHinting)
break;
fCurrentHinting = hinting;
Window()->PostMessage(kMsgUpdate);
*/ break;
}
case kMsgLocalSwitched: case kMsgLocalSwitched:
{ {
LocalDevice* lDevice; LocalDevice* lDevice;
if (msg->FindPointer("LocalDevice", (void**) &lDevice) == B_OK) { if (msg->FindPointer("LocalDevice", (void**) &lDevice) == B_OK) {
// Device integrity should be rechecked // Device integrity should be rechecked
fExtDeviceView->SetLocalDevice(lDevice); fExtDeviceView->SetLocalDevice(lDevice);
ActiveLocalDevice = lDevice;
} }
break; break;
} }
@@ -11,10 +11,9 @@
#include <SpaceLayoutItem.h> #include <SpaceLayoutItem.h>
#include <TabView.h> #include <TabView.h>
#include <bluetooth/LocalDevice.h>
#include "RemoteDevicesView.h" #include "RemoteDevicesView.h"
//#include "ConnChanView.h"
#include "defs.h" #include "defs.h"
static const uint32 kMsgSetDefaults = 'dflt'; static const uint32 kMsgSetDefaults = 'dflt';
@@ -24,6 +23,8 @@ static const uint32 kMsgStartServices = 'SrSR';
static const uint32 kMsgStopServices = 'StST'; static const uint32 kMsgStopServices = 'StST';
static const uint32 kMsgShowDebug = 'ShDG'; static const uint32 kMsgShowDebug = 'ShDG';
LocalDevice* ActiveLocalDevice = NULL;
BluetoothWindow::BluetoothWindow(BRect frame) BluetoothWindow::BluetoothWindow(BRect frame)
: BWindow(frame, "Bluetooth", B_TITLED_WINDOW, : BWindow(frame, "Bluetooth", B_TITLED_WINDOW,
+267 -43
View File
@@ -10,57 +10,225 @@
#include <SpaceLayoutItem.h> #include <SpaceLayoutItem.h>
#include <TextView.h> #include <TextView.h>
#include <TabView.h> #include <TabView.h>
#include <ListView.h>
#include <ListItem.h>
#include <MessageRunner.h>
#include <InquiryPanel.h> #include <bluetooth/DiscoveryAgent.h>
#include "defs.h" #include <bluetooth/DiscoveryListener.h>
#include <bluetooth/LocalDevice.h>
#include <bluetooth/bdaddrUtils.h>
static const uint32 kMsgUpdate = 'dflt'; #include "InquiryPanel.h"
static const uint32 kMsgRevert = 'rvrt';
static const uint32 kMsgStartServices = 'SrSR'; // private funcionaility provided by kit
static const uint32 kMsgStopServices = 'StST'; extern uint8 GetInquiryTime();
static const uint32 kMsgStart = 'InSt';
static const uint32 kMsgFinish = 'InFn';
static const uint32 kMsgShowDebug = 'ShDG'; static const uint32 kMsgShowDebug = 'ShDG';
static const uint32 kMsgInquiry = 'iQbt';
static const uint32 kMsgAddListDevice = 'aDdv';
InquiryPanel::InquiryPanel(BRect frame) static const uint32 kMsgAddToRemoteList = 'aDdL';
: BWindow(frame, "Bluetooth", B_TITLED_WINDOW, static const uint32 kMsgSecond = 'sCMs';
B_NOT_ZOOMABLE | B_AUTO_UPDATE_SIZE_LIMITS,
B_ALL_WORKSPACES) // TODO: Implement a BluetoothDeviceListItem class, this one is stolen from somewhere .....
class RangeItem : public BListItem
{
public:
RangeItem(uint32 lowAddress, uint32 highAddress, const char* name);
~RangeItem();
virtual void DrawItem(BView *, BRect, bool = false);
static int Compare(const void *firstArg, const void *secondArg);
private:
char* fName;
uint32 fLowAddress, fHighAddress;
};
RangeItem::RangeItem(uint32 lowAddress, uint32 highAddress, const char* name)
: BListItem(),
fLowAddress(lowAddress),
fHighAddress(highAddress)
{
fName = strdup(name);
}
RangeItem::~RangeItem()
{
delete fName;
}
/***********************************************************
* DrawItem
***********************************************************/
void
RangeItem::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());
}
BFont font = be_plain_font;
font_height finfo;
font.GetHeight(&finfo);
BPoint point = BPoint(itemRect.left + 17, itemRect.bottom - finfo.descent + 1);
owner->SetFont(be_fixed_font);
owner->SetHighColor(kBlack);
owner->MovePenTo(point);
/* if (fLowAddress >= 0) {
char string[255];
sprintf(string, "0x%04lx - 0x%04lx", fLowAddress, fHighAddress);
owner->DrawString(string);
}
point += BPoint(174, 0);*/
owner->SetFont(be_plain_font);
owner->MovePenTo(point);
owner->DrawString(fName);
}
int
RangeItem::Compare(const void *firstArg, const void *secondArg)
{
const RangeItem *item1 = *static_cast<const RangeItem * const *>(firstArg);
const RangeItem *item2 = *static_cast<const RangeItem * const *>(secondArg);
if (item1->fLowAddress < item2->fLowAddress) {
return -1;
} else if (item1->fLowAddress > item2->fLowAddress) {
return 1;
} else
return 0;
}
class PanelDiscoveryListener : public DiscoveryListener {
public:
PanelDiscoveryListener(InquiryPanel* iPanel) : DiscoveryListener() , fInquiryPanel(iPanel)
{
}
void
DeviceDiscovered(RemoteDevice* btDevice, DeviceClass cod)
{
BMessage* message = new BMessage(kMsgAddListDevice);
message->AddPointer("remote", btDevice);
fInquiryPanel->PostMessage(message);
}
void
InquiryCompleted(int discType)
{
BMessage* message = new BMessage(kMsgFinish);
fInquiryPanel->PostMessage(message);
}
void
InquiryStarted(status_t status)
{
BMessage* message = new BMessage(kMsgStart);
fInquiryPanel->PostMessage(message);
}
private:
InquiryPanel* fInquiryPanel;
};
InquiryPanel::InquiryPanel(BRect frame, LocalDevice* lDevice)
: BWindow(frame, "Bluetooth", B_FLOATING_WINDOW,
B_NOT_ZOOMABLE | B_NOT_RESIZABLE | B_AUTO_UPDATE_SIZE_LIMITS,
B_ALL_WORKSPACES ), fScanning(false)
, fLocalDevice(lDevice)
{ {
BRect iDontCare(0,0,0,0); BRect iDontCare(0,0,0,0);
BRect iDontCareToo(0,0,5,5);
SetLayout(new BGroupLayout(B_HORIZONTAL)); SetLayout(new BGroupLayout(B_HORIZONTAL));
fScanProgress = new BStatusBar(iDontCare, "status", "Scanning", "Scan time"); fScanProgress = new BStatusBar(iDontCare, "status", "Scanning progress", "");
fScanProgress->SetMaxValue(52); activeColor = fScanProgress->BarColor();
if (fLocalDevice == NULL)
fLocalDevice = LocalDevice::GetLocalDevice();
fMessage = new BTextView(iDontCare, "description", fMessage = new BTextView(iDontCare, "description",
iDontCare2, B_FOLLOW_LEFT_RIGHT, iDontCare, B_FOLLOW_NONE, B_WILL_DRAW | B_SUPPORTS_LAYOUT);
B_WILL_DRAW | B_FRAME_EVENTS);
fMessage->SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR)); fMessage->SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR));
fMessage->SetLowColor(fMessage->ViewColor()); fMessage->SetLowColor(fMessage->ViewColor());
fMessage->MakeEditable(false); fMessage->MakeEditable(false);
fMessage->SetText("asdfdasas asdfas asdfasd a dfad asdf dfasdf a"); fMessage->MakeSelectable(false);
fInquiryButton = new BButton("Inquiry", "Inquiry", fInquiryButton = new BButton("Inquiry", "Inquiry",
new BMessage(kMsgRevert), B_WILL_DRAW); new BMessage(kMsgInquiry), B_WILL_DRAW);
fAddButton = new BButton("ad", "Add device to list", fAddButton = new BButton("add", "Add device to list",
new BMessage(kMsgRevert), B_WILL_DRAW); new BMessage(kMsgAddToRemoteList), B_WILL_DRAW);
fAddButton->SetEnabled(false);
fRemoteList = new BListView("AttributeList", B_SINGLE_SELECTION_LIST);
AddChild(BGroupLayoutBuilder(B_VERTICAL, 0) if (fLocalDevice != NULL) {
.Add(fScanProgress) fMessage->SetText("Check that the bluetooth capabilities of your remote device"
.Add(BSpaceLayoutItem::CreateVerticalStrut(5)) " are activated. Press Inquiry to start scanning");
fInquiryButton->SetEnabled(true);
fDiscoveryAgent = fLocalDevice->GetDiscoveryAgent();
fDiscoveryListener = new PanelDiscoveryListener(this);
SetTitle((const char*)(fLocalDevice->GetFriendlyName().String()));
} else {
fMessage->SetText("There has not been found any bluetooth LocalDevice device registered"
" on the system");
fInquiryButton->SetEnabled(false);
}
fRunner = new BMessageRunner(BMessenger(this), new BMessage(kMsgSecond), 1000000L, -1);
AddChild(BGroupLayoutBuilder(B_VERTICAL, 10)
.Add(fMessage) .Add(fMessage)
.Add(BSpaceLayoutItem::CreateVerticalStrut(5)) .Add(BSpaceLayoutItem::CreateVerticalStrut(5))
.Add(BGroupLayoutBuilder(B_HORIZONTAL, 0) .Add(fScanProgress)
.Add(BSpaceLayoutItem::CreateVerticalStrut(5))
.Add(fRemoteList)
.Add(BSpaceLayoutItem::CreateVerticalStrut(5))
.Add(BGroupLayoutBuilder(B_HORIZONTAL, 10)
.Add(fAddButton) .Add(fAddButton)
.AddGlue() .AddGlue()
.Add(fInquiryButton) .Add(fInquiryButton)
) )
.SetInsets(5, 5, 5, 5) .SetInsets(15, 25, 15, 15)
); );
} }
@@ -68,34 +236,90 @@ InquiryPanel::InquiryPanel(BRect frame)
void void
InquiryPanel::MessageReceived(BMessage *message) InquiryPanel::MessageReceived(BMessage *message)
{ {
static float timer = 0; // expected time of the inquiry process
static float scanningTime = 0;
switch (message->what) { switch (message->what) {
case kMsgUpdate: case kMsgInquiry:
/* fDefaultsButton->SetEnabled(fRemoteDevices->IsDefaultable()
|| fAntialiasingSettings->IsDefaultable());
fRevertButton->SetEnabled(true);*/ fDiscoveryAgent->StartInquiry(BT_GIAC, fDiscoveryListener, GetInquiryTime());
break;
/* case kMsgSetDefaults:
fColorsView -> MessageReceived(new BMessage(DEFAULT_SETTINGS));
fAntialiasingSettings->SetDefaults();
fDefaultsButton->SetEnabled(false);
fRevertButton->SetEnabled(true);
break;
case kMsgRevert: timer = BT_BASE_INQUIRY_TIME * GetInquiryTime();
fColorsView -> MessageReceived(new BMessage(REVERT_SETTINGS)); fScanProgress->SetMaxValue(timer); // does it works as expected?
fAntialiasingSettings->Revert();
fDefaultsButton->SetEnabled(fColorsView->IsDefaultable() break;
|| fAntialiasingSettings->IsDefaultable());
fRevertButton->SetEnabled(false); case kMsgAddListDevice:
break; {
*/ default: RemoteDevice* rDevice;
message->FindPointer("remote", (void **)&rDevice);
fRemoteList->AddItem(new RangeItem(0,1,bdaddrUtils::ToString(rDevice->GetBluetoothAddress())));
}
break;
case kMsgStart:
fRemoteList->MakeEmpty();
fScanProgress->Reset();
scanningTime = 0;
fScanning = true;
UpdateUIStatus();
break;
case kMsgFinish:
fScanning = false;
UpdateUIStatus();
break;
case kMsgSecond:
{
if (fScanning) {
BString elapsedTime = "Remaining ";
fScanProgress->SetTo(scanningTime*100/timer); // TODO should not be needed if SetMaxValue works...
elapsedTime << (int)(timer - scanningTime) << " seconds";
fScanProgress->SetTrailingText(elapsedTime.String());
scanningTime = scanningTime + 1;
}
if (fRemoteList->CurrentSelection() < 0)
fAddButton->SetEnabled(false);
else
fAddButton->SetEnabled(true);
}
break;
default:
BWindow::MessageReceived(message); BWindow::MessageReceived(message);
break; break;
} }
} }
void
InquiryPanel::UpdateUIStatus(void)
{
if (fScanning) {
fAddButton->SetEnabled(false);
fInquiryButton->SetEnabled(false);
fScanProgress->SetBarColor(activeColor);
} else {
fInquiryButton->SetEnabled(true);
fScanProgress->SetBarColor(ui_color(B_PANEL_BACKGROUND_COLOR));
fScanProgress->SetTo(100);
fScanProgress->SetText("Scan completed");
}
}
bool bool
InquiryPanel::QuitRequested(void) InquiryPanel::QuitRequested(void)
{ {
+20 -5
View File
@@ -14,20 +14,35 @@
class BStatusBar; class BStatusBar;
class BButton; class BButton;
class BTextView; class BTextView;
class BListView;
class LocalDevice;
class DiscoveryAgent;
class DiscoveryListener;
class InquiryPanel : public BWindow class InquiryPanel : public BWindow
{ {
public: public:
InquiryPanel(BRect frame); InquiryPanel(BRect frame, LocalDevice* lDevice = NULL);
bool QuitRequested(void); bool QuitRequested(void);
void MessageReceived(BMessage *message); void MessageReceived(BMessage *message);
private: private:
BStatusBar* fScanProgress; BStatusBar* fScanProgress;
BButton* fAddButton; BButton* fAddButton;
BButton* fInquiryButton; BButton* fInquiryButton;
BTextView* fMessage; BTextView* fMessage;
BListView* fRemoteList;
BMessageRunner* fRunner;
bool fScanning;
LocalDevice* fLocalDevice;
DiscoveryAgent* fDiscoveryAgent;
DiscoveryListener* fDiscoveryListener;
void UpdateUIStatus(void);
rgb_color activeColor;
}; };
#endif #endif
@@ -2,7 +2,7 @@
* Copyright 2008-09, Oliver Ruiz Dorantes, <oliver.ruiz.dorantes_at_gmail.com> * Copyright 2008-09, Oliver Ruiz Dorantes, <oliver.ruiz.dorantes_at_gmail.com>
* All rights reserved. Distributed under the terms of the MIT License. * All rights reserved. Distributed under the terms of the MIT License.
*/ */
#include "RemoteDevicesView.h" #include <stdio.h>
#include <Alert.h> #include <Alert.h>
#include <Directory.h> #include <Directory.h>
@@ -13,17 +13,16 @@
#include <Path.h> #include <Path.h>
#include <SpaceLayoutItem.h> #include <SpaceLayoutItem.h>
#include <stdio.h>
#include "defs.h"
#include "InquiryPanel.h" #include "InquiryPanel.h"
#include "BluetoothWindow.h" #include "BluetoothWindow.h"
#include "defs.h"
#include "RemoteDevicesView.h"
static const uint32 kMsgAddDevices = 'ddDv'; static const uint32 kMsgAddDevices = 'ddDv';
RemoteDevicesView::RemoteDevicesView(const char *name, uint32 flags) RemoteDevicesView::RemoteDevicesView(const char *name, uint32 flags)
: BView(name, flags) : BView(name, flags)
{ {
@@ -75,7 +74,7 @@ RemoteDevicesView::RemoteDevicesView(const char *name, uint32 flags)
.SetInsets(5, 5, 5, 100) .SetInsets(5, 5, 5, 100)
); );
fAttrList->SetSelectionMessage(new BMessage(ATTRIBUTE_CHOSEN)); fAttrList->SetSelectionMessage(NULL);
} }
RemoteDevicesView::~RemoteDevicesView(void) RemoteDevicesView::~RemoteDevicesView(void)
@@ -108,7 +107,7 @@ RemoteDevicesView::MessageReceived(BMessage *msg)
switch(msg->what) { switch(msg->what) {
case kMsgAddDevices: case kMsgAddDevices:
{ {
InquiryPanel* iPanel = new InquiryPanel(BRect(0,0,50,50)); InquiryPanel* iPanel = new InquiryPanel(BRect(100,100,400,400), ActiveLocalDevice);
iPanel->Show(); iPanel->Show();
} }
break; break;
+3 -8
View File
@@ -1,14 +1,7 @@
#ifndef DEFS_H_ #ifndef DEFS_H_
#define DEFS_H_ #define DEFS_H_
// If these paths are changed, ensure that they all end in a '/' character #include <bluetooth/LocalDevice.h>
/*
#define SETTINGS_DIR "/boot/home/config/settings/app_server/"
#define COLOR_SET_DIR "/boot/home/config/settings/color_sets/"
#define CURSOR_SET_DIR "/boot/home/config/settings/cursor_sets/"
#define DECORATORS_DIR "/boot/home/config/add-ons/decorators/"
#define COLOR_SETTINGS_NAME "system_colors"
*/
#define BLUETOOTH_APP_SIGNATURE "application/x-vnd.haiku-BluetoothPrefs" #define BLUETOOTH_APP_SIGNATURE "application/x-vnd.haiku-BluetoothPrefs"
@@ -33,4 +26,6 @@
const uint32 kBorderSpace = 10; const uint32 kBorderSpace = 10;
const uint32 kItemSpace = 7; const uint32 kItemSpace = 7;
extern LocalDevice* ActiveLocalDevice;
#endif #endif