homescreenapp/stateplugins/hsapplibrarystateplugin/src/hssearchview.cpp
changeset 71 1db7cc813a4e
parent 69 87476091b3f5
child 81 7dd137878ff8
--- a/homescreenapp/stateplugins/hsapplibrarystateplugin/src/hssearchview.cpp	Fri Jul 23 13:47:57 2010 +0300
+++ b/homescreenapp/stateplugins/hsapplibrarystateplugin/src/hssearchview.cpp	Fri Aug 06 13:36:36 2010 +0300
@@ -15,6 +15,8 @@
  *
  */
 
+#include <QApplication>
+#include <QInputContext>
 #include <QSortFilterProxyModel>
 
 #include <HbGroupBox>
@@ -23,8 +25,6 @@
 #include <HbAbstractViewItem>
 #include <HbView>
 #include <HbSearchPanel>
-#include <QApplication>
-#include <QInputContext>
 
 #include <caitemmodel.h>
 
@@ -40,11 +40,10 @@
  */
 HsSearchView::HsSearchView(HsMenuViewBuilder &builder,
         HsStateContext stateContext, HsMainWindow &mainWindow) :
-    mProxyModel(new QSortFilterProxyModel(this)),
-    mSearchView(NULL),
+    mProxyModel(new QSortFilterProxyModel(this)), mSearchView(NULL),
     mSearchListView(NULL), mSearchPanel(NULL), mStateContext(stateContext),
     mBuilder(builder), mMainWindow(mainWindow), mListView(NULL),
-    mVkbHost(NULL)
+    mVkbHost(NULL), mSearchViewBuilder(), mEmptyResultText(true)
 {
     mProxyModel->setFilterRole(CaItemModel::TextRole);
     mProxyModel->setFilterKeyColumn(1);
@@ -70,17 +69,12 @@
     HSMENUTEST_FUNC_ENTRY("HsMenuView::setSearchPanelVisible");
 
     if (visible && !isActive()) {
-
         searchBegins();
-
         connectSearchItemViewsSignals();
         connectSearchPanelSignals();
-
     } else if (isActive()) {
-
         disconnectSearchPanelSignals();
         disconnectSearchItemViewsSignals();
-
         searchFinished();
     }
     HSMENUTEST_FUNC_EXIT("HsMenuView::setSearchPanelVisible");
@@ -88,20 +82,16 @@
 
 /*!
     \param view List view to operate on.
-    \return Index of F=first visible item of \a view if any 
+    \return Index of F=first visible item of \a view if any
     or default QModelIndex otherwise.
  */
 QModelIndex HsSearchView::firstVisibleItemIndex(const HbListView *view) const
 {
-    QModelIndex result;
-
-    const QList<HbAbstractViewItem *> array =
-        view->visibleItems();
-
-    if (array.count() >= 1) {
-        result = array[0]->modelIndex();
+    const QList<HbAbstractViewItem *> array = view->visibleItems();
+    if (array.count()) {
+        return array[0]->modelIndex();
     }
-    return result;
+    return QModelIndex();
 }
 
 /*!
@@ -121,37 +111,45 @@
     mProxyModel->setFilterRegExp(
             QRegExp(QString(".*"), Qt::CaseInsensitive, QRegExp::RegExp));
 
-    QString viewLabelHeading;
-
-    if (mBuilder.currentViewLabel() != 0) {
-        viewLabelHeading = mBuilder.currentViewLabel()->heading();
-    }
-
-    setSearchContext();
-
-    mSearchView = mBuilder.currentView();
-    mSearchListView = mBuilder.currentListView();
-    mSearchPanel = mBuilder.currentSearchPanel();
+    mSearchView = mSearchViewBuilder.searchView();
+    mSearchListView = mSearchViewBuilder.searchListView();
+    mSearchPanel = mSearchViewBuilder.searchPanel();
     initSearchPanel(*mSearchPanel);
     mVkbHost.reset(new HbShrinkingVkbHost(mSearchView));
 
-    if (mBuilder.currentViewLabel() != 0) {
-        mBuilder.currentViewLabel()->setHeading(viewLabelHeading);
+    if (mBuilder.currentViewLabel()) {
+        mSearchViewBuilder.searchViewLabel()->setHeading(
+                mBuilder.currentViewLabel()->heading());
+        mSearchViewBuilder.setSearchLabledContext();
     }
 
-
     mSearchView->hideItems(Hb::AllItems);
-    mSearchListView->setModel(mProxyModel);
-    mSearchListView->setItemPrototype(new HsListViewItem());
+    mSearchListView->setModel(mProxyModel, new HsListViewItem());
 
     mMainWindow.setCurrentView(mSearchView);
 
     mSearchListView->scrollTo(
         mProxyModel->mapFromSource(mSearchViewInitialIndex),
         HbAbstractItemView::PositionAtTop);
+
+    setNoResultsVisibility();
     HSMENUTEST_FUNC_EXIT("HsSearchView::searchBegins");
 }
 
+/*!
+ Handles button visibility.
+ \param visibility indicates whether show or not to show 'empty' label.
+ */
+void HsSearchView::setNoResultsVisibility()
+{
+    if (mProxyModel->rowCount() && mEmptyResultText) {
+        mSearchViewBuilder.loadViewListSection();
+        mEmptyResultText = false;
+    } else if (!mProxyModel->rowCount() && !mEmptyResultText) {
+        mSearchViewBuilder.loadViewEmptySection();
+        mEmptyResultText = true;
+    }
+}
 
 /*
  Connects \a activated and \a longPressed signals coming from search list
@@ -197,6 +195,10 @@
 */
 void HsSearchView::connectSearchPanelSignals()
 {
+    connect(mProxyModel, SIGNAL(rowsInserted(QModelIndex, int, int)),
+            this, SLOT(setNoResultsVisibility()));
+    connect(mProxyModel, SIGNAL(rowsRemoved(QModelIndex, int, int)),
+            this, SLOT(setNoResultsVisibility()));
     connect(mSearchPanel, SIGNAL(exitClicked()),
             this, SLOT(hideSearchPanel()));
     connect(mSearchPanel, SIGNAL(criteriaChanged(QString)),
@@ -210,10 +212,8 @@
 */
 void HsSearchView::disconnectSearchPanelSignals()
 {
-    disconnect(mSearchPanel, SIGNAL(exitClicked()),
-           this, SLOT(hideSearchPanel()));
-    disconnect(mSearchPanel, SIGNAL(criteriaChanged(QString)),
-           this, SLOT(findItem(QString)));
+    mProxyModel->disconnect(this);
+    mSearchPanel->disconnect(this);
 }
 
 /*!
@@ -223,20 +223,21 @@
 {
     HSMENUTEST_FUNC_ENTRY("HsSearchView::searchFinished");
 
-    mIndexToScrollAfterSearchDone =
-            firstVisibleItemIndex(mSearchListView);
+    mIndexToScrollAfterSearchDone = firstVisibleItemIndex(mSearchListView);
 
     setOriginatingContext();
 
     mMainWindow.setCurrentView(mBuilder.currentView());
 
-    mListView->scrollTo(mProxyModel->mapToSource(mIndexToScrollAfterSearchDone),
+    mListView->scrollTo(mProxyModel->mapToSource(
+            mIndexToScrollAfterSearchDone),
             HbAbstractItemView::PositionAtTop);
 
     HbVkbHost::detachHost(mSearchView);
     mVkbHost.reset(NULL);
     mSearchListView = NULL;
     mSearchPanel = NULL;
+    mProxyModel->setSourceModel(NULL);
     HSMENUTEST_FUNC_EXIT("HsSearchView::searchFinished");
 }
 
@@ -249,8 +250,6 @@
     qDebug() << "HsSearchView::findItem: " + criteriaStr;
     HSMENUTEST_FUNC_ENTRY("HsSearchView::findItem");
 
-    mProxyModel->invalidate();
-    mProxyModel->setSourceModel(mListView->model());
     mProxyModel->setFilterRegExp(
             QRegExp("(^|\\b)" + criteriaStr, Qt::CaseInsensitive));
 
@@ -275,16 +274,16 @@
   \param item Long pressed item.
   \param coords Coordinates of the long press action.
  */
-void HsSearchView::longPressedProxySlot(HbAbstractViewItem *item,
-                                      const QPointF &coords)
+void HsSearchView::longPressedProxySlot(
+        HbAbstractViewItem *item, const QPointF &coords)
 {
     /*
     this is a kind of hack, introduced for reasons:
     item object should be reusable later, but orbit (or qt) prevents setting
     its index model to previous state
     */
-    mSearchViewLongPressedIndex =
-        mProxyModel->mapToSource(item->modelIndex());
+    mSearchViewLongPressedIndex = mProxyModel->mapToSource(
+            item->modelIndex());
     QScopedPointer<HbAbstractViewItem> itemNew(item->createItem());
     itemNew->setModelIndex(mSearchViewLongPressedIndex);
     emit longPressed(itemNew.data(), coords);
@@ -301,8 +300,8 @@
 
     lineEdit->setText("");
     lineEdit->setFocus();
-    lineEdit->setInputMethodHints(Qt::ImhNoPredictiveText |
-        Qt::ImhNoAutoUppercase);
+    lineEdit->setInputMethodHints(
+            Qt::ImhNoPredictiveText | Qt::ImhNoAutoUppercase);
 }
 
 /*!
@@ -315,15 +314,10 @@
     HSMENUTEST_FUNC_ENTRY("HsSearchView::searchPanelLineEdit");
 
     HbLineEdit *result(0);
-
     foreach(QGraphicsItem *obj, searchPanel.childItems()) {
-
         QGraphicsWidget *const widget = static_cast<QGraphicsWidget *>(obj);
-
         if (widget != NULL) {
-
             HbLineEdit *const lineEdit = qobject_cast<HbLineEdit *>(widget);
-
             if (lineEdit != NULL) {
                 result = lineEdit;
                 break;
@@ -346,15 +340,6 @@
 }
 
 /*!
-  Sets the builder context to the one determined by \a mStateContext and
-  \a HsSearchContext.
- */
-void HsSearchView::setSearchContext()
-{
-    mBuilder.setStateContext(mStateContext);
-    mBuilder.setOperationalContext(HsSearchContext);
-}
-/*!
   \retval true when search view is already invoked, \a false otherwise.
  */
 bool HsSearchView::isActive() const