diff options
author | toma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2009-11-25 17:56:58 +0000 |
---|---|---|
committer | toma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2009-11-25 17:56:58 +0000 |
commit | 460c52653ab0dcca6f19a4f492ed2c5e4e963ab0 (patch) | |
tree | 67208f7c145782a7e90b123b982ca78d88cc2c87 /kmail/headeritem.h | |
download | tdepim-460c52653ab0dcca6f19a4f492ed2c5e4e963ab0.tar.gz tdepim-460c52653ab0dcca6f19a4f492ed2c5e4e963ab0.zip |
Copy the KDE 3.5 branch to branches/trinity for new KDE 3.5 features.
BUG:215923
git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/kdepim@1054174 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
Diffstat (limited to 'kmail/headeritem.h')
-rw-r--r-- | kmail/headeritem.h | 241 |
1 files changed, 241 insertions, 0 deletions
diff --git a/kmail/headeritem.h b/kmail/headeritem.h new file mode 100644 index 000000000..66b75cc23 --- /dev/null +++ b/kmail/headeritem.h @@ -0,0 +1,241 @@ +/******************************************************************************* +** +** Filename : headeritem.h +** Created on : 28 November, 2004 +** Copyright : (c) 2004 Till Adam +** Email : [email protected] +** +*******************************************************************************/ + +/******************************************************************************* +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** In addition, as a special exception, the copyright holders give +** permission to link the code of this program with any edition of +** the Qt library by Trolltech AS, Norway (or with modified versions +** of Qt that use the same license as Qt), and distribute linked +** combinations including the two. You must obey the GNU General +** Public License in all respects for all of the code used other than +** Qt. If you modify this file, you may extend this exception to +** your version of the file, but you are not obligated to do so. If +** you do not wish to do so, delete this exception statement from +** your version. +** +*******************************************************************************/ +#ifndef HEADERITEM_H +#define HEADERITEM_H + +#include <stdlib.h> + +#include <klistview.h> // include for the base class + +class KMMsgBase; +class KPaintInfo; +class KMFolder; +class KMHeaders; + +namespace KMail +{ +class HeaderItem; // forward declaration + +/** + * @short Represents an item in the set of mails to be displayed but only as far + * as sorting, threading and reading/writing of the current sort order to + * a disk cache is concerned. + * + * Each such item is paired with a KMail::HeaderItem, which holds the graphical + * representation of each item (mail). This is what the threading trees are + * built of. + */ +class SortCacheItem { + +public: + SortCacheItem() : mItem(0), mParent(0), mId(-1), mSortOffset(-1), + mUnsortedCount(0), mUnsortedSize(0), mUnsortedChildren(0), + mImperfectlyThreaded (true), mSubjThreadingList(0) { } + SortCacheItem(int i, QString k, int o=-1) + : mItem(0), mParent(0), mId(i), mSortOffset(o), mKey(k), + mUnsortedCount(0), mUnsortedSize(0), mUnsortedChildren(0), + mImperfectlyThreaded (true), mSubjThreadingList(0) { } + ~SortCacheItem() { if(mUnsortedChildren) free(mUnsortedChildren); } + + /** The parent node of the item in the threading hierarchy. 0 if the item + * is at top level, which is the default. Can only be set by parents. */ + SortCacheItem *parent() const { return mParent; } + /** + * Returs whether the item is so far imperfectly threaded. + * If an item is imperfectly threaded (by References or subject, not by + * In-Reply-To) it will be reevalutated when a new mail comes in. It could be + * the perfect parent. */ + bool isImperfectlyThreaded() const + { return mImperfectlyThreaded; } + /** Set whether the item is currently imperfectly threaded (by References + * or Subject, not by In-Reply-To). */ + void setImperfectlyThreaded (bool val) + { mImperfectlyThreaded = val; } + /** Returns whether the item has other items below it. */ + bool hasChildren() const + { return mSortedChildren.count() || mUnsortedCount; } + /** The sorted children are an array of sortcache items we know are below the + * current one and are already properly sorted (as read from the cache ) */ + const QPtrList<SortCacheItem> *sortedChildren() const + { return &mSortedChildren; } + /** The unsorted children are an array of sortcache items we know are below the + * current one, but are yet to be threaded and sorted properly. */ + SortCacheItem **unsortedChildren(int &count) const + { count = mUnsortedCount; return mUnsortedChildren; } + /** Add an item to this itme's list of already sorted children. */ + void addSortedChild(SortCacheItem *i) { + i->mParent = this; + mSortedChildren.append(i); + } + /** Add an item to this itme's list of unsorted children. */ + void addUnsortedChild(SortCacheItem *i) { + i->mParent = this; + if(!mUnsortedChildren) + mUnsortedChildren = (SortCacheItem **)malloc((mUnsortedSize = 25) * sizeof(SortCacheItem *)); + else if(mUnsortedCount >= mUnsortedSize) + mUnsortedChildren = (SortCacheItem **)realloc(mUnsortedChildren, + (mUnsortedSize *= 2) * sizeof(SortCacheItem *)); + mUnsortedChildren[mUnsortedCount++] = i; + } + + /** Clear the sorted and unsorted children datastructures. */ + void clearChildren() { + mSortedChildren.clear(); + free( mUnsortedChildren ); + mUnsortedChildren = 0; + mUnsortedCount = mUnsortedSize = 0; + } + + /** The corresponding KMail::HeaderItem */ + HeaderItem *item() const { return mItem; } + /** Set the corresponding KMail::HeaderItem */ + void setItem(HeaderItem *i) { Q_ASSERT(!mItem); mItem = i; } + + /** sort key as used by the listview */ + const QString &key() const { return mKey; } + /** Set the sort key used by the list view. */ + void setKey(const QString &key) { mKey = key; } + + int id() const { return mId; } + void setId(int id) { mId = id; } + + /** offset in the cache file stream */ + int offset() const { return mSortOffset; } + void setOffset(int x) { mSortOffset = x; } + + void updateSortFile( FILE *sortStream, KMFolder *folder, + bool waiting_for_parent = false, + bool update_discovered_count = false); + + /** Set the list of mails with a certain subject that this item is on. + * Used to remove the item from that list on deletion. */ + void setSubjectThreadingList( QPtrList<SortCacheItem> *list ) { mSubjThreadingList = list; } + /** The list of mails with a certain subject that this item is on. */ + QPtrList<SortCacheItem>* subjectThreadingList() const { return mSubjThreadingList; } + +private: + HeaderItem *mItem; + SortCacheItem *mParent; + int mId, mSortOffset; + QString mKey; + + QPtrList<SortCacheItem> mSortedChildren; + int mUnsortedCount, mUnsortedSize; + SortCacheItem **mUnsortedChildren; + bool mImperfectlyThreaded; + // pointer to the list it might be on so it can be remove from it + // when the item goes away. + QPtrList<SortCacheItem>* mSubjThreadingList; +}; + + +/** + * Visual representation of a member of the set of displayables (mails in + * the current folder). Each item is paired with a KMail::SortCacheItem. See there as to + * how they are meant to cooperate. This should be about the visual aspects of + * displaying an entry only. */ +class HeaderItem : public KListViewItem +{ +public: + HeaderItem( QListView* parent, int msgId, const QString& key = QString::null ); + HeaderItem( QListViewItem* parent, int msgId, const QString& key = QString::null ); + ~HeaderItem (); + + /** Set the message id of this item, which is the offset/index in the folder + * currently displayed by the KMHeaders list view. */ + void setMsgId( int aMsgId ); + + // Profiling note: About 30% of the time taken to initialize the + // listview is spent in this function. About 60% is spent in operator + // new and QListViewItem::QListViewItem. + void irefresh(); + + /** Return the msgId of the message associated with this item. */ + int msgId() const; + + // Return the serial number of the message associated with this item; + Q_UINT32 msgSerNum() const; + + /** Expands all children of the list view item. */ + void setOpenRecursive( bool open ); + + /** Returns the text of the list view item. */ + QString text( int col) const; + + void setup(); + + typedef QValueList<QPixmap> PixmapList; + + QPixmap pixmapMerge( PixmapList pixmaps ) const; + + const QPixmap *cryptoIcon(KMMsgBase *msgBase) const; + const QPixmap *signatureIcon(KMMsgBase *msgBase) const; + const QPixmap *statusIcon(KMMsgBase *msgBase) const; + + const QPixmap *pixmap(int col) const; + + void paintCell( QPainter * p, const QColorGroup & cg, + int column, int width, int align ); + + static QString generate_key( KMHeaders *headers, KMMsgBase *msg, const KPaintInfo *paintInfo, int sortOrder ); + + virtual QString key( int column, bool /*ascending*/ ) const; + + void setTempKey( QString key ); + + int compare( QListViewItem *i, int col, bool ascending ) const; + + QListViewItem* firstChildNonConst(); /* Non const! */ + + /** Returns whether the item is about to be removed from the list view as a + * result of some user action. Such items are not selectable and painted with + * a strike-through decoration. */ + bool aboutToBeDeleted() const { return mAboutToBeDeleted; } + /** Set the item to be in about-to-be-deleted state, which means it + * cannot be selected and will be painted with a strike-through decoration. */ + void setAboutToBeDeleted( bool val ) { mAboutToBeDeleted = val; } + + /** Associate a KMail::SortCacheItem with this item. This is the structure used to + * represent the mail during sorting and threading calculation. */ + void setSortCacheItem( SortCacheItem *item ) { mSortCacheItem = item; } + /** Returns the KMail::SortCacheItem associated with this display item. */ + SortCacheItem* sortCacheItem() const { return mSortCacheItem; } + +private: + int mMsgId; + Q_UINT32 mSerNum; + QString mKey; + bool mAboutToBeDeleted; + SortCacheItem *mSortCacheItem; +}; // End of class HeaderItem + +} // End of namespace KMail + + +#endif // HEADERITEM_H |