00001
00002
00003 #ifndef __KMHEADERS
00004 #define __KMHEADERS
00005
00006 #include "kmime_util.h"
00007 #include "headeritem.h"
00008 using KMail::SortCacheItem;
00009 using KMail::HeaderItem;
00010
00011 #include <klistview.h>
00012 #include <kfoldertree.h>
00013 #include <kmmsgbase.h>
00014
00015 #include <tqwidget.h>
00016 #include <tqstrlist.h>
00017 #include <tqmemarray.h>
00018 #include <tqmap.h>
00019 #include <tqdragobject.h>
00020 #include <tqdict.h>
00021 #include <tqguardedptr.h>
00022
00023 class KMFolder;
00024 class KMMessage;
00025 class KMMsgBase;
00026 class KMCommand;
00027 class KMMainWidget;
00028 class KPopupMenu;
00029 class TQPalette;
00030 class TQPixmap;
00031 class TQIconSet;
00032 class TQDateTime;
00033
00034 typedef TQPtrList<KMMsgBase> KMMessageList;
00035 typedef TQValueList<TQ_UINT32> SerNumList;
00036 typedef TQMap<int,KMFolder*> KMMenuToFolder;
00037 enum NestingPolicy { AlwaysOpen = 0, DefaultOpen, DefaultClosed, OpenUnread };
00038
00039
00040 #define KMAIL_SORT_VERSION 1012
00041 #define KMAIL_SORT_FILE(x) x->indexLocation() + ".sorted"
00042 #define KMAIL_SORT_HEADER "## KMail Sort V%04d\n\t"
00043 #define KMAIL_MAGIC_HEADER_OFFSET 21 //strlen(KMAIL_SORT_HEADER)
00044 #define KMAIL_MAX_KEY_LEN 16384
00045 #define KMAIL_RESERVED 3
00046
00048 class KMHeaders : public KListView
00049 {
00050 Q_OBJECT
00051 TQ_OBJECT
00052
00053 friend class ::KMail::HeaderItem;
00054
00055 public:
00056 KMHeaders(KMMainWidget *owner, TQWidget *parent=0, const char *name=0);
00057 virtual ~KMHeaders();
00058
00063 virtual void setFolder(KMFolder *, bool forceJumpToUnread = false);
00064
00066 KMFolder* folder(void) { return mFolder; }
00067
00069 void refreshNestedState(void);
00070
00073 virtual void setCurrentMsg(int msgId);
00074
00076 TQPtrList<TQListViewItem> currentThread() const;
00077
00080 virtual void setThreadStatus(KMMsgStatus status, bool toggle=false);
00081
00082
00083 virtual void setMsgRead(int msgId);
00084
00086 virtual void setMsgStatus(KMMsgStatus status, bool toggle=false);
00087 virtual void deleteMsg();
00088 virtual void applyFiltersOnMsg();
00089 virtual void undo();
00090 virtual bool canUndo() const;
00091 virtual HeaderItem * prepareMove( int *contentX, int *contentY );
00092 virtual void finalizeMove( HeaderItem *item, int contentX, int contentY );
00093
00097 virtual void moveMsgToFolder( KMFolder* destination,
00098 bool askForConfirmation=true );
00099
00102 virtual void copyMsgToFolder(KMFolder* destination,
00103 KMMessage* aMsg = 0);
00104
00106 virtual void clearSelectableAndAboutToBeDeleted(TQ_UINT32 serNum);
00109 virtual KMMessageList* selectedMsgs(bool toBeDeleted = false);
00110
00112 TQValueList<int> selectedItems();
00113
00115 TQValueList<TQ_UINT32> selectedSernums();
00116
00120 TQValueList<TQ_UINT32> selectedVisibleSernums();
00121
00123 int indexOfGetMsg (void) const { return getMsgIndex; }
00124
00126 KMMainWidget* owner(void) const { return mOwner; }
00127
00129 const KPaintInfo *paintInfo(void) const { return &mPaintInfo; }
00130
00132 virtual void readConfig(void);
00133
00135 virtual void readColorConfig(void);
00136
00144 void restoreColumnLayout( KConfig *config, const TQString &group );
00145
00147 virtual KMMessage* currentMsg();
00149 virtual HeaderItem* currentHeaderItem();
00151 virtual int currentItemIndex();
00153 virtual void setCurrentItemByIndex( int msgIdx );
00155 void setCurrentItemBySerialNum( unsigned long serialNum );
00157 virtual int topItemIndex();
00160 virtual void setTopItemByIndex( int aMsgIdx );
00161 virtual void setNestedOverride( bool override );
00162 virtual void setSubjectThreading( bool subjThreading );
00164 virtual void setOpen ( TQListViewItem *, bool );
00165
00166 NestingPolicy getNestingPolicy() const { return nestingPolicy; }
00168 bool isThreaded() const {
00169 return mNested != mNestedOverride;
00170 }
00171
00174 virtual int findUnread(bool findNext, int startAt=-1, bool onlyNew = false, bool acceptCurrent = false);
00175
00176 void highlightMessage(TQListViewItem*, bool markitread);
00177 void highlightCurrentThread();
00178
00180 static TQString fancyDate( time_t otime );
00181
00182 bool noRepaint;
00183
00184
00185 bool eventFilter ( TQObject *o, TQEvent *e );
00186
00188 const KMMsgBase * getMsgBaseForItem( const TQListViewItem *item ) const;
00189
00190
00191 TQFont newFont() const { return mNewFont; }
00192 TQFont unreadFont() const { return mUnreadFont; }
00193 TQFont importantFont() const { return mImportantFont; }
00194 TQFont todoFont() const { return mTodoFont; }
00195 TQFont dateFont() const { return mDateFont; }
00196
00202 void setCopiedMessages( const TQValueList<TQ_UINT32> &msgs, bool move );
00203
00208 bool isMessageCut( TQ_UINT32 serNum ) const;
00209
00211 virtual void writeConfig(void);
00212
00213 signals:
00216 void selected(KMMessage *);
00219 void activated(KMMessage *);
00221 void maybeDeleting();
00223 void messageListUpdated();
00224
00230 void msgAddedToListView( TQListViewItem* );
00231
00232 public slots:
00234 void selectMessage(TQListViewItem*);
00236 void highlightMessage(TQListViewItem*);
00238 void slotRMB();
00240 void msgHeaderChanged(KMFolder *folder, int msgId);
00242 void msgChanged();
00244 void folderCleared();
00246 void folderClosed();
00248 void msgAdded(int);
00250 void msgRemoved( int, TQString );
00252 void nextMessage();
00254 void selectNextMessage();
00256 void prevMessage();
00258 void selectPrevMessage();
00261 bool nextUnreadMessage(bool acceptCurrent = false);
00264 bool prevUnreadMessage();
00266 void incCurrentMessage();
00268 void decCurrentMessage();
00270 void selectCurrentMessage();
00272 void slotNoDrag();
00274 void resetCurrentTime();
00275
00277 void reset();
00278
00281 void slotExpandOrCollapseThread( bool expand );
00284 void slotExpandOrCollapseAllThreads( bool expand );
00285
00286 virtual void ensureCurrentItemVisible();
00287
00290 virtual void setSelected(TQListViewItem *item, bool selected);
00291
00295 void setSelectedByIndex(TQValueList<int> items, bool selected);
00296
00299 void slotToggleColumn(int id, int mode = -1);
00300
00302 void setFolderInfoStatus();
00303
00304 protected:
00305 static TQPixmap *pixNew, *pixUns, *pixDel, *pixRead, *pixRep, *pixSent,
00306 *pixQueued, *pixFwd, *pixFlag, *pixWatched, *pixIgnored, *pixSpam, *pixHam,
00307 *pixFullySigned, *pixPartiallySigned, *pixUndefinedSigned,
00308 *pixFullyEncrypted, *pixPartiallyEncrypted, *pixUndefinedEncrypted,
00309 *pixFiller, *pixEncryptionProblematic,
00310 *pixSignatureProblematic, *pixAttachment, *pixInvitation,
00311 *pixReadFwd, *pixReadReplied, *pixReadFwdReplied, *pixTodo;
00312
00314 virtual bool event(TQEvent *e);
00315
00317 virtual void paintEmptyArea( TQPainter * p, const TQRect & rect );
00318
00320 void makeHeaderVisible();
00321
00323 void findUnreadAux( HeaderItem*&, bool &, bool, bool );
00324
00329 virtual int firstSelectedMsg() const;
00330
00332 virtual void readFolderConfig(void);
00333
00335 virtual void writeFolderConfig(void);
00336
00338 virtual void contentsMousePressEvent(TQMouseEvent*);
00339 virtual void contentsMouseReleaseEvent(TQMouseEvent* e);
00340 virtual void keyPressEvent( TQKeyEvent * e );
00341
00343 virtual void setSorting( int column, bool ascending = true);
00344
00346 void contentsMouseMoveEvent( TQMouseEvent *e );
00347
00350 void styleChange( TQStyle& oldStyle );
00351
00354 void setStyleDependantFrameWidth();
00355
00356 protected slots:
00359 virtual void moveSelectedToFolder( int menuId );
00361 virtual void copySelectedToFolder( int menuId );
00363 virtual int slotFilterMsg( KMMessage * );
00365 void dirtySortOrder(int);
00367 void rightButtonPressed( TQListViewItem *, const TQPoint &, int );
00368
00369 private slots:
00370 void slotMoveCompleted( KMCommand * );
00371
00372 void copyMessages();
00373 void cutMessages();
00374 void pasteMessages();
00375
00376 void updateActions();
00377
00378 private:
00381 virtual void updateMessageList( bool set_selection=false,
00382 bool forceJumpToUnread = false );
00383
00385 TQGuardedPtr<KMFolder> mFolder;
00387 KMMainWidget* mOwner;
00389 int mTopItem;
00391 int mCurrentItem;
00393 unsigned long mCurrentItemSerNum;
00395 TQMemArray<HeaderItem*> mItems;
00396
00397
00398 bool mNested, mNestedOverride, mSubjThreading;
00399 NestingPolicy nestingPolicy;
00400 int mSortCol;
00401 bool mSortDescending;
00402 bool mIgnoreSortOrderChanges;
00403
00404 struct {
00405 uint ascending : 1;
00406 uint dirty : 1;
00407 short column;
00408 uint fakeSort : 1;
00409 uint removed : 1;
00410 } mSortInfo;
00411
00412
00414 TQDict< SortCacheItem > mSortCacheItems;
00416 TQDict< TQPtrList< SortCacheItem > > mSubjectLists;
00418 TQPtrList<HeaderItem> mImperfectlyThreadedList;
00419
00421 void printSubjectThreadingTree( );
00422 void printThreadingTree( );
00424 void buildThreadingTree( TQMemArray<SortCacheItem *> sortCache );
00426 void buildSubjectThreadingTree( TQMemArray<SortCacheItem *> sortCache );
00428 SortCacheItem* findParent(SortCacheItem *item);
00430 SortCacheItem* findParentBySubject(SortCacheItem *item);
00431 SortCacheItem* mRoot;
00432
00434 void appendItemToSortFile(HeaderItem *);
00436 bool writeSortOrder();
00438 bool readSortOrder( bool set_selection = false,
00439 bool forceJumpToUnread = false );
00440
00442 int getMsgIndex;
00444 bool getMsgMulti;
00446 HeaderItem* getMsgItem;
00448 KMMessageList mSelMsgBaseList;
00449 HeaderItem* mPrevCurrent;
00450
00452 KPaintInfo mPaintInfo;
00453
00454 TQFont mNewFont, mUnreadFont, mImportantFont, mDateFont,mTodoFont;
00455
00457 static TQIconSet *up, *down;
00459 KMMenuToFolder mMenuToFolder;
00460
00462 bool mMousePressed;
00464 TQPoint mPressPos;
00465
00466 KMime::DateFormatter mDate;
00467 bool mReaderWindowActive;
00468
00470 KPopupMenu* mPopup;
00471
00472
00473 TQValueList<TQ_UINT32> mCopiedMessages;
00474 bool mMoveMessages;
00475 };
00476 #endif