You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
281 lines
8.2 KiB
281 lines
8.2 KiB
#ifndef __KMFOLDERTREE |
|
#define __KMFOLDERTREE |
|
|
|
#include <qwidget.h> |
|
#include <qlistview.h> |
|
#include <qtimer.h> |
|
#include <qheader.h> |
|
#include <klocale.h> |
|
#include <kpopupmenu.h> |
|
|
|
// Fixme! A temporary dependency |
|
#include "kmheaders.h" // For KMHeaderToFolderDrag & KMPaintInfo |
|
|
|
#include "kmfolder.h" |
|
|
|
class QDropEvent; |
|
class QPixmap; |
|
class QPainter; |
|
class KMFolderImap; |
|
class CryptPlugWrapperList; |
|
|
|
class KMFolderTreeItem : public QListViewItem |
|
{ |
|
public: |
|
KMFolder* folder; |
|
QString unread; |
|
KMPaintInfo *mPaintInfo; |
|
|
|
/** Construct the root item */ |
|
KMFolderTreeItem( QListView *parent, |
|
KMPaintInfo *aPaintInfo ) |
|
: QListViewItem( parent, i18n("Mail") ), |
|
folder( 0 ), |
|
unread( QString::null ), |
|
mPaintInfo( aPaintInfo ) |
|
{} |
|
KMFolderTreeItem( QListView *parent, |
|
KMFolder* folder, |
|
KMPaintInfo *aPaintInfo ) |
|
: QListViewItem( parent, i18n("Mail") ), |
|
folder( folder ), |
|
unread( QString::null ), |
|
mPaintInfo( aPaintInfo ) |
|
{} |
|
|
|
/** Construct a child item */ |
|
KMFolderTreeItem( QListViewItem* parent, |
|
KMFolder* folder, |
|
KMPaintInfo *aPaintInfo ) |
|
: QListViewItem( parent, (folder) ? folder->label() : QString::null ), |
|
folder( folder ), |
|
unread( QString::null ), |
|
mPaintInfo( aPaintInfo ) |
|
{} |
|
|
|
virtual ~KMFolderTreeItem(); |
|
|
|
void paintCell( QPainter * p, const QColorGroup & cg, |
|
int column, int width, int align ); |
|
|
|
virtual QString key( int, bool ) const; |
|
|
|
virtual int compare( QListViewItem * i, int col, bool ascending ) const; |
|
|
|
}; |
|
|
|
|
|
#define KMFolderTreeInherited QListView |
|
class KMFolderTree : public QListView |
|
{ |
|
Q_OBJECT |
|
|
|
protected: |
|
virtual void drawContentsOffset( QPainter * p, int ox, int oy, |
|
int cx, int cy, int cw, int ch ); |
|
|
|
public: |
|
KMFolderTree( CryptPlugWrapperList * cryptPlugList, |
|
QWidget *parent=0, const char *name=0 ); |
|
virtual ~KMFolderTree(); |
|
|
|
/** Save config options */ |
|
void writeConfig(); |
|
|
|
/** Get/refresh the folder tree */ |
|
virtual void reload(bool openFolders = false); |
|
|
|
/** Recusively add folders in a folder directory to a listview item. */ |
|
virtual void addDirectory( KMFolderDir *fdir, QListViewItem* parent ); |
|
|
|
/** Find index of given folder. Returns -1 if not found */ |
|
virtual QListViewItem* indexOfFolder(const KMFolder*); |
|
|
|
/** Create a list of all folders */ |
|
virtual void createFolderList(QStringList * str, |
|
QValueList<QGuardedPtr<KMFolder> > * folders); |
|
|
|
/** Create a list of all IMAP folders of a given account */ |
|
void createImapFolderList(KMFolderImap *folder, QStringList *names, |
|
QStringList *urls, QStringList *mimeTypes); |
|
|
|
/** Read config options. */ |
|
virtual void readConfig(void); |
|
|
|
/** Read color options and set palette. */ |
|
void readColorConfig(void); |
|
|
|
/** Ensure that there is only one selected item */ |
|
virtual void setSelected( QListViewItem *, bool ); |
|
|
|
/** Remove information about not existing folders from the config file */ |
|
void cleanupConfigFile(); |
|
|
|
/** Select the next folder with unread messages */ |
|
void nextUnreadFolder(bool confirm); |
|
|
|
/** Check folder for unread messages (which isn't trash)*/ |
|
bool checkUnreadFolder(KMFolderTreeItem* ftl, bool confirm); |
|
|
|
KMFolder *currentFolder() const; |
|
|
|
enum ColumnMode {unread=15, total=16}; |
|
|
|
/** toggles the unread and total columns on/off */ |
|
void toggleColumn(int column, bool openFolders = false); |
|
|
|
/** returns true when the column is active */ |
|
bool isUnreadActive() { return unreadIsActive; } |
|
bool isTotalActive() { return totalIsActive; } |
|
|
|
/** returns the current column number (section) */ |
|
int getUnreadColumnNumber() { return header()->mapToSection(unreadIndex); } |
|
int getTotalColumnNumber() { return header()->mapToSection(totalIndex); } |
|
|
|
/** returns the current column number (section) */ |
|
int getUnreadColumIndex() { return unreadIndex; } |
|
int getTotalColumnIndex() { return totalIndex; } |
|
|
|
signals: |
|
/** The selected folder has changed */ |
|
void folderSelected(KMFolder*); |
|
|
|
/** The selected folder has changed to go to an unread message */ |
|
void folderSelectedUnread( KMFolder * ); |
|
|
|
/** Messages have been dropped onto a folder */ |
|
void folderDrop(KMFolder*); |
|
|
|
/** Messages have been dropped onto a folder with Ctrl */ |
|
void folderDropCopy(KMFolder*); |
|
|
|
protected: |
|
/** open ancestors and ensure item is visible */ |
|
void prepareItem( KMFolderTreeItem* ); |
|
|
|
public slots: |
|
/** Select the next folder with unread messages */ |
|
void nextUnreadFolder(); |
|
/** Select the previous folder with unread messages */ |
|
void prevUnreadFolder(); |
|
/** Increment current folder */ |
|
void incCurrentFolder(); |
|
/** Decrement current folder */ |
|
void decCurrentFolder(); |
|
/** Select the current folder */ |
|
void selectCurrentFolder(); |
|
/** Executes delayed update of folder tree */ |
|
void delayedUpdate(); |
|
/** Remove all items associated with the given IMAP account */ |
|
void slotAccountDeleted(KMFolderImap*); |
|
/** Select the item and switch to the folder */ |
|
void doFolderSelected(QListViewItem*); |
|
|
|
protected slots: |
|
// void slotRMB(int, int); |
|
/** called by the folder-manager when the list of folders changed */ |
|
void doFolderListChanged(); |
|
|
|
/** called, when a folder has been deleted */ |
|
void slotFolderRemoved(KMFolder *); |
|
|
|
/** Updates the folder tree only if some folder lable has changed */ |
|
void refresh(KMFolder*); |
|
|
|
/** Create a child folder */ |
|
void addChildFolder(); |
|
|
|
/** Open a folder */ |
|
void openFolder(); |
|
|
|
/** Expand an IMAP folder */ |
|
void slotFolderExpanded( QListViewItem * item ); |
|
|
|
/** Tell the folder to refresh the contents on the next expansion */ |
|
void slotFolderCollapsed( QListViewItem * item ); |
|
|
|
/** Update the total and unread columns (if available) */ |
|
void slotUpdateCounts(KMFolder * folder); |
|
void slotUpdateCounts(KMFolderImap * folder, bool success = true); |
|
void slotUpdateOneCount(); |
|
|
|
/** slots for the unread/total-popup */ |
|
void slotToggleUnreadColumn(); |
|
void slotToggleTotalColumn(); |
|
|
|
protected: |
|
/** Catch palette changes */ |
|
virtual bool event(QEvent *e); |
|
|
|
virtual void paintEmptyArea( QPainter * p, const QRect & rect ); |
|
|
|
/** Updates the number of unread messages for all folders */ |
|
virtual void updateUnreadAll( ); |
|
|
|
virtual void resizeEvent(QResizeEvent*); |
|
|
|
/** Read/Save open/close state indicator for an item in folderTree list view */ |
|
bool readIsListViewItemOpen(KMFolderTreeItem *fti); |
|
void writeIsListViewItemOpen(KMFolderTreeItem *fti); |
|
|
|
KMFolderNodeList mList; |
|
QTimer mUpdateTimer; |
|
static QPixmap *pixDir, *pixNode, *pixPlain, *pixFld, *pixFull, *pixIn, |
|
*pixOut, *pixTr, *pixSent; |
|
|
|
/** We need out own root, otherwise the @ref QListView will create |
|
its own root of type @ref QListViewItem, hence no overriding |
|
paintBranches and no backing pixmap */ |
|
QListViewItem *root; |
|
|
|
/** Drag and drop methods */ |
|
void contentsDragEnterEvent( QDragEnterEvent *e ); |
|
void contentsDragMoveEvent( QDragMoveEvent *e ); |
|
void contentsDragLeaveEvent( QDragLeaveEvent *e ); |
|
void contentsDropEvent( QDropEvent *e ); |
|
|
|
/** Navigation/Selection methods */ |
|
virtual void keyPressEvent( QKeyEvent * e ); |
|
virtual void contentsMousePressEvent( QMouseEvent * e ); |
|
virtual void contentsMouseReleaseEvent( QMouseEvent * e ); |
|
virtual void contentsMouseMoveEvent( QMouseEvent* e ); |
|
|
|
/** Drag and drop variables */ |
|
QListViewItem *oldCurrent, *oldSelected; |
|
QListViewItem *dropItem; |
|
KMFolderTreeItem *mLastItem; |
|
QTimer autoopen_timer; |
|
KMPaintInfo mPaintInfo; |
|
|
|
// filter some rmb-events |
|
// bool eventFilter(QObject*, QEvent*); |
|
|
|
// ########### The Trolls may move this Drag and drop stuff to QScrollView |
|
private: |
|
QTimer autoscroll_timer; |
|
int autoscroll_time; |
|
int autoscroll_accel; |
|
CryptPlugWrapperList * mCryptPlugList; |
|
|
|
/** unread and total column */ |
|
bool unreadIsActive; |
|
bool totalIsActive; |
|
QListViewItemIterator mUpdateIterator; |
|
int unreadIndex; |
|
int totalIndex; |
|
|
|
/** popup for unread/total */ |
|
KPopupMenu* mPopup; |
|
int mUnreadPop; |
|
int mTotalPop; |
|
|
|
public slots: |
|
void startAutoScroll(); |
|
void stopAutoScroll(); |
|
protected slots: |
|
void autoScroll(); |
|
void rightButtonPressed( QListViewItem *, const QPoint &, int); |
|
void mouseButtonPressed( int btn, QListViewItem *, const QPoint &, int); |
|
}; |
|
|
|
#endif
|
|
|