emailuis/nmailui/src/nmmessagesearchlistview.cpp
changeset 72 64e38f08e49c
parent 65 478bc57ad291
child 75 47d84de1c893
--- a/emailuis/nmailui/src/nmmessagesearchlistview.cpp	Thu Sep 02 20:15:00 2010 +0300
+++ b/emailuis/nmailui/src/nmmessagesearchlistview.cpp	Fri Sep 17 08:27:21 2010 +0300
@@ -15,16 +15,19 @@
 *
 */
 
-static const char *NMUI_MESSAGE_SEARCH_LIST_VIEW_XML = ":/docml/nmmessagesearchlistview.docml";
-static const char *NMUI_MESSAGE_SEARCH_LIST_VIEW = "NmMessageSearchListView";
-static const char *NMUI_MESSAGE_SEARCH_LIST_TREE_LIST = "MessageTreeList";
-static const char *NMUI_MESSAGE_SEARCH_LIST_NO_MESSAGES = "MessageListNoMessages";
-static const char *NMUI_MESSAGE_SEARCH_LIST_INFO_LABEL = "LabelGroupBox";
-static const char *NMUI_MESSAGE_SEARCH_LIST_LINE_EDIT = "LineEdit";
-static const char *NMUI_MESSAGE_SEARCH_LIST_PUSH_BUTTON = "PushButton";
+#include "nmuiheaders.h"
 
+static const char *NMUI_MESSAGE_SEARCH_VIEW_XML = ":/docml/nmmessagesearchlistview.docml";
+static const char *NMUI_MESSAGE_SEARCH_VIEW = "NmMessageSearchView";
+static const char *NMUI_MESSAGE_SEARCH_MESSAGE_TREE_LIST= "MessageTreeList";
+static const char *NMUI_MESSAGE_SEARCH_PANEL = "SearchPanel";
+static const char *NMUI_MESSAGE_SEARCH_NO_MESSAGES = "MessageNoMessages";
 
-#include "nmuiheaders.h"
+static const QString NmSearchListViewProgressButton("progressbutton");
+static const QString NmSearchListViewLineEdit("lineedit");
+
+static const QString NmSearchListViewSpinnerAnimation("qtg_anim_mono_loading");
+static const QString NmSearchListViewSpinnerImage("qtg_anim_mono_loading_1");
 
 
 /*!
@@ -49,19 +52,40 @@
   mMsgListModel(msgListModel),
   mDocumentLoader(documentLoader),
   mItemContextMenu(NULL),
-  mMessageListWidget(NULL),
-  mInfoLabel(NULL),
+  mMessageList(NULL),
   mNoMessagesLabel(NULL),
+  mSearchPanel(NULL),
+  mLongPressedItem(NULL),
+  mProgressButton(NULL),
   mLineEdit(NULL),
-  mPushButton(NULL),
-  mLongPressedItem(NULL),
   mViewReady(false),
-  mSearchInProgress(false)
+  mSearchInProgress(false),
+  mSpinnerIcon(NULL),
+  mAnimationAddedToManger(false),
+  mSelectTextAfterOrientationChange(false),
+  mVkbHost(NULL)
 {
     NM_FUNCTION;
     
     loadViewLayout();
     initTreeView();
+
+    // Add spinner animation axml to animation manager.
+    HbIconAnimationManager *animationManager = HbIconAnimationManager::global();
+    if (animationManager) {
+        mAnimationAddedToManger =
+            animationManager->addDefinitionFile(NmSearchListViewSpinnerAnimation);
+    }
+
+    HbMainWindow *mainWindow = mApplication.mainWindow();
+    connect(mainWindow, SIGNAL(aboutToChangeOrientation()),
+            this, SLOT(orientationAboutToChange()));
+    connect(mainWindow, SIGNAL(orientationChanged(Qt::Orientation)),
+            this, SLOT(orientationChanged()));
+
+    mVkbHost = new HbShrinkingVkbHost(this);
+    connect(mVkbHost, SIGNAL(keypadOpened()), this, SLOT(vkbOpened()));
+    connect(mVkbHost, SIGNAL(keypadClosed()), this, SLOT(vkbClosed()));
 }
 
 
@@ -71,7 +95,7 @@
 NmMessageSearchListView::~NmMessageSearchListView()
 {
     NM_FUNCTION;
-    
+    delete mSpinnerIcon;
     delete mDocumentLoader;
 
     mWidgetList.clear();
@@ -81,6 +105,7 @@
     }
 
     delete mItemContextMenu;
+    delete mVkbHost;
 }
 
 
@@ -102,6 +127,21 @@
 /*!
     From NmBaseView.
 
+    Makes necessary activities before view can exit.
+*/
+void NmMessageSearchListView::aboutToExitView()
+{
+    NM_FUNCTION;
+    if (mSearchInProgress) {
+       // Search is in progress - do cancel.
+       mUiEngine.cancelSearch(mStartParam->mailboxId());
+       mSearchInProgress = false;
+    }
+}
+
+/*!
+    From NmBaseView.
+
     Does the lazy loading after the view layout has been loaded.
 */
 void NmMessageSearchListView::viewReady()
@@ -115,8 +155,11 @@
         // Refresh the list.
         QMetaObject::invokeMethod(this, "refreshList", Qt::QueuedConnection);
 
-        // Highlight the search input.
-        setSearchInputMode(NmHighlightedMode);
+        // Undim search field.
+        setSearchInputMode(NmNormalMode);
+
+        // Open VKB
+        QMetaObject::invokeMethod(this, "sendSoftwareInputPanelRequest", Qt::QueuedConnection);
 
         mViewReady = true;
     }
@@ -154,6 +197,11 @@
     // Handle context menu commands here.
     if (actionResponse.menuType() == NmActionContextMenu) {
         if (mLongPressedItem){
+
+            // Hide VKB
+            vkbClosed();
+            sendSoftwareInputPanelRequest(QEvent::CloseSoftwareInputPanel);
+
             NmUiStartParam *startParam = new NmUiStartParam(NmUiViewMessageViewer,
                 mStartParam->mailboxId(), mLongPressedItem->envelope().folderId(),
                 mLongPressedItem->envelope().messageId());
@@ -176,7 +224,7 @@
     
     // Use the document loader to load the view layout.
     bool ok(false);
-    setObjectName(QString(NMUI_MESSAGE_SEARCH_LIST_VIEW));
+    setObjectName(QString(NMUI_MESSAGE_SEARCH_VIEW));
     QObjectList objectList;
     objectList.append(this);
 
@@ -184,74 +232,74 @@
     // document loader uses this view when the docml file is parsed.
     if (mDocumentLoader) {
         mDocumentLoader->setObjectTree(objectList);
-        mWidgetList = mDocumentLoader->load(NMUI_MESSAGE_SEARCH_LIST_VIEW_XML, &ok);
+        mWidgetList = mDocumentLoader->load(NMUI_MESSAGE_SEARCH_VIEW_XML, &ok);
     }
 
     if (ok) {
-        // Load the search panel (contains the line edit and the push button
-        // widgets.
-        mLineEdit = qobject_cast<HbLineEdit *>(
-            mDocumentLoader->findWidget(NMUI_MESSAGE_SEARCH_LIST_LINE_EDIT));
+        // Load the search panel
+        mSearchPanel = qobject_cast<HbSearchPanel *>(
+            mDocumentLoader->findWidget(NMUI_MESSAGE_SEARCH_PANEL));
 
-        if (mLineEdit) {
-            connect(mLineEdit, SIGNAL(textChanged(QString)), 
-                    this, SLOT(criteriaChanged(QString)));
-        }
-    
-        mPushButton = qobject_cast<HbPushButton *>(
-        mDocumentLoader->findWidget(NMUI_MESSAGE_SEARCH_LIST_PUSH_BUTTON));
+        if (mSearchPanel) {
+            mSearchPanel->setProgressive(false);
+            mSearchPanel->setCancelEnabled(true);
 
-        if (mPushButton) {
-            // button is disabled when line edit is empty
-            mPushButton->setEnabled(false);
-
-            // The push button both starts and stops the search.
-            connect(mPushButton, SIGNAL(clicked()), this, SLOT(toggleSearch()));
-            mPushButton->setIcon(HbIcon("qtg_mono_search"));
-        }
+            foreach(QGraphicsItem *obj, mSearchPanel->childItems()) {
+                QGraphicsWidget *const widget = static_cast<QGraphicsWidget *>(obj);
+                if (widget) {
+                    QString objectName(widget->objectName());
+                    if (objectName == NmSearchListViewProgressButton) {
+                        mProgressButton = qobject_cast<HbPushButton *>(widget);
+                        mProgressButton->setIcon(HbIcon("qtg_mono_search"));
+                        mProgressButton->setEnabled(false);
+                    }
+                    else if(objectName == NmSearchListViewLineEdit) {
+                        mLineEdit = qobject_cast<HbLineEdit *>(widget);
+                        mLineEdit->setInputMethodHints(Qt::ImhNoPredictiveText);
+                        connect(mLineEdit, SIGNAL(textChanged(const QString &)),
+                                this, SLOT(textChanged(const QString &)));
+                    }
+                }
+            }
 
-        // Load the info label.
-        mInfoLabel = qobject_cast<HbGroupBox *>(
-            mDocumentLoader->findWidget(NMUI_MESSAGE_SEARCH_LIST_INFO_LABEL));
+            connect(mSearchPanel, SIGNAL(criteriaChanged(const QString &)),
+                    this, SLOT(toggleSearch()));
 
-        if (mInfoLabel) {
-            NM_COMMENT("NmMessageSearchListView: info label loaded");
+            connect(mSearchPanel, SIGNAL(exitClicked()),
+                    this, SLOT(exitClicked()), Qt::QueuedConnection);
 
-            // If the heading is empty, the widget will not be shown which in
-            // turn would ruin the layout.
-            mInfoLabel->setHeading(" ");
         }
 
         // Get the message list widget.
-        mMessageListWidget = qobject_cast<HbTreeView *>(
-            mDocumentLoader->findWidget(NMUI_MESSAGE_SEARCH_LIST_TREE_LIST));
+        mMessageList = qobject_cast<HbTreeView *>(
+            mDocumentLoader->findWidget(NMUI_MESSAGE_SEARCH_MESSAGE_TREE_LIST));
 
-        if (mMessageListWidget) {
+        if (mMessageList) {
             NM_COMMENT("NmMessageSearchListView: message list widget loaded");
 
             // Set the item prototype.
-            mMessageListWidget->setItemPrototype(new NmMessageListViewItem());
+            mMessageList->setItemPrototype(new NmMessageListViewItem());
 
             // Set the list widget properties.
-            mMessageListWidget->setItemRecycling(true);
-            mMessageListWidget->contentWidget()->setProperty("indentation", 0);
-            mMessageListWidget->setScrollDirections(Qt::Vertical);
-            mMessageListWidget->setClampingStyle(HbScrollArea::BounceBackClamping);
-            mMessageListWidget->setFrictionEnabled(true);
-            mMessageListWidget->setItemPixmapCacheEnabled(true);
+            mMessageList->setItemRecycling(true);
+            mMessageList->contentWidget()->setProperty("indentation", 0);
+            mMessageList->setScrollDirections(Qt::Vertical);
+            mMessageList->setClampingStyle(HbScrollArea::BounceBackClamping);
+            mMessageList->setFrictionEnabled(true);
+            mMessageList->setItemPixmapCacheEnabled(true);
             
             // We want the search results to appear one by one.
-            mMessageListWidget->setEnabledAnimations(HbAbstractItemView::Appear &
-                                                     HbAbstractItemView::Expand);
+            mMessageList->setEnabledAnimations(HbAbstractItemView::Appear &
+                HbAbstractItemView::Expand);
         }
 
         // Load the no messages label.
         mNoMessagesLabel = qobject_cast<HbLabel *>(
-            mDocumentLoader->findWidget(NMUI_MESSAGE_SEARCH_LIST_NO_MESSAGES));
+            mDocumentLoader->findWidget(NMUI_MESSAGE_SEARCH_NO_MESSAGES));
 
         if (mNoMessagesLabel) {
             NMLOG("NmMessageSearchListView: No messages label loaded.");
-            mNoMessagesLabel->hide();
+            mNoMessagesLabel->setMaximumHeight(0);
         }
     }
     else {
@@ -268,14 +316,14 @@
     NM_FUNCTION;
     
     // Get the mailbox widget pointer and set the parameters.
-    if (mMessageListWidget) {
-        connect(mMessageListWidget, SIGNAL(activated(const QModelIndex &)),
+    if (mMessageList) {
+        connect(mMessageList, SIGNAL(activated(const QModelIndex &)),
                 this, SLOT(itemActivated(const QModelIndex &)));
 
-        connect(mMessageListWidget, SIGNAL(longPressed(HbAbstractViewItem*, QPointF)),
+        connect(mMessageList, SIGNAL(longPressed(HbAbstractViewItem*, QPointF)),
                 this, SLOT(showItemContextMenu(HbAbstractViewItem*, QPointF)));
 
-        mMessageListWidget->setFocus();
+        mMessageList->setFocus();
         mItemContextMenu = new HbMenu();
     }
 
@@ -314,60 +362,42 @@
     
     if (visible) {
         // Hide the message list widget and display the "no messages" label.
-        if (mMessageListWidget) {
-            mMessageListWidget->hide();
+        if (mMessageList) {
+            mMessageList->setMaximumHeight(0);
+            mMessageList->hide();
         }
 
         if (mNoMessagesLabel && !mNoMessagesLabel->isVisible()) {
+            mNoMessagesLabel->setMaximumHeight(QWIDGETSIZE_MAX);
             mNoMessagesLabel->show();
         }
     }
     else {
         // Hide the "no messages" label and display the message list widget.
         if (mNoMessagesLabel && mNoMessagesLabel->isVisible()) {
+            mNoMessagesLabel->setMaximumHeight(0);
             mNoMessagesLabel->hide();
         }
 
-        if (mMessageListWidget) {
-            mMessageListWidget->show();
+        if (mMessageList) {
+            mMessageList->setMaximumHeight(QWIDGETSIZE_MAX);
+            mMessageList->show();
         }
     }
 }
 
 
 /*!
-    Updates the search result count information. If the message list does not
-    contain any items, a "no messages" label is displayed. Otherwise the result
-    count in the information label is updated according to the number of
-    messages in the list.
+    Shows no messages label if no matching messages were found.
 */
-void NmMessageSearchListView::updateSearchResultCountInfo()
+void NmMessageSearchListView::updateResultView()
 {
     NM_FUNCTION;
 
-    const int resultCount = mMsgListModel.rowCount();
-
-    if (resultCount) {
-        if (mInfoLabel) {
-            // Display the result count on the info label.
-            QString resultsString(hbTrId("txt_mail_list_search_results",resultCount));
-            mInfoLabel->setHeading(resultsString);
-
-            if (!mInfoLabel->isVisible()) {
-                mInfoLabel->show();
-            }
-        }
-    }
-    else {
-        // No search results!
-        if (mInfoLabel && mInfoLabel->isVisible()) {
-            mInfoLabel->hide();
-        }
-
-        // Display the "no messages" label and highlight the search term.
+    if (mMsgListModel.rowCount() < 1) {
+        // Display the "no messages".
         noMessagesLabelVisibility(true);
     }
-    
 }
 
 
@@ -379,30 +409,22 @@
 void NmMessageSearchListView::setSearchInputMode(NmSearchInputMode mode)
 {
     NM_FUNCTION;
-    
+
     if (!mLineEdit) {
         // No line edit widget!
         return;
     }
 
-    switch (mode) {
-        case NmNormalMode: {
-            mLineEdit->setEnabled(true);
-            break;
-        }
-        case NmHighlightedMode: {
-            mLineEdit->setEnabled(true);
-            mLineEdit->setFocus();
-            break;
-        }
-        case NmDimmedMode: {
-            mLineEdit->setEnabled(false);
-            break;
-        }
+    if (mode == NmNormalMode) {
+        mLineEdit->setEnabled(true);
+        mLineEdit->setFocus();
+    }
+    else {
+        mLineEdit->setEnabled(false);
+        mLineEdit->deselect();
     }
 }
 
-
 /*!
     From NmBaseView.
 
@@ -437,31 +459,6 @@
     }
 }
 
-
-/*!
-    Called when text is changed in the edit field. If there is no search term
-    in the edit field, the search button is dimmed and disabled. If the field
-    contains text, the button can be clicked.
-    
-    \param text The text in the field after the modification.
-*/
-void NmMessageSearchListView::criteriaChanged(QString text) 
-{
-    NM_FUNCTION;
-    NM_COMMENT(QString("NmMessageSearchListView::criteriaChanged %1").arg(text));
-    
-    // Check if the button should be disabled/enabled.
-    bool enabled = mPushButton->isEnabled();
-
-    if (!enabled && !text.isEmpty()) {
-        mPushButton->setEnabled(true);
-    }
-    else if (enabled && text.isEmpty()) {
-        mPushButton->setEnabled(false);
-    }
-}
-
-
 /*!
     Displays the item context menu. This method gets called if an item on the
     list is long pressed.
@@ -471,6 +468,11 @@
 {
     NM_FUNCTION;
     
+    // Stop search.
+    if (mSearchInProgress) {
+        toggleSearch();
+    }
+
     // Store long press item for later use with response.
     mLongPressedItem = 
         mMsgListModel.data(listViewItem->modelIndex(),
@@ -544,6 +546,10 @@
             mStartParam->mailboxId(), modelItem->envelope().folderId(),
             modelItem->envelope().messageId());
 
+        // Hide VKB
+        vkbClosed();
+        sendSoftwareInputPanelRequest(QEvent::CloseSoftwareInputPanel);
+
         mApplication.enterNmUiView(startParam);
     }
 }
@@ -563,24 +569,24 @@
     // The search is an asynchronous operation. If a user stops the search, it
     // might take a short while before the search is actually stopped and during
     // this time it is possible that messages matching the search are added.
-    // Therefore, update the result count info if items are added after the
+    // Therefore, update is needed if items are added after the
     // search has been stopped by the user.
     if (!mSearchInProgress) {
-        updateSearchResultCountInfo();
+        updateResultView();
     }
 
-    if (!start && mMessageListWidget) {
-        QList<HbAbstractViewItem*> items = mMessageListWidget->visibleItems();
+    if (!start && mMessageList) {
+        QList<HbAbstractViewItem*> items = mMessageList->visibleItems();
 
         if (items.count()) {
             QModelIndex index = items.at(0)->modelIndex();
 
             while (index.row() > 0) {
                 QModelIndex previous =
-                    mMessageListWidget->modelIterator()->previousIndex(index);
+                    mMessageList->modelIterator()->previousIndex(index);
 
                 if (previous.isValid()) {
-                    mMessageListWidget->scrollTo(previous);
+                    mMessageList->scrollTo(previous);
                 }
 
                 index = previous;
@@ -592,15 +598,14 @@
 
 /*!
     This method gets called when an item is removed from the list. If the
-    search has completed (or stopped), the search result count information is
-    updated according to the number of messages in the list.
+    search has completed (or stopped), the search results needs to be updated.
 */
 void NmMessageSearchListView::itemsRemoved()
 {
     NM_FUNCTION;
     
     if (!mSearchInProgress) {
-        updateSearchResultCountInfo();
+        updateResultView();
     }
 }
 
@@ -612,10 +617,9 @@
 {
     NM_FUNCTION;
     
-    if (mMessageListWidget) {
+    if (mMessageList) {
         // Set the model.
-        mMessageListWidget->setModel(
-            static_cast<QStandardItemModel*>(&mMsgListModel));
+        mMessageList->setModel(static_cast<QStandardItemModel*>(&mMsgListModel));
 
         // Connect the signals.
         connect(&mMsgListModel, SIGNAL(rowsInserted(const QModelIndex&, int, int)),
@@ -627,13 +631,6 @@
         connect(&mMsgListModel, SIGNAL(setNewParam(NmUiStartParam*)),
                 this, SLOT(reloadViewContents(NmUiStartParam*)), Qt::UniqueConnection);
     }
-
-    // The info label cannot be hidden when constructed because doing so would
-    // ruin the layout (for example the line edit widget's width would be too
-    // short in lanscape).
-    if (mInfoLabel) {
-        mInfoLabel->hide();
-    }
 }
 
 
@@ -644,7 +641,7 @@
     starts an asynchronous search. Any previous search results are removed from
     the search list.
 
-    Stops search: Sets the number of search results into the info label.
+    Stops search: shows no messages label if no matching messages were found.
 */
 void NmMessageSearchListView::toggleSearch()
 {
@@ -668,34 +665,34 @@
         // Get the search input and start the search.
         QStringList searchStrings;
 
-        if (mLineEdit) {
-            searchStrings.append(mLineEdit->text());
+        if (mSearchPanel) {
+            searchStrings.append(mSearchPanel->criteria());
         }
 
-        mUiEngine.search(mStartParam->mailboxId(), searchStrings);
-
         // Hide the virtual keyboard
-        QInputContext *ic = qApp->inputContext();
-        if (ic) {
-            QEvent *closeEvent = new QEvent(QEvent::CloseSoftwareInputPanel);
-            ic->filterEvent(closeEvent);
-            delete closeEvent;
-        }
-        
+        sendSoftwareInputPanelRequest(QEvent::CloseSoftwareInputPanel);
+
         // Hide the "no messages" label if visible and dim the search input.
         noMessagesLabelVisibility(false);
         setSearchInputMode(NmDimmedMode);
 
-        // Display the info label.
-        if (mInfoLabel) {
-            mInfoLabel->setHeading(hbTrId("txt_mail_list_searching"));
-            mInfoLabel->show();
+        // Change "Go" button icon to spinner.
+        if (mProgressButton) {
+            // Create icon if not created yet.
+            if (!mSpinnerIcon) {
+                // Select one picture if animation loading has failed.
+                QString iconName = NmSearchListViewSpinnerImage;
+                if (mAnimationAddedToManger) {
+                    iconName = NmSearchListViewSpinnerAnimation;
+                }
+                mSpinnerIcon = new HbIcon(iconName);
+                mSpinnerIcon->setFlags(HbIcon::Colorized);
+            }
+            mProgressButton->setIcon(*mSpinnerIcon);
         }
 
-        // Change the push button text.
-        if (mPushButton) {
-            mPushButton->setIcon(HbIcon("qtg_mono_search_stop"));
-        }
+        // Start search
+        mUiEngine.search(mStartParam->mailboxId(), searchStrings);
     }
 }
 
@@ -711,26 +708,131 @@
     
     mSearchInProgress = false;
     
-    // Change the push button text.
-    if (mPushButton) {
-        mPushButton->setIcon(HbIcon("qtg_mono_search"));
+    // Change search button icon to magnifying glass.
+    if (mProgressButton) {
+        mProgressButton->setIcon(HbIcon("qtg_mono_search"));
     }
 
-    // Display the search result count.
-    updateSearchResultCountInfo();
+    // Update result view. Shows no message label if no matching messages were found.
+    updateResultView();
+
+    // Undim the search input.
+    setSearchInputMode(NmNormalMode);
+
+    // In no matching messages were found. Show no messages label and open VKB.
+    if (mMsgListModel.rowCount() < 1) {
+        noMessagesLabelVisibility(true);
+
+        sendSoftwareInputPanelRequest(QEvent::RequestSoftwareInputPanel);
 
-    const int resultCount = mMsgListModel.rowCount();
+        // Select text
+        mLineEdit->selectAll();
+    }
+}
+
+/*!
+    By default search button is disabled but when some text is
+    written to search field, the search button is enabled. When search field is
+    erased, button is disabled.
 
-    if (resultCount) {
-        // Undim the search input.
-        setSearchInputMode(NmNormalMode);
+    \param text chaged text.
+*/
+void NmMessageSearchListView::textChanged(const QString &text)
+{
+    NM_FUNCTION;
+
+    if (!text.isEmpty()) {
+        if (!mProgressButton->isEnabled()) {
+            mProgressButton->setEnabled(true);
+        }
     }
     else {
-        // Highlight the search field.
-        noMessagesLabelVisibility(true);
-        setSearchInputMode(NmHighlightedMode);
+        if (mProgressButton->isEnabled()) {
+            mProgressButton->setEnabled(false);
+        }
     }
 }
 
+/*!
+    When exit button is clicked, trigger back navigation action
+    which closes the search view.
+*/
+void NmMessageSearchListView::exitClicked()
+{
+    NM_FUNCTION;
+
+    navigationAction()->activate(QAction::Trigger);
+}
+
+/*!
+    Called before orientation chages. Checks if search criteria text
+    needs to be selected after the orientation has changed.
+*/
+void NmMessageSearchListView::orientationAboutToChange()
+{
+    NM_FUNCTION;
+
+    HbVkbHostBridge *instance = HbVkbHostBridge::instance();
+    if (instance &&
+        instance->keypadStatus() == HbVkbHost::HbVkbStatusOpened &&
+        mLineEdit &&
+        mLineEdit->hasSelectedText()) {
+        mSelectTextAfterOrientationChange = true;
+    }
+}
+
+/*!
+    Called when orientation has changed. Selects search criteria text if needed.
+    \sa  NmMessageSearchListView::orientationAboutToChange()
+*/
+void NmMessageSearchListView::orientationChanged()
+{
+    NM_FUNCTION;
+    if (mSelectTextAfterOrientationChange) {
+        mLineEdit->selectAll();
+        mSelectTextAfterOrientationChange = false;
+    }
+
+}
+
+/*!
+    Sends event to software input panel (VKB).
+
+    Used event types:
+    QEvent::RequestSoftwareInputPanel(opens VKB)
+    QEvent::CloseSoftwareInputPanel(closes VKB)
+*/
+void NmMessageSearchListView::sendSoftwareInputPanelRequest(QEvent::Type eventType)
+{
+    NM_FUNCTION;
+
+    QInputContext *ic = qApp->inputContext();
+    if (ic) {
+        QScopedPointer<QEvent> event(new QEvent(eventType));
+        ic->filterEvent(event.data());
+    }
+}
+
+/*!
+    Called when virtual keyboard is about to open.
+*/
+void NmMessageSearchListView::vkbOpened()
+{
+    NM_FUNCTION;
+
+    setContentFullScreen(true);
+    hideItems(Hb::ToolBarItem);
+}
+
+/*!
+    Called when virtual keyboard is about to close.
+*/
+void NmMessageSearchListView::vkbClosed()
+{
+    NM_FUNCTION;
+
+    setContentFullScreen(false);
+    showItems(Hb::ToolBarItem);
+}
 
 // End of file.