#include #include #include #include #include #include #include #include "util.h" #include "kmcomposewin.h" #include "kmsettings.h" #include "kmfolderdia.h" #include "kmaccount.h" #include "kmmainwin.moc" #include "mclass.h" #include "kbusyptr.h" KBusyPtr* kbp; KMMainView::KMMainView(QWidget *parent, const char *name) : QWidget(parent,name) { //////////////////// // Set up Panners // //////////////////// horzPanner=new KPanner(this, NULL, KPanner::O_HORIZONTAL,40); connect(horzPanner, SIGNAL(positionChanged()), this, SLOT(pannerHasChanged())); vertPanner=new KPanner(horzPanner->child0(), NULL, KPanner::O_VERTICAL, 30); connect(vertPanner, SIGNAL(positionChanged()), this, SLOT(pannerHasChanged())); //////////////////////// // Set up all widgets //# //////////////////////// folderTree = new KMFolderTree(vertPanner->child0()); connect(folderTree,SIGNAL(folderSelected(QDir *)),this,SLOT(folderSelected(QDir *))); headers = new KMHeaders(vertPanner->child1()); connect(headers,SIGNAL(messageSelected(Message *)),this,SLOT(messageSelected(Message *))); messageView = new QMultiLineEdit(horzPanner->child1()); messageView->setReadOnly(TRUE); } void KMMainView::doAddFolder() { KMFolderDialog *d=new KMFolderDialog(this); d->setCaption("Create Folder"); if (d->exec()) { QDir dir; folderTree->cdFolder(&dir); dir.mkdir(d->nameEdit->text()); folderTree->getList(); } delete d; } void KMMainView::doCheckMail() { unsigned int i,j; QDir dir; QFile *f; QTextStream *g; QString s; KMAccount *a; KMAccountMan *am; Message *m; int delmsgs; Folder download,upload; char buf[80]; am=new KMAccountMan(); for (i=1;icount();i++) { folderTree->cdFolder(&dir,i); if (!dir.exists("accounts")) continue; f=new QFile(dir.absFilePath("accounts")); if (!f->open(IO_ReadWrite)) { delete f; continue; } g=new QTextStream(f); while (!g->eof()) { s=g->readLine(); strcpy(buf,s); printf("account:\t%s\n",buf); if ((a=am->findAccount(s))==NULL) continue; if (a->config->readEntry("access method")=="maintain remotely") continue; delmsgs=a->config->readEntry("access method")=="move messages"; a->getLocation(&s); strcpy(buf,s); printf("location:\t%s\n",buf); download.open(s); if (!dir.exists("contents")) createFolder((const char *)(QString(dir.path())+QString("/contents"))); upload.open(QString(dir.path())+QString("/contents")); for (j=1;j<=download.numMsg();j++) { m=download.getMsg(j); upload.putMsg(m); delete m; } download.close(); upload.close(); } delete g; delete f; } delete am; } void KMMainView::doCompose() { KMComposeWin *d; d = new KMComposeWin(NULL,NULL,NULL); d->show(); d->resize(d->size()); } void KMMainView::doModifyFolder() { if ((folderTree->currentItem())<1) return; // make sure something is selected and it's not "/" KMFolderDialog *d=new KMFolderDialog(this); d->setCaption("Modify Folder"); d->nameEdit->setText(folderTree->getCurrentItem()->getText()); if (d->exec()) { QDir dir; folderTree->cdFolder(&dir); dir.cdUp(); dir.rename(folderTree->getCurrentItem()->getText(),d->nameEdit->text()); folderTree->getList(); } delete d; } void KMMainView::doRemoveFolder() { if ((folderTree->currentItem())<1) return; QString s; QDir dir; s.sprintf("Are you sure you want to remove the folder \"%s\"\n and all of its child folders?", folderTree->getCurrentItem()->getText()); if ((KMsgBox::yesNo(this,"Confirmation",s))==1) { headers->clear(); messageView->clear(); folderTree->cdFolder(&dir); removeDirectory(dir.path()); folderTree->getList(); } } void KMMainView::folderSelected(QDir *d) { QString s=""; s.append(d->path()); s.append("/contents"); if ((d->exists(s))==FALSE) { headers->clear(); return; } Folder *f=new Folder(); f->open(s); headers->setFolder(f); messageView->clear(); } void KMMainView::doDeleteMessage() { headers->toggleDeleteMsg(); } void KMMainView::doForwardMessage() { headers->forwardMsg(); } void KMMainView::doReplyMessage() { headers->replyToMsg(); } void KMMainView::messageSelected(Message *m) { unsigned long int l; messageView->setAutoUpdate(FALSE); messageView->setText(m->getHeader()); messageView->append(m->getText(&l)); messageView->setAutoUpdate(TRUE); messageView->repaint(); } void KMMainView::pannerHasChanged() { resizeEvent(NULL); } void KMMainView::resizeEvent(QResizeEvent *e) { QWidget::resizeEvent(e); horzPanner->setGeometry(0, 0, width(), height()); vertPanner->resize(horzPanner->child0()->width(), horzPanner->child0()->height()); folderTree->resize(vertPanner->child0()->width(), vertPanner->child0()->height()); headers->resize(vertPanner->child1()->width(), vertPanner->child1()->height()); messageView->resize(horzPanner->child1()->width(), horzPanner->child1()->height()); } KMMainWin::KMMainWin(QWidget *, char *name) : KTopLevelWidget(name) { mainView = new KMMainView(this); setView(mainView); parseConfiguration(); setupMenuBar(); setupToolBar(); setupStatusBar(); setMinimumSize(400, 300); windowCount++; } void KMMainWin::parseConfiguration() { KConfig *config; QString s; config=KApplication::getKApplication()->getConfig(); int x=0,y=0,w=400,h=300; config->setGroup("Geometry"); s=config->readEntry("Main"); if ((!s.isEmpty()) && (s.find(',')!=-1)) { sscanf(s,"%d,%d,%d,%d",&x,&y,&w,&h); setGeometry(x,y,w,h); } } void KMMainWin::setupMenuBar() { QPopupMenu *fileMenu = new QPopupMenu(); fileMenu->insertItem("New Composer", mainView, SLOT(doCompose()), Key_C); fileMenu->insertItem("New Mailreader", this, SLOT(doNewMailReader())); fileMenu->insertSeparator(); fileMenu->insertItem("&Settings...", this, SLOT(doSettings())); fileMenu->insertSeparator(); fileMenu->insertItem("&Close", this, SLOT(doClose())); fileMenu->insertItem("&Quit", qApp, SLOT(quit()), ALT + Key_Q); QPopupMenu *messageMenu = new QPopupMenu(); messageMenu->insertItem("&Next", this, SLOT(doUnimplemented()), Key_N); messageMenu->insertItem("&Previous", this, SLOT(doUnimplemented()), Key_P); messageMenu->insertSeparator(); messageMenu->insertItem("Toggle All &Headers", this, SLOT(doUnimplemented()), Key_H); messageMenu->insertSeparator(); messageMenu->insertItem("&Reply...", this, SLOT(doUnimplemented()), Key_R); messageMenu->insertItem("&Forward...", this, SLOT(doUnimplemented()), Key_F); messageMenu->insertSeparator(); messageMenu->insertItem("&Move...", this, SLOT(doUnimplemented()), Key_M); messageMenu->insertItem("&Copy...", this, SLOT(doUnimplemented()), Key_S); messageMenu->insertItem("&Delete", this, SLOT(doUnimplemented()), Key_D); messageMenu->insertItem("&Undelete", this, SLOT(doUnimplemented()), Key_U); messageMenu->insertSeparator(); messageMenu->insertItem("&Export...", this, SLOT(doUnimplemented()), Key_E); messageMenu->insertItem("Pr&int...", this, SLOT(doUnimplemented()), CTRL + Key_P); QPopupMenu *folderMenu = new QPopupMenu(); folderMenu->insertItem("&Create...", mainView, SLOT(doAddFolder()), ALT + Key_C); folderMenu->insertItem("&Modify...", mainView, SLOT(doModifyFolder()), ALT + Key_M); folderMenu->insertItem("&Remove", mainView, SLOT(doRemoveFolder()), ALT + Key_R); QPopupMenu *helpMenu = new QPopupMenu(); helpMenu->insertItem("&Help", this, SLOT(doHelp()), ALT + Key_H), helpMenu->insertSeparator(); helpMenu->insertItem("&About", this, SLOT(doAbout())); menuBar = new KMenuBar(this); menuBar->insertItem("File", fileMenu); menuBar->insertItem("Message", messageMenu); menuBar->insertItem("Folder", folderMenu); menuBar->insertItem("Help", helpMenu); setMenu(menuBar); } void KMMainWin::setupToolBar() { QString pixdir = ""; // pics dir code "inspired" by kghostview (thanks) char *kdedir = getenv("KDEDIR"); if (kdedir) pixdir.append(kdedir); else pixdir.append("/usr/local/kde"); pixdir.append("/lib/pics/toolbar/"); toolBar = new KToolBar(this); QPixmap pixmap; pixmap.load(pixdir+"kmnew.xpm"); toolBar->insertItem(pixmap, 0, SIGNAL(clicked()), mainView, SLOT(doCompose()), TRUE, "compose message"); toolBar->insertSeparator(); pixmap.load(pixdir+"kmcheckmail.xpm"); toolBar->insertItem(pixmap, 0, SIGNAL(clicked()), mainView, SLOT(doCheckMail()), TRUE, "check for new mail"); toolBar->insertSeparator(); pixmap.load(pixdir+"kmreply.xpm"); toolBar->insertItem(pixmap, 0, SIGNAL(clicked()), mainView, SLOT(doReplyMessage()), TRUE, "reply to message"); pixmap.load(pixdir+"kmforward.xpm"); toolBar->insertItem(pixmap, 0, SIGNAL(clicked()), mainView, SLOT(doForwardMessage()), TRUE, "forward message"); pixmap.load(pixdir+"kmdel.xpm"); toolBar->insertItem(pixmap, 0, SIGNAL(clicked()), mainView, SLOT(doDeleteMessage()), TRUE, "delete message"); pixmap.load(pixdir+"kmsave.xpm"); toolBar->insertItem(pixmap, 0, SIGNAL(clicked()), this, SLOT(doUnimplemented()), TRUE, "save message to file"); pixmap.load(pixdir+"kmprint.xpm"); toolBar->insertItem(pixmap, 0, SIGNAL(clicked()), this, SLOT(doUnimplemented()), TRUE, "print message"); toolBar->insertSeparator(); pixmap.load(pixdir+"help.xpm"); toolBar->insertItem(pixmap, 0, SIGNAL(clicked()), this, SLOT(doHelp()), TRUE, "Help"); addToolBar(toolBar); } void KMMainWin::setupStatusBar() { statusBar = new KStatusBar(this); statusBar->enable(KStatusBar::Show); setStatusBar(statusBar); } void KMMainWin::doAbout() { KMsgBox::message(this,"About", "kmail [ALPHA]\n\n" "Yat-Nam Lo \n" "Stephan Meyer \n" "Stefan Taferner \n" "Markus Wübben \n\n" "This program is covered by the GPL.",1); } void KMMainWin::doClose() { close(); } void KMMainWin::doHelp() { KApplication::getKApplication()->invokeHTMLHelp("",""); } void KMMainWin::doNewMailReader() { KMMainWin *d; d = new KMMainWin(NULL); d->show(); d->resize(d->size()); } void KMMainWin::doSettings() { KMSettings *d=new KMSettings(this); d->exec(); delete d; } void KMMainWin::doUnimplemented() { KMsgBox::message(this,"Ouch", "Not yet implemented!\n" "We are sorry for the inconvenience :)",1); } void KMMainWin::closeEvent(QCloseEvent *e) { KTopLevelWidget::closeEvent(e); QString s; KConfig *config; QRect r=geometry(); s.sprintf("%i,%i,%i,%i",r.x(),r.y(),r.width(),r.height()); config=KApplication::getKApplication()->getConfig(); config->setGroup("Geometry"); config->writeEntry("Main",s); delete this; if (!(--windowCount)) qApp->quit(); } main(int argc, char *argv[]) { KApplication *a; KMMainWin *k; initCC(); a = new KApplication(argc, argv, "kmail"); k = new KMMainWin(); kbp = new KBusyPtr(a); k->show(); k->resize(k->size()); // necessary despite resize in constructor a->exec(); delete a; }