• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdepim API Reference
  • KDE Home
  • Contact Us
 

messagelist

  • sources
  • kde-4.14
  • kdepim
  • messagelist
  • core
messageitem.cpp
Go to the documentation of this file.
1 
2 /******************************************************************************
3  *
4  * Copyright 2008 Szymon Tomasz Stefanek <pragma@kvirc.net>
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19  *
20  *******************************************************************************/
21 
22 #include "messageitem.h"
23 #include "messageitem_p.h"
24 
25 #include "messagecore/widgets/annotationdialog.h"
26 #include "theme.h"
27 
28 #include <akonadi/item.h>
29 #include <akonadi/entityannotationsattribute.h>
30 #include <akonadi/tagattribute.h>
31 #include <akonadi/tagfetchjob.h>
32 #include <akonadi/tagfetchscope.h>
33 #include <KIconLoader>
34 #include <KLocalizedString>
35 
36 using namespace MessageList::Core;
37 
38 K_GLOBAL_STATIC( TagCache, s_tagCache )
39 
40 class MessageItem::Tag::Private
41 {
42  public:
43  Private()
44  :mPriority( 0 ) //Initialize it
45  {
46 
47  }
48  QPixmap mPixmap;
49  QString mName;
50  QString mId;
51  QColor mTextColor;
52  QColor mBackgroundColor;
53  QFont mFont;
54  int mPriority;
55 };
56 
57 MessageItem::Tag::Tag( const QPixmap &pix, const QString &tagName, const QString &tagId )
58  : d( new Private )
59 {
60  d->mPixmap = pix;
61  d->mName = tagName;
62  d->mId = tagId;
63 }
64 
65 MessageItem::Tag::~Tag()
66 {
67  delete d;
68 }
69 
70 QPixmap MessageItem::Tag::pixmap() const
71 {
72  return d->mPixmap;
73 }
74 
75 QString MessageItem::Tag::name() const
76 {
77  return d->mName;
78 }
79 
80 QString MessageItem::Tag::id() const
81 {
82  return d->mId;
83 }
84 
85 QColor MessageItem::Tag::textColor() const
86 {
87  return d->mTextColor;
88 }
89 
90 QColor MessageItem::Tag::backgroundColor() const
91 {
92  return d->mBackgroundColor;
93 }
94 
95 QFont MessageItem::Tag::font() const
96 {
97  return d->mFont;
98 }
99 
100 int MessageItem::Tag::priority() const
101 {
102  return d->mPriority;
103 }
104 
105 void MessageItem::Tag::setTextColor( const QColor &textColor )
106 {
107  d->mTextColor = textColor;
108 }
109 
110 void MessageItem::Tag::setBackgroundColor( const QColor &backgroundColor )
111 {
112  d->mBackgroundColor = backgroundColor;
113 }
114 
115 void MessageItem::Tag::setFont( const QFont &font )
116 {
117  d->mFont = font;
118 }
119 
120 void MessageItem::Tag::setPriority( int priority )
121 {
122  d->mPriority = priority;
123 }
124 
125 
126 class MessageItemPrivateSettings
127 {
128 public:
129  QColor mColorUnreadMessage;
130  QColor mColorImportantMessage;
131  QColor mColorToDoMessage;
132  QFont mFont;
133  QFont mFontUnreadMessage;
134  QFont mFontImportantMessage;
135  QFont mFontToDoMessage;
136  QString mFontKey;
137  QString mFontUnreadMessageKey;
138  QString mFontImportantMessageKey;
139  QString mFontToDoMessageKey;
140 };
141 
142 K_GLOBAL_STATIC(MessageItemPrivateSettings, s_settings)
143 
144 MessageItemPrivate::MessageItemPrivate( MessageItem* qq )
145  : ItemPrivate( qq ),
146  mThreadingStatus( MessageItem::ParentMissing ),
147  mEncryptionState( MessageItem::NotEncrypted ),
148  mSignatureState( MessageItem::NotSigned ),
149  mAboutToBeRemoved( false ),
150  mSubjectIsPrefixed( false ),
151  mTagList( 0 )
152 {
153 }
154 
155 MessageItemPrivate::~MessageItemPrivate()
156 {
157  s_tagCache->cancelRequest(this);
158  invalidateTagCache();
159 }
160 
161 void MessageItemPrivate::invalidateTagCache()
162 {
163  if ( mTagList ) {
164  qDeleteAll( *mTagList );
165  delete mTagList;
166  mTagList = 0;
167  }
168 }
169 
170 void MessageItemPrivate::invalidateAnnotationCache()
171 {
172 }
173 
174 const MessageItem::Tag* MessageItemPrivate::bestTag() const
175 {
176  const MessageItem::Tag *best = 0;
177  foreach( const MessageItem::Tag* tag, getTagList() ) {
178  if ( !best || tag->priority() < best->priority() )
179  best = tag;
180  }
181  return best;
182 }
183 
184 void MessageItemPrivate::fillTagList(const Akonadi::Tag::List &taglist)
185 {
186  Q_ASSERT( !mTagList );
187  mTagList = new QList<MessageItem::Tag*>;
188 
189  // TODO: The tag pointers here could be shared between all items, there really is no point in
190  // creating them for each item that has tags
191 
192  //Priority sort this and make bestTag more efficient
193 
194  foreach( const Akonadi::Tag &tag, taglist ) {
195  QString symbol = QLatin1String( "mail-tagged" );
196  Akonadi::TagAttribute *attr = tag.attribute<Akonadi::TagAttribute>();
197  if (attr) {
198  if (!attr->iconName().isEmpty()) {
199  symbol = attr->iconName();
200  }
201  }
202  MessageItem::Tag *messageListTag =
203  new MessageItem::Tag( SmallIcon( symbol ), tag.name(), tag.url().url() );
204 
205  if (attr) {
206  messageListTag->setTextColor( attr->textColor() );
207  messageListTag->setBackgroundColor( attr->backgroundColor() );
208  if (!attr->font().isEmpty()) {
209  QFont font;
210  if (font.fromString( attr->font() )) {
211  messageListTag->setFont( font );
212  }
213  }
214  if (attr->priority() != -1) {
215  messageListTag->setPriority( attr->priority() );
216  } else {
217  messageListTag->setPriority( 0xFFFF );
218  }
219  }
220 
221  mTagList->append( messageListTag );
222  }
223 }
224 
225 QList<MessageItem::Tag*> MessageItemPrivate::getTagList() const
226 {
227  if ( !mTagList ) {
228  s_tagCache->retrieveTags(mAkonadiItem.tags(), const_cast<MessageItemPrivate*>(this));
229  return QList<MessageItem::Tag*>();
230  }
231 
232  return *mTagList;
233 }
234 
235 bool MessageItemPrivate::tagListInitialized() const
236 {
237  return mTagList != 0;
238 }
239 
240 MessageItem::MessageItem()
241  : Item( Message, new MessageItemPrivate( this ) ), ModelInvariantIndex()
242 {
243 }
244 
245 MessageItem::MessageItem ( MessageItemPrivate* dd )
246  : Item ( Message, dd ), ModelInvariantIndex()
247 {
248 }
249 
250 MessageItem::~MessageItem()
251 {
252 }
253 
254 QList< MessageItem::Tag * > MessageItem::tagList() const
255 {
256  Q_D( const MessageItem );
257  return d->getTagList();
258 }
259 
260 bool MessageItem::hasAnnotation() const
261 {
262  Q_D( const MessageItem );
263  //TODO check for note entry?
264  return d->mAkonadiItem.hasAttribute<Akonadi::EntityAnnotationsAttribute>();
265 }
266 
267 QString MessageItem::annotation() const
268 {
269  Q_D( const MessageItem );
270  if ( d->mAkonadiItem.hasAttribute<Akonadi::EntityAnnotationsAttribute>() ) {
271  Akonadi::EntityAnnotationsAttribute *attr = d->mAkonadiItem.attribute<Akonadi::EntityAnnotationsAttribute>();
272  const QMap<QByteArray, QByteArray> annotations = attr->annotations();
273  if (annotations.contains("/private/comment")) {
274  return QString::fromLatin1(annotations.value("/private/comment"));
275  }
276  if (annotations.contains("/shared/comment")) {
277  return QString::fromLatin1(annotations.value("/shared/comment"));
278  }
279  }
280  return QString();
281 }
282 
283 void MessageItem::editAnnotation()
284 {
285  Q_D( MessageItem );
286  if ( d->mAnnotationDialog.data() )
287  return;
288  d->mAnnotationDialog = new MessageCore::AnnotationEditDialog( d->mAkonadiItem );
289  d->mAnnotationDialog.data()->setAttribute( Qt::WA_DeleteOnClose );
290  //FIXME make async
291  if ( d->mAnnotationDialog.data()->exec() ) {
292  // invalidate the cached mHasAnnotation value
293  }
294 }
295 
296 const MessageItem::Tag * MessageItemPrivate::findTagInternal( const QString &szTagId ) const
297 {
298  foreach( const MessageItem::Tag *tag, getTagList() ) {
299  if ( tag->id() == szTagId )
300  return tag;
301  }
302  return 0;
303 }
304 
305 const MessageItem::Tag *MessageItem::findTag( const QString &szTagId ) const
306 {
307  Q_D( const MessageItem );
308  return d->findTagInternal( szTagId );
309 }
310 
311 QString MessageItem::tagListDescription() const
312 {
313  QString ret;
314 
315  foreach( const Tag *tag, tagList() ) {
316  if ( !ret.isEmpty() )
317  ret += QLatin1String( ", " );
318  ret += tag->name();
319  }
320 
321  return ret;
322 }
323 
324 void MessageItem::invalidateTagCache()
325 {
326  Q_D( MessageItem );
327  d->invalidateTagCache();
328 }
329 
330 void MessageItem::invalidateAnnotationCache()
331 {
332  Q_D( MessageItem );
333  d->invalidateAnnotationCache();
334 }
335 
336 QColor MessageItem::textColor() const
337 {
338  Q_D( const MessageItem );
339  const Tag *bestTag = d->bestTag();
340  if ( bestTag != 0 && bestTag->textColor().isValid() ) {
341  return bestTag->textColor();
342  }
343  QColor clr;
344  Akonadi::MessageStatus messageStatus = status();
345  if ( !messageStatus.isRead() ) {
346  clr = s_settings->mColorUnreadMessage;
347  } else if ( messageStatus.isImportant() ) {
348  clr = s_settings->mColorImportantMessage;
349  } else if ( messageStatus.isToAct() ) {
350  clr = s_settings->mColorToDoMessage;
351  }
352 
353  return clr;
354 }
355 
356 QColor MessageItem::backgroundColor() const
357 {
358  Q_D( const MessageItem );
359  const Tag *bestTag = d->bestTag();
360  if ( bestTag ) {
361  return bestTag->backgroundColor();
362  } else {
363  return QColor();
364  }
365 }
366 
367 QFont MessageItem::font() const
368 {
369  Q_D( const MessageItem );
370  // for performance reasons we don't want font retrieval to trigger
371  // full tags loading, as the font is used for geometry calculation
372  // and thus this method called for each item
373  if ( d->tagListInitialized() ) {
374  const Tag *bestTag = d->bestTag();
375  if ( bestTag && bestTag->font() != QFont() ) {
376  return bestTag->font();
377  }
378  }
379 
380  QFont font;
381 
382  // from KDE3: "important" overrides "new" overrides "unread" overrides "todo"
383  Akonadi::MessageStatus messageStatus = status();
384  if ( messageStatus.isImportant() ) {
385  font = s_settings->mFontImportantMessage;
386  } else if ( !messageStatus.isRead() ) {
387  font = s_settings->mFontUnreadMessage;
388  } else if ( messageStatus.isToAct() ) {
389  font = s_settings->mFontToDoMessage;
390  } else {
391  font = s_settings->mFont;
392  }
393 
394  return font;
395 }
396 
397 QString MessageItem::fontKey() const
398 {
399  Q_D( const MessageItem );
400 
401  // for performance reasons we don't want font retrieval to trigger
402  // full tags loading, as the font is used for geometry calculation
403  // and thus this method called for each item
404  if ( d->tagListInitialized() ) {
405  const Tag *bestTag = d->bestTag();
406  if ( bestTag && bestTag->font() != QFont() ) {
407  return bestTag->font().key();
408  }
409  }
410 
411  // from KDE3: "important" overrides "new" overrides "unread" overrides "todo"
412  Akonadi::MessageStatus messageStatus = status();
413  if ( messageStatus.isImportant() ) {
414  return s_settings->mFontImportantMessageKey;
415  } else if ( !messageStatus.isRead() ) {
416  return s_settings->mFontUnreadMessageKey;
417  } else if ( messageStatus.isToAct() ) {
418  return s_settings->mFontToDoMessageKey;
419  } else {
420  return s_settings->mFontKey;
421  }
422 
423 }
424 
425 
426 MessageItem::SignatureState MessageItem::signatureState() const
427 {
428  Q_D( const MessageItem );
429  return d->mSignatureState;
430 }
431 
432 void MessageItem::setSignatureState( SignatureState state )
433 {
434  Q_D( MessageItem );
435  d->mSignatureState = state;
436 }
437 
438 MessageItem::EncryptionState MessageItem::encryptionState() const
439 {
440  Q_D( const MessageItem );
441  return d->mEncryptionState;
442 }
443 
444 void MessageItem::setEncryptionState( EncryptionState state )
445 {
446  Q_D( MessageItem );
447  d->mEncryptionState = state;
448 }
449 
450 QByteArray MessageItem::messageIdMD5() const
451 {
452  Q_D( const MessageItem );
453  return d->mMessageIdMD5;
454 }
455 
456 void MessageItem::setMessageIdMD5( const QByteArray &md5 )
457 {
458  Q_D( MessageItem );
459  d->mMessageIdMD5 = md5;
460 }
461 
462 QByteArray MessageItem::inReplyToIdMD5() const
463 {
464  Q_D( const MessageItem );
465  return d->mInReplyToIdMD5;
466 }
467 
468 void MessageItem::setInReplyToIdMD5( const QByteArray& md5 )
469 {
470  Q_D( MessageItem );
471  d->mInReplyToIdMD5 = md5;
472 }
473 
474 QByteArray MessageItem::referencesIdMD5() const
475 {
476  Q_D( const MessageItem );
477  return d->mReferencesIdMD5;
478 }
479 
480 void MessageItem::setReferencesIdMD5( const QByteArray& md5 )
481 {
482  Q_D( MessageItem );
483  d->mReferencesIdMD5 = md5;
484 }
485 
486 void MessageItem::setSubjectIsPrefixed( bool subjectIsPrefixed )
487 {
488  Q_D( MessageItem );
489  d->mSubjectIsPrefixed = subjectIsPrefixed;
490 }
491 
492 bool MessageItem::subjectIsPrefixed() const
493 {
494  Q_D( const MessageItem );
495  return d->mSubjectIsPrefixed;
496 }
497 
498 QByteArray MessageItem::strippedSubjectMD5() const
499 {
500  Q_D( const MessageItem );
501  return d->mStrippedSubjectMD5;
502 }
503 
504 void MessageItem::setStrippedSubjectMD5( const QByteArray& md5 )
505 {
506  Q_D( MessageItem );
507  d->mStrippedSubjectMD5 = md5;
508 }
509 
510 bool MessageItem::aboutToBeRemoved() const
511 {
512  Q_D( const MessageItem );
513  return d->mAboutToBeRemoved;
514 }
515 
516 void MessageItem::setAboutToBeRemoved( bool aboutToBeRemoved )
517 {
518  Q_D( MessageItem );
519  d->mAboutToBeRemoved = aboutToBeRemoved;
520 }
521 
522 MessageItem::ThreadingStatus MessageItem::threadingStatus() const
523 {
524  Q_D( const MessageItem );
525  return d->mThreadingStatus;
526 }
527 
528 void MessageItem::setThreadingStatus( ThreadingStatus threadingStatus )
529 {
530  Q_D( MessageItem );
531  d->mThreadingStatus = threadingStatus;
532 }
533 
534 unsigned long MessageItem::uniqueId() const
535 {
536  Q_D( const MessageItem );
537  return d->mAkonadiItem.id();
538 }
539 
540 Akonadi::Item MessageList::Core::MessageItem::akonadiItem() const
541 {
542  Q_D( const MessageItem );
543  return d->mAkonadiItem;
544 }
545 
546 void MessageList::Core::MessageItem::setAkonadiItem(const Akonadi::Item& item)
547 {
548  Q_D( MessageItem );
549  d->mAkonadiItem = item;
550 }
551 
552 MessageItem * MessageItem::topmostMessage()
553 {
554  if ( !parent() )
555  return this;
556  if ( parent()->type() == Item::Message )
557  return static_cast< MessageItem * >( parent() )->topmostMessage();
558  return this;
559 }
560 
561 QString MessageItem::accessibleTextForField(Theme::ContentItem::Type field)
562 {
563  switch (field) {
564  case Theme::ContentItem::Subject:
565  return d_ptr->mSubject;
566  case Theme::ContentItem::Sender:
567  return d_ptr->mSender;
568  case Theme::ContentItem::Receiver:
569  return d_ptr->mReceiver;
570  case Theme::ContentItem::SenderOrReceiver:
571  return senderOrReceiver();
572  case Theme::ContentItem::Date:
573  return formattedDate();
574  case Theme::ContentItem::Size:
575  return formattedSize();
576  case Theme::ContentItem::RepliedStateIcon:
577  return status().isReplied() ? i18nc( "Status of an item", "Replied" ) : QString();
578  case Theme::ContentItem::ReadStateIcon:
579  return status().isRead() ? i18nc( "Status of an item", "Read" ) : i18nc( "Status of an item", "Unread" );
580  case Theme::ContentItem::CombinedReadRepliedStateIcon:
581  return accessibleTextForField( Theme::ContentItem::ReadStateIcon ) + accessibleTextForField( Theme::ContentItem::RepliedStateIcon );
582  default:
583  return QString();
584  }
585 }
586 
587 
588 QString MessageItem::accessibleText( const Theme* theme, int columnIndex )
589 {
590  QStringList rowsTexts;
591 
592  Q_FOREACH( Theme::Row *row, theme->column(columnIndex)->messageRows() ) {
593  QStringList leftStrings;
594  QStringList rightStrings;
595  Q_FOREACH( Theme::ContentItem *contentItem, row->leftItems() ) {
596  leftStrings.append( accessibleTextForField( contentItem->type() ) );
597  }
598 
599  Q_FOREACH( Theme::ContentItem *contentItem, row->rightItems() ) {
600  rightStrings.insert( rightStrings.begin(), accessibleTextForField( contentItem->type() ) );
601  }
602 
603  rowsTexts.append( ( leftStrings + rightStrings ).join( QLatin1String( " " ) ) );
604  }
605 
606  return rowsTexts.join( QLatin1String(" ") );
607 }
608 
609 void MessageItem::subTreeToList( QList< MessageItem * > &list )
610 {
611  list.append( this );
612  QList< Item * > * childList = childItems();
613  if ( !childList )
614  return;
615  QList< Item * >::ConstIterator end( childList->constEnd() );
616  for ( QList< Item * >::ConstIterator it = childList->constBegin(); it != end; ++it )
617  {
618  Q_ASSERT( ( *it )->type() == Item::Message );
619  static_cast< MessageItem * >( *it )->subTreeToList( list );
620  }
621 }
622 
623 void MessageItem::setUnreadMessageColor( const QColor &color )
624 {
625  s_settings->mColorUnreadMessage = color;
626 }
627 
628 
629 void MessageItem::setImportantMessageColor( const QColor &color )
630 {
631  s_settings->mColorImportantMessage = color;
632 }
633 
634 
635 void MessageItem::setToDoMessageColor( const QColor &color )
636 {
637  s_settings->mColorToDoMessage = color;
638 }
639 
640 
641 void MessageItem::setGeneralFont( const QFont &font )
642 {
643  s_settings->mFont = font;
644  s_settings->mFontKey = font.key();
645 }
646 
647 void MessageItem::setUnreadMessageFont( const QFont &font )
648 {
649  s_settings->mFontUnreadMessage = font;
650  s_settings->mFontUnreadMessageKey = font.key();
651 }
652 
653 void MessageItem::setImportantMessageFont( const QFont &font )
654 {
655  s_settings->mFontImportantMessage = font;
656  s_settings->mFontImportantMessageKey = font.key();
657 }
658 
659 void MessageItem::setToDoMessageFont( const QFont &font )
660 {
661  s_settings->mFontToDoMessage = font;
662  s_settings->mFontToDoMessageKey = font.key();
663 }
664 
665 FakeItemPrivate::FakeItemPrivate( FakeItem *qq ) : MessageItemPrivate( qq )
666 {
667 }
668 
669 FakeItem::FakeItem()
670  : MessageItem( new FakeItemPrivate( this ) )
671 {
672 }
673 
674 FakeItem::~FakeItem()
675 {
676 }
677 
678 QList< MessageItem::Tag * > FakeItem::tagList() const
679 {
680  Q_D( const FakeItem );
681  return d->mFakeTags;
682 }
683 
684 void FakeItem::setFakeTags( const QList< MessageItem::Tag* > &tagList )
685 {
686  Q_D( FakeItem );
687  d->mFakeTags = tagList;
688 }
689 
690 bool FakeItem::hasAnnotation() const
691 {
692  return true;
693 }
694 
695 TagCache::TagCache()
696  :QObject(),
697  mMonitor(new Akonadi::Monitor(this))
698 {
699  mCache.setMaxCost(100);
700  mMonitor->setTypeMonitored(Akonadi::Monitor::Tags);
701  mMonitor->tagFetchScope().fetchAttribute<Akonadi::TagAttribute>();
702  connect(mMonitor, SIGNAL(tagAdded(Akonadi::Tag)), this, SLOT(onTagAdded(Akonadi::Tag)));
703  connect(mMonitor, SIGNAL(tagRemoved(Akonadi::Tag)), this, SLOT(onTagRemoved(Akonadi::Tag)));
704  connect(mMonitor, SIGNAL(tagChanged(Akonadi::Tag)), this, SLOT(onTagChanged(Akonadi::Tag)));
705 }
706 
707 void TagCache::onTagAdded(const Akonadi::Tag &tag)
708 {
709  mCache.insert(tag.id(), new Akonadi::Tag(tag));
710 }
711 
712 void TagCache::onTagChanged(const Akonadi::Tag &tag)
713 {
714  mCache.remove(tag.id());
715 }
716 
717 void TagCache::onTagRemoved(const Akonadi::Tag &tag)
718 {
719  mCache.remove(tag.id());
720 }
721 
722 void TagCache::retrieveTags(const Akonadi::Tag::List &tags, MessageItemPrivate *m)
723 {
724  //Retrieval is in progress
725  if (mRequests.key(m)) {
726  return;
727  }
728  Akonadi::Tag::List toFetch;
729  Akonadi::Tag::List available;
730  Q_FOREACH( const Akonadi::Tag &tag, tags ) {
731  if (mCache.contains(tag.id())) {
732  available << *mCache.object(tag.id());
733  } else {
734  toFetch << tag;
735  }
736  }
737  //Because fillTagList expects to be called once we either fetch all or none
738  if (!toFetch.isEmpty()) {
739  Akonadi::TagFetchJob *tagFetchJob = new Akonadi::TagFetchJob(tags, this);
740  tagFetchJob->fetchScope().fetchAttribute<Akonadi::TagAttribute>();
741  connect(tagFetchJob, SIGNAL(result(KJob*)), this, SLOT(onTagsFetched(KJob*)));
742  mRequests.insert(tagFetchJob, m);
743  } else {
744  m->fillTagList(available);
745  }
746 }
747 
748 void TagCache::cancelRequest(MessageItemPrivate *m)
749 {
750  const QList<KJob*> keys = mRequests.keys(m);
751  Q_FOREACH( KJob *job, keys ) {
752  mRequests.remove(job);
753  }
754 }
755 
756 void TagCache::onTagsFetched(KJob *job)
757 {
758  if (job->error()) {
759  kWarning() << "Failed to fetch tags: " << job->errorString();
760  return;
761  }
762  Akonadi::TagFetchJob *fetchJob = static_cast<Akonadi::TagFetchJob*>(job);
763  Q_FOREACH( const Akonadi::Tag &tag, fetchJob->tags() ) {
764  mCache.insert(tag.id(), new Akonadi::Tag(tag));
765  }
766  MessageItemPrivate *m = mRequests.take(fetchJob);
767  if (m) {
768  m->fillTagList(fetchJob->tags());
769  }
770 }
MessageList::Core::Theme::ContentItem
The ContentItem class defines a content item inside a Row.
Definition: theme.h:73
MessageList::Core::MessageItem::Tag::Tag
Tag(const QPixmap &pix, const QString &tagName, const QString &tagId)
Definition: messageitem.cpp:57
MessageList::Core::FakeItem::setFakeTags
void setFakeTags(const QList< Tag * > &tagList)
Sets a list of fake tags for this item.
Definition: messageitem.cpp:684
MessageList::Core::TagCache::cancelRequest
void cancelRequest(MessageItemPrivate *m)
Definition: messageitem.cpp:748
MessageList::Core::MessageItem::Tag::pixmap
QPixmap pixmap() const
Definition: messageitem.cpp:70
messageitem_p.h
MessageList::Core::Theme::ContentItem::ReadStateIcon
The icon that displays the unread/read state (never disabled)
Definition: theme.h:154
MessageList::Core::MessageItem::Tag::font
QFont font() const
Definition: messageitem.cpp:95
MessageList::Core::MessageItem::annotation
QString annotation() const
Returns the annotation of the message, given that hasAnnotation() is true.
Definition: messageitem.cpp:267
MessageList::Core::MessageItem::Tag::setBackgroundColor
void setBackgroundColor(const QColor &backgroundColor)
Definition: messageitem.cpp:110
MessageList::Core::MessageItem::EncryptionState
EncryptionState
Definition: messageitem.h:80
MessageList::Core::MessageItem::setUnreadMessageColor
static void setUnreadMessageColor(const QColor &color)
Definition: messageitem.cpp:623
QCache::contains
bool contains(const Key &key) const
QByteArray
MessageList::Core::MessageItem
Definition: messageitem.h:46
MessageList::Core::Theme::Row::rightItems
const QList< ContentItem * > & rightItems() const
Returns the list of right aligned items for this row.
Definition: theme.h:513
MessageList::Core::MessageItem::setThreadingStatus
void setThreadingStatus(ThreadingStatus threadingStatus)
Definition: messageitem.cpp:528
MessageList::Core::MessageItem::subTreeToList
void subTreeToList(QList< MessageItem * > &list)
Appends the whole subtree originating at this item to the specified list.
Definition: messageitem.cpp:609
MessageList::Core::TagCache
A tag cache.
Definition: messageitem_p.h:98
MessageList::Core::Item::senderOrReceiver
const QString & senderOrReceiver() const
Returns the sender or the receiver, depending on the underlying StorageModel settings.
Definition: item.cpp:461
MessageList::Core::MessageItem::Tag::backgroundColor
QColor backgroundColor() const
Definition: messageitem.cpp:90
MessageList::Core::MessageItemPrivate::fillTagList
void fillTagList(const Akonadi::Tag::List &taglist)
Definition: messageitem.cpp:184
MessageList::Core::Theme::ContentItem::CombinedReadRepliedStateIcon
The combined icon that displays the unread/read/replied/forwarded state (never disabled) ...
Definition: theme.h:210
MessageList::Core::MessageItem::topmostMessage
MessageItem * topmostMessage()
Definition: messageitem.cpp:552
MessageList::Core::MessageItem::Tag::setTextColor
void setTextColor(const QColor &textColor)
Definition: messageitem.cpp:105
QFont
MessageList::Core::MessageItem::setImportantMessageColor
static void setImportantMessageColor(const QColor &color)
Definition: messageitem.cpp:629
MessageList::Core::MessageItem::Tag::setPriority
void setPriority(int priority)
Definition: messageitem.cpp:120
MessageList::Core::MessageItemPrivate
Definition: messageitem_p.h:37
QMap
MessageList::Core::FakeItem::hasAnnotation
virtual bool hasAnnotation() const
Reimplemented to always return true.
Definition: messageitem.cpp:690
MessageList::Core::ItemPrivate::mReceiver
QString mReceiver
The receiver of the message (or group receiver)
Definition: item_p.h:244
MessageList::Core::Theme::Row
The Row class defines a row of items inside a Column.
Definition: theme.h:466
MessageList::Core::MessageItem::setStrippedSubjectMD5
void setStrippedSubjectMD5(const QByteArray &md5)
Definition: messageitem.cpp:504
MessageList::Core::MessageItem::Tag::priority
int priority() const
Definition: messageitem.cpp:100
MessageList::Core::MessageItem::encryptionState
EncryptionState encryptionState() const
Definition: messageitem.cpp:438
MessageList::Core::MessageItem::setAboutToBeRemoved
void setAboutToBeRemoved(bool aboutToBeRemoved)
Definition: messageitem.cpp:516
MessageList::Core::Item::formattedSize
QString formattedSize() const
A string with a text rappresentation of size().
Definition: item.cpp:254
QCache::object
T * object(const Key &key) const
MessageList::Core::ItemPrivate
Definition: item_p.h:41
MessageList::Core::MessageItem::setMessageIdMD5
void setMessageIdMD5(const QByteArray &md5)
Definition: messageitem.cpp:456
MessageList::Core::MessageItem::setAkonadiItem
void setAkonadiItem(const Akonadi::Item &item)
Definition: messageitem.cpp:546
theme.h
MessageList::Core::MessageItemPrivate::getTagList
QList< MessageItem::Tag * > getTagList() const
Returns the list of tags. This is calculated on demand and cached in mTagList.
Definition: messageitem.cpp:225
QCache::setMaxCost
void setMaxCost(int cost)
MessageList::Core::MessageItem::fontKey
QString fontKey() const
Definition: messageitem.cpp:397
MessageList::Core::Theme::ContentItem::Sender
From: strip, always.
Definition: theme.h:142
QStringList::join
QString join(const QString &separator) const
MessageList::Core::FakeItemPrivate
Definition: messageitem_p.h:88
MessageList::Core::MessageItem::ParentMissing
this message might belong to a thread but its parent is actually missing
Definition: messageitem.h:76
MessageList::Core::FakeItem::~FakeItem
~FakeItem()
Definition: messageitem.cpp:674
MessageList::Core::MessageItem::setToDoMessageFont
static void setToDoMessageFont(const QFont &font)
Definition: messageitem.cpp:659
MessageList::Core::MessageItem::editAnnotation
void editAnnotation()
Shows a dialog to edit or delete the annotation.
Definition: messageitem.cpp:283
MessageList::Core::MessageItem::font
QFont font() const
Definition: messageitem.cpp:367
MessageList::Core::MessageItem::Tag::textColor
QColor textColor() const
Definition: messageitem.cpp:85
MessageList::Core::Theme::Column::messageRows
const QList< Row * > & messageRows() const
Returns the list of rows visible in this column for a MessageItem.
Definition: theme.h:774
MessageList::Core::TagCache::retrieveTags
void retrieveTags(const Akonadi::Tag::List &tags, MessageItemPrivate *m)
Definition: messageitem.cpp:722
MessageList::Core::Theme::ContentItem::RepliedStateIcon
The icon that displays the replied/forwarded state (may be disabled)
Definition: theme.h:162
MessageList::Core::MessageItem::setInReplyToIdMD5
void setInReplyToIdMD5(const QByteArray &md5)
Definition: messageitem.cpp:468
MessageList::Core::MessageItem::uniqueId
unsigned long uniqueId() const
Definition: messageitem.cpp:534
MessageList::Core::MessageItemPrivate::bestTag
const MessageItem::Tag * bestTag() const
Returns the tag with the highest priority, or 0 if there are no tags.
Definition: messageitem.cpp:174
MessageList::Core::Item::type
Type type() const
Returns the type of this item.
Definition: item.cpp:297
MessageList::Core::FakeItem::tagList
virtual QList< Tag * > tagList() const
Reimplemented to return the fake tag list.
Definition: messageitem.cpp:678
MessageList::Core::MessageItem::hasAnnotation
virtual bool hasAnnotation() const
Returns true if this message has an annotation.
Definition: messageitem.cpp:260
QList::append
void append(const T &value)
MessageList::Core::TagCache::TagCache
TagCache()
Definition: messageitem.cpp:695
MessageList::Core::MessageItem::akonadiItem
Akonadi::Item akonadiItem() const
Definition: messageitem.cpp:540
messageitem.h
QFont::fromString
bool fromString(const QString &descrip)
MessageList::Core::MessageItem::strippedSubjectMD5
QByteArray strippedSubjectMD5() const
Definition: messageitem.cpp:498
QObject
MessageList::Core::MessageItem::Tag::name
QString name() const
Definition: messageitem.cpp:75
MessageList::Core::Theme::ContentItem::type
Type type() const
Returns the type of this content item.
Definition: theme.h:264
MessageList::Core::Theme::ContentItem::Subject
Display the subject of the message item.
Definition: theme.h:130
MessageList::Core::MessageItem::setEncryptionState
void setEncryptionState(EncryptionState state)
Definition: messageitem.cpp:444
QFont::key
QString key() const
MessageList::Core::MessageItem::messageIdMD5
QByteArray messageIdMD5() const
Definition: messageitem.cpp:450
MessageList::Core::MessageItem::Tag::id
QString id() const
Definition: messageitem.cpp:80
QString::isEmpty
bool isEmpty() const
MessageList::Core::MessageItem::aboutToBeRemoved
bool aboutToBeRemoved() const
Definition: messageitem.cpp:510
MessageList::Core::MessageItem::findTag
const Tag * findTag(const QString &szTagId) const
Returns Tag associated to this message that has the specified id or 0 if no such tag exists...
Definition: messageitem.cpp:305
MessageList::Core::MessageItem::signatureState
SignatureState signatureState() const
Definition: messageitem.cpp:426
MessageList::Core::MessageItem::tagListDescription
QString tagListDescription() const
Definition: messageitem.cpp:311
MessageList::Core::MessageItem::setReferencesIdMD5
void setReferencesIdMD5(const QByteArray &md5)
Definition: messageitem.cpp:480
MessageList::Core::MessageItem::textColor
QColor textColor() const
Definition: messageitem.cpp:336
MessageList::Core::MessageItem::MessageItem
MessageItem()
Definition: messageitem.cpp:240
QCache::insert
bool insert(const Key &key, T *object, int cost)
MessageList::Core::MessageItemPrivate::tagListInitialized
bool tagListInitialized() const
Definition: messageitem.cpp:235
MessageList::Core::Theme::ContentItem::Date
Formatted date time of the message/group.
Definition: theme.h:134
MessageList::Core::Theme::Row::leftItems
const QList< ContentItem * > & leftItems() const
Returns the list of left aligned items for this row.
Definition: theme.h:482
QString
QList
QColor
MessageList::Core::Theme::ContentItem::Type
Type
The available ContentItem types.
Definition: theme.h:125
MessageList::Core::Theme::ContentItem::Receiver
To: strip, always.
Definition: theme.h:146
MessageList::Core::MessageItem::setSignatureState
void setSignatureState(SignatureState state)
Definition: messageitem.cpp:432
MessageList::Core::MessageItem::invalidateTagCache
void invalidateTagCache()
Deletes all cached tags.
Definition: messageitem.cpp:324
QStringList
QPixmap
MessageList::Core::Theme::ContentItem::Size
Formatted size of the message.
Definition: theme.h:150
MessageList::Core::Item::formattedDate
QString formattedDate() const
A string with a text rappresentation of date() obtained via Manager.
Definition: item.cpp:259
MessageList::Core::Item::Message
This item is a MessageItem.
Definition: item.h:64
MessageList::Core::Theme::ContentItem::SenderOrReceiver
From: or To: strip, depending on the folder settings.
Definition: theme.h:138
MessageList::Core::Item
A single item of the MessageList tree managed by MessageList::Model.
Definition: item.h:52
MessageList::Core::FakeItem
A message item that can have a fake tag list and a fake annotation.
Definition: messageitem.h:214
MessageList::Core::Item::childItems
QList< Item * > * childItems() const
Return the list of child items.
Definition: item.cpp:70
MessageList::Core::MessageItem::threadingStatus
ThreadingStatus threadingStatus() const
Definition: messageitem.cpp:522
MessageList::Core::MessageItem::setSubjectIsPrefixed
void setSubjectIsPrefixed(bool subjectIsPrefixed)
Definition: messageitem.cpp:486
MessageList::Core::MessageItem::NotSigned
Definition: messageitem.h:90
MessageList::Core::MessageItem::SignatureState
SignatureState
Definition: messageitem.h:88
MessageList::Core::MessageItem::backgroundColor
QColor backgroundColor() const
Definition: messageitem.cpp:356
MessageList::Core::MessageItem::setUnreadMessageFont
static void setUnreadMessageFont(const QFont &font)
Definition: messageitem.cpp:647
MessageList::Core::MessageItemPrivate::invalidateAnnotationCache
void invalidateAnnotationCache()
Deletes the cache of the annotation.
Definition: messageitem.cpp:170
MessageList::Core::MessageItem::tagList
virtual QList< Tag * > tagList() const
Returns the list of tags for this item.
Definition: messageitem.cpp:254
MessageList::Core::MessageItemPrivate::findTagInternal
const MessageItem::Tag * findTagInternal(const QString &szTagId) const
Linear search in the list of tags.
Definition: messageitem.cpp:296
MessageList::Core::MessageItem::setImportantMessageFont
static void setImportantMessageFont(const QFont &font)
Definition: messageitem.cpp:653
MessageList::Core::MessageItem::setToDoMessageColor
static void setToDoMessageColor(const QColor &color)
Definition: messageitem.cpp:635
MessageList::Core::MessageItemPrivate::~MessageItemPrivate
~MessageItemPrivate()
Definition: messageitem.cpp:155
MessageList::Core::MessageItem::subjectIsPrefixed
bool subjectIsPrefixed() const
Definition: messageitem.cpp:492
MessageList::Core::MessageItem::~MessageItem
virtual ~MessageItem()
Definition: messageitem.cpp:250
MessageList::Core::MessageItem::accessibleText
QString accessibleText(const MessageList::Core::Theme *theme, int columnIndex)
Definition: messageitem.cpp:588
QLatin1String
QList::insert
void insert(int i, const T &value)
MessageList::Core::ItemPrivate::mSubject
QString mSubject
The subject of the message (or group subject)
Definition: item_p.h:245
MessageList::Core::Item::d_ptr
ItemPrivate *const d_ptr
Definition: item.h:402
MessageList::Core::Theme::column
Column * column(int idx) const
Returns a pointer to the column at the specified index or 0 if there is no such column.
Definition: theme.h:947
MessageList::Core::FakeItemPrivate::FakeItemPrivate
FakeItemPrivate(FakeItem *qq)
Definition: messageitem.cpp:665
MessageList::Core::MessageItem::Tag::~Tag
~Tag()
Definition: messageitem.cpp:65
MessageList::Core::FakeItem::FakeItem
FakeItem()
Definition: messageitem.cpp:669
QString::fromLatin1
QString fromLatin1(const char *str, int size)
MessageList::Core::Item::status
const Akonadi::MessageStatus & status() const
Returns the status associated to this Item.
Definition: item.cpp:401
MessageList::Core::MessageItem::NotEncrypted
Definition: messageitem.h:82
MessageList::Core::Theme
The Theme class defines the visual appearance of the MessageList.
Definition: theme.h:65
MessageList::Core::MessageItem::setGeneralFont
static void setGeneralFont(const QFont &font)
Definition: messageitem.cpp:641
QList::constEnd
const_iterator constEnd() const
QList::constBegin
const_iterator constBegin() const
MessageList::Core::MessageItemPrivate::invalidateTagCache
void invalidateTagCache()
Deletes the internal list of tags.
Definition: messageitem.cpp:161
QObject::connect
bool connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
MessageList::Core::Item::parent
Item * parent() const
Returns the parent Item in the tree, or 0 if this item isn't attached to the tree.
Definition: item.cpp:391
QCache::remove
bool remove(const Key &key)
MessageList::Core::ModelInvariantIndex
An invariant index that can be ALWAYS used to reference an item inside a QAbstractItemModel.
Definition: modelinvariantindex.h:44
MessageList::Core::MessageItem::Tag
Definition: messageitem.h:49
MessageList::Core::MessageItem::Tag::setFont
void setFont(const QFont &font)
Definition: messageitem.cpp:115
QList::begin
iterator begin()
MessageList::Core::MessageItem::referencesIdMD5
QByteArray referencesIdMD5() const
Definition: messageitem.cpp:474
MessageList::Core::MessageItem::inReplyToIdMD5
QByteArray inReplyToIdMD5() const
Definition: messageitem.cpp:462
MessageList::Core::MessageItem::ThreadingStatus
ThreadingStatus
Definition: messageitem.h:72
QColor::isValid
bool isValid() const
MessageList::Core::MessageItem::invalidateAnnotationCache
void invalidateAnnotationCache()
Same as invalidateTagCache(), only for the annotation.
Definition: messageitem.cpp:330
MessageList::Core::ItemPrivate::mSender
QString mSender
The sender of the message (or group sender)
Definition: item_p.h:243
This file is part of the KDE documentation.
Documentation copyright © 1996-2020 The KDE developers.
Generated on Mon Jun 22 2020 13:32:01 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

messagelist

Skip menu "messagelist"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members

kdepim API Reference

Skip menu "kdepim API Reference"
  • akonadi_next
  • akregator
  • blogilo
  • calendarsupport
  • console
  •   kabcclient
  •   konsolekalendar
  • kaddressbook
  • kalarm
  •   lib
  • kdgantt2
  • kjots
  • kleopatra
  • kmail
  • knode
  • knotes
  • kontact
  • korgac
  • korganizer
  • ktimetracker
  • libkdepim
  • libkleo
  • libkpgp
  • mailcommon
  • messagelist
  • messageviewer
  • pimprint

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal