emailuis/nmhswidget/src/nmhswidgetlistmodel.cpp
author hgs
Thu, 14 Oct 2010 17:33:43 +0300
changeset 76 38bf5461e270
parent 68 83cc6bae1de8
permissions -rw-r--r--
201041
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
68
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
hgs
parents:
diff changeset
     3
* All rights reserved.
hgs
parents:
diff changeset
     4
* This component and the accompanying materials are made available
hgs
parents:
diff changeset
     5
* under the terms of "Eclipse Public License v1.0"
hgs
parents:
diff changeset
     6
* which accompanies this distribution, and is available
hgs
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     8
*
hgs
parents:
diff changeset
     9
* Initial Contributors:
hgs
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    11
*
hgs
parents:
diff changeset
    12
* Contributors:
hgs
parents:
diff changeset
    13
*
hgs
parents:
diff changeset
    14
* Description:
hgs
parents:
diff changeset
    15
*
hgs
parents:
diff changeset
    16
*/
hgs
parents:
diff changeset
    17
hgs
parents:
diff changeset
    18
#include <hbnamespace.h>
hgs
parents:
diff changeset
    19
#include <nmmessageenvelope.h>
hgs
parents:
diff changeset
    20
#include "nmhswidgetlistmodel.h"
hgs
parents:
diff changeset
    21
#include "nmhswidgetlistmodelitem.h"
hgs
parents:
diff changeset
    22
hgs
parents:
diff changeset
    23
/*!
hgs
parents:
diff changeset
    24
    \class NmHsWidgetListModel
hgs
parents:
diff changeset
    25
    \brief The NmHsWidgetListModel class represents data model for message list.
hgs
parents:
diff changeset
    26
    @alpha
hgs
parents:
diff changeset
    27
hgs
parents:
diff changeset
    28
    The NmHsWidgetListModel class uses NmHsWidgetListModelItem class to represent data returned in its'
hgs
parents:
diff changeset
    29
    data method to get all information needed for one list row for a widget by calling the method
hgs
parents:
diff changeset
    30
    once.
hgs
parents:
diff changeset
    31
*/
hgs
parents:
diff changeset
    32
hgs
parents:
diff changeset
    33
/*!
hgs
parents:
diff changeset
    34
    Constructor
hgs
parents:
diff changeset
    35
 */
hgs
parents:
diff changeset
    36
NmHsWidgetListModel::NmHsWidgetListModel(QObject *parent)
hgs
parents:
diff changeset
    37
:QStandardItemModel(parent)
hgs
parents:
diff changeset
    38
{
hgs
parents:
diff changeset
    39
    NM_FUNCTION;
hgs
parents:
diff changeset
    40
}
hgs
parents:
diff changeset
    41
hgs
parents:
diff changeset
    42
/*!
hgs
parents:
diff changeset
    43
	Destructor
hgs
parents:
diff changeset
    44
 */
hgs
parents:
diff changeset
    45
NmHsWidgetListModel::~NmHsWidgetListModel()
hgs
parents:
diff changeset
    46
{
hgs
parents:
diff changeset
    47
    NM_FUNCTION;
hgs
parents:
diff changeset
    48
    
hgs
parents:
diff changeset
    49
    clear();
hgs
parents:
diff changeset
    50
}
hgs
parents:
diff changeset
    51
hgs
parents:
diff changeset
    52
/*!
hgs
parents:
diff changeset
    53
    Returns data specified by \a index. Only Qt::DisplayRole is supported in \a role.
hgs
parents:
diff changeset
    54
    The refresh method must have been called before this method can return any real data.
hgs
parents:
diff changeset
    55
 */
hgs
parents:
diff changeset
    56
QVariant NmHsWidgetListModel::data(const QModelIndex &index, int role) const
hgs
parents:
diff changeset
    57
{
hgs
parents:
diff changeset
    58
    NM_FUNCTION;
hgs
parents:
diff changeset
    59
    
hgs
parents:
diff changeset
    60
    QVariant qVariant;
hgs
parents:
diff changeset
    61
    if (index.isValid() && Qt::DisplayRole == role) {
hgs
parents:
diff changeset
    62
        NmHsWidgetListModelItem *item = static_cast<NmHsWidgetListModelItem*>(itemFromIndex(index));
hgs
parents:
diff changeset
    63
        NmMessageEnvelope *mailbox = item->itemMetaData();
hgs
parents:
diff changeset
    64
        qVariant = QVariant::fromValue(mailbox);
hgs
parents:
diff changeset
    65
    }
hgs
parents:
diff changeset
    66
    return qVariant;
hgs
parents:
diff changeset
    67
}
hgs
parents:
diff changeset
    68
hgs
parents:
diff changeset
    69
hgs
parents:
diff changeset
    70
/*!
hgs
parents:
diff changeset
    71
    Create mailbox item
hgs
parents:
diff changeset
    72
    \param mailbox
hgs
parents:
diff changeset
    73
 */
hgs
parents:
diff changeset
    74
NmHsWidgetListModelItem* NmHsWidgetListModel::createMessageListModelItem(const NmMessageEnvelope* envelope)
hgs
parents:
diff changeset
    75
{
hgs
parents:
diff changeset
    76
    NM_FUNCTION;
hgs
parents:
diff changeset
    77
    
hgs
parents:
diff changeset
    78
    NmMessageEnvelope *newMeta = new NmMessageEnvelope(*envelope);
hgs
parents:
diff changeset
    79
    NmHsWidgetListModelItem *item = new NmHsWidgetListModelItem();
hgs
parents:
diff changeset
    80
    item->setItemMetaData(newMeta);
hgs
parents:
diff changeset
    81
    item->setData(Hb::StandardItem, Hb::ItemTypeRole);
hgs
parents:
diff changeset
    82
    return item;
hgs
parents:
diff changeset
    83
}
76
hgs
parents: 68
diff changeset
    84
hgs
parents: 68
diff changeset
    85
hgs
parents: 68
diff changeset
    86
/*!
hgs
parents: 68
diff changeset
    87
    Function determines model index in which the new message should be inserted.
hgs
parents: 68
diff changeset
    88
*/
hgs
parents: 68
diff changeset
    89
int NmHsWidgetListModel::getInsertionIndex(
hgs
parents: 68
diff changeset
    90
    const NmMessageEnvelope &envelope) const
hgs
parents: 68
diff changeset
    91
{
hgs
parents: 68
diff changeset
    92
    NM_FUNCTION;
hgs
parents: 68
diff changeset
    93
   
hgs
parents: 68
diff changeset
    94
   int ret(NmNotFoundError);
hgs
parents: 68
diff changeset
    95
   
hgs
parents: 68
diff changeset
    96
   // Date+descending sort mode based comparison.
hgs
parents: 68
diff changeset
    97
   // Go through model and compare sent times with QDateTime >= comparison operation.
hgs
parents: 68
diff changeset
    98
   QList<QStandardItem*> items = findItems("*", Qt::MatchWildcard | Qt::MatchRecursive);
hgs
parents: 68
diff changeset
    99
   int count(items.count());
hgs
parents: 68
diff changeset
   100
   bool found(false);
hgs
parents: 68
diff changeset
   101
   int i(0);
hgs
parents: 68
diff changeset
   102
   while (i < count && !found) {
hgs
parents: 68
diff changeset
   103
       QModelIndex index = items[i]->index();
hgs
parents: 68
diff changeset
   104
       NmHsWidgetListModelItem *item = static_cast<NmHsWidgetListModelItem*>(itemFromIndex(index));
hgs
parents: 68
diff changeset
   105
       found = envelope.sentTime() >= item->itemMetaData()->sentTime();
hgs
parents: 68
diff changeset
   106
       if (found) {
hgs
parents: 68
diff changeset
   107
           ret = i;
hgs
parents: 68
diff changeset
   108
       }
hgs
parents: 68
diff changeset
   109
       i++;
hgs
parents: 68
diff changeset
   110
    }
hgs
parents: 68
diff changeset
   111
   if (0 == count) {
hgs
parents: 68
diff changeset
   112
       ret = NmNoError;
hgs
parents: 68
diff changeset
   113
   }
hgs
parents: 68
diff changeset
   114
   items.clear();
hgs
parents: 68
diff changeset
   115
   return ret;
hgs
parents: 68
diff changeset
   116
}
hgs
parents: 68
diff changeset
   117
hgs
parents: 68
diff changeset
   118
hgs
parents: 68
diff changeset
   119
/*!
hgs
parents: 68
diff changeset
   120
    Inserts given messages into the model
hgs
parents: 68
diff changeset
   121
*/
hgs
parents: 68
diff changeset
   122
void NmHsWidgetListModel::addMessages(const QList<NmMessageEnvelope*> &messageEnvs)
hgs
parents: 68
diff changeset
   123
{
hgs
parents: 68
diff changeset
   124
    NM_FUNCTION;
hgs
parents: 68
diff changeset
   125
    int orig_count = rowCount();
hgs
parents: 68
diff changeset
   126
    foreach(NmMessageEnvelope* env, messageEnvs){
hgs
parents: 68
diff changeset
   127
        int insertionIndex = getInsertionIndex(*env);
hgs
parents: 68
diff changeset
   128
        NmHsWidgetListModelItem *newItem = createMessageListModelItem(env);
hgs
parents: 68
diff changeset
   129
        insertRow(insertionIndex, newItem);
hgs
parents: 68
diff changeset
   130
    }
hgs
parents: 68
diff changeset
   131
hgs
parents: 68
diff changeset
   132
    if( !messageEnvs.isEmpty() ){
hgs
parents: 68
diff changeset
   133
        if (orig_count == 0){
hgs
parents: 68
diff changeset
   134
            emit modelIsEmpty(false);
hgs
parents: 68
diff changeset
   135
        }
hgs
parents: 68
diff changeset
   136
        emit messagesAddedToModel(); //emit messages added to model 
hgs
parents: 68
diff changeset
   137
    }
hgs
parents: 68
diff changeset
   138
}
hgs
parents: 68
diff changeset
   139
hgs
parents: 68
diff changeset
   140
/*!
hgs
parents: 68
diff changeset
   141
    This refreshes the data of the model.
hgs
parents: 68
diff changeset
   142
    NOTE: safe guard any call to this function with try-catch.
hgs
parents: 68
diff changeset
   143
 */
hgs
parents: 68
diff changeset
   144
void NmHsWidgetListModel::refresh(const QList<NmMessageEnvelope*> &envelopeList)
hgs
parents: 68
diff changeset
   145
{
hgs
parents: 68
diff changeset
   146
    NM_FUNCTION;
hgs
parents: 68
diff changeset
   147
    
hgs
parents: 68
diff changeset
   148
    clear();
hgs
parents: 68
diff changeset
   149
    foreach(NmMessageEnvelope *env, envelopeList){
hgs
parents: 68
diff changeset
   150
       NmHsWidgetListModelItem *item = createMessageListModelItem(env);
hgs
parents: 68
diff changeset
   151
       appendRow(item);
hgs
parents: 68
diff changeset
   152
    }
hgs
parents: 68
diff changeset
   153
    
hgs
parents: 68
diff changeset
   154
    //As we refresh all data, emit signal in any case
hgs
parents: 68
diff changeset
   155
    if( rowCount() == 0 ){
hgs
parents: 68
diff changeset
   156
        emit modelIsEmpty(true);
hgs
parents: 68
diff changeset
   157
    }else{
hgs
parents: 68
diff changeset
   158
        emit modelIsEmpty(false);
hgs
parents: 68
diff changeset
   159
    }
hgs
parents: 68
diff changeset
   160
}
hgs
parents: 68
diff changeset
   161
hgs
parents: 68
diff changeset
   162
/*!
hgs
parents: 68
diff changeset
   163
    Updates existing messages in model with given envelopes
hgs
parents: 68
diff changeset
   164
*/
hgs
parents: 68
diff changeset
   165
void NmHsWidgetListModel::updateMessages(const QList<NmMessageEnvelope*> &messageEnvs)
hgs
parents: 68
diff changeset
   166
{
hgs
parents: 68
diff changeset
   167
    NM_FUNCTION; 
hgs
parents: 68
diff changeset
   168
    QList<QStandardItem*> modelItemList = findItems("*", Qt::MatchWildcard | Qt::MatchRecursive);
hgs
parents: 68
diff changeset
   169
    foreach(NmMessageEnvelope *env, messageEnvs){
hgs
parents: 68
diff changeset
   170
        foreach (QStandardItem *it, modelItemList){
hgs
parents: 68
diff changeset
   171
            QModelIndex index = it->index();
hgs
parents: 68
diff changeset
   172
            NmHsWidgetListModelItem *item = static_cast<NmHsWidgetListModelItem*>(itemFromIndex(index));
hgs
parents: 68
diff changeset
   173
            if (env->messageId() == item->itemMetaData()->messageId()) {
hgs
parents: 68
diff changeset
   174
                item->setItemMetaData(env);
hgs
parents: 68
diff changeset
   175
                break;
hgs
parents: 68
diff changeset
   176
            }
hgs
parents: 68
diff changeset
   177
        }
hgs
parents: 68
diff changeset
   178
    }
hgs
parents: 68
diff changeset
   179
}
hgs
parents: 68
diff changeset
   180
hgs
parents: 68
diff changeset
   181
hgs
parents: 68
diff changeset
   182
/*!
hgs
parents: 68
diff changeset
   183
    Removes the given messages from the model
hgs
parents: 68
diff changeset
   184
*/
hgs
parents: 68
diff changeset
   185
void NmHsWidgetListModel::removeMessages(const QList<NmId> &messageIds)
hgs
parents: 68
diff changeset
   186
{
hgs
parents: 68
diff changeset
   187
    NM_FUNCTION; 
hgs
parents: 68
diff changeset
   188
    foreach(NmId msgId, messageIds){
hgs
parents: 68
diff changeset
   189
        //lets refresh the item list every time, so that it really is up to date after each iteration 
hgs
parents: 68
diff changeset
   190
        //(and the count stays valid!)
hgs
parents: 68
diff changeset
   191
        QList<QStandardItem*> modelItemList = findItems("*", Qt::MatchWildcard | Qt::MatchRecursive);
hgs
parents: 68
diff changeset
   192
        foreach(QStandardItem *it, modelItemList){
hgs
parents: 68
diff changeset
   193
            QModelIndex index = it->index();
hgs
parents: 68
diff changeset
   194
            NmHsWidgetListModelItem *item = static_cast<NmHsWidgetListModelItem*>(itemFromIndex(index));
hgs
parents: 68
diff changeset
   195
            if (msgId == item->itemMetaData()->messageId()) {
hgs
parents: 68
diff changeset
   196
                removeRow(index.row());
hgs
parents: 68
diff changeset
   197
                break;
hgs
parents: 68
diff changeset
   198
            }
hgs
parents: 68
diff changeset
   199
        }
hgs
parents: 68
diff changeset
   200
    }
hgs
parents: 68
diff changeset
   201
    
hgs
parents: 68
diff changeset
   202
    //if model is empty after removing messages, signal it.
hgs
parents: 68
diff changeset
   203
    if( rowCount() == 0 ){
hgs
parents: 68
diff changeset
   204
        emit modelIsEmpty(true);  
hgs
parents: 68
diff changeset
   205
    }
hgs
parents: 68
diff changeset
   206
    
hgs
parents: 68
diff changeset
   207
}
hgs
parents: 68
diff changeset
   208
hgs
parents: 68
diff changeset
   209
/*!
hgs
parents: 68
diff changeset
   210
    Clears the model and emits modelIsEmpty signal
hgs
parents: 68
diff changeset
   211
*/
hgs
parents: 68
diff changeset
   212
void  NmHsWidgetListModel::removeAllMessages()
hgs
parents: 68
diff changeset
   213
{
hgs
parents: 68
diff changeset
   214
    clear();
hgs
parents: 68
diff changeset
   215
    emit modelIsEmpty(true);
hgs
parents: 68
diff changeset
   216
}