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 |
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) |