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.
337 lines
8.5 KiB
337 lines
8.5 KiB
// kmfoldertree.cpp |
|
|
|
#include <stdlib.h> |
|
#include <qfileinfo.h> |
|
#include <qpixmap.h> |
|
#include <kapp.h> |
|
#include <kconfig.h> |
|
#include <kiconloader.h> |
|
#include <qtimer.h> |
|
#include <qpopupmenu.h> |
|
#include <klocale.h> |
|
#include <kglobal.h> |
|
|
|
#include "kmglobal.h" |
|
#include "kmdragdata.h" |
|
#include "kmfoldermgr.h" |
|
#include "kmfolderdir.h" |
|
#include "kmfolder.h" |
|
|
|
#include "kmfoldertree.moc" |
|
|
|
//----------------------------------------------------------------------------- |
|
KMFolderTree::KMFolderTree(QWidget *parent,const char *name) : |
|
KMFolderTreeInherited(parent, name, 1), mList() |
|
{ |
|
KConfig* conf = app->getConfig(); |
|
KIconLoader* loader = KGlobal::iconLoader(); |
|
static QPixmap pixDir, pixNode, pixPlain, pixFld, pixIn, pixOut, pixTr, |
|
pixSent; |
|
static bool pixmapsLoaded = FALSE; |
|
int width; |
|
|
|
initMetaObject(); |
|
|
|
mUpdateTimer = NULL; |
|
|
|
setDropAccepted(true); |
|
|
|
connect(this, SIGNAL(highlighted(int,int)), |
|
this, SLOT(doFolderSelected(int,int))); |
|
connect(folderMgr, SIGNAL(changed()), |
|
this, SLOT(doFolderListChanged())); |
|
connect(this, SIGNAL(popupMenu(int,int)), |
|
this, SLOT(slotRMB(int,int))); |
|
|
|
conf->setGroup("Geometry"); |
|
width = conf->readNumEntry(name, 80); |
|
resize(width, size().height()); |
|
|
|
clearTableFlags(); |
|
setTableFlags (Tbl_smoothVScrolling | Tbl_autoVScrollBar); |
|
|
|
setColumn(0, i18n("Folders"), 400, KTabListBox::MixedColumn); |
|
|
|
if (!pixmapsLoaded) |
|
{ |
|
pixmapsLoaded = TRUE; |
|
|
|
pixDir = loader->loadIcon("closed.xpm"); |
|
pixNode = loader->loadIcon("green-bullet.xpm"); |
|
pixPlain = loader->loadIcon("kmfolder.xpm"); |
|
pixFld = loader->loadIcon("kmfolder.xpm"); |
|
pixIn = loader->loadIcon("kmfldin.xpm"); |
|
pixOut = loader->loadIcon("kmfldout.xpm"); |
|
pixSent = loader->loadIcon("kmfldsent.xpm"); |
|
pixTr = loader->loadIcon("kmtrash.xpm"); |
|
} |
|
|
|
dict().insert("dir", &pixDir); |
|
dict().insert("node", &pixNode); |
|
dict().insert("plain", &pixPlain); |
|
dict().insert("Fld", &pixFld); |
|
dict().insert("In", &pixIn); |
|
dict().insert("Out", &pixOut); |
|
dict().insert("St", &pixSent); |
|
dict().insert("Tr", &pixTr); |
|
|
|
setAutoUpdate(TRUE); |
|
updateUnreadAll( ); |
|
reload(); |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
void KMFolderTree::updateUnreadAll() |
|
{ |
|
KMFolderDir* fdir; |
|
KMFolder* folder; |
|
debug( "KMFolderTree::updateUnreadAll" ); |
|
bool upd = autoUpdate(); |
|
setAutoUpdate(FALSE); |
|
|
|
fdir = &folderMgr->dir(); |
|
for (folder = (KMFolder*)fdir->first(); |
|
folder != NULL; |
|
folder = (KMFolder*)fdir->next()) |
|
{ |
|
folder->open(); |
|
folder->countUnread(); |
|
folder->close(); |
|
} |
|
setAutoUpdate(upd); |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
KMFolderTree::~KMFolderTree() |
|
{ |
|
KConfig* conf = app->getConfig(); |
|
|
|
conf->setGroup("Geometry"); |
|
conf->writeEntry(name(), size().width()); |
|
|
|
disconnect(folderMgr, SIGNAL(changed()), this, SLOT(doFolderListChanged())); |
|
|
|
delete mUpdateTimer; |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
void KMFolderTree::reload(void) |
|
{ |
|
KMFolderDir* fdir; |
|
KMFolder* folder; |
|
QString str; |
|
KMFolder* cur; |
|
debug( "KMFolderTree::reload" ); |
|
bool upd = autoUpdate(); |
|
|
|
setAutoUpdate(FALSE); |
|
|
|
clear(); |
|
for (cur=(KMFolder*)mList.first(); cur; cur=(KMFolder*)mList.next()) |
|
disconnect(cur,SIGNAL(numUnreadMsgsChanged(KMFolder*)), |
|
this,SLOT(refresh(KMFolder*))); |
|
mList.clear(); |
|
|
|
fdir = &folderMgr->dir(); |
|
|
|
for (folder = (KMFolder*)fdir->first(); |
|
folder != NULL; |
|
folder = (KMFolder*)fdir->next()) |
|
{ |
|
inSort(folder); |
|
} |
|
for (cur=(KMFolder*)mList.first(); cur; cur=(KMFolder*)mList.next()) |
|
connect(cur,SIGNAL(numUnreadMsgsChanged(KMFolder*)), |
|
this,SLOT(refresh(KMFolder*))); |
|
setAutoUpdate(upd); |
|
if (upd) repaint(); |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
void KMFolderTree::refresh(KMFolder* ) |
|
{ |
|
if (!mUpdateTimer) |
|
{ |
|
mUpdateTimer = new QTimer(this); |
|
connect(mUpdateTimer, SIGNAL(timeout()), this, SLOT(delayedUpdate())); |
|
} |
|
mUpdateTimer->changeInterval(200); |
|
} |
|
//----------------------------------------------------------------------------- |
|
void KMFolderTree::delayedUpdate() |
|
{ |
|
int i; |
|
KMFolder* folder; |
|
QString str; |
|
bool upd = autoUpdate(); |
|
bool repaintRequired = false; |
|
|
|
setAutoUpdate(FALSE); |
|
|
|
for (i=0, folder = (KMFolder*)mList.first(); |
|
folder != NULL; |
|
folder = (KMFolder*)mList.next(),i++) |
|
{ |
|
str = QString("{") + folder->type() + "} " + folder->label(); |
|
if (text(i) != str) { |
|
repaintRequired = true; |
|
changeItem(str, i); |
|
if (folder->countUnread()>0) |
|
changeItemColor(darkRed, i); |
|
else |
|
changeItemColor(kapp->palette().normal().foreground(), i); |
|
} |
|
} |
|
setAutoUpdate(upd); |
|
if (upd && repaintRequired) repaint(); |
|
|
|
mUpdateTimer->stop(); |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
void KMFolderTree::doFolderListChanged() |
|
{ |
|
uint idx = currentItem(); |
|
debug("doFolderListChanged()"); |
|
reload(); |
|
if (idx >= 0 && idx < count()) setCurrentItem(idx); |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
void KMFolderTree::dropEvent(QDropEvent * event) |
|
{ |
|
KMFolder *toFld, *fromFld; |
|
KMDragData* dd; |
|
KMMessage* msg; |
|
QPoint pos; |
|
int i; |
|
|
|
if (aDropZone!=mDropZone) return; |
|
if (aDropZone->getDataType() != DndRawData) return; //sven |
|
|
|
dd = (KMDragData*)aDropZone->getData().ascii(); |
|
if (!dd || sizeof(*dd)!=sizeof(KMDragData)) return; |
|
fromFld = dd->folder(); |
|
|
|
pos.setY(aDropZone->getMouseY()); |
|
pos = mapFromGlobal(pos); |
|
|
|
toFld = (KMFolder*)mList.at(findItem(pos.y())); |
|
if (!fromFld || !toFld || toFld->isDir()) return; |
|
|
|
fromFld->open(); |
|
toFld->open(); |
|
|
|
for (i=dd->to(); i>=dd->from(); i--) |
|
{ |
|
msg = fromFld->take(i); |
|
if (msg) toFld->addMsg(msg); |
|
} |
|
|
|
fromFld->close(); |
|
toFld->close(); |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
void KMFolderTree::inSort(KMFolder* aFolder) |
|
{ |
|
KMFolder* cur; |
|
QString str; |
|
int i, cmp; |
|
|
|
for (i=0,cur=(KMFolder*)mList.first(); cur; cur=(KMFolder*)mList.next(),i++) |
|
{ |
|
cmp = strcmp(aFolder->type(), cur->type()); |
|
if (!cmp) cmp = stricmp(aFolder->label(), cur->label()); |
|
if (cmp < 0) break; |
|
} |
|
|
|
str = QString("{") + aFolder->type() + "} " + aFolder->label(); |
|
insertItem(str, i); |
|
mList.insert(i, aFolder); |
|
|
|
if (aFolder->countUnread()>0) |
|
changeItemColor(darkRed, i); |
|
else |
|
changeItemColor(kapp->palette().normal().foreground(), i); |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
void KMFolderTree::doFolderSelected(int index, int) |
|
{ |
|
KMFolder* folder; |
|
|
|
if (index < 0) return; |
|
|
|
folder = (KMFolder*)mList.at(index); |
|
if(folder) |
|
{ |
|
if (folder->isDir()) |
|
{ |
|
debug("Folder `%s' is a directory -> ignoring it.", |
|
(const char*)folder->name()); |
|
emit folderSelected(NULL); |
|
} |
|
|
|
else emit folderSelected(folder); |
|
} |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
void KMFolderTree::resizeEvent(QResizeEvent* e) |
|
{ |
|
KConfig* conf = app->getConfig(); |
|
|
|
conf->setGroup("Geometry"); |
|
conf->writeEntry(name(), size().width()); |
|
|
|
KMFolderTreeInherited::resizeEvent(e); |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
int KMFolderTree::indexOfFolder(const KMFolder* folder) const |
|
{ |
|
KMFolderNodeList* list = (KMFolderNodeList*)&mList; |
|
KMFolderNode* cur; |
|
int i; |
|
|
|
for (i=0, cur=list->first(); cur; cur=list->next()) |
|
{ |
|
if (cur == (KMFolderNode*)folder) return i; |
|
i++; |
|
} |
|
return -1; |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
void KMFolderTree::slotRMB(int index, int) |
|
{ |
|
doFolderSelected(index, 0); |
|
setCurrentItem(index); |
|
|
|
if (!topLevelWidget()) return; // safe bet |
|
|
|
QPopupMenu *folderMenu = new QPopupMenu; |
|
|
|
folderMenu->insertItem(i18n("&Create..."), topLevelWidget(), |
|
SLOT(slotAddFolder())); |
|
folderMenu->insertItem(i18n("&Modify..."), topLevelWidget(), |
|
SLOT(slotModifyFolder())); |
|
folderMenu->insertItem(i18n("C&ompact"), topLevelWidget(), |
|
SLOT(slotCompactFolder())); |
|
folderMenu->insertSeparator(); |
|
folderMenu->insertItem(i18n("&Empty"), topLevelWidget(), |
|
SLOT(slotEmptyFolder())); |
|
folderMenu->insertItem(i18n("&Remove"), topLevelWidget(), |
|
SLOT(slotRemoveFolder())); |
|
folderMenu->exec (QCursor::pos(), 0); |
|
delete folderMenu; |
|
} |
|
//----------------------------------------------------------------------------- |
|
|
|
|