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.
 
 
 

382 lines
11 KiB

/* -*- mode: C++ -*-
This file is part of the KDE libraries
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License version 2 as published by the Free Software Foundation.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public License
along with this library; see the file COPYING.LIB. If not, write to
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301, USA.
*/
#ifndef __KMFOLDERTREE
#define __KMFOLDERTREE
#include "kmail_export.h"
#include "foldertreebase.h"
#include <klocale.h>
#include <QWidget>
#include <QTimer>
#include <q3header.h>
#include <QPixmap>
#include <QDragLeaveEvent>
#include <QEvent>
#include <QDragMoveEvent>
#include <QDropEvent>
#include <QList>
#include <QResizeEvent>
#include <QDragEnterEvent>
#include <QMouseEvent>
#include <Q3DragObject>
#include <QPointer>
class QDropEvent;
class QPixmap;
class QMenu;
class KMenu;
class KMFolder;
class KMFolderDir;
class KMFolderImap;
class KMFolderTree;
class KMAccount;
// duplication from kmcommands.h, to avoid the include
typedef QMap<QAction*,KMFolder*> KMMenuToFolder;
template <typename T> class QPointer;
using KPIM::KFolderTree;
using KPIM::KFolderTreeItem;
class KMAIL_EXPORT KMFolderTreeItem : public QObject, public KFolderTreeItem
{
Q_OBJECT
public:
/** Construct a root item _without_ folder */
KMFolderTreeItem( KFolderTree *parent, const QString & name,
KFolderTreeItem::Protocol protocol=KFolderTreeItem::NONE );
/** Construct a root item _with_ folder */
KMFolderTreeItem( KFolderTree *parent, const QString & name,
KMFolder* folder );
/** Construct a child item */
KMFolderTreeItem( KFolderTreeItem* parent, const QString & name,
KMFolder* folder );
virtual ~KMFolderTreeItem();
QPixmap normalIcon( int size ) const;
QPixmap unreadIcon( int size ) const;
void setNeedsRepaint( bool value ) { mNeedsRepaint = value; }
bool needsRepaint() const { return mNeedsRepaint; }
/** associated folder */
KMFolder* folder() const { return mFolder; }
Q3ListViewItem* parent() const { return KFolderTreeItem::parent(); }
/** Adjust the unread count from the folder and update the
* pixmaps accordingly. */
void adjustUnreadCount( int newUnreadCount );
/** dnd */
virtual bool acceptDrag(QDropEvent* e) const;
signals:
/** Our icon changed */
void iconChanged( KMFolderTreeItem * );
/** Our name changed */
void nameChanged( KMFolderTreeItem * );
public slots:
void properties();
void assignShortcut();
void slotShowExpiryProperties();
void slotIconsChanged();
void slotNameChanged();
protected:
void init();
KMFolder* mFolder;
/** Returns true when top-level/account icons should be used */
virtual bool useTopLevelIcon() const { return depth() == 0; }
/** Returns the icon size. */
virtual int iconSize() const { return 16; }
private:
bool mNeedsRepaint;
};
//==========================================================================
class KMFolderTree : public KMail::FolderTreeBase
{
Q_OBJECT
public:
explicit KMFolderTree( KMMainWidget *mainWidget, QWidget *parent=0,
const char *name=0 );
/** 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, KMFolderTreeItem* parent );
/** Find index of given folder. Returns 0 if not found */
virtual Q3ListViewItem* indexOfFolder( const KMFolder* folder ) const
{
if ( mFolderToItem.contains( folder ) )
return mFolderToItem[ folder ];
else
return 0;
}
/** create a folderlist */
void createFolderList( QStringList *str,
QList<QPointer<KMFolder> > *folders,
bool localFolders=true,
bool imapFolders=true,
bool dimapFolders=true,
bool searchFolders=false,
bool includeNoContent=true,
bool includeNoChildren=true );
/** Read config options. */
virtual void readConfig(void);
/** 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;
QList<QPointer<KMFolder> > selectedFolders();
enum ColumnMode {unread=15, total=16, foldersize=17};
/** toggles the unread and total columns on/off */
void toggleColumn(int column, bool openFolders = false);
/** Set the checked/unchecked state of the unread and total column
* in the popup correctly */
virtual void updatePopup() const;
/** Select the folder and make sure it's visible */
void showFolder( KMFolder* );
void insertIntoFolderToItemMap( const KMFolder *folder, KMFolderTreeItem* item )
{
mFolderToItem.insert( folder, item );
}
void removeFromFolderToItemMap( const KMFolder *folder )
{
mFolderToItem.remove( folder );
}
/** Valid actions for the folderToPopup method */
enum MenuAction {
CopyMessage,
MoveMessage,
CopyFolder,
MoveFolder
};
/** Generate a popup menu that contains all folders that can have content */
void folderToPopupMenu( MenuAction action, QObject *receiver, KMMenuToFolder *,
QMenu *menu, Q3ListViewItem *start = 0 );
signals:
/** The selected folder has changed */
void folderSelected(KMFolder*);
/** The selected folder has changed to go to an unread message */
void folderSelectedUnread( KMFolder * );
/** unread/total/size column has changed */
void columnsChanged();
/** an icon of one of our folders changed */
void iconChanged( KMFolderTreeItem * );
/** the name of one of our folders changed */
void nameChanged( 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();
/** Make sure the given account is not selected because it is gone */
void slotAccountRemoved(KMAccount*);
/** Select the item and switch to the folder */
void doFolderSelected(Q3ListViewItem *qlvi, bool keepSelection = false);
/**
* Reset current folder and all children
* If no item is given we take the current one
* If startListing is true a folder listing is started
*/
void slotResetFolderList( Q3ListViewItem* item = 0, bool startList = true );
/** Create a child folder */
void addChildFolder( KMFolder *folder = 0, QWidget * parent = 0 );
/** Copies the currently selected folder. */
void copyFolder();
/** Cuts the currently selected folder. */
void cutFolder();
/** Pastes a previously copied/cutted folder below the currently selected folder. */
void pasteFolder();
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 *);
/** called, when a folder has been moved or copied, successfully or not */
void slotFolderMoveOrCopyOperationFinished();
/** Updates the folder tree (delayed), causing a "blink" */
void refresh();
/** Open a folder */
void openFolder();
/** Expand an IMAP folder */
void slotFolderExpanded( Q3ListViewItem * item );
/** Tell the folder to refresh the contents on the next expansion */
void slotFolderCollapsed( Q3ListViewItem * item );
/** Check if the new name is valid and confirm the new name */
void slotRenameFolder( Q3ListViewItem * item, int col, const QString& text);
/** Update the total and unread columns (if available) */
void slotUpdateCounts(KMFolder * folder);
void slotUpdateCounts(KMFolderImap * folder, bool success = true);
/** Update the total and unread columns but delayed */
void slotUpdateCountsDelayed(KMFolder * folder);
void slotUpdateCountTimeout();
void slotUpdateOneCount();
/** slots for the unread/total/size-popup */
void slotToggleUnreadColumn();
void slotToggleTotalColumn();
void slotToggleSizeColumn();
void slotContextMenuRequested( Q3ListViewItem *, const QPoint & );
/** Fires a new-mail-check of the account that is accociated with currentItem */
void slotCheckMail();
void slotNewMessageToMailingList();
/** For RMB move folder */
virtual void moveSelectedToFolder( QAction* act );
/** For RMB copy folder */
virtual void copySelectedToFolder( QAction* act );
/** Updates copy/cut/paste actions */
void updateCopyActions();
protected:
virtual void contentsMousePressEvent( QMouseEvent *e );
virtual void contentsMouseReleaseEvent(QMouseEvent* me);
/** 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);
QTimer mUpdateTimer;
/** Drag and drop methods */
void contentsDragEnterEvent( QDragEnterEvent *e );
void contentsDragMoveEvent( QDragMoveEvent *e );
void contentsDragLeaveEvent( QDragLeaveEvent *e );
void contentsDropEvent( QDropEvent *e );
virtual Q3DragObject* dragObject();
/** Drag and drop variables */
Q3ListViewItem *oldCurrent, *oldSelected;
Q3ListViewItem *dropItem;
QPointer<KMFolderTreeItem> mLastItem;
QTimer autoopen_timer;
// filter some rmb-events
bool eventFilter(QObject*, QEvent*);
/** open ancestors and ensure item is visible */
void prepareItem( KMFolderTreeItem* );
/** connect all signals */
void connectSignals();
/** Move or copy the folder @p source to @p destination. */
void moveOrCopyFolder( QList<QPointer<KMFolder> > sources, KMFolder* destination, bool move=false );
private slots:
void slotAddToFavorites();
void slotUnhideLocalInbox();
private:
/** total column */
Q3ListViewItemIterator mUpdateIterator;
/** popup for unread/total */
KMenu* mPopup;
QAction *mUnreadAction,*mTotalAction, *mSizeAction;
bool mReloading;
QMap<const KMFolder*, KMFolderTreeItem*> mFolderToItem;
QList<QPointer<KMFolder> > mCopySourceFolders;
bool mCutFolder;
QTimer *mUpdateCountTimer;
QMap<QString,KMFolder*> mFolderToUpdateCount;
/** Map menu id into a folder */
KMMenuToFolder mMenuToFolder;
};
#endif