-rw-r--r-- | noncore/net/mail/accountitem.cpp | 842 | ||||
-rw-r--r-- | noncore/net/mail/accountitem.h | 164 | ||||
-rw-r--r-- | noncore/net/mail/accountview.cpp | 818 | ||||
-rw-r--r-- | noncore/net/mail/accountview.h | 162 | ||||
-rw-r--r-- | noncore/net/mail/mail.pro | 2 | ||||
-rw-r--r-- | noncore/net/mail/opiemail.cpp | 1 |
6 files changed, 1020 insertions, 969 deletions
diff --git a/noncore/net/mail/accountitem.cpp b/noncore/net/mail/accountitem.cpp new file mode 100644 index 0000000..2d3cd4b --- a/dev/null +++ b/noncore/net/mail/accountitem.cpp @@ -0,0 +1,842 @@ +#include "accountitem.h" +#include "accountview.h" +#include <qpopupmenu.h> +#include <qmessagebox.h> +#include "selectstore.h" +#include "newmaildir.h" +#include <libmailwrapper/mailtypes.h> +#include <libmailwrapper/abstractmail.h> +#include <libmailwrapper/mailwrapper.h> +#include "defines.h" + +#define SETPIX(x) if (!account->getOffline()) {setPixmap( 0,x);} else {setPixmap( 0, PIXMAP_OFFLINE );} +/** + * POP3 Account stuff + */ +POP3viewItem::POP3viewItem( POP3account *a, AccountView *parent ) + : AccountViewItem( parent ) +{ + account = a; + wrapper = AbstractMail::getWrapper( account ); + SETPIX(PIXMAP_POP3FOLDER); +#if 0 + if (!account->getOffline()) { + setPixmap( 0, ); + } else { + setPixmap( 0, PIXMAP_OFFLINE ); + } +#endif + setText( 0, account->getAccountName() ); + setOpen( true ); +} + +POP3viewItem::~POP3viewItem() +{ + delete wrapper; +} + +AbstractMail *POP3viewItem::getWrapper() +{ + return wrapper; +} + +void POP3viewItem::refresh( QList<RecMail> & ) +{ + refresh(); +} + +void POP3viewItem::refresh() +{ + if (account->getOffline()) return; + QList<Folder> *folders = wrapper->listFolders(); + QListViewItem *child = firstChild(); + while ( child ) { + QListViewItem *tmp = child; + child = child->nextSibling(); + delete tmp; + } + Folder *it; + QListViewItem*item = 0; + for ( it = folders->first(); it; it = folders->next() ) { + item = new POP3folderItem( it, this , item ); + item->setSelectable(it->may_select()); + } + // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + folders->setAutoDelete(false); + delete folders; +} + +RecBody POP3viewItem::fetchBody( const RecMail &mail ) +{ + qDebug( "POP3 fetchBody" ); + return wrapper->fetchBody( mail ); +} + +QPopupMenu * POP3viewItem::getContextMenu() +{ + QPopupMenu *m = new QPopupMenu(0); + if (m) { + if (!account->getOffline()) { + m->insertItem(QObject::tr("Disconnect",contextName),0); + m->insertItem(QObject::tr("Set offline",contextName),1); + } else { + m->insertItem(QObject::tr("Set online",contextName),1); + } + } + return m; +} + +void POP3viewItem::disconnect() +{ + QListViewItem *child = firstChild(); + while ( child ) { + QListViewItem *tmp = child; + child = child->nextSibling(); + delete tmp; + } + wrapper->logout(); +} + +void POP3viewItem::setOnOffline() +{ + if (!account->getOffline()) { + disconnect(); + } + account->setOffline(!account->getOffline()); + account->save(); + SETPIX(PIXMAP_POP3FOLDER); + refresh(); +} + +void POP3viewItem::contextMenuSelected(int which) +{ + switch (which) { + case 0: + disconnect(); + break; + case 1: + setOnOffline(); + break; + } +} + +POP3folderItem::~POP3folderItem() +{ +} + +POP3folderItem::POP3folderItem( Folder *folderInit, POP3viewItem *parent , QListViewItem*after ) + : AccountViewItem( parent,after ) +{ + folder = folderInit; + pop3 = parent; + if (folder->getDisplayName().lower()!="inbox") { + setPixmap( 0, PIXMAP_POP3FOLDER ); + } else { + setPixmap( 0, PIXMAP_INBOXFOLDER); + } + setText( 0, folder->getDisplayName() ); +} + +void POP3folderItem::refresh(QList<RecMail>&target) +{ + if (folder->may_select()) + pop3->getWrapper()->listMessages( folder->getName(),target ); +} + +RecBody POP3folderItem::fetchBody(const RecMail&aMail) +{ + return pop3->getWrapper()->fetchBody(aMail); +} + +QPopupMenu * POP3folderItem::getContextMenu() +{ + QPopupMenu *m = new QPopupMenu(0); + if (m) { + m->insertItem(QObject::tr("Refresh header list",contextName),0); + m->insertItem(QObject::tr("Delete all mails",contextName),1); + m->insertItem(QObject::tr("Move/Copie all mails",contextName),2); + } + return m; +} + +void POP3folderItem::downloadMails() +{ + AccountView*bl = pop3->accountView(); + if (!bl) return; + bl->downloadMails(folder,pop3->getWrapper()); +} + +void POP3folderItem::contextMenuSelected(int which) +{ + AccountView * view = (AccountView*)listView(); + switch (which) { + case 0: + /* must be 'cause pop3 lists are cached */ + pop3->getWrapper()->logout(); + view->refreshCurrent(); + break; + case 1: + deleteAllMail(pop3->getWrapper(),folder); + break; + case 2: + downloadMails(); + break; + default: + break; + } +} + +/** + * IMAP Account stuff + */ +IMAPviewItem::IMAPviewItem( IMAPaccount *a, AccountView *parent ) + : AccountViewItem( parent ) +{ + account = a; + wrapper = AbstractMail::getWrapper( account ); + SETPIX(PIXMAP_IMAPFOLDER); + setText( 0, account->getAccountName() ); + setOpen( true ); +} + +IMAPviewItem::~IMAPviewItem() +{ + delete wrapper; +} + +AbstractMail *IMAPviewItem::getWrapper() +{ + return wrapper; +} + +void IMAPviewItem::refresh(QList<RecMail>&) +{ + refreshFolders(false); +} + +const QStringList&IMAPviewItem::subFolders() +{ + return currentFolders; +} + +void IMAPviewItem::refreshFolders(bool force) +{ + if (childCount()>0 && force==false) return; + if (account->getOffline()) return; + + removeChilds(); + currentFolders.clear(); + QList<Folder> *folders = wrapper->listFolders(); + + Folder *it; + QListViewItem*item = 0; + QListViewItem*titem = 0; + QString fname,del,search; + int pos; + // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + folders->setAutoDelete(false); + + for ( it = folders->first(); it; it = folders->next() ) { + if (it->getDisplayName().lower()=="inbox") { + item = new IMAPfolderItem( it, this , item ); + folders->remove(it); + qDebug("inbox found"); + break; + } + } + for ( it = folders->first(); it; it = folders->next() ) { + fname = it->getDisplayName(); + currentFolders.append(it->getName()); + pos = fname.findRev(it->Separator()); + if (pos != -1) { + fname = fname.left(pos); + } + IMAPfolderItem*pitem = (IMAPfolderItem*)findSubItem(fname); + if (pitem) { + titem = item; + item = new IMAPfolderItem(it,pitem,pitem->firstChild(),this); + /* setup the short name */ + item->setText(0,it->getDisplayName().right(it->getDisplayName().length()-pos-1)); + item = titem; + } else { + item = new IMAPfolderItem( it, this , item ); + } + } + delete folders; +} + +QPopupMenu * IMAPviewItem::getContextMenu() +{ + QPopupMenu *m = new QPopupMenu(0); + if (m) { + if (!account->getOffline()) { + m->insertItem(QObject::tr("Refresh folder list",contextName),0); + m->insertItem(QObject::tr("Create new folder",contextName),1); + m->insertSeparator(); + m->insertItem(QObject::tr("Disconnect",contextName),2); + m->insertItem(QObject::tr("Set offline",contextName),3); + } else { + m->insertItem(QObject::tr("Set online",contextName),3); + } + } + return m; +} + +void IMAPviewItem::createNewFolder() +{ + Newmdirdlg ndirdlg; + ndirdlg.showMaximized(); + if (ndirdlg.exec()) { + QString ndir = ndirdlg.Newdir(); + bool makesubs = ndirdlg.subpossible(); + QString delemiter = "/"; + IMAPfolderItem*item = (IMAPfolderItem*)firstChild(); + if (item) { + delemiter = item->Delemiter(); + } + if (wrapper->createMbox(ndir,0,delemiter,makesubs)) { + refreshFolders(true); + } + } +} + +void IMAPviewItem::contextMenuSelected(int id) +{ + qDebug("Id selected: %i",id); + switch (id) { + case 0: + refreshFolders(true); + break; + case 1: + createNewFolder(); + break; + case 2: + removeChilds(); + wrapper->logout(); + break; + case 3: + if (account->getOffline()==false) { + removeChilds(); + wrapper->logout(); + } + account->setOffline(!account->getOffline()); + account->save(); + SETPIX(PIXMAP_IMAPFOLDER); + refreshFolders(false); + break; + default: + break; + } +} + +RecBody IMAPviewItem::fetchBody(const RecMail&) +{ + return RecBody(); +} + +bool IMAPviewItem::offline() +{ + return account->getOffline(); +} + +IMAPfolderItem::IMAPfolderItem( Folder *folderInit, IMAPviewItem *parent , QListViewItem*after ) + : AccountViewItem( parent , after ) +{ + folder = folderInit; + imap = parent; + if (folder->getDisplayName().lower()!="inbox") { + setPixmap( 0, PIXMAP_IMAPFOLDER ); + } else { + setPixmap( 0, PIXMAP_INBOXFOLDER); + } + setText( 0, folder->getDisplayName() ); +} + +IMAPfolderItem::IMAPfolderItem( Folder *folderInit, IMAPfolderItem *parent , QListViewItem*after, IMAPviewItem *master ) + : AccountViewItem( parent,after ) +{ + folder = folderInit; + imap = master; + if (folder->getDisplayName().lower()!="inbox") { + setPixmap( 0, PIXMAP_IMAPFOLDER ); + } else { + setPixmap( 0, PIXMAP_INBOXFOLDER); + } + setText( 0, folder->getDisplayName() ); +} + +IMAPfolderItem::~IMAPfolderItem() +{ +} + +const QString& IMAPfolderItem::Delemiter()const +{ + return folder->Separator(); +} + +void IMAPfolderItem::refresh(QList<RecMail>&target) +{ + if (folder->may_select()) { + imap->getWrapper()->listMessages( folder->getName(),target ); + } else { + target.clear(); + } +} + +RecBody IMAPfolderItem::fetchBody(const RecMail&aMail) +{ + return imap->getWrapper()->fetchBody(aMail); +} + +QPopupMenu * IMAPfolderItem::getContextMenu() +{ + QPopupMenu *m = new QPopupMenu(0); + if (m) { + if (folder->may_select()) { + m->insertItem(QObject::tr("Refresh header list",contextName),0); + m->insertItem(QObject::tr("Move/Copie all mails",contextName),4); + m->insertItem(QObject::tr("Delete all mails",contextName),1); + } + if (folder->no_inferior()==false) { + m->insertItem(QObject::tr("Create new subfolder",contextName),2); + } + if (folder->getDisplayName().lower()!="inbox") { + m->insertItem(QObject::tr("Delete folder",contextName),3); + } + } + return m; +} + +void IMAPfolderItem::createNewFolder() +{ + Newmdirdlg ndirdlg; + ndirdlg.showMaximized(); + if (ndirdlg.exec()) { + QString ndir = ndirdlg.Newdir(); + bool makesubs = ndirdlg.subpossible(); + QString delemiter = Delemiter(); + if (imap->wrapper->createMbox(ndir,folder,delemiter,makesubs)) { + imap->refreshFolders(true); + } + } +} + +void IMAPfolderItem::deleteFolder() +{ + int yesno = QMessageBox::warning(0,QObject::tr("Delete folder",contextName), + QObject::tr("<center>Realy delete folder <br><b>%1</b><br>and all if it content?</center>",contextName).arg(folder->getDisplayName()), + QObject::tr("Yes",contextName), + QObject::tr("No",contextName),QString::null,1,1); + qDebug("Auswahl: %i",yesno); + if (yesno == 0) { + if (imap->getWrapper()->deleteMbox(folder)) { + QListView*v=listView(); + IMAPviewItem * box = imap; + /* be carefull - after that this object is destroyd so don't use + * any member of it after that call!!*/ + imap->refreshFolders(true); + if (v) { + v->setSelected(box,true); + } + } + } +} + +void IMAPfolderItem::downloadMails() +{ + AccountView*bl = imap->accountView(); + if (!bl) return; + bl->downloadMails(folder,imap->getWrapper()); +} + +void IMAPfolderItem::contextMenuSelected(int id) +{ + qDebug("Selected id: %i",id); + AccountView * view = (AccountView*)listView(); + switch(id) { + case 0: + view->refreshCurrent(); + break; + case 1: + deleteAllMail(imap->getWrapper(),folder); + break; + case 2: + createNewFolder(); + break; + case 3: + deleteFolder(); + break; + case 4: + downloadMails(); + break; + default: + break; + } +} + +/** + * MH Account stuff + */ +/* MH is a little bit different - the top folder can contains messages other than in IMAP and + POP3 and MBOX */ +MHviewItem::MHviewItem( const QString&aPath, AccountView *parent ) + : AccountViewItem( parent ) +{ + m_Path = aPath; + /* be carefull - the space within settext is wanted - thats why the string twice */ + wrapper = AbstractMail::getWrapper( m_Path,"Local Folders"); + setPixmap( 0, PIXMAP_LOCALFOLDER ); + setText( 0, " Local Folders" ); + setOpen( true ); + folder = 0; +} + +MHviewItem::~MHviewItem() +{ + delete wrapper; +} + +AbstractMail *MHviewItem::getWrapper() +{ + return wrapper; +} + +void MHviewItem::refresh( QList<RecMail> & target) +{ + refresh(false); + getWrapper()->listMessages( "",target ); +} + +void MHviewItem::refresh(bool force) +{ + if (childCount()>0 && force==false) return; + removeChilds(); + currentFolders.clear(); + QList<Folder> *folders = wrapper->listFolders(); + Folder *it; + MHfolderItem*item = 0; + MHfolderItem*pmaster = 0; + QString fname = ""; + int pos; + for ( it = folders->first(); it; it = folders->next() ) { + fname = it->getDisplayName(); + /* this folder itself */ + if (fname=="/") { + currentFolders.append(fname); + folder = it; + continue; + } + currentFolders.append(fname); + pos = fname.findRev("/"); + if (pos > 0) { + fname = fname.left(pos); + pmaster = (MHfolderItem*)findSubItem(fname); + } else { + pmaster = 0; + } + if (pmaster) { + item = new MHfolderItem( it, pmaster, item, this ); + } else { + item = new MHfolderItem( it, this , item ); + } + item->setSelectable(it->may_select()); + } + // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + folders->setAutoDelete(false); + delete folders; +} + +RecBody MHviewItem::fetchBody( const RecMail &mail ) +{ + qDebug( "MH fetchBody" ); + return wrapper->fetchBody( mail ); +} + +QPopupMenu * MHviewItem::getContextMenu() +{ + QPopupMenu *m = new QPopupMenu(0); + if (m) { + m->insertItem(QObject::tr("Refresh folder list",contextName),0); + m->insertItem(QObject::tr("Create new folder",contextName),1); + m->insertItem(QObject::tr("Delete all mails",contextName),2); + m->insertItem(QObject::tr("Move/Copie all mails",contextName),3); + } + return m; +} + +void MHviewItem::createFolder() +{ + Newmdirdlg ndirdlg(0,0,true); + ndirdlg.showMaximized(); + if (ndirdlg.exec()) { + QString ndir = ndirdlg.Newdir(); + if (wrapper->createMbox(ndir)) { + refresh(true); + } + } +} + +void MHviewItem::downloadMails() +{ + AccountView*bl = accountView(); + if (!bl) return; + bl->downloadMails(folder,getWrapper()); +} + +QStringList MHviewItem::subFolders() +{ + return currentFolders; +} + +void MHviewItem::contextMenuSelected(int which) +{ + switch (which) { + case 0: + refresh(true); + break; + case 1: + createFolder(); + break; + case 2: + deleteAllMail(getWrapper(),folder); + break; + case 3: + downloadMails(); + break; + default: + break; + } +} + +MHfolderItem::~MHfolderItem() +{ +} + +MHfolderItem::MHfolderItem( Folder *folderInit, MHviewItem *parent , QListViewItem*after ) + : AccountViewItem( parent,after ) +{ + folder = folderInit; + mbox = parent; + initName(); +} + +MHfolderItem::MHfolderItem( Folder *folderInit, MHfolderItem *parent, QListViewItem*after, MHviewItem*master) + : AccountViewItem( parent,after ) +{ + folder = folderInit; + mbox = master; + initName(); +} + +void MHfolderItem::initName() +{ + QString bName = folder->getDisplayName(); + if (bName.startsWith("/")&&bName.length()>1) { + bName.replace(0,1,""); + } + int pos = bName.findRev("/"); + if (pos > 0) { + bName.replace(0,pos+1,""); + } + if (bName.lower() == "outgoing") { + setPixmap( 0, PIXMAP_OUTBOXFOLDER ); + } else if (bName.lower() == "inbox") { + setPixmap( 0, PIXMAP_INBOXFOLDER); + } else { + setPixmap( 0, PIXMAP_MBOXFOLDER ); + } + setText( 0, bName ); +} + +Folder*MHfolderItem::getFolder() +{ + return folder; +} + +void MHfolderItem::refresh(QList<RecMail>&target) +{ + if (folder->may_select()) + mbox->getWrapper()->listMessages( folder->getName(),target ); +} + +RecBody MHfolderItem::fetchBody(const RecMail&aMail) +{ + return mbox->getWrapper()->fetchBody(aMail); +} + +void MHfolderItem::deleteFolder() +{ + int yesno = QMessageBox::warning(0,QObject::tr("Delete folder",contextName), + QObject::tr("<center>Realy delete folder <br><b>%1</b><br>and all if it content?</center>",contextName).arg(folder->getDisplayName()), + QObject::tr("Yes",contextName), + QObject::tr("No",contextName),QString::null,1,1); + qDebug("Auswahl: %i",yesno); + if (yesno == 0) { + if (mbox->getWrapper()->deleteMbox(folder)) { + QListView*v=listView(); + MHviewItem * box = mbox; + /* be carefull - after that this object is destroyd so don't use + * any member of it after that call!!*/ + mbox->refresh(true); + if (v) { + v->setSelected(box,true); + } + } + } +} + +QPopupMenu * MHfolderItem::getContextMenu() +{ + QPopupMenu *m = new QPopupMenu(0); + if (m) { + m->insertItem(QObject::tr("Move/Copie all mails",contextName),2); + m->insertItem(QObject::tr("Delete all mails",contextName),0); + m->insertItem(QObject::tr("Create new subfolder",contextName),3); + m->insertItem(QObject::tr("Delete folder",contextName),1); + } + return m; +} + +void MHfolderItem::downloadMails() +{ + AccountView*bl = mbox->accountView(); + if (!bl) return; + bl->downloadMails(folder,mbox->getWrapper()); +} + +void MHfolderItem::createFolder() +{ + Newmdirdlg ndirdlg(0,0,true); + ndirdlg.showMaximized(); + if (ndirdlg.exec()) { + QString ndir = ndirdlg.Newdir(); + if (mbox->getWrapper()->createMbox(ndir,folder)) { + QListView*v=listView(); + MHviewItem * box = mbox; + /* be carefull - after that this object is destroyd so don't use + * any member of it after that call!!*/ + mbox->refresh(true); + if (v) { + v->setSelected(box,true); + } + } + } +} + +void MHfolderItem::contextMenuSelected(int which) +{ + switch(which) { + case 0: + deleteAllMail(mbox->getWrapper(),folder); + break; + case 1: + deleteFolder(); + break; + case 2: + downloadMails(); + break; + case 3: + createFolder(); + break; + default: + break; + } +} + +/** + * Generic stuff + */ + +const QString AccountViewItem::contextName="AccountViewItem"; + +AccountViewItem::AccountViewItem( AccountView *parent ) + : QListViewItem( parent ) +{ + init(); + m_Backlink = parent; +} + +AccountViewItem::AccountViewItem( QListViewItem *parent) + : QListViewItem( parent) +{ + init(); +} + +AccountViewItem::AccountViewItem( QListViewItem *parent , QListViewItem*after ) + :QListViewItem( parent,after ) +{ + init(); +} + +void AccountViewItem::init() +{ + m_Backlink = 0; + folder = 0; +} + +AccountViewItem::~AccountViewItem() +{ + if (folder) delete folder; +} + +AccountView*AccountViewItem::accountView() +{ + return m_Backlink; +} + +void AccountViewItem::deleteAllMail(AbstractMail*wrapper,Folder*folder) +{ + if (!wrapper) return; + QString fname=""; + if (folder) fname = folder->getDisplayName(); + int yesno = QMessageBox::warning(0,QObject::tr("Delete all mails",contextName), + QObject::tr("<center>Realy delete all mails in box <br>%1</center>",contextName). + arg(fname), + QObject::tr("Yes",contextName), + QObject::tr("No",contextName),QString::null,1,1); + qDebug("Auswahl: %i",yesno); + if (yesno == 0) { + if (wrapper->deleteAllMail(folder)) { + AccountView * view = (AccountView*)listView(); + if (view) view->refreshCurrent(); + } + } +} + +void AccountViewItem::removeChilds() +{ + QListViewItem *child = firstChild(); + while ( child ) { + QListViewItem *tmp = child; + child = child->nextSibling(); + delete tmp; + } +} + +bool AccountViewItem::matchName(const QString&name)const +{ + if (!folder) return false; + return folder->getDisplayName()==name; +} + + +AccountViewItem*AccountViewItem::findSubItem(const QString&path,AccountViewItem*start) +{ + AccountViewItem*pitem,*sitem; + if (!start) pitem = (AccountViewItem*)firstChild(); + else pitem = (AccountViewItem*)start->firstChild(); + while (pitem) { + if (pitem->matchName(path)) { + break; + } + if (pitem->childCount()>0) { + sitem = findSubItem(path,pitem); + if (sitem) { + pitem = sitem; + break; + } + } + pitem=(AccountViewItem*)pitem->nextSibling(); + } + return pitem; +} diff --git a/noncore/net/mail/accountitem.h b/noncore/net/mail/accountitem.h new file mode 100644 index 0000000..99208b6 --- a/dev/null +++ b/noncore/net/mail/accountitem.h @@ -0,0 +1,164 @@ +#ifndef __ACCOUNT_ITEM +#define __ACCOUNT_ITEM + +#include <qlistview.h> +#include <qlist.h> + +class POP3wrapper; +class RecMail; +class RecBody; +class QPopupMenu; +class Selectstore; +class AccountView; +class POP3account; +class IMAPaccount; +class AbstractMail; +class Folder; + +class AccountViewItem : public QListViewItem +{ + +public: + AccountViewItem( AccountView *parent ); + AccountViewItem( QListViewItem *parent); + AccountViewItem( QListViewItem *parent , QListViewItem*after ); + virtual ~AccountViewItem(); + virtual void refresh(QList<RecMail>&)=0; + virtual RecBody fetchBody(const RecMail&)=0; + virtual QPopupMenu * getContextMenu(){return 0;}; + virtual void contextMenuSelected(int){} + virtual AccountView*accountView(); + virtual bool matchName(const QString&name)const; + +protected: + AccountViewItem*findSubItem(const QString&path,AccountViewItem*start=0); + virtual void init(); + virtual void removeChilds(); + virtual void deleteAllMail(AbstractMail*wrapper,Folder*f); + static const QString contextName; + AccountView*m_Backlink; + Folder *folder; +}; + +class POP3viewItem : public AccountViewItem +{ + +public: + POP3viewItem( POP3account *a, AccountView *parent ); + virtual ~POP3viewItem(); + virtual void refresh( QList<RecMail> &target ); + virtual RecBody fetchBody( const RecMail &mail ); + AbstractMail *getWrapper(); + virtual QPopupMenu * getContextMenu(); + virtual void contextMenuSelected(int); + +protected: + POP3account *account; + virtual void refresh(); + AbstractMail *wrapper; + void disconnect(); + void setOnOffline(); +}; + +class POP3folderItem : public AccountViewItem +{ + +public: + POP3folderItem( Folder *folder, POP3viewItem *parent , QListViewItem*after ); + virtual ~POP3folderItem(); + virtual void refresh(QList<RecMail>&); + virtual RecBody fetchBody(const RecMail&); + virtual QPopupMenu * getContextMenu(); + virtual void contextMenuSelected(int); + +protected: + void downloadMails(); + POP3viewItem *pop3; +}; + +class IMAPviewItem : public AccountViewItem +{ + friend class IMAPfolderItem; +public: + IMAPviewItem( IMAPaccount *a, AccountView *parent ); + virtual ~IMAPviewItem(); + virtual void refresh(QList<RecMail>&); + virtual RecBody fetchBody(const RecMail&); + AbstractMail *getWrapper(); + virtual QPopupMenu * getContextMenu(); + virtual void contextMenuSelected(int); + const QStringList&subFolders(); + virtual void refreshFolders(bool force=false); + bool offline(); + +protected: + virtual void createNewFolder(); + IMAPaccount *account; + AbstractMail *wrapper; + QStringList currentFolders; +}; + +class IMAPfolderItem : public AccountViewItem +{ + +public: + IMAPfolderItem( Folder *folder, IMAPviewItem *parent , QListViewItem*after ); + IMAPfolderItem( Folder *folder, IMAPfolderItem *parent , QListViewItem*after, IMAPviewItem *master ); + virtual ~IMAPfolderItem(); + virtual void refresh(QList<RecMail>&); + virtual RecBody fetchBody(const RecMail&); + virtual QPopupMenu * getContextMenu(); + virtual void contextMenuSelected(int); + virtual const QString& Delemiter()const; +protected: + virtual void createNewFolder(); + virtual void deleteFolder(); + virtual void downloadMails(); + IMAPviewItem *imap; +}; + +class MHviewItem : public AccountViewItem +{ + friend class MHfolderItem; + +public: + MHviewItem( const QString&aMboxPath, AccountView *parent ); + virtual ~MHviewItem(); + virtual void refresh( QList<RecMail> &target ); + virtual RecBody fetchBody( const RecMail &mail ); + AbstractMail *getWrapper(); + virtual QPopupMenu * getContextMenu(); + virtual void contextMenuSelected(int); + QStringList subFolders(); + virtual void refresh(bool force=false); + +protected: + void downloadMails(); + virtual void createFolder(); + QString m_Path; + AbstractMail *wrapper; + QStringList currentFolders; +}; + +class MHfolderItem : public AccountViewItem +{ + +public: + MHfolderItem( Folder *folder, MHviewItem *parent , QListViewItem*after ); + MHfolderItem( Folder *folder, MHfolderItem *parent, QListViewItem*after, MHviewItem*master); + virtual ~MHfolderItem(); + virtual void refresh(QList<RecMail>&); + virtual RecBody fetchBody(const RecMail&); + virtual QPopupMenu * getContextMenu(); + virtual void contextMenuSelected(int); + virtual Folder*getFolder(); + +protected: + void downloadMails(); + virtual void createFolder(); + virtual void deleteFolder(); + void initName(); + MHviewItem *mbox; +}; + +#endif diff --git a/noncore/net/mail/accountview.cpp b/noncore/net/mail/accountview.cpp index 3048e49..d9792d4 100644 --- a/noncore/net/mail/accountview.cpp +++ b/noncore/net/mail/accountview.cpp @@ -1,957 +1,149 @@ #include "accountview.h" -#include <libmailwrapper/mailtypes.h> -#include <libmailwrapper/abstractmail.h> -#include "defines.h" -#include "newmaildir.h" +#include "accountitem.h" #include "selectstore.h" #include <qmessagebox.h> #include <qpopupmenu.h> +#include <libmailwrapper/settings.h> +#include <libmailwrapper/mailwrapper.h> +#include <libmailwrapper/mailtypes.h> +#include <libmailwrapper/abstractmail.h> -#define SETPIX(x) if (!account->getOffline()) {setPixmap( 0,x);} else {setPixmap( 0, PIXMAP_OFFLINE );} -/** - * POP3 Account stuff - */ -POP3viewItem::POP3viewItem( POP3account *a, AccountView *parent ) - : AccountViewItem( parent ) -{ - account = a; - wrapper = AbstractMail::getWrapper( account ); - SETPIX(PIXMAP_POP3FOLDER); -#if 0 - if (!account->getOffline()) { - setPixmap( 0, ); - } else { - setPixmap( 0, PIXMAP_OFFLINE ); - } -#endif - setText( 0, account->getAccountName() ); - setOpen( true ); -} - -POP3viewItem::~POP3viewItem() -{ - delete wrapper; -} - -AbstractMail *POP3viewItem::getWrapper() -{ - return wrapper; -} - -void POP3viewItem::refresh( QList<RecMail> & ) -{ - refresh(); -} - -void POP3viewItem::refresh() -{ - if (account->getOffline()) return; - QList<Folder> *folders = wrapper->listFolders(); - QListViewItem *child = firstChild(); - while ( child ) { - QListViewItem *tmp = child; - child = child->nextSibling(); - delete tmp; - } - Folder *it; - QListViewItem*item = 0; - for ( it = folders->first(); it; it = folders->next() ) { - item = new POP3folderItem( it, this , item ); - item->setSelectable(it->may_select()); - } - // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - folders->setAutoDelete(false); - delete folders; -} - -RecBody POP3viewItem::fetchBody( const RecMail &mail ) -{ - qDebug( "POP3 fetchBody" ); - return wrapper->fetchBody( mail ); -} - -QPopupMenu * POP3viewItem::getContextMenu() -{ - QPopupMenu *m = new QPopupMenu(0); - if (m) { - if (!account->getOffline()) { - m->insertItem(QObject::tr("Disconnect",contextName),0); - m->insertItem(QObject::tr("Set offline",contextName),1); - } else { - m->insertItem(QObject::tr("Set online",contextName),1); - } - } - return m; -} - -void POP3viewItem::disconnect() -{ - QListViewItem *child = firstChild(); - while ( child ) { - QListViewItem *tmp = child; - child = child->nextSibling(); - delete tmp; - } - wrapper->logout(); -} - -void POP3viewItem::setOnOffline() -{ - if (!account->getOffline()) { - disconnect(); - } - account->setOffline(!account->getOffline()); - account->save(); - SETPIX(PIXMAP_POP3FOLDER); - refresh(); -} - -void POP3viewItem::contextMenuSelected(int which) -{ - switch (which) { - case 0: - disconnect(); - break; - case 1: - setOnOffline(); - break; - } -} - -POP3folderItem::~POP3folderItem() -{ - delete folder; -} - -POP3folderItem::POP3folderItem( Folder *folderInit, POP3viewItem *parent , QListViewItem*after ) - : AccountViewItem( parent,after ) -{ - folder = folderInit; - pop3 = parent; - if (folder->getDisplayName().lower()!="inbox") { - setPixmap( 0, PIXMAP_POP3FOLDER ); - } else { - setPixmap( 0, PIXMAP_INBOXFOLDER); - } - setText( 0, folder->getDisplayName() ); -} - -void POP3folderItem::refresh(QList<RecMail>&target) -{ - if (folder->may_select()) - pop3->getWrapper()->listMessages( folder->getName(),target ); -} - -RecBody POP3folderItem::fetchBody(const RecMail&aMail) -{ - return pop3->getWrapper()->fetchBody(aMail); -} - -QPopupMenu * POP3folderItem::getContextMenu() -{ - QPopupMenu *m = new QPopupMenu(0); - if (m) { - m->insertItem(QObject::tr("Refresh header list",contextName),0); - m->insertItem(QObject::tr("Delete all mails",contextName),1); - m->insertItem(QObject::tr("Move/Copie all mails",contextName),2); - } - return m; -} - -void POP3folderItem::downloadMails() -{ - AccountView*bl = pop3->accountView(); - if (!bl) return; - bl->downloadMails(folder,pop3->getWrapper()); -} - -void POP3folderItem::contextMenuSelected(int which) -{ - AccountView * view = (AccountView*)listView(); - switch (which) { - case 0: - /* must be 'cause pop3 lists are cached */ - pop3->getWrapper()->logout(); - view->refreshCurrent(); - break; - case 1: - deleteAllMail(pop3->getWrapper(),folder); - break; - case 2: - downloadMails(); - break; - default: - break; - } -} - -/** - * IMAP Account stuff - */ -IMAPviewItem::IMAPviewItem( IMAPaccount *a, AccountView *parent ) - : AccountViewItem( parent ) -{ - account = a; - wrapper = AbstractMail::getWrapper( account ); - SETPIX(PIXMAP_IMAPFOLDER); - setText( 0, account->getAccountName() ); - setOpen( true ); -} - -IMAPviewItem::~IMAPviewItem() -{ - delete wrapper; -} - -AbstractMail *IMAPviewItem::getWrapper() -{ - return wrapper; -} - -IMAPfolderItem*IMAPviewItem::findSubItem(const QString&path,IMAPfolderItem*start) -{ - IMAPfolderItem*pitem,*sitem; - if (!start) pitem = (IMAPfolderItem*)firstChild(); - else pitem = (IMAPfolderItem*)start->firstChild(); - while (pitem) { - if (pitem->matchName(path)) { - break; - } - if (pitem->childCount()>0) { - sitem = findSubItem(path,pitem); - if (sitem) { - pitem = sitem; - break; - } - } - pitem=(IMAPfolderItem*)pitem->nextSibling(); - } - return pitem; -} - -void IMAPviewItem::refresh(QList<RecMail>&) -{ - refreshFolders(false); -} - -void IMAPviewItem::removeChilds() -{ - QListViewItem *child = firstChild(); - while ( child ) { - QListViewItem *tmp = child; - child = child->nextSibling(); - delete tmp; - } -} - -const QStringList&IMAPviewItem::subFolders() -{ - return currentFolders; -} - -void IMAPviewItem::refreshFolders(bool force) -{ - if (childCount()>0 && force==false) return; - if (account->getOffline()) return; - - removeChilds(); - currentFolders.clear(); - QList<Folder> *folders = wrapper->listFolders(); - - Folder *it; - QListViewItem*item = 0; - QListViewItem*titem = 0; - QString fname,del,search; - int pos; - // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - folders->setAutoDelete(false); - - for ( it = folders->first(); it; it = folders->next() ) { - if (it->getDisplayName().lower()=="inbox") { - item = new IMAPfolderItem( it, this , item ); - folders->remove(it); - qDebug("inbox found"); - break; - } - } - for ( it = folders->first(); it; it = folders->next() ) { - fname = it->getDisplayName(); - currentFolders.append(it->getName()); - pos = fname.findRev(it->Separator()); - if (pos != -1) { - fname = fname.left(pos); - } - IMAPfolderItem*pitem = findSubItem(fname); - if (pitem) { - titem = item; - item = new IMAPfolderItem(it,pitem,pitem->firstChild(),this); - /* setup the short name */ - item->setText(0,it->getDisplayName().right(it->getDisplayName().length()-pos-1)); - item = titem; - } else { - item = new IMAPfolderItem( it, this , item ); - } - } - delete folders; -} - -QPopupMenu * IMAPviewItem::getContextMenu() -{ - QPopupMenu *m = new QPopupMenu(0); - if (m) { - if (!account->getOffline()) { - m->insertItem(QObject::tr("Refresh folder list",contextName),0); - m->insertItem(QObject::tr("Create new folder",contextName),1); - m->insertSeparator(); - m->insertItem(QObject::tr("Disconnect",contextName),2); - m->insertItem(QObject::tr("Set offline",contextName),3); - } else { - m->insertItem(QObject::tr("Set online",contextName),3); - } - } - return m; -} - -void IMAPviewItem::createNewFolder() -{ - Newmdirdlg ndirdlg; - ndirdlg.showMaximized(); - if (ndirdlg.exec()) { - QString ndir = ndirdlg.Newdir(); - bool makesubs = ndirdlg.subpossible(); - QString delemiter = "/"; - IMAPfolderItem*item = (IMAPfolderItem*)firstChild(); - if (item) { - delemiter = item->Delemiter(); - } - if (wrapper->createMbox(ndir,0,delemiter,makesubs)) { - refreshFolders(true); - } - } -} - -void IMAPviewItem::contextMenuSelected(int id) -{ - qDebug("Id selected: %i",id); - switch (id) { - case 0: - refreshFolders(true); - break; - case 1: - createNewFolder(); - break; - case 2: - removeChilds(); - wrapper->logout(); - break; - case 3: - if (account->getOffline()==false) { - removeChilds(); - wrapper->logout(); - } - account->setOffline(!account->getOffline()); - account->save(); - SETPIX(PIXMAP_IMAPFOLDER); - refreshFolders(false); - break; - default: - break; - } -} - -RecBody IMAPviewItem::fetchBody(const RecMail&) -{ - return RecBody(); -} - -bool IMAPviewItem::offline() -{ - return account->getOffline(); -} - -IMAPfolderItem::IMAPfolderItem( Folder *folderInit, IMAPviewItem *parent , QListViewItem*after ) - : AccountViewItem( parent , after ) -{ - folder = folderInit; - imap = parent; - if (folder->getDisplayName().lower()!="inbox") { - setPixmap( 0, PIXMAP_IMAPFOLDER ); - } else { - setPixmap( 0, PIXMAP_INBOXFOLDER); - } - setText( 0, folder->getDisplayName() ); -} - -IMAPfolderItem::IMAPfolderItem( Folder *folderInit, IMAPfolderItem *parent , QListViewItem*after, IMAPviewItem *master ) - : AccountViewItem( parent,after ) -{ - folder = folderInit; - imap = master; - if (folder->getDisplayName().lower()!="inbox") { - setPixmap( 0, PIXMAP_IMAPFOLDER ); - } else { - setPixmap( 0, PIXMAP_INBOXFOLDER); - } - setText( 0, folder->getDisplayName() ); -} - -IMAPfolderItem::~IMAPfolderItem() -{ - delete folder; -} - -const QString& IMAPfolderItem::Delemiter()const -{ - return folder->Separator(); -} - -bool IMAPfolderItem::matchName(const QString&name)const -{ - return folder->getDisplayName()==name; -} - -void IMAPfolderItem::refresh(QList<RecMail>&target) -{ - if (folder->may_select()) { - imap->getWrapper()->listMessages( folder->getName(),target ); - } else { - target.clear(); - } -} - -RecBody IMAPfolderItem::fetchBody(const RecMail&aMail) -{ - return imap->getWrapper()->fetchBody(aMail); -} - -QPopupMenu * IMAPfolderItem::getContextMenu() -{ - QPopupMenu *m = new QPopupMenu(0); - if (m) { - if (folder->may_select()) { - m->insertItem(QObject::tr("Refresh header list",contextName),0); - m->insertItem(QObject::tr("Move/Copie all mails",contextName),4); - m->insertItem(QObject::tr("Delete all mails",contextName),1); - } - if (folder->no_inferior()==false) { - m->insertItem(QObject::tr("Create new subfolder",contextName),2); - } - if (folder->getDisplayName().lower()!="inbox") { - m->insertItem(QObject::tr("Delete folder",contextName),3); - } - } - return m; -} - -void IMAPfolderItem::createNewFolder() -{ - Newmdirdlg ndirdlg; - ndirdlg.showMaximized(); - if (ndirdlg.exec()) { - QString ndir = ndirdlg.Newdir(); - bool makesubs = ndirdlg.subpossible(); - QString delemiter = Delemiter(); - if (imap->wrapper->createMbox(ndir,folder,delemiter,makesubs)) { - imap->refreshFolders(true); - } - } -} - -void IMAPfolderItem::deleteFolder() -{ - int yesno = QMessageBox::warning(0,QObject::tr("Delete folder",contextName), - QObject::tr("<center>Realy delete folder <br><b>%1</b><br>and all if it content?</center>",contextName).arg(folder->getDisplayName()), - QObject::tr("Yes",contextName), - QObject::tr("No",contextName),QString::null,1,1); - qDebug("Auswahl: %i",yesno); - if (yesno == 0) { - if (imap->getWrapper()->deleteMbox(folder)) { - QListView*v=listView(); - IMAPviewItem * box = imap; - /* be carefull - after that this object is destroyd so don't use - * any member of it after that call!!*/ - imap->refreshFolders(true); - if (v) { - v->setSelected(box,true); - } - } - } -} - -void IMAPfolderItem::downloadMails() -{ - AccountView*bl = imap->accountView(); - if (!bl) return; - bl->downloadMails(folder,imap->getWrapper()); -} - -void IMAPfolderItem::contextMenuSelected(int id) -{ - qDebug("Selected id: %i",id); - AccountView * view = (AccountView*)listView(); - switch(id) { - case 0: - view->refreshCurrent(); - break; - case 1: - deleteAllMail(imap->getWrapper(),folder); - break; - case 2: - createNewFolder(); - break; - case 3: - deleteFolder(); - break; - case 4: - downloadMails(); - break; - default: - break; - } -} - -/** - * Generic stuff - */ - -const QString AccountViewItem::contextName="AccountViewItem"; - -AccountViewItem::AccountViewItem( AccountView *parent ) - : QListViewItem( parent ) -{ - m_Backlink = parent; -} - -AccountViewItem::AccountViewItem( QListViewItem *parent) - : QListViewItem( parent) -{ - m_Backlink = 0; -} - -AccountViewItem::AccountViewItem( QListViewItem *parent , QListViewItem*after ) - :QListViewItem( parent,after ) -{ - m_Backlink = 0; -} - -AccountViewItem::~AccountViewItem() -{ -} - -AccountView*AccountViewItem::accountView() -{ - return m_Backlink; -} - -void AccountViewItem::deleteAllMail(AbstractMail*wrapper,Folder*folder) -{ - if (!wrapper) return; - QString fname=""; - if (folder) fname = folder->getDisplayName(); - int yesno = QMessageBox::warning(0,QObject::tr("Delete all mails",contextName), - QObject::tr("<center>Realy delete all mails in box <br>%1</center>",contextName). - arg(fname), - QObject::tr("Yes",contextName), - QObject::tr("No",contextName),QString::null,1,1); - qDebug("Auswahl: %i",yesno); - if (yesno == 0) { - if (wrapper->deleteAllMail(folder)) { - AccountView * view = (AccountView*)listView(); - if (view) view->refreshCurrent(); - } - } -} AccountView::AccountView( QWidget *parent, const char *name, WFlags flags ) : QListView( parent, name, flags ) { connect( this, SIGNAL( selectionChanged( QListViewItem * ) ), SLOT( refresh( QListViewItem * ) ) ); connect( this, SIGNAL( mouseButtonPressed(int, QListViewItem *,const QPoint&,int ) ),this, SLOT( slotHold( int, QListViewItem *,const QPoint&,int ) ) ); - setSorting(0); } AccountView::~AccountView() { imapAccounts.clear(); mhAccounts.clear(); } void AccountView::slotContextMenu(int id) { AccountViewItem *view = static_cast<AccountViewItem *>(currentItem()); if (!view) return; view->contextMenuSelected(id); } void AccountView::slotHold(int button, QListViewItem * item,const QPoint&,int) { if (button==1) {return;} if (!item) return; AccountViewItem *view = static_cast<AccountViewItem *>(item); QPopupMenu*m = view->getContextMenu(); if (!m) return; connect(m,SIGNAL(activated(int)),this,SLOT(slotContextMenu(int))); m->setFocus(); m->exec( QPoint( QCursor::pos().x(), QCursor::pos().y()) ); delete m; } void AccountView::populate( QList<Account> list ) { clear(); imapAccounts.clear(); mhAccounts.clear(); mhAccounts.append(new MHviewItem(AbstractMail::defaultLocalfolder(),this)); Account *it; for ( it = list.first(); it; it = list.next() ) { if ( it->getType().compare( "IMAP" ) == 0 ) { IMAPaccount *imap = static_cast<IMAPaccount *>(it); qDebug( "added IMAP " + imap->getAccountName() ); imapAccounts.append(new IMAPviewItem( imap, this )); } else if ( it->getType().compare( "POP3" ) == 0 ) { POP3account *pop3 = static_cast<POP3account *>(it); qDebug( "added POP3 " + pop3->getAccountName() ); /* must not be hold 'cause it isn't required */ (void) new POP3viewItem( pop3, this ); } } } void AccountView::refresh(QListViewItem *item) { qDebug("AccountView refresh..."); if ( item ) { m_currentItem = item; QList<RecMail> headerlist; headerlist.setAutoDelete(true); AccountViewItem *view = static_cast<AccountViewItem *>(item); view->refresh(headerlist); emit refreshMailview(&headerlist); } } void AccountView::refreshCurrent() { m_currentItem = currentItem(); if ( !m_currentItem ) return; QList<RecMail> headerlist; headerlist.setAutoDelete(true); AccountViewItem *view = static_cast<AccountViewItem *>(m_currentItem); view->refresh(headerlist); emit refreshMailview(&headerlist); } void AccountView::refreshAll() { } RecBody AccountView::fetchBody(const RecMail&aMail) { QListViewItem*item = selectedItem (); if (!item) return RecBody(); AccountViewItem *view = static_cast<AccountViewItem *>(item); return view->fetchBody(aMail); } void AccountView::setupFolderselect(Selectstore*sels) { sels->showMaximized(); QStringList sFolders; unsigned int i = 0; for (i=0; i < mhAccounts.count();++i) { mhAccounts[i]->refresh(false); sFolders = mhAccounts[i]->subFolders(); sels->addAccounts(mhAccounts[i]->getWrapper(),sFolders); } for (i=0; i < imapAccounts.count();++i) { if (imapAccounts[i]->offline()) continue; imapAccounts[i]->refreshFolders(false); sels->addAccounts(imapAccounts[i]->getWrapper(),imapAccounts[i]->subFolders()); } } void AccountView::downloadMails(Folder*fromFolder,AbstractMail*fromWrapper) { AbstractMail*targetMail = 0; QString targetFolder = ""; Selectstore sels; setupFolderselect(&sels); if (!sels.exec()) return; targetMail = sels.currentMail(); targetFolder = sels.currentFolder(); if ( (fromWrapper==targetMail && fromFolder->getName()==targetFolder) || targetFolder.isEmpty()) { return; } if (sels.newFolder() && !targetMail->createMbox(targetFolder)) { QMessageBox::critical(0,tr("Error creating new Folder"), tr("<center>Error while creating<br>new folder - breaking.</center>")); return; } qDebug("Targetfolder: %s",targetFolder.latin1()); qDebug("Fromfolder: %s",fromFolder->getName().latin1()); fromWrapper->mvcpAllMails(fromFolder,targetFolder,targetMail,sels.moveMails()); refreshCurrent(); } - -/** - * MH Account stuff - */ -/* MH is a little bit different - the top folder can contains messages other than in IMAP and - POP3 and MBOX */ -MHviewItem::MHviewItem( const QString&aPath, AccountView *parent ) - : AccountViewItem( parent ) -{ - m_Path = aPath; - /* be carefull - the space within settext is wanted - thats why the string twice */ - wrapper = AbstractMail::getWrapper( m_Path,"Local Folders"); - setPixmap( 0, PIXMAP_LOCALFOLDER ); - setText( 0, " Local Folders" ); - setOpen( true ); - folder = 0; -} - -MHviewItem::~MHviewItem() -{ - delete wrapper; - if (folder) delete folder; -} - -AbstractMail *MHviewItem::getWrapper() -{ - return wrapper; -} - -void MHviewItem::refresh( QList<RecMail> & target) -{ - refresh(false); - getWrapper()->listMessages( "",target ); -} - -void MHviewItem::removeChilds() -{ - QListViewItem *child = firstChild(); - while ( child ) { - QListViewItem *tmp = child; - child = child->nextSibling(); - delete tmp; - } -} - -void MHviewItem::refresh(bool force) -{ - if (childCount()>0 && force==false) return; - removeChilds(); - QList<Folder> *folders = wrapper->listFolders(); - Folder *it; - MHfolderItem*item = 0; - MHfolderItem*pmaster = 0; - QString fname = ""; - for ( it = folders->first(); it; it = folders->next() ) { - fname = it->getDisplayName(); - /* this folder itself */ - if (fname=="/") { - folder = it; - continue; - } - if (pmaster) { - item = new MHfolderItem( it, pmaster, item, this ); - } else { - item = new MHfolderItem( it, this , item ); - } - item->setSelectable(it->may_select()); - } - // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - folders->setAutoDelete(false); - delete folders; -} - -RecBody MHviewItem::fetchBody( const RecMail &mail ) -{ - qDebug( "MH fetchBody" ); - return wrapper->fetchBody( mail ); -} - -QPopupMenu * MHviewItem::getContextMenu() -{ - QPopupMenu *m = new QPopupMenu(0); - if (m) { - m->insertItem(QObject::tr("Refresh folder list",contextName),0); - m->insertItem(QObject::tr("Create new folder",contextName),1); - m->insertItem(QObject::tr("Delete all mails",contextName),2); - m->insertItem(QObject::tr("Move/Copie all mails",contextName),3); - } - return m; -} - -void MHviewItem::createFolder() -{ - Newmdirdlg ndirdlg(0,0,true); - ndirdlg.showMaximized(); - if (ndirdlg.exec()) { - QString ndir = ndirdlg.Newdir(); - if (wrapper->createMbox(ndir)) { - refresh(true); - } - } -} - -void MHviewItem::downloadMails() -{ - AccountView*bl = accountView(); - if (!bl) return; - bl->downloadMails(folder,getWrapper()); -} - -QStringList MHviewItem::subFolders() -{ - QStringList result; - QListViewItem *child = firstChild(); - result.append("/"); - while ( child ) { - MHfolderItem *tmp = (MHfolderItem*)child; - child = child->nextSibling(); - result.append(tmp->getFolder()->getDisplayName()); - } - qDebug("Size of result: %i",result.count()); - return result; -} - -void MHviewItem::contextMenuSelected(int which) -{ - switch (which) { - case 0: - refresh(true); - break; - case 1: - createFolder(); - break; - case 2: - deleteAllMail(getWrapper(),folder); - break; - case 3: - downloadMails(); - break; - default: - break; - } -} - -MHfolderItem::~MHfolderItem() -{ - delete folder; -} - -MHfolderItem::MHfolderItem( Folder *folderInit, MHviewItem *parent , QListViewItem*after ) - : AccountViewItem( parent,after ) -{ - folder = folderInit; - mbox = parent; - initName(); -} - -MHfolderItem::MHfolderItem( Folder *folderInit, MHfolderItem *parent, QListViewItem*after, MHviewItem*master) - : AccountViewItem( parent,after ) -{ - folder = folderInit; - mbox = master; - initName(); -} - -void MHfolderItem::initName() -{ - QString bName = folder->getDisplayName(); - if (bName.startsWith("/")&&bName.length()>1) { - bName.replace(0,1,""); - } - if (bName.lower() == "outgoing") { - setPixmap( 0, PIXMAP_OUTBOXFOLDER ); - } else if (bName.lower() == "inbox") { - setPixmap( 0, PIXMAP_INBOXFOLDER); - } else { - setPixmap( 0, PIXMAP_MBOXFOLDER ); - } - setText( 0, bName ); -} - -Folder*MHfolderItem::getFolder() -{ - return folder; -} - -void MHfolderItem::refresh(QList<RecMail>&target) -{ - if (folder->may_select()) - mbox->getWrapper()->listMessages( folder->getName(),target ); -} - -RecBody MHfolderItem::fetchBody(const RecMail&aMail) -{ - return mbox->getWrapper()->fetchBody(aMail); -} - -void MHfolderItem::deleteFolder() -{ - int yesno = QMessageBox::warning(0,QObject::tr("Delete folder",contextName), - QObject::tr("<center>Realy delete folder <br><b>%1</b><br>and all if it content?</center>",contextName).arg(folder->getDisplayName()), - QObject::tr("Yes",contextName), - QObject::tr("No",contextName),QString::null,1,1); - qDebug("Auswahl: %i",yesno); - if (yesno == 0) { - if (mbox->getWrapper()->deleteMbox(folder)) { - QListView*v=listView(); - MHviewItem * box = mbox; - /* be carefull - after that this object is destroyd so don't use - * any member of it after that call!!*/ - mbox->refresh(true); - if (v) { - v->setSelected(box,true); - } - } - } -} - -QPopupMenu * MHfolderItem::getContextMenu() -{ - QPopupMenu *m = new QPopupMenu(0); - if (m) { - m->insertItem(QObject::tr("Delete all mails",contextName),0); - m->insertItem(QObject::tr("Delete folder",contextName),1); - m->insertItem(QObject::tr("Move/Copie all mails",contextName),2); - m->insertItem(QObject::tr("Create new folder",contextName),3); - } - return m; -} - -void MHfolderItem::downloadMails() -{ - AccountView*bl = mbox->accountView(); - if (!bl) return; - bl->downloadMails(folder,mbox->getWrapper()); -} - -void MHfolderItem::contextMenuSelected(int which) -{ - switch(which) { - case 0: - deleteAllMail(mbox->getWrapper(),folder); - break; - case 1: - deleteFolder(); - break; - case 2: - downloadMails(); - break; - default: - break; - } -} - diff --git a/noncore/net/mail/accountview.h b/noncore/net/mail/accountview.h index 60e2b4b..9f92090 100644 --- a/noncore/net/mail/accountview.h +++ b/noncore/net/mail/accountview.h @@ -1,194 +1,44 @@ #ifndef ACCOUNTVIEW_H #define ACCOUNTVIEW_H #include <qlistview.h> #include <qlist.h> -#include <libmailwrapper/settings.h> -#include <libmailwrapper/mailwrapper.h> -#include <libmailwrapper/abstractmail.h> - -class POP3wrapper; +class Selectstore; class RecMail; class RecBody; -class QPopupMenu; -class Selectstore; -class AccountView; - -class AccountViewItem : public QListViewItem -{ - -public: - AccountViewItem( AccountView *parent ); - AccountViewItem( QListViewItem *parent); - AccountViewItem( QListViewItem *parent , QListViewItem*after ); - virtual ~AccountViewItem(); - virtual void refresh(QList<RecMail>&)=0; - virtual RecBody fetchBody(const RecMail&)=0; - virtual QPopupMenu * getContextMenu(){return 0;}; - virtual void contextMenuSelected(int){} - virtual AccountView*accountView(); -protected: - virtual void deleteAllMail(AbstractMail*wrapper,Folder*f); - static const QString contextName; - AccountView*m_Backlink; -}; - -class POP3viewItem : public AccountViewItem -{ - -public: - POP3viewItem( POP3account *a, AccountView *parent ); - virtual ~POP3viewItem(); - virtual void refresh( QList<RecMail> &target ); - virtual RecBody fetchBody( const RecMail &mail ); - AbstractMail *getWrapper(); - virtual QPopupMenu * getContextMenu(); - virtual void contextMenuSelected(int); - -protected: - POP3account *account; - virtual void refresh(); - AbstractMail *wrapper; - void disconnect(); - void setOnOffline(); -}; - -class POP3folderItem : public AccountViewItem -{ - -public: - POP3folderItem( Folder *folder, POP3viewItem *parent , QListViewItem*after ); - virtual ~POP3folderItem(); - virtual void refresh(QList<RecMail>&); - virtual RecBody fetchBody(const RecMail&); - virtual QPopupMenu * getContextMenu(); - virtual void contextMenuSelected(int); - -protected: - void downloadMails(); - Folder *folder; - POP3viewItem *pop3; -}; - -class IMAPfolderItem; - -class IMAPviewItem : public AccountViewItem -{ - friend class IMAPfolderItem; -public: - IMAPviewItem( IMAPaccount *a, AccountView *parent ); - virtual ~IMAPviewItem(); - virtual void refresh(QList<RecMail>&); - virtual RecBody fetchBody(const RecMail&); - AbstractMail *getWrapper(); - virtual QPopupMenu * getContextMenu(); - virtual void contextMenuSelected(int); - const QStringList&subFolders(); - virtual void refreshFolders(bool force=false); - bool offline(); - -protected: - IMAPfolderItem*findSubItem(const QString&path,IMAPfolderItem*start=0); - virtual void createNewFolder(); - virtual void removeChilds(); - IMAPaccount *account; - AbstractMail *wrapper; - QStringList currentFolders; -}; - -class IMAPfolderItem : public AccountViewItem -{ - -public: - IMAPfolderItem( Folder *folder, IMAPviewItem *parent , QListViewItem*after ); - IMAPfolderItem( Folder *folder, IMAPfolderItem *parent , QListViewItem*after, IMAPviewItem *master ); - virtual ~IMAPfolderItem(); - virtual void refresh(QList<RecMail>&); - virtual RecBody fetchBody(const RecMail&); - bool matchName(const QString&name)const; - virtual QPopupMenu * getContextMenu(); - virtual void contextMenuSelected(int); - virtual const QString& Delemiter()const; -protected: - virtual void createNewFolder(); - virtual void deleteFolder(); - virtual void downloadMails(); - Folder *folder; - IMAPviewItem *imap; -}; - -class MHviewItem : public AccountViewItem -{ - friend class MHfolderItem; - -public: - MHviewItem( const QString&aMboxPath, AccountView *parent ); - virtual ~MHviewItem(); - virtual void refresh( QList<RecMail> &target ); - virtual RecBody fetchBody( const RecMail &mail ); - AbstractMail *getWrapper(); - virtual QPopupMenu * getContextMenu(); - virtual void contextMenuSelected(int); - QStringList subFolders(); - virtual void refresh(bool force=false); - -protected: - void downloadMails(); - void removeChilds(); - virtual void createFolder(); - QString m_Path; - AbstractMail *wrapper; - Folder *folder; -}; - -class MHfolderItem : public AccountViewItem -{ - -public: - MHfolderItem( Folder *folder, MHviewItem *parent , QListViewItem*after ); - MHfolderItem( Folder *folder, MHfolderItem *parent, QListViewItem*after, MHviewItem*master); - virtual ~MHfolderItem(); - virtual void refresh(QList<RecMail>&); - virtual RecBody fetchBody(const RecMail&); - virtual QPopupMenu * getContextMenu(); - virtual void contextMenuSelected(int); - virtual Folder*getFolder(); - -protected: - void downloadMails(); - virtual void deleteFolder(); - void initName(); - Folder *folder; - MHviewItem *mbox; -}; +class Folder; +class AbstractMail; +class Account; +class IMAPviewItem; +class MHviewItem; class AccountView : public QListView { Q_OBJECT public: AccountView( QWidget *parent = 0, const char *name = 0, WFlags flags = 0 ); virtual ~AccountView(); virtual void populate( QList<Account> list ); virtual RecBody fetchBody(const RecMail&aMail); virtual void downloadMails(Folder*fromFolder,AbstractMail*fromWrapper); public slots: virtual void refreshAll(); virtual void refresh(QListViewItem *item); virtual void refreshCurrent(); virtual void slotHold(int, QListViewItem *,const QPoint&,int); virtual void slotContextMenu(int id); void setupFolderselect(Selectstore*sels); signals: void refreshMailview(QList<RecMail>*); protected: QListViewItem* m_currentItem; QValueList<IMAPviewItem*> imapAccounts; QValueList<MHviewItem*> mhAccounts; }; #endif diff --git a/noncore/net/mail/mail.pro b/noncore/net/mail/mail.pro index 90e1e46..552f0e5 100644 --- a/noncore/net/mail/mail.pro +++ b/noncore/net/mail/mail.pro @@ -1,57 +1,59 @@ CONFIG += qt warn_on debug quick-app HEADERS = defines.h \ editaccounts.h \ composemail.h \ accountview.h \ + accountitem.h \ mainwindow.h \ viewmail.h \ viewmailbase.h \ opiemail.h \ mailistviewitem.h \ settingsdialog.h \ statuswidget.h \ newmaildir.h \ selectstore.h SOURCES = main.cpp \ opiemail.cpp \ mainwindow.cpp \ accountview.cpp \ + accountitem.cpp \ composemail.cpp \ addresspicker.cpp \ editaccounts.cpp \ viewmail.cpp \ viewmailbase.cpp \ mailistviewitem.cpp \ settingsdialog.cpp \ statuswidget.cpp \ newmaildir.cpp \ selectstore.cpp INTERFACES = editaccountsui.ui \ selectmailtypeui.ui \ imapconfigui.ui \ pop3configui.ui \ nntpconfigui.ui \ smtpconfigui.ui \ addresspickerui.ui \ composemailui.ui \ settingsdialogui.ui \ statuswidgetui.ui \ newmaildirui.ui \ selectstoreui.ui INCLUDEPATH += $(OPIEDIR)/include CONFTEST = $$system( echo $CONFIG_TARGET_MACOSX ) contains( CONFTEST, y ){ LIBS += -lqpe -lopie -lmailwrapper -liconv }else{ LIBS += -lqpe -lopie -lmailwrapper } TARGET = opiemail include ( $(OPIEDIR)/include.pro ) diff --git a/noncore/net/mail/opiemail.cpp b/noncore/net/mail/opiemail.cpp index 39e3a64..d3d3cdb 100644 --- a/noncore/net/mail/opiemail.cpp +++ b/noncore/net/mail/opiemail.cpp @@ -1,107 +1,108 @@ #include <qmessagebox.h> #include "settingsdialog.h" #include "opiemail.h" #include "editaccounts.h" #include "composemail.h" #include <libmailwrapper/smtpwrapper.h> #include <qpe/qcopenvelope_qws.h> #include <qpe/resource.h> #include <qaction.h> #include <qapplication.h> #include <libmailwrapper/mailtypes.h> +#include <libmailwrapper/abstractmail.h> #include "mailistviewitem.h" #include "viewmail.h" #include "selectstore.h" OpieMail::OpieMail( QWidget *parent, const char *name, WFlags flags ) : MainWindow( parent, name, WStyle_ContextHelp ) { settings = new Settings(); folderView->populate( settings->getAccounts() ); } OpieMail::~OpieMail() { if (settings) delete settings; } void OpieMail::appMessage(const QCString &msg, const QByteArray &data) { // copied from old mail2 if (msg == "writeMail(QString,QString)") { QDataStream stream(data,IO_ReadOnly); QString name, email; stream >> name >> email; // removing the whitespaces at beginning and end is needed! slotwriteMail(name.stripWhiteSpace(),email.stripWhiteSpace()); } else if (msg == "newMail()") { slotComposeMail(); } } void OpieMail::slotwriteMail(const QString&name,const QString&email) { ComposeMail compose( settings, this, 0, true , WStyle_ContextHelp ); if (!email.isEmpty()) { if (!name.isEmpty()) { compose.setTo("\"" + name + "\"" + " " + "<"+ email + ">"); } else { compose.setTo(email); } } compose.showMaximized(); compose.slotAdjustColumns(); compose.exec(); } void OpieMail::slotComposeMail() { qDebug( "Compose Mail" ); slotwriteMail(0l,0l); } void OpieMail::slotSendQueued() { qDebug( "Send Queued" ); SMTPaccount *smtp = 0; QList<Account> list = settings->getAccounts(); Account *it; // if (list.count()==1) { for ( it = list.first(); it; it = list.next() ) { if ( it->getType().compare( "SMTP" ) == 0 ) { smtp = static_cast<SMTPaccount *>(it); break; } } // } if (smtp) { SMTPwrapper * wrap = new SMTPwrapper(settings); if ( wrap->flushOutbox(smtp) ) { QMessageBox::information(0,tr("Info"),tr("Mail queue flushed")); } } } void OpieMail::slotSearchMails() { qDebug( "Search Mails" ); } void OpieMail::slotEditSettings() { SettingsDialog settingsDialog( this, 0, true, WStyle_ContextHelp ); settingsDialog.showMaximized(); settingsDialog.exec(); } void OpieMail::slotEditAccounts() { qDebug( "Edit Accounts" ); EditAccounts eaDialog( settings, this, 0, true, WStyle_ContextHelp ); eaDialog.showMaximized(); eaDialog.slotAdjustColumns(); eaDialog.exec(); if ( settings ) delete settings; settings = new Settings(); |