homescreenapp/stateplugins/hsapplibrarystateplugin/src/hssearchfilterproxymodel.cpp
changeset 96 458d8c8d9580
child 98 e6f74eb7f69f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/homescreenapp/stateplugins/hsapplibrarystateplugin/src/hssearchfilterproxymodel.cpp	Mon Oct 04 00:07:25 2010 +0300
@@ -0,0 +1,130 @@
+/*
+ * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description: Proxy model for search and highlight items view.
+ *
+ */
+
+#include <QObject>
+#include <hbcolorscheme.h>
+#include <caitemmodel.h>
+
+#include "hssearchfilterproxymodel.h"
+
+/*!
+ \class HsSearchFilterProxyModel
+ \ingroup group_hsmenustateplugin
+ \brief Proxy Model for highlight search string.
+ Highlight search string in model item title.
+ \lib ?library
+ \see QSortFilterProxyModel
+ */
+
+/*!
+ Constructor.
+ \param parent parent for object.
+ */
+HsSearchFilterProxyModel::HsSearchFilterProxyModel(QObject *parent) :
+    QSortFilterProxyModel(parent),
+    mInSettingFilterString(false)
+{
+}
+
+/*
+ Destructor.
+ */
+HsSearchFilterProxyModel::~HsSearchFilterProxyModel()
+{
+}
+
+/*
+The data() method is overridden to have a place where the highlighting
+ is added to the item data. In this implementation HTML-tags for 
+ background color are added to the beginning and end of the match 
+ in the data method using HbColorScheme.
+ \param index source parent index.
+ \param role item role.
+ */
+QVariant HsSearchFilterProxyModel::data(const QModelIndex &index, 
+        int role) const
+{
+    QColor highlight = HbColorScheme::color("qtc_lineedit_marker_normal");
+    QColor color = HbColorScheme::color("qtc_lineedit_selected");
+    
+    if (role == Qt::DisplayRole && !mFilterCriteria.isEmpty()) {
+        QStringList textList = 
+                QSortFilterProxyModel::data(index, role).toStringList();
+        if(!textList[0].isEmpty())
+        {
+            QString start = QString(
+                    TAG_START).arg( highlight.name().toUpper() ).arg(color.name().toUpper());
+            int pos = textList[0].indexOf(mFilterCriteria, 0,Qt::CaseInsensitive);
+            textList[0].insert(pos, start);
+            textList[0].insert(pos + start.length() + mFilterCriteria.length(), TAG_END);
+        }
+        
+        return QVariant(textList);
+    }
+        return QSortFilterProxyModel::data(index, role);
+
+}
+/*
+SetFilterString is the way to set the filtering criteria that is used
+ in highlight filtering. 
+ QSortFilterProxyModel does not allow overriding its own filtering 
+ criteria setting methods, so a separate method is added in the 
+ HighlightFilterProxyModel. 
+ This method stores the current filtering criteria and it can be 
+ used in the data() method in highlighting the matches. 
+ The method also calls the QSortFilterProxyModel method for setting 
+ the filterCriteria. This triggers the base class to do the actual 
+ filtering.
+ \param index source parent index.
+ \param role item role.
+ */
+void HsSearchFilterProxyModel::setFilterString(const QString &filterCriteria)
+{
+    mInSettingFilterString = true;
+    mFilterCriteria = filterCriteria;
+    setFilterRegExp(
+            QRegExp("(^|\\b)" + filterCriteria, Qt::CaseInsensitive));
+    mInSettingFilterString = false;
+}
+
+QString HsSearchFilterProxyModel::filterString() const
+{
+    return mFilterCriteria;
+}
+
+/*
+ Reimplementated from QSortFilterProxyModel.
+ The filterAcceptsRow method is overridden to send a dataChanged signal 
+ to the list view item
+ \param source_row row in source model.
+ \param source_parent source parent index.
+ */
+bool HsSearchFilterProxyModel::filterAcceptsRow (int source_row, 
+        const QModelIndex &source_parent) const
+{
+    bool retVal = QSortFilterProxyModel::filterAcceptsRow(source_row, 
+            source_parent);
+    if (mInSettingFilterString && retVal) {
+        QModelIndex mi = mapFromSource(sourceModel()->index(source_row, 0, 
+                source_parent));
+        emit const_cast<HsSearchFilterProxyModel*>(this)->dataChanged(mi, mi);
+    }
+    return retVal;
+}
+
+
+