emailuis/nmailuiengine/src/nmmessagelistmodel.cpp
changeset 43 99bcbff212ad
parent 40 2c62ef3caffd
child 44 c2d07d913565
equal deleted inserted replaced
42:139d4b7b2938 43:99bcbff212ad
    39   mDividersActive(false),
    39   mDividersActive(false),
    40   mParentPtr(NULL),
    40   mParentPtr(NULL),
    41   mCurrentFolderType(NmFolderInbox),
    41   mCurrentFolderType(NmFolderInbox),
    42   mIgnoreFolderIds(false)
    42   mIgnoreFolderIds(false)
    43 {
    43 {
       
    44     NM_FUNCTION;
       
    45     
    44     // Check for setting whether dividers are active
    46     // Check for setting whether dividers are active
    45     // mDividersActive = ...
    47     // mDividersActive = ...
    46     // update also the test cases
    48     // update also the test cases
    47 }
    49 }
    48 
    50 
    50 /*!
    52 /*!
    51 	Class destructor.
    53 	Class destructor.
    52 */
    54 */
    53 NmMessageListModel::~NmMessageListModel()
    55 NmMessageListModel::~NmMessageListModel()
    54 {
    56 {
       
    57     NM_FUNCTION;
       
    58     
    55     clear();
    59     clear();
    56 }
    60 }
    57 
    61 
    58 
    62 
    59 /*!
    63 /*!
    60     Returns data specified by \a index. Only Qt::DisplayRole is supported in \a role.
    64     Returns data specified by \a index. Only Qt::DisplayRole is supported in \a role.
    61     The refresh method must have been called before this method can return any real data.
    65     The refresh method must have been called before this method can return any real data.
    62 */
    66 */
    63 QVariant NmMessageListModel::data(const QModelIndex &index, int role) const
    67 QVariant NmMessageListModel::data(const QModelIndex &index, int role) const
    64 {
    68 {
       
    69     NM_FUNCTION;
       
    70     
    65     QVariant qVariant;
    71     QVariant qVariant;
    66 
    72 
    67     if (index.isValid()){
    73     if (index.isValid()){
    68         if (role == Qt::DisplayRole) {
    74         if (role == Qt::DisplayRole) {
    69             NmMessageListModelItem *item =
    75             NmMessageListModelItem *item =
    89 void NmMessageListModel::refresh(
    95 void NmMessageListModel::refresh(
    90         const NmId mailboxId, 
    96         const NmId mailboxId, 
    91         const NmId folderId,
    97         const NmId folderId,
    92         const QList<NmMessageEnvelope*> &messageEnvelopeList)
    98         const QList<NmMessageEnvelope*> &messageEnvelopeList)
    93 {
    99 {
       
   100     NM_FUNCTION;
       
   101 
    94     // Store the current mailbox and folder IDs.
   102     // Store the current mailbox and folder IDs.
    95     mCurrentMailboxId = mailboxId;
   103     mCurrentMailboxId = mailboxId;
    96     mCurrentFolderId = folderId;
   104     mCurrentFolderId = folderId;
    97 
   105 
    98     // Store the type of the currently displayed folder.
   106     // Store the type of the currently displayed folder.
   105     NmMessageEnvelope* insertedMessage(NULL);
   113     NmMessageEnvelope* insertedMessage(NULL);
   106     int parentCount(0);
   114     int parentCount(0);
   107     int childCount(0);
   115     int childCount(0);
   108 
   116 
   109     for (int i(0); i < messageEnvelopeList.count(); i++) {
   117     for (int i(0); i < messageEnvelopeList.count(); i++) {
   110         NmMessageEnvelope* nextMessage = messageEnvelopeList[i];
   118         NmMessageEnvelope *nextMessage = messageEnvelopeList[i];
   111 
   119         // imap and pop is using common sent, outbox or draft folder
   112         if (mDividersActive &&
   120         // for all mailboxes, here we want to filter out messages that
   113             !messagesBelongUnderSameDivider(insertedMessage, nextMessage)) {
   121         // are not under this mailbox
   114             insertDividerIntoModel(nextMessage, parentCount);
   122         bool insert(true);
   115             parentCount++;
   123         if (nextMessage 
   116             childCount = 0;
   124             && (NmFolderSent == mCurrentFolderType
   117         }
   125              || NmFolderOutbox == mCurrentFolderType
   118 
   126              || NmFolderDrafts == mCurrentFolderType)) {
   119         insertMessageIntoModel(nextMessage, childCount, false);
   127             insert = (mCurrentMailboxId == nextMessage->mailboxId());  
   120         insertedMessage = nextMessage;
   128         }
   121         childCount++;
   129         if (insert) {
       
   130             if (mDividersActive &&
       
   131                 !messagesBelongUnderSameDivider(insertedMessage, nextMessage)) {
       
   132                 insertDividerIntoModel(nextMessage, parentCount);
       
   133                 parentCount++;
       
   134                 childCount = 0;
       
   135             }
       
   136     
       
   137             insertMessageIntoModel(nextMessage, childCount, false);
       
   138             insertedMessage = nextMessage;
       
   139             childCount++;
       
   140         }
   122     }
   141     }
   123 }
   142 }
   124 
   143 
   125 
   144 
   126 /*!
   145 /*!
   128 */
   147 */
   129 void NmMessageListModel::insertDividerIntoModel(
   148 void NmMessageListModel::insertDividerIntoModel(
   130     NmMessageEnvelope *messageForDivider,
   149     NmMessageEnvelope *messageForDivider,
   131     int parentRow)
   150     int parentRow)
   132 {
   151 {
       
   152     NM_FUNCTION;
       
   153     
   133     mParentPtr = createTitleDividerItem(messageForDivider);
   154     mParentPtr = createTitleDividerItem(messageForDivider);
   134     insertRow(parentRow,mParentPtr);
   155     insertRow(parentRow,mParentPtr);
   135     mParentPtr->callEmitDataChanged();
   156     mParentPtr->callEmitDataChanged();
   136 }
   157 }
   137 
   158 
   140     either to root or to parent. If parent is zero, item is added into root.
   161     either to root or to parent. If parent is zero, item is added into root.
   141 */
   162 */
   142 void NmMessageListModel::insertMessageIntoModel(
   163 void NmMessageListModel::insertMessageIntoModel(
   143 		NmMessageEnvelope *messageEnvelope, int childRow, bool emitSignal)
   164 		NmMessageEnvelope *messageEnvelope, int childRow, bool emitSignal)
   144 {
   165 {
       
   166     NM_FUNCTION;
       
   167     
   145     NmMessageListModelItem *mailItem = createMessageItem(messageEnvelope);
   168     NmMessageListModelItem *mailItem = createMessageItem(messageEnvelope);
   146     if (mParentPtr) {
   169     if (mParentPtr) {
   147         // Add under parent divider
   170         // Add under parent divider
   148         mParentPtr->insertRow(childRow, mailItem);
   171         mParentPtr->insertRow(childRow, mailItem);
   149     }
   172     }
   162 */
   185 */
   163 bool NmMessageListModel::messagesBelongUnderSameDivider(
   186 bool NmMessageListModel::messagesBelongUnderSameDivider(
   164     const NmMessageEnvelope *message1,
   187     const NmMessageEnvelope *message1,
   165     const NmMessageEnvelope *message2) const
   188     const NmMessageEnvelope *message2) const
   166 {
   189 {
       
   190     NM_FUNCTION;
       
   191     
   167     bool retVal(false);
   192     bool retVal(false);
   168     // First check pointer validity
   193     // First check pointer validity
   169     if (message1 && message2) {
   194     if (message1 && message2) {
   170         // Switch here for other sort modes 
   195         // Switch here for other sort modes 
   171         // Date based comparison
   196         // Date based comparison
   186     \param folderId The folder containing the message.
   211     \param folderId The folder containing the message.
   187     \param messageIds A list of message IDs related to the event.
   212     \param messageIds A list of message IDs related to the event.
   188 */
   213 */
   189 void NmMessageListModel::handleMessageEvent(NmMessageEvent event,
   214 void NmMessageListModel::handleMessageEvent(NmMessageEvent event,
   190                                             const NmId &folderId,
   215                                             const NmId &folderId,
   191                                             const QList<NmId> &messageIds)
   216                                             const QList<NmId> &messageIds,
   192 {
   217                                             const NmId &mailboxId)
   193     NMLOG(QString("nmmessagelistmodel::handleMessageEvent()"));
   218 {
   194     
   219     NM_FUNCTION;
   195     NmId mailboxId = mCurrentMailboxId;
       
   196     const int idCount = messageIds.count();
   220     const int idCount = messageIds.count();
   197 
   221 
   198     // Folder ID does not concern us if this model instance is used for e.g.
   222     // Folder ID does not concern us if this model instance is used for e.g.
   199     // searching messages.
   223     // searching messages.
   200     if (!mIgnoreFolderIds) {
   224     if (!mIgnoreFolderIds) {
   212             // Folder ID was not known at time when the mailbox opened and we
   236             // Folder ID was not known at time when the mailbox opened and we
   213             // know that because of events the subscription is valid only for
   237             // know that because of events the subscription is valid only for
   214             // the current mailbox.
   238             // the current mailbox.
   215             mCurrentFolderId = folderId; 
   239             mCurrentFolderId = folderId; 
   216         }
   240         }
   217 
   241         // MailboxId checking here is done because we want to filter out messages
   218         if (mCurrentFolderId != folderId) {
   242         // that belongs to other mailboxes in case of imap/pop sent, outbox or draft folder
       
   243         if (mCurrentFolderId != folderId || mCurrentMailboxId != mailboxId) {
   219             // The event does not concern the folder currently being displayed.
   244             // The event does not concern the folder currently being displayed.
   220             // Thus, ignore it.
   245             // Thus, ignore it.
   221             return;
   246             return;
   222         }
   247         }
   223     }
   248     }
   254 void NmMessageListModel::insertNewMessageIntoModel(
   279 void NmMessageListModel::insertNewMessageIntoModel(
   255     const NmId &mailboxId,
   280     const NmId &mailboxId,
   256     const NmId &folderId,
   281     const NmId &folderId,
   257     const NmId &msgId)
   282     const NmId &msgId)
   258 {
   283 {
   259     NMLOG(QString("NmMessageListModel::insertNewMessageIntoModel"));
   284     NM_FUNCTION;
       
   285     
   260     // envelope ownership is here
   286     // envelope ownership is here
   261     NmMessageEnvelope *newMsgEnve = mDataManager.envelopeById(mailboxId, folderId, msgId);
   287     NmMessageEnvelope *newMsgEnve = mDataManager.envelopeById(mailboxId, folderId, msgId);
   262     if (newMsgEnve) {
   288     if (newMsgEnve) {
   263         int rowIndex(getInsertionIndex(*newMsgEnve));
   289         int rowIndex(getInsertionIndex(*newMsgEnve));
   264         if (!mDividersActive) {
   290         if (!mDividersActive) {
   318     with the currently active sort mode.
   344     with the currently active sort mode.
   319 */
   345 */
   320 int NmMessageListModel::getInsertionIndex(
   346 int NmMessageListModel::getInsertionIndex(
   321     const NmMessageEnvelope &envelope) const
   347     const NmMessageEnvelope &envelope) const
   322 {
   348 {
   323     // NMLOG(QString("nmailuiengine: getInsertionIndex"));
   349     NM_FUNCTION;
       
   350     
   324     int ret(NmNotFoundError);
   351     int ret(NmNotFoundError);
   325     
   352     
   326     // Date+descending sort mode based comparison.
   353     // Date+descending sort mode based comparison.
   327     // Go through model and compare sent times with QDateTime >= comparison operation.
   354     // Go through model and compare sent times with QDateTime >= comparison operation.
   328     QList<QStandardItem*> items = findItems("*", Qt::MatchWildcard | Qt::MatchRecursive);
   355     QList<QStandardItem*> items = findItems("*", Qt::MatchWildcard | Qt::MatchRecursive);
   351     Function finds preceding title divider index and sets the
   378     Function finds preceding title divider index and sets the
   352     mParentPtr variable.
   379     mParentPtr variable.
   353 */
   380 */
   354 int NmMessageListModel::dividerInsertionIndex(int messageIndex)
   381 int NmMessageListModel::dividerInsertionIndex(int messageIndex)
   355 {
   382 {
       
   383     NM_FUNCTION;
       
   384     
   356     bool found(false);
   385     bool found(false);
   357     int ret(NmNoError);
   386     int ret(NmNoError);
   358     QModelIndex index;
   387     QModelIndex index;
   359     QList<QStandardItem*> items = findItems("*", Qt::MatchWildcard | Qt::MatchRecursive);
   388     QList<QStandardItem*> items = findItems("*", Qt::MatchWildcard | Qt::MatchRecursive);
   360     for (int i = messageIndex-1; i >= 0 && !found; i--) {
   389     for (int i = messageIndex-1; i >= 0 && !found; i--) {
   374     Create title divider item
   403     Create title divider item
   375 */
   404 */
   376 NmMessageListModelItem *NmMessageListModel::createTitleDividerItem(
   405 NmMessageListModelItem *NmMessageListModel::createTitleDividerItem(
   377 		NmMessageEnvelope *messageForDivider)
   406 		NmMessageEnvelope *messageForDivider)
   378 {
   407 {
       
   408     NM_FUNCTION;
       
   409     
   379     NmMessageListModelItem *item = new NmMessageListModelItem();
   410     NmMessageListModelItem *item = new NmMessageListModelItem();
   380     item->setItemType(NmMessageListModelItem::NmMessageItemTitleDivider);
   411     item->setItemType(NmMessageListModelItem::NmMessageItemTitleDivider);
   381 
   412 
   382     QDate sentLocalDate = messageForDivider->sentTime().toLocalTime().date();
   413     QDate sentLocalDate = messageForDivider->sentTime().toLocalTime().date();
   383     QDate currentdate = QDate::currentDate();
   414     QDate currentdate = QDate::currentDate();
   403     Create message item
   434     Create message item
   404 */
   435 */
   405 NmMessageListModelItem *NmMessageListModel::createMessageItem(
   436 NmMessageListModelItem *NmMessageListModel::createMessageItem(
   406 		NmMessageEnvelope *envelope)
   437 		NmMessageEnvelope *envelope)
   407 {
   438 {
   408 
   439     NM_FUNCTION;
       
   440     
   409     NmMessageListModelItem *mailItem = new NmMessageListModelItem();
   441     NmMessageListModelItem *mailItem = new NmMessageListModelItem();
   410     mailItem->setEnvelope(*envelope);
   442     mailItem->setEnvelope(*envelope);
   411     mailItem->setItemType(NmMessageListModelItem::NmMessageItemMessage);
   443     mailItem->setItemType(NmMessageListModelItem::NmMessageItemMessage);
   412     mailItem->setData(Hb::StandardItem, Hb::ItemTypeRole);
   444     mailItem->setData(Hb::StandardItem, Hb::ItemTypeRole);
   413     return mailItem;
   445     return mailItem;
   416 /*!
   448 /*!
   417     Returns divider state
   449     Returns divider state
   418 */
   450 */
   419 bool NmMessageListModel::dividersActive()
   451 bool NmMessageListModel::dividersActive()
   420 {
   452 {
       
   453     NM_FUNCTION;
       
   454     
   421     return mDividersActive;
   455     return mDividersActive;
   422 }
   456 }
   423 
   457 
   424 /*!
   458 /*!
   425     Set divider state
   459     Set divider state
   426 */
   460 */
   427 void NmMessageListModel::setDividers(bool active)
   461 void NmMessageListModel::setDividers(bool active)
   428 {
   462 {
       
   463     NM_FUNCTION;
       
   464     
   429     mDividersActive = active;
   465     mDividersActive = active;
   430 }
   466 }
   431 
   467 
   432 /*!
   468 /*!
   433    Change item property if differs
   469    Change item property if differs
   434 */
   470 */
   435 void NmMessageListModel::setEnvelopeProperties(
   471 void NmMessageListModel::setEnvelopeProperties(
   436     NmEnvelopeProperties property,
   472     NmEnvelopeProperties property,
   437     const QList<NmId> &messageIds)
   473     const QList<NmId> &messageIds)
   438 {
   474 {
       
   475     NM_FUNCTION;
       
   476     
   439     for (int i(0); i < messageIds.count(); i++) {
   477     for (int i(0); i < messageIds.count(); i++) {
   440         updateEnvelope(property, messageIds[i]);
   478         updateEnvelope(property, messageIds[i]);
   441     }
   479     }
   442 }
   480 }
   443 
   481 
   445 /*!
   483 /*!
   446     Returns the ID of the current mailbox.
   484     Returns the ID of the current mailbox.
   447 */
   485 */
   448 NmId NmMessageListModel::currentMailboxId()
   486 NmId NmMessageListModel::currentMailboxId()
   449 {
   487 {
       
   488     NM_FUNCTION;
       
   489     
   450     return mCurrentMailboxId;
   490     return mCurrentMailboxId;
   451 }
   491 }
   452 
   492 
   453 
   493 
   454 /*!
   494 /*!
   458 
   498 
   459     \param ignore If true, will ignore the folder IDs.
   499     \param ignore If true, will ignore the folder IDs.
   460 */
   500 */
   461 void NmMessageListModel::setIgnoreFolderIds(bool ignore)
   501 void NmMessageListModel::setIgnoreFolderIds(bool ignore)
   462 {
   502 {
       
   503     NM_FUNCTION;
       
   504     
   463     mIgnoreFolderIds = ignore;
   505     mIgnoreFolderIds = ignore;
   464 }
   506 }
   465 
   507 
   466 
   508 
   467 /*!
   509 /*!
   468    Remove message from model if message exists in model
   510    Remove message from model if message exists in model
   469 */
   511 */
   470 void NmMessageListModel::removeMessageFromModel(const NmId &msgId)
   512 void NmMessageListModel::removeMessageFromModel(const NmId &msgId)
   471 {
   513 {
       
   514     NM_FUNCTION;
       
   515     
   472     QList<QStandardItem*> items = findItems("*", Qt::MatchWildcard | Qt::MatchRecursive);
   516     QList<QStandardItem*> items = findItems("*", Qt::MatchWildcard | Qt::MatchRecursive);
   473     int count(items.count());
   517     int count(items.count());
   474     bool found(false);
   518     bool found(false);
   475     int i(0);
   519     int i(0);
   476     while (!found && i < count) {
   520     while (!found && i < count) {
   519 /*!
   563 /*!
   520    Helper function to remove row
   564    Helper function to remove row
   521 */
   565 */
   522 void NmMessageListModel::removeItem(int row, NmMessageListModelItem &item)
   566 void NmMessageListModel::removeItem(int row, NmMessageListModelItem &item)
   523 {
   567 {
       
   568     NM_FUNCTION;
       
   569     
   524     QStandardItem *parent = item.parent();
   570     QStandardItem *parent = item.parent();
   525     removeRow(row, indexFromItem(parent));
   571     removeRow(row, indexFromItem(parent));
   526 }
   572 }
   527 
   573 
   528 /*!
   574 /*!
   529    Search item from model
   575    Search item from model
   530 */
   576 */
   531 NmMessageListModelItem *NmMessageListModel::itemFromModel(const NmId &messageId)
   577 NmMessageListModelItem *NmMessageListModel::itemFromModel(const NmId &messageId)
   532 {
   578 {
       
   579     NM_FUNCTION;
       
   580     
   533     QList<QStandardItem*> items = findItems("*", Qt::MatchWildcard | Qt::MatchRecursive);
   581     QList<QStandardItem*> items = findItems("*", Qt::MatchWildcard | Qt::MatchRecursive);
   534     int count(items.count());
   582     int count(items.count());
   535     bool found(false);
   583     bool found(false);
   536     int i(0);
   584     int i(0);
   537     NmMessageListModelItem *ret(NULL);
   585     NmMessageListModelItem *ret(NULL);
   551 /*!
   599 /*!
   552    Helper function for envelope comparison
   600    Helper function for envelope comparison
   553 */
   601 */
   554 bool NmMessageListModel::changed(const NmMessageEnvelope &first, const NmMessageEnvelope &second)
   602 bool NmMessageListModel::changed(const NmMessageEnvelope &first, const NmMessageEnvelope &second)
   555 {
   603 {
       
   604     NM_FUNCTION;
       
   605     
   556     return first != second;
   606     return first != second;
   557 }
   607 }
   558 
   608 
   559 /*!
   609 /*!
   560    Updates envelope if something is changed
   610    Updates envelope if something is changed
   561 */
   611 */
   562 void NmMessageListModel::updateMessageEnvelope(const NmId &mailboxId,
   612 void NmMessageListModel::updateMessageEnvelope(const NmId &mailboxId,
   563         const NmId &folderId,
   613         const NmId &folderId,
   564         const NmId &msgId)
   614         const NmId &msgId)
   565 {
   615 {
       
   616     NM_FUNCTION;
       
   617     
   566     NmMessageListModelItem *item = itemFromModel(msgId);
   618     NmMessageListModelItem *item = itemFromModel(msgId);
   567     // envelope ownership is here
   619     // envelope ownership is here
   568     NmMessageEnvelope *newEnvelope = mDataManager.envelopeById(mailboxId, folderId, msgId);
   620     NmMessageEnvelope *newEnvelope = mDataManager.envelopeById(mailboxId, folderId, msgId);
   569     if (item && newEnvelope) {
   621     if (item && newEnvelope) {
   570         if (changed(*item->envelopePtr(), *newEnvelope)) {
   622         if (changed(*item->envelopePtr(), *newEnvelope)) {
   580 /*!
   632 /*!
   581    Update envelope property
   633    Update envelope property
   582 */
   634 */
   583 void NmMessageListModel::updateEnvelope(NmEnvelopeProperties property, const NmId &msgId)
   635 void NmMessageListModel::updateEnvelope(NmEnvelopeProperties property, const NmId &msgId)
   584 {
   636 {
       
   637     NM_FUNCTION;
       
   638     
   585     NmMessageListModelItem *item = itemFromModel(msgId);
   639     NmMessageListModelItem *item = itemFromModel(msgId);
   586     if (item) {
   640     if (item) {
   587         bool changed(false);
   641         bool changed(false);
   588         NmMessageEnvelope *envelope = item->envelopePtr();
   642         NmMessageEnvelope *envelope = item->envelopePtr();
   589         switch (property)
   643         switch (property)