diff -r 4545c04e61e1 -r bcf742120177 bluetoothengine/btui/btcpplugin/btcpuisearchview.cpp --- a/bluetoothengine/btui/btcpplugin/btcpuisearchview.cpp Wed Aug 18 09:59:05 2010 +0300 +++ b/bluetoothengine/btui/btcpplugin/btcpuisearchview.cpp Fri Sep 17 08:30:56 2010 +0300 @@ -16,8 +16,9 @@ */ #include "btcpuisearchview.h" -#include "btuiviewutil.h" +#include #include +#include #include #include #include @@ -31,41 +32,30 @@ #include #include #include -#include "btcpuimainview.h" -#include "btdelegatefactory.h" #include "btabstractdelegate.h" #include "btcpuisearchlistviewitem.h" #include "btuidevtypemap.h" - +#include "btuimodelsortfilter.h" +#include "btuiviewutil.h" +#include "btcpuiviewmgr.h" // docml to load const char* BTUI_SEARCHVIEW_DOCML = ":/docml/bt-search-view.docml"; -BtCpUiSearchView::BtCpUiSearchView( - BtSettingModel &settingModel, +BtcpuiSearchView::BtcpuiSearchView(BtSettingModel &settingModel, BtDeviceModel &deviceModel, QGraphicsItem *parent) : - BtCpUiBaseView(settingModel,deviceModel, parent), mAbstractDelegate(0), mBtuiModelSortFilter(0) + BtcpuiBaseView(settingModel,deviceModel, parent) { bool ret(false); - - mQuery = 0; - mLoader = 0; - mSoftKeyBackAction = 0; - - mMainView = (BtCpUiMainView *) parent; - mMainWindow = hbInstance->allMainWindows().first(); - - mSoftKeyBackAction = new HbAction(Hb::BackNaviAction, this); - BTUI_ASSERT_X(mSoftKeyBackAction, "BtCpUiSearchView::BtCpUiSearchView", "can't create back action"); - + // Create view for the application. // Set the name for the view. The name should be same as the view's // name in docml. setObjectName("bt_search_view"); mLoader = new HbDocumentLoader(); - BTUI_ASSERT_X( mLoader != 0, "BtCpUiSearchView::BtCpUiSearchView", "can't create mLoader" ); + BTUI_ASSERT_X( mLoader != 0, "BtcpuiSearchView::BtcpuiSearchView", "can't create mLoader" ); // Pass the view to documentloader. Document loader uses this view // when docml is parsed, instead of creating new view. QObjectList objectList; @@ -86,77 +76,79 @@ mDeviceIcon=0; // can't use qobject_cast since HbIcon is not derived from QObject! - mDeviceIcon = qobject_cast( mLoader->findWidget( "icon" ) ); - BTUI_ASSERT_X( mDeviceIcon != 0, "BtCpUiSearchView::BtCpUiSearchView", "Device Icon not found" ); + mDeviceIcon = qobject_cast( mLoader->findWidget( "searchIcon" ) ); + BTUI_ASSERT_X( mDeviceIcon != 0, "BtcpuiSearchView::BtcpuiSearchView", "Device Icon not found" ); mDataForm=0; - mDataForm = qobject_cast( mLoader->findWidget( "dataForm" ) ); - BTUI_ASSERT_X( mDataForm != 0, "BtCpUiSearchView::BtCpUiSearchView", "dataForm not found" ); + mDataForm = qobject_cast( mLoader->findWidget( "searchHeading" ) ); + BTUI_ASSERT_X( mDataForm != 0, "BtcpuiSearchView::BtcpuiSearchView", "dataForm not found" ); mDataForm->setHeading(hbTrId("txt_bt_subhead_bluetooth_found_devices")); mLabelSearching=0; - mLabelSearching = qobject_cast( mLoader->findWidget( "label_searching" ) ); - BTUI_ASSERT_X( mLabelSearching != 0, "BtCpUiSearchView::BtCpUiSearchView", "Searching not found" ); + mLabelSearching = qobject_cast( mLoader->findWidget( "searchStatus" ) ); + BTUI_ASSERT_X( mLabelSearching != 0, "BtcpuiSearchView::BtcpuiSearchView", "Searching not found" ); mLabelSearching->setPlainText(hbTrId("txt_bt_subhead_searching")); mDeviceList=0; mDeviceList = qobject_cast( mLoader->findWidget( "deviceList" ) ); - BTUI_ASSERT_X( mDeviceList != 0, "BtCpUiSearchView::BtCpUiSearchView", "Device List not found" ); + BTUI_ASSERT_X( mDeviceList != 0, "BtcpuiSearchView::BtcpuiSearchView", "Device List not found" ); - + ret = connect(mDeviceList, + SIGNAL(longPressed(HbAbstractViewItem*, QPointF)), this, + SLOT(showContextMenu(HbAbstractViewItem*, QPointF))); + BTUI_ASSERT_X( ret, "bt-search-view", "deviceSelected can't connect" ); + mDeviceList->setSelectionMode( HbAbstractItemView::SingleSelection ); // read landscape orientation section from docml file if needed mOrientation = mMainWindow->orientation(); if (mOrientation == Qt::Horizontal) { - mLoader->load(BTUI_SEARCHVIEW_DOCML, "landscape_ui", &ok); - BTUI_ASSERT_X( ok, "BtCpUiSearchView::BtCpUiSearchView", "Invalid docml file: landscape section problem" ); + mLoader->load(BTUI_SEARCHVIEW_DOCML, "landscape", &ok); + BTUI_ASSERT_X( ok, "BtcpuiSearchView::BtcpuiSearchView", "Invalid docml file: landscape section problem" ); } else { - mLoader->load(BTUI_SEARCHVIEW_DOCML, "portrait_ui", &ok); - BTUI_ASSERT_X( ok, "BtCpUiSearchView::BtCpUiSearchView", "Invalid docml file: portrait section problem" ); + mLoader->load(BTUI_SEARCHVIEW_DOCML, "portrait", &ok); + BTUI_ASSERT_X( ok, "BtcpuiSearchView::BtcpuiSearchView", "Invalid docml file: portrait section problem" ); } // listen for orientation changes ret = connect(mMainWindow, SIGNAL(orientationChanged(Qt::Orientation)), this, SLOT(changeOrientation(Qt::Orientation))); - BTUI_ASSERT_X( ret, "BtCpUiSearchView::BtCpUiSearchView()", "connect orientationChanged() failed"); + BTUI_ASSERT_X( ret, "BtcpuiSearchView::BtcpuiSearchView()", "connect orientationChanged() failed"); // load tool bar actions mViewBy = static_cast( mLoader->findObject( "viewByAction" ) ); - BTUI_ASSERT_X( mViewBy, "BtCpUiSearchView::BtCpUiSearchView", "view by action missing" ); + BTUI_ASSERT_X( mViewBy, "BtcpuiSearchView::BtcpuiSearchView", "view by action missing" ); ret = connect(mViewBy, SIGNAL(triggered()), this, SLOT(viewByDeviceTypeDialog())); - BTUI_ASSERT_X( ret, "BtCpUiSearchView::BtCpUiSearchView", "viewByAction can't connect" ); + BTUI_ASSERT_X( ret, "BtcpuiSearchView::BtcpuiSearchView", "viewByAction can't connect" ); mStop = static_cast( mLoader->findObject( "stopAction" ) ); - BTUI_ASSERT_X( mStop, "BtCpUiSearchView::BtCpUiSearchView", "stopAction missing" ); + BTUI_ASSERT_X( mStop, "BtcpuiSearchView::BtcpuiSearchView", "stopAction missing" ); ret = connect(mStop, SIGNAL(triggered()), this, SLOT(stopSearching())); - BTUI_ASSERT_X( ret, "BtCpUiSearchView::BtCpUiSearchView", "stopAction can't connect" ); + BTUI_ASSERT_X( ret, "BtcpuiSearchView::BtcpuiSearchView", "stopAction can't connect" ); mStop->setEnabled(true); mRetry = static_cast( mLoader->findObject( "retryAction" ) ); - BTUI_ASSERT_X( mRetry, "BtCpUiSearchView::BtCpUiSearchView", "retryAction missing" ); + BTUI_ASSERT_X( mRetry, "BtcpuiSearchView::BtcpuiSearchView", "retryAction missing" ); ret = connect(mRetry, SIGNAL(triggered()), this, SLOT(retrySearch())); - BTUI_ASSERT_X( ret, "BtCpUiSearchView::BtCpUiSearchView", "retryAction can't connect" ); + BTUI_ASSERT_X( ret, "BtcpuiSearchView::BtcpuiSearchView", "retryAction can't connect" ); // Disable for initial search mRetry->setEnabled(false); // load menu HbMenu *optionsMenu = qobject_cast(mLoader->findWidget("viewMenu")); - BTUI_ASSERT_X( optionsMenu != 0, "BtCpUiSearchView::BtCpUiSearchView", "Options menu not found" ); + BTUI_ASSERT_X( optionsMenu != 0, "BtcpuiSearchView::BtcpuiSearchView", "Options menu not found" ); this->setMenu(optionsMenu); ret = connect(mDeviceList, SIGNAL(activated(QModelIndex)), this, SLOT(deviceSelected(QModelIndex))); - BTUI_ASSERT_X( ret, "BtCpUiSearchView::BtCpUiSearchView", "deviceSelected can't connect" ); + BTUI_ASSERT_X( ret, "BtcpuiSearchView::BtcpuiSearchView", "deviceSelected can't connect" ); - // initialize device type list for "view by" option - // Note: this list needs to be in the same order as enum devTypeSelectionList - mDevTypeList << hbTrId("txt_bt_list_audio_devices") - << hbTrId("txt_bt_list_computers") - << hbTrId("txt_bt_list_input_devices") - << hbTrId("txt_bt_list_phones") - << hbTrId("txt_bt_list_other_devices"); - + bool regStatus(false); + regStatus = HbStyleLoader::registerFilePath(":/docml/btcpuisearchlistviewitem.widgetml"); + BTUI_ASSERT_X( regStatus, "BtcpuiSearchView::BtcpuiSearchView", "registerFilePath Widgetml Failed" ); + regStatus = HbStyleLoader::registerFilePath(":/docml/btcpuisearchlistviewitem.css"); + BTUI_ASSERT_X( regStatus, "BtcpuiSearchView::BtcpuiSearchView", "registerFilePath CSS Failed" ); + // initialize sort model & create // inquiry delegate // Sort is set to dynamic sort filter = true in the class, will sort automatically @@ -165,6 +157,7 @@ mBtuiModelSortFilter->addDeviceMajorFilter( BtuiDevProperty::InRange, BtuiModelSortFilter::AtLeastMatch); mDeviceList->setModel(mBtuiModelSortFilter); + mDeviceList->setLayoutName("custom-list"); // add sort order to show devices in the order they are found mBtuiModelSortFilter->setSortRole(BtDeviceModel::SeqNumRole); // Sort according to the first column (and the only column) in the listview - sorted according SeqNumRole @@ -173,34 +166,17 @@ BtCpUiSearchListViewItem *prototype = new BtCpUiSearchListViewItem(mDeviceList); prototype->setModelSortFilter(mBtuiModelSortFilter); mDeviceList->setItemPrototype(prototype); - - // Create the inquiry delegate. - mAbstractDelegate = BtDelegateFactory::newDelegate(BtDelegate::Inquiry, mSettingModel, mDeviceModel ); - - } -BtCpUiSearchView::~BtCpUiSearchView() +BtcpuiSearchView::~BtcpuiSearchView() { delete mLoader; // Also deletes all widgets that it constructed. - - setNavigationAction(0); - disconnect( mSoftKeyBackAction ); - delete mSoftKeyBackAction; - - if(mAbstractDelegate) { - disconnect(mAbstractDelegate); - delete mAbstractDelegate; - } - if(mBtuiModelSortFilter) { - delete mBtuiModelSortFilter; - } - if ( mQuery ) { - delete mQuery; - } + delete mBtuiModelSortFilter; + HbStyleLoader::unregisterFilePath(":/docml/btcpuisearchlistviewitem.widgetml"); + HbStyleLoader::unregisterFilePath(":/docml/btcpuisearchlistviewitem.css"); } -void BtCpUiSearchView::changeOrientation( Qt::Orientation orientation ) +void BtcpuiSearchView::changeOrientation( Qt::Orientation orientation ) { // ToDo: this does not handle redrawing list view items differently for portrait/landscape bool ok = false; @@ -208,181 +184,119 @@ if( orientation == Qt::Vertical ) { // load "portrait" section - mLoader->load( BTUI_SEARCHVIEW_DOCML, "portrait_ui", &ok ); - BTUI_ASSERT_X( ok, "BtCpUiSearchView::changeOrientation", "Invalid docml file: portrait section problem" ); + mLoader->load( BTUI_SEARCHVIEW_DOCML, "portrait", &ok ); + BTUI_ASSERT_X( ok, "BtcpuiSearchView::changeOrientation", "Invalid docml file: portrait section problem" ); } else { // load "landscape" section - mLoader->load( BTUI_SEARCHVIEW_DOCML, "landscape_ui", &ok ); - BTUI_ASSERT_X( ok, "BtCpUiSearchView::changeOrientation", "Invalid docml file: landscape section problem" ); + mLoader->load( BTUI_SEARCHVIEW_DOCML, "landscape", &ok ); + BTUI_ASSERT_X( ok, "BtcpuiSearchView::changeOrientation", "Invalid docml file: landscape section problem" ); } } - -void BtCpUiSearchView::viewByDeviceTypeDialog() -{ - if ( !mQuery ) { - mQuery = new HbSelectionDialog; - mQuery->setStringItems(mDevTypeList, 0); - mQuery->setSelectionMode(HbAbstractItemView::MultiSelection); - - QList current; - current.append(QVariant(0)); - mQuery->setSelectedItems(current); - - // Set the heading for the dialog. - HbLabel *headingLabel = new HbLabel(hbTrId("txt_bt_title_show"), mQuery); - mQuery->setHeadingWidget(headingLabel); - } - mQuery->open(this,SLOT(viewByDialogClosed(HbAction*))); -} /*! Callback for HbSelectionDialog closing + ReImplemented Slot from Base class */ -void BtCpUiSearchView::viewByDialogClosed(HbAction* action) +void BtcpuiSearchView::viewByDialogClosed(HbAction* action) +{ + int devTypesWanted = 0; + + devTypesWanted = selectedDeviceTypes(action); + + if (devTypesWanted) { + mBtuiModelSortFilter->clearDeviceMajorFilters(); + mBtuiModelSortFilter->addDeviceMajorFilter(BtuiDevProperty::InRange, + BtuiModelSortFilter::AtLeastMatch); // device must be in range + mBtuiModelSortFilter->addDeviceMajorFilter(devTypesWanted, + BtuiModelSortFilter::RoughMatch); // device can be any one of selected ones + } +} + +void BtcpuiSearchView::stopSearching() { - disconnect( mQuery ); // remove slot - if (action == mQuery->actions().first()) { // user pressed "Ok" - // Get selected items. - QList selections; - selections = mQuery->selectedItems(); - - int devTypesWanted = 0; - - for (int i=0; i < selections.count(); i++) { - switch (selections.at(i).toInt()) { - case BtUiDevAudioDevice: - devTypesWanted |= BtuiDevProperty::AVDev; - break; - case BtUiDevComputer: - devTypesWanted |= BtuiDevProperty::Computer; - break; - case BtUiDevInputDevice: - devTypesWanted |= BtuiDevProperty::Peripheral; - break; - case BtUiDevPhone: - devTypesWanted |= BtuiDevProperty::Phone; - break; - case BtUiDevOtherDevice: - devTypesWanted |= (BtuiDevProperty::LANAccessDev | - BtuiDevProperty::Toy | - BtuiDevProperty::WearableDev | - BtuiDevProperty::ImagingDev | - BtuiDevProperty::HealthDev | - BtuiDevProperty::UncategorizedDev); - break; - default: - // should never get here - BTUI_ASSERT_X(false, "BtCpUiSearchView::viewByDialogClosed()", - "wrong device type in viewBy dialog!"); - } - } - if (devTypesWanted) { - mBtuiModelSortFilter->clearDeviceMajorFilters(); - mBtuiModelSortFilter->addDeviceMajorFilter(BtuiDevProperty::InRange, - BtuiModelSortFilter::AtLeastMatch); // device must be in range - mBtuiModelSortFilter->addDeviceMajorFilter(devTypesWanted, - BtuiModelSortFilter::RoughMatch); // device can be any one of selected ones + // Stop searching + if (mDelegate) { + mDelegate->cancel(); + // update the states of view items + deviceSearchCompleted(KErrNone); + } +} + +void BtcpuiSearchView::take(BtAbstractDelegate *delegate) +{ + mDelegate = delegate; + if (mDelegate) { + disconnect(mDelegate, 0, 0, 0); + if (mDelegate->supportedEditorTypes() & BtDelegate::Inquiry) { + connect(mDelegate, SIGNAL(delegateCompleted(int,BtAbstractDelegate*)), + this, SLOT(deviceSearchCompleted(int))); + } else { + connect(mDelegate, SIGNAL(delegateCompleted(int,BtAbstractDelegate*)), + this, SLOT(handleDelegateCompleted(int))); } } } -void BtCpUiSearchView::stopSearching() +void BtcpuiSearchView::startSearchDelegate() { - // Stop searching - - // Stop search delegate - mAbstractDelegate->cancel(); - // reset view - deviceSearchCompleted(KErrNone); + (void) createExecuteDelegate(BtDelegate::Inquiry, + this, SLOT(deviceSearchCompleted(int)), QVariant()); } -void BtCpUiSearchView::startSearchDelegate () -{ - bool ret = false; - - // Connect to the signal from the BtDelegateInquiry for completion of the search request - ret = connect(mAbstractDelegate, SIGNAL(commandCompleted(int)), this, SLOT(searchDelegateCompleted(int))); - BTUI_ASSERT_X( ret, "BtCpUiSearchView::BtCpUiSearchView", "searchDelegateCompleted can't connect" ); - - // Connect to the signal from the BtuiModel when the search has been completed. - ret = connect(mDeviceModel, SIGNAL(deviceSearchCompleted(int)), this, SLOT(deviceSearchCompleted(int))); - BTUI_ASSERT_X( ret, "BtCpUiSearchView::BtCpUiSearchView", "deviceSearchCompleted can't connect" ); - - mAbstractDelegate->exec(QVariant()); -} - -void BtCpUiSearchView::retrySearch() +void BtcpuiSearchView::retrySearch() { // Retry search - // Change label and buttons to reflect status mLabelSearching->setPlainText(hbTrId("txt_bt_subhead_searching")); mRetry->setEnabled(false); mStop->setEnabled(true); // Make use of the delegate and start the search. - startSearchDelegate (); -} - -void BtCpUiSearchView::setSoftkeyBack() -{ - if (navigationAction() != mSoftKeyBackAction) { - setNavigationAction(mSoftKeyBackAction); - connect( mSoftKeyBackAction, SIGNAL(triggered()), this, SLOT(switchToPreviousView()) ); - } + startSearchDelegate(); } -void BtCpUiSearchView::switchToPreviousView() -{ - BTUI_ASSERT_X(mMainView, "BtCpUiSearchView::switchToPreviousView", "invalid mMainView"); - mMainView->switchToPreviousView(); -} - -void BtCpUiSearchView::activateView( const QVariant& value, bool fromBackButton ) +void BtcpuiSearchView::activateView( const QVariant& value, bool backNavi) { Q_UNUSED(value); - + if (!backNavi) { + retrySearch(); + } + // ToDo: consider whether orientation should be updated here rather than when orientation really changes; // advantage: if orientation changes temporarily in another view, but returns to previous setting before // search is reactived, there is no processing overhead - - setSoftkeyBack(); - - if ( !fromBackButton ) { - // Sets the label and toolbar buttons - retrySearch(); - } } -void BtCpUiSearchView::deactivateView() +void BtcpuiSearchView::deactivateView() { - mAbstractDelegate->cancel(); // Stop searching when leaving view - deviceSearchCompleted(KErrNone); // reset view + stopSearching(); } - -void BtCpUiSearchView::searchDelegateCompleted(int error) +void BtcpuiSearchView::deviceSearchCompleted(int error) { Q_UNUSED(error); - -} - -void BtCpUiSearchView::deviceSearchCompleted(int error) -{ - //TODO - handle error. - Q_UNUSED(error); - mLabelSearching->setPlainText(hbTrId("txt_bt_subhead_search_done")); mRetry->setEnabled(true); mStop->setEnabled(false); - - // disconnect signals - disconnect(mAbstractDelegate); - disconnect(mDeviceModel); + handleDelegateCompleted(error, mDelegate); } -void BtCpUiSearchView::deviceSelected(const QModelIndex& modelIndex) +void BtcpuiSearchView::createContextMenuActions(int majorRole) { - QModelIndex index = mBtuiModelSortFilter->mapToSource(modelIndex); - static_cast(mMainView)->goToDeviceView(index); + if (majorRole & BtuiDevProperty::Connected) { + if(majorRole & BtuiDevProperty::AVDev) { + mContextMenu->addAction(hbTrId("txt_bt_menu_disconnect_audio")); + } + else { + mContextMenu->addAction(hbTrId("txt_bt_menu_disconnect")); + } + } + else { + if(majorRole & BtuiDevProperty::AVDev) { + mContextMenu->addAction(hbTrId("txt_bt_menu_connect_audio")); + } + else { + mContextMenu->addAction(hbTrId("txt_bt_menu_connect")); + } + } }