Make it possible to use a distinct selection model in the foldertreewidget.
[kdepim.git] / messagecore / messagestatus.cpp
blob8cec3cf529fbbc3710f3e6fddccaace00b99159c
1 /*
2 This file is part of KDEPIM.
3 Copyright (c) 2003 Andreas Gungl <a.gungl@gmx.de>
5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Library General Public
7 License as published by the Free Software Foundation; either
8 version 2 of the License, or (at your option) any later version.
10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU Library General Public License for more details.
15 You should have received a copy of the GNU Library General Public License
16 along with this library; see the file COPYING.LIB. If not, write to the
17 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18 Boston, MA 02110-1301, USA.
21 #include "messagestatus.h"
23 #include <KDE/KDebug>
24 #include <QString>
26 using namespace KPIM;
28 /** The message status format. These can be or'd together.
29 Note, that the KMMsgStatusIgnored implies the
30 status to be Read even if the flags are set
31 to Unread or New. This is done in isRead()
32 and related getters. So we can preserve the state
33 when switching a thread to Ignored and back. */
34 enum MsgStatus {
35 KMMsgStatusUnknown = 0x00000000,
36 KMMsgStatusNew = 0x00000001,
37 KMMsgStatusUnread = 0x00000002,
38 KMMsgStatusRead = 0x00000004,
39 KMMsgStatusOld = 0x00000008,
40 KMMsgStatusDeleted = 0x00000010,
41 KMMsgStatusReplied = 0x00000020,
42 KMMsgStatusForwarded = 0x00000040,
43 KMMsgStatusQueued = 0x00000080,
44 KMMsgStatusSent = 0x00000100,
45 KMMsgStatusFlag = 0x00000200, // flag means important
46 KMMsgStatusWatched = 0x00000400,
47 KMMsgStatusIgnored = 0x00000800, // forces isRead()
48 KMMsgStatusToAct = 0x00001000,
49 KMMsgStatusSpam = 0x00002000,
50 KMMsgStatusHam = 0x00004000,
51 KMMsgStatusHasAttach = 0x00008000
54 MessageStatus::MessageStatus()
56 mStatus = KMMsgStatusUnknown;
59 MessageStatus &MessageStatus::operator = ( const MessageStatus &other )
61 mStatus = other.mStatus;
62 return *this;
65 bool MessageStatus::operator == ( const MessageStatus &other ) const
67 return ( mStatus == other.mStatus );
70 bool MessageStatus::operator != ( const MessageStatus &other ) const
72 return ( mStatus != other.mStatus );
75 bool MessageStatus::operator & ( const MessageStatus &other ) const
77 return ( mStatus & other.mStatus );
80 void MessageStatus::clear()
82 mStatus = KMMsgStatusUnknown;
85 void MessageStatus::set( const MessageStatus &other )
87 // Those stati are exclusive, but we have to lock at the
88 // internal representation because Ignored can manipulate
89 // the result of the getter methods.
90 if ( other.mStatus & KMMsgStatusNew ) {
91 setNew();
93 if ( other.mStatus & KMMsgStatusUnread ) {
94 setUnread();
96 if ( other.mStatus & KMMsgStatusRead ) {
97 setRead();
99 if ( other.mStatus & KMMsgStatusOld ) {
100 setOld();
103 if ( other.isDeleted() ) {
104 setDeleted();
106 if ( other.isReplied() ) {
107 setReplied();
109 if ( other.isForwarded() ) {
110 setForwarded();
112 if ( other.isQueued() ) {
113 setQueued();
115 if ( other.isSent() ) {
116 setSent();
118 if ( other.isImportant() ) {
119 setImportant();
122 if ( other.isWatched() ) {
123 setWatched();
125 if ( other.isIgnored() ) {
126 setIgnored();
128 if ( other.isToAct() ) {
129 setToAct();
131 if ( other.isSpam() ) {
132 setSpam();
134 if ( other.isHam() ) {
135 setHam();
137 if ( other.hasAttachment() ) {
138 setHasAttachment();
142 void MessageStatus::toggle( const MessageStatus &other )
144 if ( other.isDeleted() ) {
145 setDeleted( !( mStatus & KMMsgStatusDeleted ) );
147 if ( other.isReplied() ) {
148 setReplied( !( mStatus & KMMsgStatusReplied ) );
150 if ( other.isForwarded() ) {
151 setForwarded( !( mStatus & KMMsgStatusForwarded ) );
153 if ( other.isQueued() ) {
154 setQueued( !( mStatus & KMMsgStatusQueued ) );
156 if ( other.isSent() ) {
157 setSent( !( mStatus & KMMsgStatusSent ) );
159 if ( other.isImportant() ) {
160 setImportant( !( mStatus & KMMsgStatusFlag ) );
163 if ( other.isWatched() ) {
164 setWatched( !( mStatus & KMMsgStatusWatched ) );
166 if ( other.isIgnored() ) {
167 setIgnored( !( mStatus & KMMsgStatusIgnored ) );
169 if ( other.isToAct() ) {
170 setToAct( !( mStatus & KMMsgStatusToAct ) );
172 if ( other.isSpam() ) {
173 setSpam( !( mStatus & KMMsgStatusSpam ) );
175 if ( other.isHam() ) {
176 setHam( !( mStatus & KMMsgStatusHam ) );
178 if ( other.hasAttachment() ) {
179 setHasAttachment( !( mStatus & KMMsgStatusHasAttach ) );
183 bool MessageStatus::isOfUnknownStatus() const
185 return ( mStatus == KMMsgStatusUnknown );
188 bool MessageStatus::isNew() const
190 return ( mStatus & KMMsgStatusNew && !( mStatus & KMMsgStatusIgnored ) );
193 bool MessageStatus::isUnread() const
195 return ( mStatus & KMMsgStatusUnread && !( mStatus & KMMsgStatusIgnored ) );
198 bool MessageStatus::isRead() const
200 return ( mStatus & KMMsgStatusRead || mStatus & KMMsgStatusIgnored );
203 bool MessageStatus::isOld() const
205 return ( mStatus & KMMsgStatusOld );
208 bool MessageStatus::isDeleted() const
210 return ( mStatus & KMMsgStatusDeleted );
213 bool MessageStatus::isReplied() const
215 return ( mStatus & KMMsgStatusReplied );
218 bool MessageStatus::isForwarded() const
220 return ( mStatus & KMMsgStatusForwarded );
223 bool MessageStatus::isQueued() const
225 return ( mStatus & KMMsgStatusQueued );
228 bool MessageStatus::isSent() const
230 return ( mStatus & KMMsgStatusSent );
233 bool MessageStatus::isImportant() const
235 return ( mStatus & KMMsgStatusFlag );
238 bool MessageStatus::isWatched() const
240 return ( mStatus & KMMsgStatusWatched );
243 bool MessageStatus::isIgnored() const
245 return ( mStatus & KMMsgStatusIgnored );
248 bool MessageStatus::isToAct() const
250 return ( mStatus & KMMsgStatusToAct );
253 bool MessageStatus::isSpam() const
255 return ( mStatus & KMMsgStatusSpam );
258 bool MessageStatus::isHam() const
260 return ( mStatus & KMMsgStatusHam );
263 bool MessageStatus::hasAttachment() const
265 return ( mStatus & KMMsgStatusHasAttach );
268 void MessageStatus::setNew()
270 // new overrides old and read
271 mStatus &= ~KMMsgStatusOld;
272 mStatus &= ~KMMsgStatusRead;
273 mStatus &= ~KMMsgStatusUnread;
274 mStatus |= KMMsgStatusNew;
277 void MessageStatus::setUnread()
279 // unread overrides read
280 mStatus &= ~KMMsgStatusOld;
281 mStatus &= ~KMMsgStatusRead;
282 mStatus &= ~KMMsgStatusNew;
283 mStatus |= KMMsgStatusUnread;
286 void MessageStatus::setRead()
288 // Unset unread and new, set read
289 mStatus &= ~KMMsgStatusUnread;
290 mStatus &= ~KMMsgStatusNew;
291 mStatus |= KMMsgStatusRead;
294 void MessageStatus::setOld()
296 // old can't be new or unread
297 mStatus &= ~KMMsgStatusNew;
298 mStatus &= ~KMMsgStatusUnread;
299 mStatus |= KMMsgStatusOld;
302 void MessageStatus::setDeleted( bool deleted )
304 if ( deleted ) {
305 mStatus |= KMMsgStatusDeleted;
306 } else {
307 mStatus &= ~KMMsgStatusDeleted;
311 void MessageStatus::setReplied( bool replied )
313 if ( replied ) {
314 mStatus |= KMMsgStatusReplied;
315 } else {
316 mStatus &= ~KMMsgStatusReplied;
320 void MessageStatus::setForwarded( bool forwarded )
322 if ( forwarded ) {
323 mStatus |= KMMsgStatusForwarded;
324 } else {
325 mStatus &= ~KMMsgStatusForwarded;
329 void MessageStatus::setQueued( bool queued )
331 if ( queued ) {
332 mStatus |= KMMsgStatusQueued;
333 } else {
334 mStatus &= ~KMMsgStatusQueued;
338 void MessageStatus::setSent( bool sent )
340 if ( sent ) {
341 mStatus &= ~KMMsgStatusQueued;
342 // FIXME to be discussed if sent messages are Read
343 mStatus &= ~KMMsgStatusUnread;
344 mStatus &= ~KMMsgStatusNew;
345 mStatus |= KMMsgStatusSent;
346 } else {
347 mStatus &= ~KMMsgStatusSent;
351 void MessageStatus::setImportant( bool important )
353 if ( important ) {
354 mStatus |= KMMsgStatusFlag;
355 } else {
356 mStatus &= ~KMMsgStatusFlag;
360 // Watched and ignored are mutually exclusive
361 void MessageStatus::setWatched( bool watched )
363 if ( watched ) {
364 mStatus &= ~KMMsgStatusIgnored;
365 mStatus |= KMMsgStatusWatched;
366 } else {
367 mStatus &= ~KMMsgStatusWatched;
371 void MessageStatus::setIgnored( bool ignored )
373 if ( ignored ) {
374 mStatus &= ~KMMsgStatusWatched;
375 mStatus |= KMMsgStatusIgnored;
376 } else {
377 mStatus &= ~KMMsgStatusIgnored;
381 void MessageStatus::setToAct( bool toAct )
383 if ( toAct ) {
384 mStatus |= KMMsgStatusToAct;
385 } else {
386 mStatus &= ~KMMsgStatusToAct;
390 // Ham and Spam are mutually exclusive
391 void MessageStatus::setSpam( bool spam )
393 if ( spam ) {
394 mStatus &= ~KMMsgStatusHam;
395 mStatus |= KMMsgStatusSpam;
396 } else {
397 mStatus &= ~KMMsgStatusSpam;
401 void MessageStatus::setHam( bool ham )
403 if ( ham ) {
404 mStatus &= ~KMMsgStatusSpam;
405 mStatus |= KMMsgStatusHam;
406 } else {
407 mStatus &= ~KMMsgStatusHam;
411 void MessageStatus::setHasAttachment( bool withAttachment )
413 if ( withAttachment ) {
414 mStatus |= KMMsgStatusHasAttach;
415 } else {
416 mStatus &= ~KMMsgStatusHasAttach;
420 qint32 MessageStatus::toQInt32() const
422 return mStatus;
425 void MessageStatus::fromQInt32( qint32 status )
427 mStatus = status;
430 QString MessageStatus::getStatusStr() const
432 QString sstr;
433 if ( mStatus & KMMsgStatusNew ) {
434 sstr += 'N';
436 if ( mStatus & KMMsgStatusUnread ) {
437 sstr += 'U';
439 if ( mStatus & KMMsgStatusOld ) {
440 sstr += 'O';
442 if ( mStatus & KMMsgStatusRead ) {
443 sstr += 'R';
445 if ( mStatus & KMMsgStatusDeleted ) {
446 sstr += 'D';
448 if ( mStatus & KMMsgStatusReplied ) {
449 sstr += 'A';
451 if ( mStatus & KMMsgStatusForwarded ) {
452 sstr += 'F';
454 if ( mStatus & KMMsgStatusQueued ) {
455 sstr += 'Q';
457 if ( mStatus & KMMsgStatusToAct ) {
458 sstr += 'K';
460 if ( mStatus & KMMsgStatusSent ) {
461 sstr += 'S';
463 if ( mStatus & KMMsgStatusFlag ) {
464 sstr += 'G';
466 if ( mStatus & KMMsgStatusWatched ) {
467 sstr += 'W';
469 if ( mStatus & KMMsgStatusIgnored ) {
470 sstr += 'I';
472 if ( mStatus & KMMsgStatusSpam ) {
473 sstr += 'P';
475 if ( mStatus & KMMsgStatusHam ) {
476 sstr += 'H';
478 if ( mStatus & KMMsgStatusHasAttach ) {
479 sstr += 'T';
482 return sstr;
485 void MessageStatus::setStatusFromStr( const QString& aStr )
487 mStatus = KMMsgStatusUnknown;
489 if ( aStr.contains( 'N' ) ) {
490 setNew();
492 if ( aStr.contains( 'U' ) ) {
493 setUnread();
495 if ( aStr.contains( 'O' ) ) {
496 setOld();
498 if ( aStr.contains( 'R' ) ) {
499 setRead();
501 if ( aStr.contains( 'D' ) ) {
502 setDeleted();
504 if ( aStr.contains( 'A' ) ) {
505 setReplied();
507 if ( aStr.contains( 'F' ) ) {
508 setForwarded();
510 if ( aStr.contains( 'Q' ) ) {
511 setQueued();
513 if ( aStr.contains( 'K' ) ) {
514 setToAct();
516 if ( aStr.contains( 'S' ) ) {
517 setSent();
519 if ( aStr.contains( 'G' ) ) {
520 setImportant();
522 if ( aStr.contains( 'W' ) ) {
523 setWatched();
525 if ( aStr.contains( 'I' ) ) {
526 setIgnored();
528 if ( aStr.contains( 'P' ) ) {
529 setSpam();
531 if ( aStr.contains( 'H' ) ) {
532 setHam();
534 if ( aStr.contains( 'T' ) ) {
535 setHasAttachment();
537 if ( aStr.contains( 'C' ) ) {
538 setHasAttachment( false );
542 QString MessageStatus::getSortRank() const
544 QString sstr = "bcbbbbbbbb";
546 // put watched ones first, then normal ones, ignored ones last
547 if ( mStatus & KMMsgStatusWatched ) {
548 sstr[0] = 'a';
550 if ( mStatus & KMMsgStatusIgnored ) {
551 sstr[0] = 'c';
554 // Second level. One of new, old, read, unread
555 if ( mStatus & KMMsgStatusNew ) {
556 sstr[1] = 'a';
558 if ( mStatus & KMMsgStatusUnread ) {
559 sstr[1] = 'b';
561 //if ( mStatus & KMMsgStatusOld ) {
562 // sstr[1] = 'c';
564 //if ( mStatus & KMMsgStatusRead ) {
565 // sstr[1] = 'c';
568 // Third level. In somewhat arbitrary order.
569 if ( mStatus & KMMsgStatusDeleted ) {
570 sstr[2] = 'a';
572 if ( mStatus & KMMsgStatusFlag ) {
573 sstr[3] = 'a';
575 if ( mStatus & KMMsgStatusReplied ) {
576 sstr[4] = 'a';
578 if ( mStatus & KMMsgStatusForwarded ) {
579 sstr[5] = 'a';
581 if ( mStatus & KMMsgStatusQueued ) {
582 sstr[6] = 'a';
584 if ( mStatus & KMMsgStatusSent ) {
585 sstr[7] = 'a';
587 if ( mStatus & KMMsgStatusHam ) {
588 sstr[8] = 'a';
590 if ( mStatus & KMMsgStatusSpam ) {
591 sstr[8] = 'c';
593 if ( mStatus & KMMsgStatusToAct ) {
594 sstr[9] = 'a';
597 return sstr;
600 QSet<QByteArray> MessageStatus::getStatusFlags() const
602 QSet<QByteArray> flags;
604 // Non handled status:
605 // * KMMsgStatusQueued
606 // * KMMsgStatusSent
607 // * KMMsgStatusSpam
608 // * KMMsgStatusHam
609 // * KMMsgStatusHasAttach
611 if ( mStatus & KMMsgStatusDeleted ) {
612 flags+= "\\DELETED";
613 } else {
614 if ( mStatus & ( KMMsgStatusOld | KMMsgStatusRead ) )
615 flags+= "\\SEEN ";
616 if ( mStatus & KMMsgStatusReplied )
617 flags+= "\\ANSWERED ";
618 if ( mStatus & KMMsgStatusFlag )
619 flags+= "\\FLAGGED ";
620 // non standard flags
621 if ( mStatus & KMMsgStatusForwarded )
622 flags+= "$FORWARDED ";
623 if ( mStatus & KMMsgStatusToAct )
624 flags+= "$TODO ";
625 if ( mStatus & KMMsgStatusWatched )
626 flags+= "$WATCHED ";
627 if ( mStatus & KMMsgStatusIgnored )
628 flags+= "$IGNORED ";
631 return flags;
634 void MessageStatus::setStatusFromFlags( const QSet<QByteArray> &flags )
636 mStatus = KMMsgStatusUnknown;
637 setNew();
639 // Non handled status:
640 // * KMMsgStatusQueued
641 // * KMMsgStatusSent
642 // * KMMsgStatusSpam
643 // * KMMsgStatusHam
644 // * KMMsgStatusHasAttach
646 foreach ( const QByteArray &flag, flags ) {
647 if ( flag.toUpper() == QByteArray( "\\DELETED" ) ) {
648 setDeleted();
649 } else if ( flag.toUpper() == QByteArray( "\\SEEN" ) ) {
650 setRead();
651 } else if ( flag.toUpper() == QByteArray( "\\ANSWERED" ) ) {
652 setReplied();
653 } else if ( flag.toUpper() == QByteArray( "\\FLAGGED" ) ) {
654 setImportant();
656 // non standard flags
657 } else if ( flag.toUpper() == QByteArray( "$FORWARDED" ) ) {
658 setForwarded();
659 } else if ( flag.toUpper() == QByteArray( "$TODO" ) ) {
660 setToAct();
661 } else if ( flag.toUpper() == QByteArray( "$WATCHED" ) ) {
662 setWatched();
663 } else if ( flag.toUpper() == QByteArray( "$IGNORED" ) ) {
664 setIgnored();
665 } else {
666 kWarning() << "Unknown flag:" << flag;
671 MessageStatus MessageStatus::statusNew()
673 MessageStatus st;
674 st.setNew();
675 return st;
678 MessageStatus MessageStatus::statusRead()
680 MessageStatus st;
681 st.setRead();
682 return st;
685 MessageStatus MessageStatus::statusUnread()
687 MessageStatus st;
688 st.setUnread();
689 return st;
692 MessageStatus MessageStatus::statusNewAndUnread()
694 MessageStatus st;
695 // set the "new and unread" pseudo status; we have to set the internal
696 // representation directly because new and unread are mutually exclusive
697 st.fromQInt32( statusNew().toQInt32() | statusUnread().toQInt32() );
698 return st;
701 MessageStatus MessageStatus::statusOld()
703 MessageStatus st;
704 st.setOld();
705 return st;
708 MessageStatus MessageStatus::statusDeleted()
710 MessageStatus st;
711 st.setDeleted();
712 return st;
715 MessageStatus MessageStatus::statusReplied()
717 MessageStatus st;
718 st.setReplied();
719 return st;
722 MessageStatus MessageStatus::statusForwarded()
724 MessageStatus st;
725 st.setForwarded();
726 return st;
729 MessageStatus MessageStatus::statusQueued()
731 MessageStatus st;
732 st.setQueued();
733 return st;
736 MessageStatus MessageStatus::statusSent()
738 MessageStatus st;
739 st.setSent();
740 return st;
743 MessageStatus MessageStatus::statusImportant()
745 MessageStatus st;
746 st.setImportant();
747 return st;
750 MessageStatus MessageStatus::statusWatched()
752 MessageStatus st;
753 st.setWatched();
754 return st;
757 MessageStatus MessageStatus::statusIgnored()
759 MessageStatus st;
760 st.setIgnored();
761 return st;
764 MessageStatus MessageStatus::statusToAct()
766 MessageStatus st;
767 st.setToAct();
768 return st;
771 MessageStatus MessageStatus::statusSpam()
773 MessageStatus st;
774 st.setSpam();
775 return st;
778 MessageStatus MessageStatus::statusHam()
780 MessageStatus st;
781 st.setHam();
782 return st;
785 MessageStatus MessageStatus::statusHasAttachment()
787 MessageStatus st;
788 st.setHasAttachment();
789 return st;