00001 #include <qmessagebox.h>
00002 #include <qpopupmenu.h>
00003 #include <qheader.h>
00004 #include <qtimer.h>
00005
00006 #include "folderwidget.h"
00007 #include "imaphandler.h"
00008 #include "mailtable.h"
00009
00010 MailTableItem::MailTableItem(QListView *parent, IMAPResponseFETCH fetch)
00011 : QListViewItem(parent), _fetch(fetch)
00012 {
00013 _draft = false;
00014 _new = false;
00015 _unseen = true;
00016
00017 QValueList<IMAPResponseEnums::IMAPResponseFlags>::Iterator it;
00018 QValueList<IMAPResponseEnums::IMAPResponseFlags> flags = fetch.flags();
00019 for (it = flags.begin(); it != flags.end(); it++) {
00020 if (*it == IMAPResponseEnums::Draft) _draft = true;
00021 else if (*it == IMAPResponseEnums::Recent) _new = true;
00022 else if (*it == IMAPResponseEnums::Seen) _unseen = false;
00023 }
00024
00025 setText(0, fetch.envelope().from()[0].name().isEmpty() ? QObject::tr("(no from)") : fetch.envelope().from()[0].name());
00026 setText(1, fetch.envelope().subject().isEmpty() ? QObject::tr("(no subject)") : fetch.envelope().subject());
00027 setText(2, fetch.envelope().mailDate().isEmpty() ? QObject::tr("(no date)") : fetch.envelope().mailDate());
00028 }
00029
00030 void MailTableItem::paintCell(QPainter *painter, const QColorGroup &cg, int col, int width, int align)
00031 {
00032 QColor color = cg.color(QColorGroup::Text);
00033 QFont font = painter->font();
00034 if (_draft) {
00035 color = QColor("#707070");
00036 } else if (_new) {
00037 color = QColor("#ff0000");
00038 font.setBold(true);
00039 } else if (_unseen) {
00040 font.setBold(true);
00041 }
00042
00043 painter->setFont(font);
00044 QColorGroup cg_(cg);
00045 cg_.setColor(QColorGroup::Text, color);
00046
00047 QListViewItem::paintCell(painter, cg_, col, width, align);
00048 }
00049
00050 MailTable::MailTable(QWidget *parent, const char *name, WFlags fl)
00051 : ListViewPlus(parent, name, fl), _parent(parent)
00052 {
00053 _stopped = false;
00054
00055 setSorting(-1);
00056
00057 setAllColumnsShowFocus(true);
00058 addColumn(tr("From"), 100);
00059 addColumn(tr("Subject"), 100);
00060 addColumn(tr("Date"), 100);
00061
00062 QPopupMenu *menu = new QPopupMenu(this);
00063 menu->insertItem(tr("Copy"), MENU_COPY);
00064
00065 QPopupMenu *markMenu = new QPopupMenu(this);
00066 markMenu->insertItem(tr("Seen"), MENU_MARK_READ);
00067 markMenu->insertItem(tr("Unseen"), MENU_MARK_UNREAD);
00068 markMenu->insertSeparator();
00069 markMenu->insertItem(tr("Marked"), MENU_MARK_MARKED);
00070 markMenu->insertItem(tr("Unmarked"), MENU_MARK_UNMARKED);
00071
00072 menu->insertItem(tr("Mark as..."), markMenu, MENU_MARK);
00073 menu->insertSeparator();
00074 menu->insertItem(tr("Delete Mail"), MENU_DELETE);
00075 setPopup(menu);
00076
00077 connect(this, SIGNAL(clicked(QListViewItem*)), SLOT(itemClicked(QListViewItem*)));
00078 }
00079
00080 void MailTable::setFolder(Folder folder)
00081 {
00082 folder.topFolder().handler()->iSelect(folder.fullName());
00083 _handler = folder.topFolder().handler();
00084 connect(folder.topFolder().handler(), SIGNAL(gotResponse(IMAPResponse&)), SLOT(slotIMAPSelect(IMAPResponse&)));
00085 }
00086
00087 void MailTable::setHeaders(QValueList<IMAPResponseFETCH> response)
00088 {
00089 clear();
00090 QValueList<IMAPResponseFETCH>::Iterator it;
00091 for (it = response.begin(); it != response.end(); it++) {
00092 (void) new MailTableItem(this, *it);
00093 }
00094 }
00095
00096 void MailTable::slotIMAPSelect(IMAPResponse &response)
00097 {
00098 disconnect(response.imapHandler(), SIGNAL(gotResponse(IMAPResponse&)), this, SLOT(slotIMAPSelect(IMAPResponse&)));
00099
00100 if (response.statusResponse().status() == IMAPResponseEnums::OK) {
00101 clear();
00102 QString mails = response.EXISTS()[0].mails();
00103 if (mails.toInt() == 0) {
00104 emit status(tr("Mailbox contained no mails."));
00105 return;
00106 }
00107 int a = mails.toInt() / 5;
00108 int b = mails.toInt() % 5;
00109
00110 _downloadSteps = a;
00111 if (b > 0) _downloadSteps++;
00112 _lastStep = b;
00113 _currentProgress = 0;
00114
00115 emit totalSteps(_downloadSteps);
00116 emit progress(_currentProgress);
00117 emit stopEnabled(true);
00118
00119 response.imapHandler()->iFetch(QString("1:%1").arg((a == 0) ? b : 5), "ENVELOPE FLAGS UID");
00120 emit status(tr("Getting mail headers..."));
00121 connect(response.imapHandler(), SIGNAL(gotResponse(IMAPResponse&)), SLOT(slotIMAPFetch(IMAPResponse&)));
00122 } else {
00123 QMessageBox::warning(this, tr("Error"), tr("<p>An error occoured during the selection of the mailbox. (Server said: %1)</p>").arg(response.statusResponse().comment()), tr("Ok"));
00124 }
00125 }
00126
00127 void MailTable::slotIMAPFetch(IMAPResponse &response)
00128 {
00129 disconnect(response.imapHandler(), SIGNAL(gotResponse(IMAPResponse&)), this, SLOT(slotIMAPFetch(IMAPResponse&)));
00130
00131 if (response.statusResponse().status() == IMAPResponseEnums::OK) {
00132 QValueList<IMAPResponseFETCH>::Iterator it;
00133 QValueList<IMAPResponseFETCH> fetch = response.FETCH();
00134 for (it = fetch.begin(); it != fetch.end(); it++) {
00135 (void) new MailTableItem(this, *it);
00136 }
00137 emit progress(++_currentProgress);
00138
00139 if (_currentProgress != _downloadSteps) {
00140 if (_stopped) {
00141 _currentProgress = 0;
00142 _downloadSteps = 0;
00143 _lastStep = 0;
00144 _stopped = false;
00145 emit status(tr("Stopped"));
00146 emit resetProgress();
00147 emit stopEnabled(false);
00148 } else {
00149 response.imapHandler()->iFetch(QString("%1:%2").arg(_currentProgress * 5 + 1).arg((_currentProgress + 1 == _downloadSteps) ? _currentProgress * 5 + _lastStep : _currentProgress * 5 + 5), "ENVELOPE FLAGS UID");
00150 connect(response.imapHandler(), SIGNAL(gotResponse(IMAPResponse&)), SLOT(slotIMAPFetch(IMAPResponse&)));
00151 }
00152 } else {
00153 _currentProgress = 0;
00154 _downloadSteps = 0;
00155 _lastStep = 0;
00156 emit status(tr("Got all mail headers."));
00157 emit resetProgress();
00158 emit stopEnabled(false);
00159 }
00160 } else {
00161 emit status(tr("<font color=#ff0000>Couldn't fetch mail."));
00162 }
00163 }
00164
00165 void MailTable::itemClicked(QListViewItem *item)
00166 {
00167 if (item == NULL) return;
00168 emit mailClicked(((MailTableItem *)item)->fetch(), _handler);
00169 }
00170
00171