phonebookui/pbkcommonui/src/cntcollectionlistmodel.cpp
changeset 27 de1630741fbe
parent 25 76a2435edfd4
child 31 2a11b5b00470
--- a/phonebookui/pbkcommonui/src/cntcollectionlistmodel.cpp	Fri Apr 16 14:53:18 2010 +0300
+++ b/phonebookui/pbkcommonui/src/cntcollectionlistmodel.cpp	Mon May 03 12:24:20 2010 +0300
@@ -16,6 +16,9 @@
 */
 
 #include "cntcollectionlistmodel.h"
+#include "cntextensionmanager.h"
+#include <cntuiextensionfactory.h>
+#include <cntuigroupsupplier.h>
 
 #include <QIcon>
 #include <qtcontacts.h>
@@ -25,8 +28,9 @@
 /*!
 Constructor
 */
-CntCollectionListModel::CntCollectionListModel(QContactManager *manager, QObject *parent)
+CntCollectionListModel::CntCollectionListModel(QContactManager *manager, CntExtensionManager &extensionManager, QObject *parent)
     : QAbstractListModel(parent),
+    mExtensionManager(extensionManager),
     mContactManager(manager),
     mFavoriteGroupId(-1)
 {
@@ -65,8 +69,11 @@
     else if (role == Qt::DecorationRole)
     {
         QVariantList icons;
-        HbIcon icon(values[1].toString());
-        icons.append(icon);
+        for (int i = 0;i < values[1].toStringList().count();i++)
+        {
+            HbIcon icon(values[1].toStringList().at(i));
+            icons.append(icon);
+        }
         return QVariant(icons);
     }
     
@@ -102,6 +109,22 @@
     
     beginRemoveRows(parent, row, row);
     mDataPointer->mDataList.removeAt(row);
+    if (mDataPointer->mExtensions.remove(row) > 0)
+    {
+        // if extension group was deleted, refresh the indices of extension group map
+        QList<int> keyList = mDataPointer->mExtensions.keys();
+        qSort(keyList);
+        
+        for (int i = 0;i < keyList.count();i++)
+        {
+            if (keyList.at(i) > row)
+            {
+                CntUiGroupSupplier* groupSupplier = mDataPointer->mExtensions.take(keyList.at(i));
+                mDataPointer->mExtensions.insert(keyList.at(i) - 1, groupSupplier);
+            }
+        }
+    }
+
     endRemoveRows();
 
     return true;
@@ -128,6 +151,7 @@
 void CntCollectionListModel::doConstruct()
 {
     initializeStaticGroups();
+    initializeExtensions();
     initializeUserGroups();
 }
 
@@ -158,11 +182,25 @@
         QContact favoriteGroup =  mContactManager->contact(mFavoriteGroupId);
         QContactRelationshipFilter rFilter;
         rFilter.setRelationshipType(QContactRelationship::HasMember);
-            rFilter.setRelatedContactRole(QContactRelationshipFilter::First);
+        rFilter.setRelatedContactRole(QContactRelationship::First);
         rFilter.setRelatedContactId(favoriteGroup.id());
        
-       // group members and their count
-       QList<QContactLocalId> groupMemberIds = mContactManager->contactIds(rFilter);
+        QContactSortOrder sortOrderFirstName;
+        sortOrderFirstName.setDetailDefinitionName(QContactName::DefinitionName,
+            QContactName::FieldFirst);
+        sortOrderFirstName.setCaseSensitivity(Qt::CaseInsensitive);
+
+        QContactSortOrder sortOrderLastName;
+        sortOrderLastName.setDetailDefinitionName(QContactName::DefinitionName,
+            QContactName::FieldLast);
+        sortOrderLastName.setCaseSensitivity(Qt::CaseInsensitive);
+
+        QList<QContactSortOrder> sortOrders;
+        sortOrders.append(sortOrderFirstName);
+        sortOrders.append(sortOrderLastName);
+
+        // group members and their count
+       QList<QContactLocalId> groupMemberIds = mContactManager->contactIds(rFilter, sortOrders);
 
        if (!groupMemberIds.isEmpty())
        {
@@ -188,12 +226,52 @@
 
     }
     dataList.append(displayList);
-    dataList.append("qtg_large_favourites");
+    dataList.append(QStringList("qtg_large_favourites"));
     dataList.append(mFavoriteGroupId); // as favorites doesn't really have a contact Id, -1 is used
     mDataPointer->mDataList.append(dataList);
 }
 
 /*!
+Initialize extension groups
+*/
+void CntCollectionListModel::initializeExtensions()
+{
+    for(int i = 0;i < mExtensionManager.pluginCount();i++)
+    {
+        CntUiGroupSupplier* groupSupplier = mExtensionManager.pluginAt(i)->groupSupplier();
+        if (groupSupplier)
+        {
+            for(int j = 0;j < groupSupplier->groupCount();j++)
+            {
+                const CntUiExtensionGroup& group = groupSupplier->groupAt(j);
+
+                QVariantList dataList;
+                
+                QStringList displayList;
+                displayList.append(group.name());
+                displayList.append(group.extraText());
+                if (group.memberCount() > 0)
+                {
+                    displayList.append(hbTrId("(%1)").arg(group.memberCount()));
+                }
+                dataList.append(displayList);
+                
+                QStringList decorationList;
+                decorationList.append(group.groupIcon());
+                decorationList.append(group.extraIcon());
+                dataList.append(decorationList);
+                
+                dataList.append(group.serviceId());
+                dataList.append(true); // for checking if this is from an extension
+                
+                mDataPointer->mExtensions.insert(rowCount(), groupSupplier);
+                mDataPointer->mDataList.append(dataList);
+            }
+        }
+    }
+}
+
+/*!
 Initialize user defined groups
 */
 void CntCollectionListModel::initializeUserGroups()
@@ -202,7 +280,15 @@
     groupFilter.setDetailDefinitionName(QContactType::DefinitionName, QContactType::FieldType);
     groupFilter.setValue(QString(QLatin1String(QContactType::TypeGroup)));
 
-    QList<QContactLocalId> groupContactIds = mContactManager->contactIds(groupFilter);
+    QContactSortOrder sortOrderGroupName;
+    sortOrderGroupName.setDetailDefinitionName(QContactName::DefinitionName,
+        QContactName::FieldCustomLabel);
+    sortOrderGroupName.setCaseSensitivity(Qt::CaseInsensitive);
+
+    QList<QContactSortOrder> groupsOrder;
+    groupsOrder.append(sortOrderGroupName);
+
+    QList<QContactLocalId> groupContactIds = mContactManager->contactIds(groupFilter, groupsOrder);
     if (!groupContactIds.isEmpty())
     {
         for(int i = 0;i < groupContactIds.count();i++)
@@ -229,11 +315,25 @@
                 
                 QContactRelationshipFilter rFilter;
                 rFilter.setRelationshipType(QContactRelationship::HasMember);
-                rFilter.setRelatedContactRole(QContactRelationshipFilter::First);
+                rFilter.setRelatedContactRole(QContactRelationship::First);
                 rFilter.setRelatedContactId(contact.id());
                 
+                QContactSortOrder sortOrderFirstName;
+                sortOrderFirstName.setDetailDefinitionName(QContactName::DefinitionName,
+                    QContactName::FieldFirst);
+                sortOrderFirstName.setCaseSensitivity(Qt::CaseInsensitive);
+
+                QContactSortOrder sortOrderLastName;
+                sortOrderLastName.setDetailDefinitionName(QContactName::DefinitionName,
+                    QContactName::FieldLast);
+                sortOrderLastName.setCaseSensitivity(Qt::CaseInsensitive);
+
+                QList<QContactSortOrder> sortOrders;
+                sortOrders.append(sortOrderFirstName);
+                sortOrders.append(sortOrderLastName);
+
                 // group members and their count
-                QList<QContactLocalId> groupMemberIds = mContactManager->contactIds(rFilter);
+                QList<QContactLocalId> groupMemberIds = mContactManager->contactIds(rFilter, sortOrders);
                 
                 if (!groupMemberIds.isEmpty())
                 {
@@ -259,7 +359,7 @@
                 dataList.append(displayList);
                 
                 // icon, default for now always
-                dataList.append("qtg_large_custom");
+                dataList.append(QStringList("qtg_large_custom"));
                 
                 // contact Id for identification
                 dataList.append(groupContactIds.at(i));
@@ -303,3 +403,51 @@
     return mFavoriteGroupId;
 }
 
+bool CntCollectionListModel::isExtensionGroup(const QModelIndex &index)
+{
+    int row = index.row();
+    if (row < 0)
+    {
+        return false;
+    }
+    
+    QVariantList values = mDataPointer->mDataList.at(row);
+    
+    if(values.count() > 3)
+    {
+        return true;
+    }
+    
+    return false;
+}
+
+CntViewParameters CntCollectionListModel::extensionGroupActivated(int row)
+{
+    CntViewParameters params;
+    for(int i = 0;i < mDataPointer->mExtensions.value(row)->groupCount();i++)
+    {
+        const CntUiExtensionGroup& group = mDataPointer->mExtensions.value(row)->groupAt(i);
+        if (group.serviceId() == mDataPointer->mDataList.at(row)[2].toInt())
+        {
+            group.activated(params);
+            break;
+        }
+    }
+    return params;
+}
+
+CntViewParameters CntCollectionListModel::extensionGroupLongPressed(int row, const QPointF& coords)
+{
+    CntViewParameters params;
+    for(int i = 0;i < mDataPointer->mExtensions.value(row)->groupCount();i++)
+    {
+        const CntUiExtensionGroup& group = mDataPointer->mExtensions.value(row)->groupAt(i);
+        if (group.serviceId() == mDataPointer->mDataList.at(row)[2].toInt())
+        {
+            group.longPressed(coords, params);
+            break;
+        }
+    }
+    return params;
+}
+