o factor out HeaderItem class out of KMHeaders, it's just too large

o KMHeaderItem -> KMail::HeaderItem
o include fixes

svn path=/trunk/kdepim/; revision=366855
wilder-work
Till Adam 22 years ago
parent 7fa70b5e11
commit b928cccc3a
  1. 1
      Makefile.am
  2. 538
      headeritem.cpp
  3. 175
      headeritem.h
  4. 5
      kmcommands.cpp
  5. 2
      kmfolderdia.cpp
  6. 3
      kmfolderdia.h
  7. 745
      kmheaders.cpp
  8. 37
      kmheaders.h
  9. 1
      kmmainwidget.cpp

@ -49,6 +49,7 @@ libkmailprivate_la_SOURCES = kmmessage.cpp kmmainwin.cpp configuredialog.cpp \
identitydrag.cpp identitylistview.cpp identitydialog.cpp \
kmfolderdia.cpp kmfoldertree.cpp kmtransport.cpp \
kmfoldercombobox.cpp kmaccount.cpp kmheaders.cpp \
headeritem.cpp \
kmcomposewin.cpp kmfolder.cpp kmmsgpartdlg.cpp \
kmreaderwin.cpp htmlstatusbar.cpp kmmsgdict.cpp \
kmgroupware.cpp folderstorage.cpp \

@ -0,0 +1,538 @@
/*******************************************************************************
**
** Filename : headeritem.cpp
** Created on : 28 November, 2004
** Copyright : (c) 2004 Till Adam
** Email : adam@kde.org
**
*******************************************************************************/
/*******************************************************************************
**
** 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.
**
*******************************************************************************/
#include <klocale.h>
#include <qapplication.h>
#include <qregexp.h>
#include <qbitmap.h>
#include <qpainter.h>
#include "headeritem.h"
#include "kmheaders.h"
#include "kmfolder.h"
using namespace KMail;
// Constuction a new list view item with the given colors and pixmap
HeaderItem::HeaderItem( QListView* parent, int msgId, const QString& key )
: KListViewItem( parent ),
mMsgId( msgId ),
mKey( key ),
mAboutToBeDeleted( false ),
mSortCacheItem( 0 )
{
irefresh();
}
// Constuction a new list view item with the given parent, colors, & pixmap
HeaderItem::HeaderItem( QListViewItem* parent, int msgId, const QString& key )
: KListViewItem( parent ),
mMsgId( msgId ),
mKey( key ),
mAboutToBeDeleted( false ),
mSortCacheItem( 0 )
{
irefresh();
}
HeaderItem::~HeaderItem ()
{
delete mSortCacheItem;
}
// Update the msgId this item corresponds to.
void HeaderItem::setMsgId( int aMsgId )
{
mMsgId = 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 HeaderItem::irefresh()
{
KMHeaders *headers = static_cast<KMHeaders*>(listView());
NestingPolicy threadingPolicy = headers->getNestingPolicy();
if ((threadingPolicy == AlwaysOpen) ||
(threadingPolicy == DefaultOpen)) {
//Avoid opening items as QListView is currently slow to do so.
setOpen(true);
return;
}
if (threadingPolicy == DefaultClosed)
return; //default to closed
// otherwise threadingPolicy == OpenUnread
if (parent() && parent()->isOpen()) {
setOpen(true);
return;
}
KMMsgBase *mMsgBase = headers->folder()->getMsgBase( mMsgId );
if (mMsgBase->isNew() || mMsgBase->isUnread()
|| mMsgBase->isImportant() || mMsgBase->isWatched() ) {
setOpen(true);
HeaderItem * topOfThread = this;
while(topOfThread->parent())
topOfThread = (HeaderItem*)topOfThread->parent();
topOfThread->setOpenRecursive(true);
}
}
// Return the msgId of the message associated with this item
int HeaderItem::msgId() const
{
return mMsgId;
}
// Update this item to summarise a new folder and message
void HeaderItem::reset( int aMsgId )
{
mMsgId = aMsgId;
irefresh();
}
//Opens all children in the thread
void HeaderItem::setOpenRecursive( bool open )
{
if (open){
QListViewItem * lvchild;
lvchild = firstChild();
while (lvchild){
((HeaderItem*)lvchild)->setOpenRecursive( true );
lvchild = lvchild->nextSibling();
}
setOpen( true );
} else {
setOpen( false );
}
}
QString HeaderItem::text( int col) const
{
KMHeaders *headers = static_cast<KMHeaders*>(listView());
KMMsgBase *mMsgBase = headers->folder()->getMsgBase( mMsgId );
QString tmp;
assert(mMsgBase);
if ( col == headers->paintInfo()->senderCol ) {
if ( (headers->folder()->whoField().lower() == "to") && !headers->paintInfo()->showReceiver )
tmp = mMsgBase->toStrip();
else
tmp = mMsgBase->fromStrip();
if (tmp.isEmpty())
tmp = i18n("Unknown");
else
tmp = tmp.simplifyWhiteSpace();
} else if ( col == headers->paintInfo()->receiverCol ) {
tmp = mMsgBase->toStrip();
if (tmp.isEmpty())
tmp = i18n("Unknown");
else
tmp = tmp.simplifyWhiteSpace();
} else if(col == headers->paintInfo()->subCol) {
tmp = mMsgBase->subject();
if (tmp.isEmpty())
tmp = i18n("No Subject");
else
tmp.remove(QRegExp("[\r\n]"));
} else if(col == headers->paintInfo()->dateCol) {
tmp = headers->mDate.dateString( mMsgBase->date() );
} else if(col == headers->paintInfo()->sizeCol
&& headers->paintInfo()->showSize) {
if ( mMsgBase->parent()->folderType() == KMFolderTypeImap ) {
tmp = KIO::convertSize( mMsgBase->msgSizeServer() );
} else {
tmp = KIO::convertSize( mMsgBase->msgSize() );
}
}
return tmp;
}
void HeaderItem::setup()
{
widthChanged();
const int ph = KMHeaders::pixNew->height();
QListView *v = listView();
int h = QMAX( v->fontMetrics().height(), ph ) + 2*v->itemMargin();
h = QMAX( h, QApplication::globalStrut().height());
if ( h % 2 > 0 )
h++;
setHeight( h );
}
typedef QValueList<QPixmap> PixmapList;
QPixmap HeaderItem::pixmapMerge( PixmapList pixmaps ) const
{
int width = 0;
int height = 0;
for ( PixmapList::ConstIterator it = pixmaps.begin();
it != pixmaps.end(); ++it ) {
width += (*it).width();
height = QMAX( height, (*it).height() );
}
QPixmap res( width, height );
QBitmap mask( width, height );
int x = 0;
for ( PixmapList::ConstIterator it = pixmaps.begin();
it != pixmaps.end(); ++it ) {
bitBlt( &res, x, 0, &(*it) );
bitBlt( &mask, x, 0, (*it).mask() );
x += (*it).width();
}
res.setMask( mask );
return res;
}
const QPixmap *HeaderItem::cryptoIcon(KMMsgBase *msgBase) const
{
switch ( msgBase->encryptionState() )
{
case KMMsgFullyEncrypted : return KMHeaders::pixFullyEncrypted;
case KMMsgPartiallyEncrypted : return KMHeaders::pixPartiallyEncrypted;
case KMMsgEncryptionStateUnknown: return KMHeaders::pixUndefinedEncrypted;
case KMMsgEncryptionProblematic : return KMHeaders::pixEncryptionProblematic;
default : return 0;
}
}
const QPixmap *HeaderItem::signatureIcon(KMMsgBase *msgBase) const
{
switch ( msgBase->signatureState() )
{
case KMMsgFullySigned : return KMHeaders::pixFullySigned;
case KMMsgPartiallySigned : return KMHeaders::pixPartiallySigned;
case KMMsgSignatureStateUnknown: return KMHeaders::pixUndefinedSigned;
case KMMsgSignatureProblematic : return KMHeaders::pixSignatureProblematic;
default : return 0;
}
}
const QPixmap *HeaderItem::statusIcon(KMMsgBase *msgBase) const
{
// forwarded, replied have precedence over the other states
if ( msgBase->isForwarded() && !msgBase->isReplied() ) return KMHeaders::pixReadFwd;
if ( !msgBase->isForwarded() && msgBase->isReplied() ) return KMHeaders::pixReadReplied;
if ( msgBase->isForwarded() && msgBase->isReplied() ) return KMHeaders::pixReadFwdReplied;
// a queued or sent mail is usually also read
if ( msgBase->isQueued() ) return KMHeaders::pixQueued;
if ( msgBase->isTodo() ) return KMHeaders::pixTodo;
if ( msgBase->isSent() ) return KMHeaders::pixSent;
if ( msgBase->isNew() ) return KMHeaders::pixNew;
if ( msgBase->isRead() || msgBase->isOld() ) return KMHeaders::pixRead;
if ( msgBase->isUnread() ) return KMHeaders::pixUns;
if ( msgBase->isDeleted() ) return KMHeaders::pixDel;
return 0;
}
const QPixmap *HeaderItem::pixmap(int col) const
{
KMHeaders *headers = static_cast<KMHeaders*>(listView());
KMMsgBase *msgBase = headers->folder()->getMsgBase( mMsgId );
if ( col == headers->paintInfo()->subCol ) {
PixmapList pixmaps;
if ( !headers->mPaintInfo.showSpamHam ) {
// Have the spam/ham and watched/ignored icons first, I guess.
if ( msgBase->isSpam() ) pixmaps << *KMHeaders::pixSpam;
if ( msgBase->isHam() ) pixmaps << *KMHeaders::pixHam;
}
if ( !headers->mPaintInfo.showWatchedIgnored ) {
if ( msgBase->isIgnored() ) pixmaps << *KMHeaders::pixIgnored;
if ( msgBase->isWatched() ) pixmaps << *KMHeaders::pixWatched;
}
if ( !headers->mPaintInfo.showStatus ) {
const QPixmap *pix = statusIcon(msgBase);
if ( pix ) pixmaps << *pix;
}
// Only merge the attachment icon in if that is configured.
if ( headers->paintInfo()->showAttachmentIcon &&
!headers->paintInfo()->showAttachment &&
msgBase->attachmentState() == KMMsgHasAttachment )
pixmaps << *KMHeaders::pixAttachment;
// Only merge the crypto icons in if that is configured.
if ( headers->paintInfo()->showCryptoIcons ) {
const QPixmap *pix;
if ( !headers->paintInfo()->showCrypto )
if ( (pix = cryptoIcon(msgBase)) ) pixmaps << *pix;
if ( !headers->paintInfo()->showSigned )
if ( (pix = signatureIcon(msgBase)) ) pixmaps << *pix;
}
if ( !headers->mPaintInfo.showImportant )
if ( msgBase->isImportant() ) pixmaps << *KMHeaders::pixFlag;
static QPixmap mergedpix;
mergedpix = pixmapMerge( pixmaps );
return &mergedpix;
}
else if ( col == headers->paintInfo()->statusCol ) {
return statusIcon(msgBase);
}
else if ( col == headers->paintInfo()->attachmentCol ) {
if ( msgBase->attachmentState() == KMMsgHasAttachment )
return KMHeaders::pixAttachment;
}
else if ( col == headers->paintInfo()->importantCol ) {
if ( msgBase->isImportant() )
return KMHeaders::pixFlag;
}
else if ( col == headers->paintInfo()->spamHamCol ) {
if ( msgBase->isSpam() ) return KMHeaders::pixSpam;
if ( msgBase->isHam() ) return KMHeaders::pixHam;
}
else if ( col == headers->paintInfo()->watchedIgnoredCol ) {
if ( msgBase->isWatched() ) return KMHeaders::pixWatched;
if ( msgBase->isIgnored() ) return KMHeaders::pixIgnored;
}
else if ( col == headers->paintInfo()->signedCol ) {
return signatureIcon(msgBase);
}
else if ( col == headers->paintInfo()->cryptoCol ) {
return cryptoIcon(msgBase);
}
return 0;
}
void HeaderItem::paintCell( QPainter * p, const QColorGroup & cg,
int column, int width, int align )
{
KMHeaders *headers = static_cast<KMHeaders*>(listView());
if (headers->noRepaint) return;
if (!headers->folder()) return;
QColorGroup _cg( cg );
QColor c = _cg.text();
QColor *color;
KMMsgBase *mMsgBase = headers->folder()->getMsgBase( mMsgId );
if (!mMsgBase) return;
color = (QColor *)(&headers->paintInfo()->colFore);
// new overrides unread, and flagged overrides new.
if (mMsgBase->isUnread()) color = (QColor*)(&headers->paintInfo()->colUnread);
if (mMsgBase->isNew()) color = (QColor*)(&headers->paintInfo()->colNew);
if (mMsgBase->isImportant()) color = (QColor*)(&headers->paintInfo()->colFlag);
_cg.setColor( QColorGroup::Text, *color );
if( column == headers->paintInfo()->dateCol )
p->setFont(headers->dateFont);
KListViewItem::paintCell( p, _cg, column, width, align );
if (aboutToBeDeleted()) {
// strike through
p->drawLine( 0, height()/2, width, height()/2);
}
_cg.setColor( QColorGroup::Text, c );
}
QString HeaderItem::generate_key( KMHeaders *headers,
KMMsgBase *msg,
const KPaintInfo *paintInfo,
int sortOrder )
{
// It appears, that QListView in Qt-3.0 asks for the key
// in QListView::clear(), which is called from
// readSortOrder()
if (!msg) return QString::null;
int column = sortOrder & ((1 << 5) - 1);
QString ret = QChar( (char)sortOrder );
QString sortArrival = QString( "%1" ).arg( msg->getMsgSerNum(), 0, 36 );
while (sortArrival.length() < 7) sortArrival = '0' + sortArrival;
if (column == paintInfo->dateCol) {
if (paintInfo->orderOfArrival)
return ret + sortArrival;
else {
QString d = QString::number(msg->date());
while (d.length() <= 10) d = '0' + d;
return ret + d + sortArrival;
}
} else if (column == paintInfo->senderCol) {
QString tmp;
if ( (headers->folder()->whoField().lower() == "to") && !headers->paintInfo()->showReceiver )
tmp = msg->toStrip();
else
tmp = msg->fromStrip();
return ret + tmp.lower() + ' ' + sortArrival;
} else if (column == paintInfo->receiverCol) {
QString tmp = msg->toStrip();
return ret + tmp.lower() + ' ' + sortArrival;
} else if (column == paintInfo->subCol) {
QString tmp;
tmp = ret;
if (paintInfo->status) {
tmp += msg->statusToSortRank() + ' ';
}
tmp += KMMessage::stripOffPrefixes( msg->subject().lower() ) + ' ' + sortArrival;
return tmp;
}
else if (column == paintInfo->sizeCol) {
QString len;
if ( msg->parent()->folderType() == KMFolderTypeImap )
{
len = QString::number( msg->msgSizeServer() );
} else {
len = QString::number( msg->msgSize() );
}
while (len.length() < 9) len = '0' + len;
return ret + len + sortArrival;
}
else if (column == paintInfo->statusCol) {
QString s;
if ( msg->isNew() ) s = "1";
else if ( msg->isUnread() ) s = "2";
else if (!msg->isForwarded() && msg->isReplied() ) s = "3";
else if ( msg->isForwarded() && msg->isReplied() ) s = "4";
else if ( msg->isForwarded() && !msg->isReplied() ) s = "5";
else if ( msg->isRead() || msg->isOld() ) s = "6";
else if ( msg->isQueued() ) s = "7";
else if ( msg->isSent() ) s = "8";
else if ( msg->isDeleted() ) s = "9";
return ret + s + sortArrival;
}
else if (column == paintInfo->attachmentCol) {
QString s(msg->attachmentState() == KMMsgHasAttachment ? "1" : "0");
return ret + s + sortArrival;
}
else if (column == paintInfo->importantCol) {
QString s(msg->isImportant() ? "1" : "0");
return ret + s + sortArrival;
}
else if (column == paintInfo->spamHamCol) {
QString s((msg->isSpam() || msg->isHam()) ? "1" : "0");
return ret + s + sortArrival;
}
else if (column == paintInfo->watchedIgnoredCol) {
QString s((msg->isWatched() || msg->isIgnored()) ? "1" : "0");
return ret + s + sortArrival;
}
else if (column == paintInfo->signedCol) {
QString s;
switch ( msg->signatureState() )
{
case KMMsgFullySigned : s = "1"; break;
case KMMsgPartiallySigned : s = "2"; break;
case KMMsgSignatureStateUnknown: s = "3"; break;
case KMMsgSignatureProblematic : s = "4"; break;
default : s = "5"; break;
}
return ret + s + sortArrival;
}
else if (column == paintInfo->cryptoCol) {
QString s;
switch ( msg->encryptionState() )
{
case KMMsgFullyEncrypted : s = "1"; break;
case KMMsgPartiallyEncrypted : s = "2"; break;
case KMMsgEncryptionStateUnknown: s = "3"; break;
case KMMsgEncryptionProblematic : s = "4"; break;
default : s = "5"; break;
}
return ret + s + sortArrival;
}
return ret + "missing key"; //you forgot something!!
}
QString HeaderItem::key( int column, bool /*ascending*/ ) const
{
KMHeaders *headers = static_cast<KMHeaders*>(listView());
int sortOrder = column;
if (headers->mPaintInfo.orderOfArrival)
sortOrder |= (1 << 6);
if (headers->mPaintInfo.status)
sortOrder |= (1 << 5);
//This code should stay pretty much like this, if you are adding new
//columns put them in generate_key
if(mKey.isEmpty() || mKey[0] != (char)sortOrder) {
KMHeaders *headers = static_cast<KMHeaders*>(listView());
KMMsgBase *msgBase = headers->folder()->getMsgBase( mMsgId );
return ((HeaderItem *)this)->mKey =
generate_key( headers, msgBase, headers->paintInfo(), sortOrder );
}
return mKey;
}
void HeaderItem::setTempKey( QString key ) {
mKey = key;
}
int HeaderItem::compare( QListViewItem *i, int col, bool ascending ) const
{
int res = 0;
KMHeaders *headers = static_cast<KMHeaders*>(listView());
if ( ( col == headers->paintInfo()->statusCol ) ||
( col == headers->paintInfo()->sizeCol ) ||
( col == headers->paintInfo()->attachmentCol ) ||
( col == headers->paintInfo()->importantCol ) ||
( col == headers->paintInfo()->spamHamCol ) ||
( col == headers->paintInfo()->signedCol ) ||
( col == headers->paintInfo()->cryptoCol ) ||
( col == headers->paintInfo()->watchedIgnoredCol ) ) {
res = key( col, ascending ).compare( i->key( col, ascending ) );
} else if ( col == headers->paintInfo()->dateCol ) {
res = key( col, ascending ).compare( i->key( col, ascending ) );
if (i->parent() && !ascending)
res = -res;
} else if ( col == headers->paintInfo()->subCol ||
col == headers->paintInfo()->senderCol ||
col == headers->paintInfo()->receiverCol ) {
res = key( col, ascending ).localeAwareCompare( i->key( col, ascending ) );
}
return res;
}
QListViewItem* HeaderItem::firstChildNonConst() /* Non const! */
{
enforceSortOrder(); // Try not to rely on QListView implementation details
return firstChild();
}

@ -0,0 +1,175 @@
/*******************************************************************************
**
** Filename : headeritem.h
** Created on : 28 November, 2004
** Copyright : (c) 2004 Till Adam
** Email : adam@kde.org
**
*******************************************************************************/
/*******************************************************************************
**
** 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
class KMSortCacheItem {
HeaderItem *mItem;
KMSortCacheItem *mParent;
int mId, mSortOffset;
QString mKey;
QPtrList<KMSortCacheItem> mSortedChildren;
int mUnsortedCount, mUnsortedSize;
KMSortCacheItem **mUnsortedChildren;
bool mImperfectlyThreaded;
public:
KMSortCacheItem() : mItem(0), mParent(0), mId(-1), mSortOffset(-1),
mUnsortedCount(0), mUnsortedSize(0), mUnsortedChildren(0),
mImperfectlyThreaded (true) { }
KMSortCacheItem(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) { }
~KMSortCacheItem() { if(mUnsortedChildren) free(mUnsortedChildren); }
KMSortCacheItem *parent() const { return mParent; } //can't be set, only by the parent
bool isImperfectlyThreaded() const
{ return mImperfectlyThreaded; }
void setImperfectlyThreaded (bool val)
{ mImperfectlyThreaded = val; }
bool hasChildren() const
{ return mSortedChildren.count() || mUnsortedCount; }
const QPtrList<KMSortCacheItem> *sortedChildren() const
{ return &mSortedChildren; }
KMSortCacheItem **unsortedChildren(int &count) const
{ count = mUnsortedCount; return mUnsortedChildren; }
void addSortedChild(KMSortCacheItem *i) {
i->mParent = this;
mSortedChildren.append(i);
}
void addUnsortedChild(KMSortCacheItem *i) {
i->mParent = this;
if(!mUnsortedChildren)
mUnsortedChildren = (KMSortCacheItem **)malloc((mUnsortedSize = 25) * sizeof(KMSortCacheItem *));
else if(mUnsortedCount >= mUnsortedSize)
mUnsortedChildren = (KMSortCacheItem **)realloc(mUnsortedChildren,
(mUnsortedSize *= 2) * sizeof(KMSortCacheItem *));
mUnsortedChildren[mUnsortedCount++] = i;
}
HeaderItem *item() const { return mItem; }
void setItem(HeaderItem *i) { Q_ASSERT(!mItem); mItem = i; }
const QString &key() const { return mKey; }
void setKey(const QString &key) { mKey = key; }
int id() const { return mId; }
void setId(int id) { mId = id; }
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);
};
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 ();
// Update the msgId this item corresponds to.
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;
// Update this item to summarise a new folder and message
void reset( int aMsgId );
//Opens all children in the thread
void setOpenRecursive( bool open );
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! */
bool aboutToBeDeleted() const { return mAboutToBeDeleted; }
void setAboutToBeDeleted( bool val ) { mAboutToBeDeleted = val; }
void setSortCacheItem( KMSortCacheItem *item ) { mSortCacheItem = item; }
KMSortCacheItem* sortCacheItem() const { return mSortCacheItem; }
private:
int mMsgId;
QString mKey;
bool mAboutToBeDeleted;
KMSortCacheItem *mSortCacheItem;
}; // End of class HeaderItem
} // End of namespace KMail
#endif // HEADERITEM_H

@ -68,6 +68,7 @@ using KMail::ActionScheduler;
#include "kmfolderimap.h"
#include "kmfoldermgr.h"
#include "kmheaders.h"
#include "headeritem.h"
#include "kmmainwidget.h"
#include "kmmsgdict.h"
#include "kmsender.h"
@ -1437,7 +1438,7 @@ void KMMetaFilterActionCommand::start()
scheduler->setAutoDestruct( true );
int contentX, contentY;
KMHeaderItem *nextItem = mHeaders->prepareMove( &contentX, &contentY );
HeaderItem *nextItem = mHeaders->prepareMove( &contentX, &contentY );
QPtrList<KMMsgBase> msgList = *mHeaders->selectedMsgs(true);
mHeaders->finalizeMove( nextItem, contentX, contentY );
@ -1449,7 +1450,7 @@ void KMMetaFilterActionCommand::start()
*mHeaders->selectedMsgs(), mFilter);
filterCommand->start();
int contentX, contentY;
KMHeaderItem *item = mHeaders->prepareMove( &contentX, &contentY );
HeaderItem *item = mHeaders->prepareMove( &contentX, &contentY );
mHeaders->finalizeMove( item, contentX, contentY );
#endif
}

@ -39,6 +39,7 @@
#include "kmfolderimap.h"
#include "kmfoldercachedimap.h"
#include "kmfolder.h"
#include "kmheaders.h"
#include "kmkernel.h"
#include "kmcommands.h"
#include "mailinglist-magic.h"
@ -49,7 +50,6 @@
#include "kmmainwidget.h"
#include "globalsettings.h"
#include "folderrequester.h"
using KMail::FolderRequester;
#include <keditlistbox.h>
#include <klineedit.h>

@ -55,10 +55,9 @@ namespace KPIM { class IdentityCombo; }
class KMFolderDialog;
class KMFolderTree;
template <typename T> class QGuardedPtr;
namespace KMail { class FolderRequester; }
namespace KMail {
class FolderRequester;
/**
* This is the base class for tabs in the folder dialog.
* It uses the API from ConfigModuleTab (basically: it's a widget that can load and save)

File diff suppressed because it is too large Load Diff

@ -6,6 +6,9 @@
#include "kmmessage.h"
#include "kmime_util.h"
#include "kmcommands.h"
#include "headeritem.h"
using KMail::KMSortCacheItem;
using KMail::HeaderItem;
#include <klistview.h>
#include <kfoldertree.h>
@ -23,23 +26,29 @@ class KMMessage;
class KMMsgBase;
class KMMainWidget;
class QPalette;
class KMHeaderItem;
class QPixmap;
class QIconSet;
class QDateTime;
class KMSortCacheItem;
typedef QPtrList<KMMsgBase> KMMessageList;
typedef QValueList<Q_UINT32> SerNumList;
typedef QMap<int,KMFolder*> KMMenuToFolder;
enum NestingPolicy { AlwaysOpen = 0, DefaultOpen, DefaultClosed, OpenUnread };
#define KMAIL_SORT_VERSION 1012
#define KMAIL_SORT_FILE(x) x->indexLocation() + ".sorted"
#define KMAIL_SORT_HEADER "## KMail Sort V%04d\n\t"
#define KMAIL_MAGIC_HEADER_OFFSET 21 //strlen(KMAIL_SORT_HEADER)
#define KMAIL_MAX_KEY_LEN 16384
#define KMAIL_RESERVED 3
/** The widget that shows the contents of folders */
class KMHeaders : public KListView
{
Q_OBJECT
friend class KMHeaderItem; // For easy access to the pixmaps
friend class HeaderItem; // For easy access to the pixmaps
public:
KMHeaders(KMMainWidget *owner, QWidget *parent=0, const char *name=0);
@ -77,8 +86,8 @@ public:
virtual void applyFiltersOnMsg();
virtual void undo();
virtual bool canUndo() const;
virtual KMHeaderItem * prepareMove( int *contentX, int *contentY );
virtual void finalizeMove( KMHeaderItem *item, int contentX, int contentY );
virtual HeaderItem * prepareMove( int *contentX, int *contentY );
virtual void finalizeMove( HeaderItem *item, int contentX, int contentY );
/** If destination is 0 then the messages are deleted, otherwise
they are moved to this folder. The second parameter is usefull when the
@ -124,7 +133,7 @@ public:
/** Return the current message */
virtual KMMessage* currentMsg();
/** Return the current list view item */
virtual KMHeaderItem* currentHeaderItem();
virtual HeaderItem* currentHeaderItem();
/** Return the index of the message corresponding to the current item */
virtual int currentItemIndex();
/** Set the current item to the one corresponding to the given msg id */
@ -264,7 +273,7 @@ protected:
void makeHeaderVisible();
/** Auxillary method to findUnread */
void findUnreadAux( KMHeaderItem*&, bool &, bool, bool );
void findUnreadAux( HeaderItem*&, bool &, bool, bool );
/** Returns message index of first selected message of the messages
where the message with the given id is in. This for finding the correct
@ -332,8 +341,8 @@ private:
int mCurrentItem;
/** Serial number of the current item */
unsigned long mCurrentItemSerNum;
/** Map messages ids into KMHeaderItems */
QMemArray<KMHeaderItem*> mItems;
/** Map messages ids into HeaderItems */
QMemArray<HeaderItem*> mItems;
// ===== threading and sorting ==========
bool mNested, mNestedOverride, mSubjThreading;
@ -355,7 +364,7 @@ private:
/** */
QDict< QPtrList< KMSortCacheItem > > mSubjectLists;
/** */
QPtrList<KMHeaderItem> mImperfectlyThreadedList;
QPtrList<HeaderItem> mImperfectlyThreadedList;
/** Initializes the mSortCacheItems tree with the contents of the folder */
void buildThreadingTree( QMemArray<KMSortCacheItem *> sortCache );
@ -367,7 +376,7 @@ private:
KMSortCacheItem* findParentBySubject(KMSortCacheItem *item);
/** */
void appendItemToSortFile(KMHeaderItem *);
void appendItemToSortFile(HeaderItem *);
/** */
bool writeSortOrder();
/** */
@ -379,11 +388,11 @@ private:
/** ditto */
bool getMsgMulti;
/** ditto */
KMHeaderItem* getMsgItem;
HeaderItem* getMsgItem;
/** @see KMHeaders::selectedMsgs isn't reentrant */
KMMessageList mSelMsgBaseList;
QPtrList<KMMessage> mSelMsgList;
KMHeaderItem* mPrevCurrent;
HeaderItem* mPrevCurrent;
/** Current colours and backing pixmap */
KPaintInfo mPaintInfo;
@ -403,6 +412,6 @@ private:
/** popup to switch columns */
KPopupMenu* mPopup;
};
}; // class
#endif

@ -84,6 +84,7 @@ using KMail::AntiSpamWizard;
using KMail::FilterLogDialog;
#include <headerlistquicksearch.h>
using KMail::HeaderListQuickSearch;
#include "kmheaders.h"
#include <assert.h>
#include <kstatusbar.h>

Loading…
Cancel
Save