Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

folderwidget.cpp

Go to the documentation of this file.
00001 #include <qmessagebox.h>
00002 #include <qtextstream.h>
00003 #include <qpopupmenu.h>
00004 #include <qheader.h>
00005 #include <qfile.h>
00006 #include <qdir.h> 
00007 
00008 #include <qpe/resource.h>
00009 
00010 #include <stdlib.h>
00011 
00012 #include "folderwidget.h"
00013 #include "imaphandler.h"
00014 #include "imapbase.h"
00015 #include "rename.h"
00016 
00017 FolderWidgetItem::FolderWidgetItem(Folder &folder, QListView *parent)
00018         : QListViewItem(parent), _folder(folder)
00019 {
00020         setPixmap(0, QPixmap(Resource::loadPixmap("mail/inbox")));
00021         setText(0, _folder.topFolder().account().user() + " (" + _folder.topFolder().account().imapServer() + ")");
00022         setOpen(true);
00023 }
00024 
00025 FolderWidgetItem::FolderWidgetItem(Folder &folder, FolderWidgetItem *parent)
00026         : QListViewItem(parent), _folder(folder)
00027 {
00028         if (_folder.noCache()) {
00029                 setText(0, QObject::tr("<Foldertree not known.>"));
00030         } else {
00031                 if (folder.fullName().upper() == "INBOX") {
00032                         setPixmap(0, QPixmap(Resource::loadPixmap("mail/inbox")));
00033                         setText(0, QObject::tr("Inbox"));
00034                 } else {
00035                         setPixmap(0, QPixmap(Resource::loadPixmap("mail/folder")));
00036                         setText(0, folder.fullName());
00037                 }
00038                 setOpen(true);
00039         }
00040 }
00041 
00042 FolderWidget::FolderWidget(QWidget *parent, const char *name, WFlags fl)
00043         : ListViewPlus(parent, name, fl)
00044 {
00045         header()->hide();
00046         addColumn("");
00047         setSorting(-1);
00048 
00049         QPopupMenu *menu = new QPopupMenu();
00050         menu->insertItem(tr("Rename"), MENU_RENAME);
00051         menu->insertItem(tr("Delete"), MENU_DELETE);
00052         menu->insertItem(tr("Move"), MENU_MOVE);
00053         menu->insertItem(tr("Copy"), MENU_COPY);
00054         menu->insertSeparator();
00055         menu->insertItem(tr("Create folder"), MENU_CREATE);
00056         menu->insertSeparator();
00057         menu->insertItem(tr("Rescan folder list"), MENU_RESCAN);
00058         setPopup(menu);
00059 
00060         getAccounts();
00061 
00062         connect(menu, SIGNAL(activated(int)), SLOT(slotMenuActivated(int)));
00063         connect(this, SIGNAL(clicked(QListViewItem*)), SLOT(slotItemClicked(QListViewItem*)));
00064 }
00065 
00066 FolderWidget::~FolderWidget()
00067 {
00068         // TODO: Save folder tree.
00069 }
00070 
00071 void FolderWidget::update()
00072 {
00073         getAccounts();
00074 }
00075 
00076 void FolderWidget::getAccounts()
00077 {
00078         clear();
00079 
00080         QValueList<Account> accounts = ConfigFile::getAccounts();
00081         QValueList<Account>::Iterator it;
00082         for (it = accounts.begin(); it != accounts.end(); it++) {
00083                 FolderWidgetItem *item = addAccount(*it);
00084                 QFile f((QString) getenv("HOME") + "/Applications/mail/foldercache/foldercache-" + (*it).accountName());
00085                 if (!f.open(IO_ReadOnly)) {
00086                         Folder folder;
00087                         folder.setNoCache(true);
00088                         addFolder(folder, item);
00089                 } else {
00090                         QTextStream t(&f);
00091                         while (!t.atEnd()) {
00092                                 QString separator = t.readLine();
00093                                 QString fullname = t.readLine();
00094                                 Folder folder;
00095                                 folder.setSeparator(separator);
00096                                 folder.setFullName(fullname);
00097                                 folder.setTopFolder(item->folder().topFolder());
00098                                 addFolder(folder, item);
00099                         }
00100                         f.close();
00101                 }
00102         }
00103 }
00104 
00105 FolderWidgetItem *FolderWidget::addAccount(Account &account)
00106 {
00107         TopFolder tf;
00108         tf.setAccount(account);
00109 
00110         // XXX This has to change!!! The folderwidget may not create an
00111         // XXX IMAPHandler!!!! Do this in IMAPHandler!
00112         tf.setIMAPHandler(new IMAPHandler(account));
00113 
00114         Folder folder;
00115         folder.setTopFolder(tf);
00116 
00117         connect(tf.handler(), SIGNAL(IMAPLookingUpHost()), SLOT(slotIMAPLookingUpHost()));
00118         connect(tf.handler(), SIGNAL(IMAPHostFound()), SLOT(slotIMAPHostFound()));
00119         connect(tf.handler(), SIGNAL(IMAPConnected()), SLOT(slotIMAPConnected()));
00120         connect(tf.handler(), SIGNAL(IMAPDisconnected()), SLOT(slotIMAPDisconnected()));
00121         connect(tf.handler(), SIGNAL(IMAPError(int)), SLOT(slotIMAPError(int)));
00122 
00123         return new FolderWidgetItem(folder, this);
00124 }
00125 
00126 FolderWidgetItem *FolderWidget::addFolder(Folder &folder, FolderWidgetItem *folderWidgetItem)
00127 {
00128         return new FolderWidgetItem(folder, folderWidgetItem);
00129 }
00130 
00131 void FolderWidget::slotMenuActivated(int itemid)
00132 {
00133         if (currentItem() == NULL) {
00134                 QMessageBox::information(this, tr("Error"), tr("<p>Please select an item first.</p>"), tr("Ok"));
00135                 return;
00136         }
00137 
00138         if (itemid == MENU_RENAME) {
00139                 if (((FolderWidgetItem *)currentItem())->folder().fullName().isEmpty()) return;
00140 
00141                 Folder folder = ((FolderWidgetItem *)currentItem())->folder();
00142                 QString newName = Rename::rename(folder.fullName(), this); 
00143                 if (newName.isNull()) return;
00144 
00145                 folder.topFolder().handler()->iRename(folder.fullName(), newName);
00146                 connect(folder.topFolder().handler(), SIGNAL(gotResponse(IMAPResponse&)), SLOT(slotIMAPRename(IMAPResponse&)));
00147         } else if (itemid == MENU_DELETE) {
00148                 if (((FolderWidgetItem *)currentItem())->folder().fullName().isEmpty()) return;
00149 
00150                 Folder folder = ((FolderWidgetItem *)currentItem())->folder();
00151 
00152                 int ret = QMessageBox::information(this, tr("Question"), tr("<p>Do you really want to delete <pre>%1</pre>?").arg(folder.fullName()), tr("Yes"), tr("No"));
00153                 if (ret == 1) return;
00154 
00155                 _createFolder = folder;
00156 
00157                 folder.topFolder().handler()->iDelete(folder.fullName());
00158                 connect(folder.topFolder().handler(), SIGNAL(gotResponse(IMAPResponse&)), SLOT(slotIMAPDelete(IMAPResponse&)));
00159         } else if (itemid == MENU_MOVE) {
00160 
00161         } else if (itemid == MENU_COPY) {
00162 
00163         } else if (itemid == MENU_CREATE) {
00164                 Folder folder = (((FolderWidgetItem *)currentItem())->folder());
00165                 _createFolder = folder;
00166 
00167                 QString folderName = Rename::getText(tr("Foldername"), tr("<p>Please enter the name of the new folder.</p>"), this);
00168                 if (folderName.isNull()) return;
00169 
00170                 folder.topFolder().handler()->iCreate(folder.fullName() + folder.separator() + folderName);
00171                 connect(folder.topFolder().handler(), SIGNAL(gotResponse(IMAPResponse&)), SLOT(slotIMAPCreate(IMAPResponse&)));
00172         } else if (itemid == MENU_RESCAN) {
00173                 Folder folder = (((FolderWidgetItem *)currentItem())->folder());
00174                 _rescanAccount = folder.topFolder().account();
00175 
00176                 folder.topFolder().handler()->iList("", "*");
00177                 connect(folder.topFolder().handler(), SIGNAL(gotResponse(IMAPResponse&)), SLOT(slotIMAPList(IMAPResponse&)));
00178         }
00179 }
00180 
00181 void FolderWidget::slotItemClicked(QListViewItem *item)
00182 {
00183         if (item == NULL) return;
00184         Folder folder = ((FolderWidgetItem *)item)->folder();
00185         if (folder.fullName().isEmpty()) return;
00186 
00187         emit folderSelected(folder);
00188 }
00189 
00190 void FolderWidget::slotIMAPLookingUpHost()
00191 {
00192         emit status(tr("Looking up host..."));
00193         emit connecting();
00194 }
00195 
00196 void FolderWidget::slotIMAPHostFound()
00197 {
00198         emit status(tr("Host found."));
00199 }
00200 
00201 void FolderWidget::slotIMAPConnected()
00202 {
00203         emit status(tr("Connected to host."));
00204         emit connected();
00205 }
00206 
00207 void FolderWidget::slotIMAPError(int error)
00208 {
00209         if (error == IMAPBase::IMAPErrConnectionRefused) {
00210                 QMessageBox::warning(this, tr("Error"), tr("<p>The IMAP connection was refused.</p>"), tr("Ok"));
00211         } else if (error == IMAPBase::IMAPErrHostNotFound) {
00212                 QMessageBox::warning(this, tr("Error"), tr("<p>The host was not found.</p>"), tr("Ok"));
00213         } else if (error == IMAPBase::IMAPErrSocketRead) {
00214                 QMessageBox::warning(this, tr("Error"), tr("<p>There was an error while reading from the socket.</p>"), tr("Ok"));
00215         } else if (error == IMAPBase::IMAPErrLoginFailed) {
00216                 QMessageBox::warning(this, tr("Error"), tr("<p>Login failed. Check your password/username.</p>"), tr("Ok"));
00217         } else {
00218                 QMessageBox::warning(this, tr("Error"), tr("<p>An unknown error was encountered.</p>"), tr("Ok"));
00219         }
00220 }
00221 
00222 void FolderWidget::slotIMAPDisconnected()
00223 {
00224         emit status(tr("Disconnected."));
00225         emit disconnected();
00226 }
00227 
00228 void FolderWidget::slotIMAPLogin(IMAPResponse &response)
00229 {
00230         disconnect(response.imapHandler(), SIGNAL(gotResponse(IMAPResponse&)), this, SLOT(slotIMAPLogin(IMAPResponse&)));
00231 
00232         if (response.statusResponse().status() == IMAPResponseEnums::OK) {
00233                 emit status(tr("Login successful!"));
00234         } else {
00235                 QMessageBox::warning(this, tr("Error"), tr("<p>Login failed. Go away.</p>"), tr("Ok"));
00236         }
00237 }
00238 
00239 void FolderWidget::slotIMAPRename(IMAPResponse &response)
00240 {
00241         disconnect(response.imapHandler(), SIGNAL(gotResponse(IMAPResponse&)), this, SLOT(slotIMAPRename(IMAPResponse&)));
00242 
00243         if (response.statusResponse().status() == IMAPResponseEnums::OK) {
00244                 emit status(tr("Renaming successful!"));
00245         } else {
00246                 QMessageBox::warning(this, tr("Error"), tr("<p>Renaming failed. (Server said: %1)</p>").arg(response.statusResponse().comment()), tr("Ok"));
00247         }
00248 }
00249 
00250 void FolderWidget::slotIMAPDelete(IMAPResponse &response)
00251 {
00252         disconnect(response.imapHandler(), SIGNAL(gotResponse(IMAPResponse&)), this, SLOT(slotIMAPDelete(IMAPResponse&)));
00253 
00254         if (response.statusResponse().status() == IMAPResponseEnums::OK) {
00255                 emit status(tr("Deletion successful!"));
00256 
00257                 _rescanAccount = _createFolder.topFolder().account();
00258 
00259                 _createFolder.topFolder().handler()->iList(".", "*");
00260                 connect(_createFolder.topFolder().handler(), SIGNAL(gotResponse(IMAPResponse&)), SLOT(slotIMAPList(IMAPResponse&)));
00261         } else {
00262                 QMessageBox::warning(this, tr("Error"), tr("<p>Delete failed. (Server said: %1)</p>").arg(response.statusResponse().comment()), tr("Ok"));
00263         }
00264 }
00265 
00266 void FolderWidget::slotIMAPCreate(IMAPResponse &response)
00267 {
00268         disconnect(response.imapHandler(), SIGNAL(gotResponse(IMAPResponse&)), this, SLOT(slotIMAPCreate(IMAPResponse&)));
00269 
00270         if (response.statusResponse().status() == IMAPResponseEnums::OK) {
00271                 emit status(tr("Folder created. Rescanning..."));
00272 
00273                 _rescanAccount = _createFolder.topFolder().account();
00274 
00275                 _createFolder.topFolder().handler()->iList(".", "*");
00276                 connect(_createFolder.topFolder().handler(), SIGNAL(gotResponse(IMAPResponse&)), SLOT(slotIMAPList(IMAPResponse&)));
00277         } else {
00278                 QMessageBox::warning(this, tr("Error"), tr("<p>The folder could not be created. (Server said: %1)</p>").arg(response.statusResponse().comment()), tr("Ok"));
00279         }
00280 }
00281 
00282 void FolderWidget::slotIMAPList(IMAPResponse &response)
00283 {
00284         disconnect(response.imapHandler(), SIGNAL(gotResponse(IMAPResponse&)), this, SLOT(slotIMAPList(IMAPResponse&)));
00285 
00286         if (response.statusResponse().status() == IMAPResponseEnums::OK) {
00287                 QDir d((QString) getenv("HOME") + "/Applications/mail/foldercache");
00288                 if (!d.exists()) {
00289                         system("mkdir -p $HOME/Applications/mail/foldercache");
00290                         qWarning("Created $HOME/Applications/mail/foldercache.");
00291                 }
00292                 QFile f((QString) getenv("HOME") + "/Applications/mail/foldercache/foldercache-" + _rescanAccount.accountName());
00293                 if (!f.open(IO_WriteOnly)) {
00294                         QMessageBox::critical(this, tr("Error"), tr("<p>Couldn't open folder cache file for writing!</p>"), tr("Ok"));
00295                         return;
00296                 } 
00297                 QTextStream t(&f);
00298 
00299                 QValueList<IMAPResponseLIST>::Iterator it;
00300                 QValueList<IMAPResponseLIST> lists = response.LIST();
00301                 for (it = lists.begin(); it != lists.end(); it++) {
00302                         t << (*it).folderSeparator() << "\n";
00303                         t << (*it).folder() << "\n";
00304                 }
00305 
00306                 f.close();
00307 
00308                 emit status(tr("Got folder list."));
00309                 getAccounts();
00310         } else {
00311                 QMessageBox::warning(this, tr("Error"), tr("<p>Couldn't retrieve the folder list. (Server said: %1)</p>").arg(response.statusResponse().comment()), tr("Ok"));
00312         }
00313 }
00314 

Generated on Sat Nov 5 16:18:07 2005 for OPIE by  doxygen 1.4.2