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.
303 lines
6.2 KiB
303 lines
6.2 KiB
// $Id$ |
|
|
|
#include "kmheaders.h" |
|
#include "mclass.h" |
|
#include "kbusyptr.h" |
|
#include "kmdragdata.h" |
|
#include <drag.h> |
|
#include <qstrlist.h> |
|
|
|
#define MFL_DEL 'D' |
|
#define MFL_NEW 'N' |
|
#define MFL_UNREAD 'U' |
|
|
|
extern KBusyPtr* kbp; |
|
|
|
//----------------------------------------------------------------------------- |
|
KMHeaders::KMHeaders(QWidget *parent=0, const char *name=0) : KTabListBox(parent, name) |
|
{ |
|
folder = NULL; |
|
getMsgIndex = -1; |
|
|
|
setNumCols(4); |
|
setColumn(0, "F", 16, KTabListBox::PixmapColumn); |
|
setColumn(1, "Sender", 100); |
|
setColumn(2, "Subject", 200); |
|
setColumn(3, "Date", 100); |
|
|
|
dict().insert("N", new QPixmap("pics/kmmsgnew.xpm")); |
|
dict().insert("U", new QPixmap("pics/kmmsgunseen.xpm")); |
|
dict().insert("D", new QPixmap("pics/kmmsgdel.xpm")); |
|
|
|
connect(this,SIGNAL(selected(int,int)), |
|
this,SLOT(selectMessage(int,int))); |
|
connect(this,SIGNAL(highlighted(int,int)), |
|
this,SLOT(highlightMessage(int,int))); |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
void KMHeaders::setFolder (Folder *f) |
|
{ |
|
if (folder) |
|
{ |
|
folder->close(); |
|
delete folder; |
|
} |
|
|
|
folder=f; |
|
updateMessageList(); |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
void KMHeaders::setMsgUnread (int msgId) |
|
{ |
|
Message* msg; |
|
|
|
for (msg=getMsg(msgId); msg; msg=getMsg()) |
|
{ |
|
msg->clearFlag(F_SEEN); |
|
changeItem(msg->getFlag(), getMsgIndex, 0); |
|
changeItemColor(darkBlue, getMsgIndex); |
|
} |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
void KMHeaders::setMsgRead (int msgId) |
|
{ |
|
Message* msg; |
|
|
|
for (msg=getMsg(msgId); msg; msg=getMsg()) |
|
{ |
|
msg->setFlag(F_SEEN); |
|
changeItem(msg->getFlag(), getMsgIndex, 0); |
|
changeItemColor(black, getMsgIndex); |
|
} |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
void KMHeaders::deleteMsg (int msgId) |
|
{ |
|
Message* msg; |
|
|
|
for (msg=getMsg(msgId); msg; msg=getMsg()) |
|
{ |
|
msg->del(); |
|
changeItem(msg->getFlag(), getMsgIndex, 0); |
|
} |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
void KMHeaders::undeleteMsg (int msgId) |
|
{ |
|
Message* msg; |
|
|
|
for (msg=getMsg(msgId); msg; msg=getMsg()) |
|
{ |
|
msg->undel(); |
|
changeItem(msg->getFlag(), getMsgIndex, 0); |
|
} |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
void KMHeaders::toggleDeleteMsg (int msgId) |
|
{ |
|
Message* msg; |
|
|
|
if (!(msg=getMsg(msgId))) return; |
|
|
|
if (msg->getFlag() != MFL_DEL) deleteMsg(msgId); |
|
else undeleteMsg(msgId); |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
void KMHeaders::forwardMsg (int msgId) |
|
{ |
|
static bool isBusy = FALSE; |
|
|
|
if (isBusy) kbp->idle(); |
|
else kbp->busy(); |
|
|
|
isBusy = !isBusy; |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
void KMHeaders::replyToMsg (int msgId) |
|
{ |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
void KMHeaders::replyAllToMsg (int msgId) |
|
{ |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
void KMHeaders::moveMsgToFolder (Folder* destination, int msgId) |
|
{ |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
Message* KMHeaders::getMsg (int msgId) |
|
{ |
|
int i, high; |
|
|
|
if (!folder || msgId < -2) |
|
{ |
|
getMsgIndex = -1; |
|
return NULL; |
|
} |
|
if (msgId >= 0) |
|
{ |
|
getMsgIndex = msgId; |
|
getMsgMulti = FALSE; |
|
return folder->getMsg(msgId+1); |
|
} |
|
|
|
if (msgId == -1) |
|
{ |
|
getMsgMulti = TRUE; |
|
getMsgIndex = currentItem(); |
|
for (i=0,high=numRows(); i<high; i++) |
|
{ |
|
if (itemList[i].isMarked()) |
|
{ |
|
getMsgIndex = i; |
|
break; |
|
} |
|
} |
|
|
|
return (getMsgIndex>=0 ? folder->getMsg(getMsgIndex+1) : NULL); |
|
} |
|
|
|
if (getMsgIndex < 0) return NULL; |
|
|
|
if (getMsgMulti) for (getMsgIndex++; getMsgIndex < numRows(); getMsgIndex++) |
|
{ |
|
if (itemList[getMsgIndex].isMarked()) |
|
return folder->getMsg(getMsgIndex+1); |
|
} |
|
|
|
getMsgIndex = -1; |
|
return NULL; |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
void KMHeaders::changeItem (char c, int itemIndex, int column) |
|
{ |
|
char str[2]; |
|
|
|
str[0] = c; |
|
str[1] = '\0'; |
|
|
|
KTabListBox::changeItem((const char*)str, itemIndex, column); |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
void KMHeaders::highlightMessage(int idx, int colId) |
|
{ |
|
kbp->busy(); |
|
if (idx >= 0) setMsgRead(idx); |
|
|
|
emit messageSelected(folder->getMsg(idx+1)); |
|
kbp->idle(); |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
void KMHeaders::selectMessage(int idx, int colId) |
|
{ |
|
Message* msg; |
|
|
|
if (idx >= 0) |
|
{ |
|
msg = getMsg(idx); |
|
if (msg->getFlag()=='D') undeleteMsg(idx); |
|
else deleteMsg(idx); |
|
} |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
void KMHeaders::updateMessageList(void) |
|
{ |
|
unsigned long i; |
|
char hdr[256]; |
|
char sfrom[80]; |
|
char ssubject[80]; |
|
char sdate[32]; |
|
char flags; |
|
Message* msg; |
|
|
|
clear(); |
|
if (!folder) return; |
|
|
|
kbp->busy(); |
|
setAutoUpdate(FALSE); |
|
for (i = (long)1; i <= folder->numMsg(); i++) |
|
{ |
|
msg = folder->getMsg(i); |
|
flags = msg->getFlag(); |
|
msg->getFrom(sfrom); |
|
msg->getSubject(ssubject); |
|
msg->getDate(sdate); |
|
sprintf(hdr, "%c\t%s\t%s\t%s", flags, sfrom, ssubject, sdate); |
|
insertItem(hdr); |
|
//printf ("%s\n", hdr); |
|
if (flags=='N') changeItemColor(darkRed); |
|
else if(flags=='U') changeItemColor(darkBlue); |
|
} |
|
setAutoUpdate(TRUE); |
|
repaint(); |
|
kbp->idle(); |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
bool KMHeaders :: prepareForDrag (int aCol, int aRow, char** data, |
|
int* size, int* type) |
|
{ |
|
static KmDragData dd; |
|
int i, from, to, high; |
|
|
|
high = numRows()-1; |
|
for (i=0, from=-1; i<=high; i++) |
|
{ |
|
if (itemList[i].isMarked()) |
|
{ |
|
from = i; |
|
break; |
|
} |
|
} |
|
for (i=high-1, to=-1; i>=0; i--) |
|
{ |
|
if (itemList[i].isMarked()) |
|
{ |
|
to = i; |
|
break; |
|
} |
|
} |
|
if (from < 0 || to < 0) return FALSE; |
|
|
|
dd.init(folder, from, to); |
|
*data = (char*)ⅆ |
|
*size = sizeof(dd); |
|
*type = DndRawData; |
|
|
|
return TRUE; |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
#include "kmheaders.moc"
|
|
|