#include "kmreaderwin.moc" #define FORWARD 0 #define REPLY 1 #define REPLYALL 2 KMReaderView::KMReaderView(QWidget *parent =0, const char *name = 0, int msgno = 0,Folder *f = 0) :QWidget(parent,name) { printf("Entering view: msgno = %i \n",msgno); currentFolder = new Folder(); currentFolder = f; currentMessage = new Message(); currentIndex = msgno; if(f !=0) currentMessage = f->getMsg(msgno); else currentMessage= NULL; printf("After getmsg\n"); // Let's initialize the HTMLWidget theCanvas = new KHTMLWidget(this,0,"/kde/lib/pics/"); theCanvas->setURLCursor(upArrowCursor); theCanvas->resize(parent->width()-16,parent->height()-16); connect(theCanvas,SIGNAL(URLSelected(const char *,int)),this,SLOT(openURL(const char *,int))); vert = new QScrollBar( 0, 0, 12, theCanvas->height()-16, 0, QScrollBar::Vertical, this, "vert" ); horz = new QScrollBar( 0, 0, 24, theCanvas->width()-16, 0, QScrollBar::Horizontal, this, "horz" ); connect( theCanvas, SIGNAL( scrollVert( int ) ), SLOT( slotScrollVert(int))); connect( theCanvas, SIGNAL( scrollHorz( int ) ), SLOT( slotScrollHorz(int))); connect( vert, SIGNAL(valueChanged(int)), theCanvas, SLOT(slotScrollVert(int))); connect( horz, SIGNAL(valueChanged(int)), theCanvas, SLOT(slotScrollHorz(int))); connect( theCanvas, SIGNAL( documentChanged() ), SLOT( slotDocumentChanged() ) ); connect( theCanvas, SIGNAL( documentDone() ), SLOT( slotDocumentDone() ) ); // Puh, okay this is done QAccel *accel = new QAccel( this ); accel->connectItem( accel->insertItem(Key_Up),this,SLOT(slotScrollLeRi()) ); accel->connectItem( accel->insertItem(Key_Down),this,SLOT(slotScrollUpDo()) ); if(currentMessage) parseMessage(currentMessage); else clearCanvas(); printf("Leaving constructor\n"); } // *********************** Public slots ******************* void KMReaderView::clearCanvas() { // Produce a white canvas theCanvas->begin(); theCanvas->write(""); theCanvas->end(); theCanvas->parse(); } void KMReaderView::updateDisplay() { } // ********************** Protected ********************** void KMReaderView::resizeEvent(QResizeEvent *) { theCanvas->setGeometry(0,0,this->width()-16,this->height()-16); horz->setGeometry(0,height()-16,width()-16,16); vert->setGeometry(width()-16,0,16,height()); } // ******************* Private slots ******************** void KMReaderView::parseMessage(Message *message) { QString fromStr; QString subjStr; QString text; QString header; char sfrom[256]; char ssubj[512]; ulong length; const char *B[] = BODYTYPE; const char *E[] = ENCODING; currentMessage = message; // To make sure currentMessage is set. KConfig *config = new KConfig(); config = KApplication::getKApplication()->getConfig(); text = config->readEntry("Header"); if( !text.isEmpty() && text.find("full",0,false) == 0 ) displayFull = true; else displayFull = false; int noAttach; if(!(noAttach =message->numAttch())) text = message->getText(&length); else {text = message->getText(&length); text.truncate(length); } header = message->getHeader(); // Ok. Convert the text to html header.replace(QRegExp("\n"),"
"); text.replace(QRegExp("\n"),"
"); theCanvas->begin(); theCanvas->write(""); theCanvas->write(""); if(displayFull) {theCanvas->write(header); theCanvas->write(text); } else {message->getFrom(sfrom); message->getSubject(ssubj); char sdate[256]; char scc[256]; QString dateStr; QString ccStr; message->getCc(scc); message->getLongDate(sdate); dateStr.sprintf("Date: %s
",sdate); fromStr.sprintf("From: %s
",sfrom); ccStr.sprintf("Cc: %s
",scc); subjStr.sprintf("Subject: %s

",ssubj); theCanvas->write(dateStr); theCanvas->write(fromStr); theCanvas->write(ccStr); theCanvas->write(subjStr); theCanvas->write(text); } if(noAttach != 0) {while(noAttach > 0) {printf("Attach : %i\n",noAttach); printf("OK: Writing image for attachment\n"); Attachment *atmnt = new Attachment(); theCanvas->write("


write(t); theCanvas->write("\">"); theCanvas->write("
write(t); theCanvas->write("\">Part 1."); t.sprintf("%i",noAttach); theCanvas->write(t); theCanvas->write(""); theCanvas->write("
Name:"); atmnt = message->getAttch(noAttach); t = atmnt->getFilename(); theCanvas->write(t); theCanvas->write("
Type:"); t.sprintf("%s", B[atmnt->getType()]); theCanvas->write(t); theCanvas->write("
Encoding:"); t.sprintf("%s",E[atmnt->getEncoding()]); theCanvas->write(t); theCanvas->write("
"); noAttach--; delete atmnt; } } theCanvas->write(""); theCanvas->end(); theCanvas->parse(); printf("Leaving parsing\n"); } void KMReaderView::replyMessage() { printf("Entering reply\n"); KMComposeWin *c = new KMComposeWin(NULL,NULL,NULL,currentMessage,REPLY); c->show(); c->resize(c->size()); printf("Leaving reply()\n"); } void KMReaderView::replyAll() { KMComposeWin *c = new KMComposeWin(NULL,NULL,NULL,currentMessage,REPLYALL); c->show(); c->resize(c->size()); printf("Leaving replyAll()\n"); } void KMReaderView::forwardMessage() { KMComposeWin *c = new KMComposeWin(NULL,NULL,NULL,currentMessage,FORWARD); c->show(); c->resize(c->size()); } void KMReaderView::nextMessage() { currentIndex++; printf("Index (next) : %i\n",currentIndex); clearCanvas(); currentMessage = currentFolder->getMsg(currentIndex); parseMessage(currentMessage); } void KMReaderView::previousMessage() { if(currentIndex == 1) return; currentIndex--; printf("Index (prev) : %i\n",currentIndex); clearCanvas(); currentMessage = currentFolder->getMsg(currentIndex); parseMessage(currentMessage); } void KMReaderView::deleteMessage() { printf("Message %i will be deleted\n",currentIndex); currentMessage->del(); currentIndex--; currentFolder->expunge(); nextMessage(); } void KMReaderView::saveMail() { QString pwd; QString file; char buf[511]; pwd.sprintf("%s",getcwd(buf,sizeof(buf))); file = QFileDialog::getSaveFileName(pwd,0,this); if(!file.isEmpty()) {printf("EMail will be saved\n"); QFile *f = new QFile(file); if(!f->open(IO_ReadWrite)) return; else f->close(); Folder *saveFolder = new Folder(); if(!saveFolder->open(file)) {KMsgBox::message(0,"Ouch","SaveFile could not be opened\n"); return; } if(!saveFolder->putMsg(currentMessage)) {KMsgBox::message(0,"Ouch","Could not save message\n"); saveFolder->close(); return; } saveFolder->close(); } else {} } void KMReaderView::slotScrollVert( int _y ) { vert->setValue( _y ); } void KMReaderView::slotScrollHorz( int _x ) { horz->setValue( _x ); } void KMReaderView::slotScrollUpDo() { printf("Entering slotScrollUpDo\n"); int i = vert->value(); i--; horz->setValue(i); } void KMReaderView::slotScrollLeRi() { printf("Entering slotScrollLeRi\n"); int i = vert->value(); i++; vert->setValue(i); } void KMReaderView::slotDocumentChanged() { if ( theCanvas->docHeight() > theCanvas->height() ) vert->setRange( 0, theCanvas->docHeight() - theCanvas->height() ); else vert->setRange( 0, 0 ); if ( theCanvas->docWidth() > theCanvas->width() ) horz->setRange( 0, theCanvas->docWidth() - theCanvas->width() ); else horz->setRange( 0, 0 ); } void KMReaderView::slotDocumentDone() { vert->setValue( 0 ); } void KMReaderView::openURL(const char *url, int) { QString temp; int number; printf("URL selected\n"); cout << url << "\n"; temp = url; temp.replace(QRegExp(":/"),""); cout << temp << "\n"; number = temp.toUInt(); printf("Attachment : %i",number); saveURL(number); } void KMReaderView::saveURL(int num) { printf("Entering saveURL()\n"); Attachment *a = new Attachment(); a = currentMessage->getAttch(num); QString pwd; QString file; char buf[511]; pwd.sprintf("%s",getcwd(buf,sizeof(buf))); file = QFileDialog::getSaveFileName(pwd,0,this); if(!file.isEmpty()) {printf("Attachment will be saved\n"); a->save(file); } else {} return; } /***************************************************************************/ /***************************************************************************/ KMReaderWin::KMReaderWin(QWidget *, const char *, int msgno = 0,Folder *f =0) :KTopLevelWidget(NULL) { tempFolder = new Folder(); tempFolder = f; setCaption("KMail Reader"); parseConfiguration(); newView = new KMReaderView(this,NULL, msgno,f); setView(newView); setupMenuBar(); setupToolBar(); if(!showToolBar) enableToolBar(KToolBar::Hide); resize(480, 510); } // ******************** Public slots ******************** void KMReaderWin::parseConfiguration() { KConfig *config; QString o; printf("Entering parseConfig\n"); config = KApplication::getKApplication()->getConfig(); config->setGroup("Settings"); o = config->readEntry("Reader ShowToolBar"); if((!o.isEmpty() && o.find("no",0,false)) == 0) showToolBar = 0; else showToolBar = 1; o = config->readEntry("Header"); if( !o.isEmpty() && o.find("half",0,false) ==0) displayFull = false; else displayFull = true; } // ***************** Private slots ******************** void KMReaderWin::setupMenuBar() { menuBar = new KMenuBar(this); QPopupMenu *menu = new QPopupMenu(); menu->insertItem("Save...",newView,SLOT(saveMail()),ALT+Key_S); menu->insertItem("Address Book...",this,SLOT(toDo()),ALT+Key_B); menu->insertItem("Print...",this,SLOT(toDo()),ALT+Key_P); menu->insertSeparator(); menu->insertItem("New Composer",this,SLOT(newComposer()),ALT+Key_C); menu->insertItem("New Mailreader",this,SLOT(newReader()),ALT+Key_R); menu->insertSeparator(); menu->insertItem("Close",this,SLOT(abort()),CTRL+ALT+Key_C); menuBar->insertItem("File",menu); menu = new QPopupMenu(); menu->insertItem("Copy",this,SLOT(toDo()),CTRL+Key_C); menu->insertItem("Mark all",this,SLOT(toDo())); menu->insertSeparator(); menu->insertItem("Find...",this,SLOT(toDo())); menuBar->insertItem("Edit",menu); menu = new QPopupMenu(); menu->insertItem("Reply...",newView,SLOT(replyMessage()),ALT+Key_R); menu->insertItem("Reply all...", newView,SLOT(replyAll()),ALT+Key_A); menu->insertItem("Forward ...",newView,SLOT(forwardMessage()),ALT+Key_F); menu->insertSeparator(); menu->insertItem("Next...",newView,SLOT(nextMessage()),Key_Next); menu->insertItem("Previous...",newView,SLOT(previousMessage()),Key_Prior); menu->insertSeparator(); menu->insertItem("Delete...",newView,SLOT(deleteMessage()), Key_Delete); menuBar->insertItem("Message",menu); menu = new QPopupMenu(); menu->insertItem("Toggle Toolbar", this, SLOT(toggleToolBar()),ALT+Key_O); menuBar->insertItem("Options",menu); menuBar->insertSeparator(); menu = new QPopupMenu(); menu->insertItem("Help",this,SLOT(invokeHelp()),ALT+Key_H); menu->insertSeparator(); menu->insertItem("About",this,SLOT(about())); menuBar->insertItem("Help",menu); setMenu(menuBar); } void KMReaderWin::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+"mailsave.xpm"); toolBar->insertItem(pixmap,0,SIGNAL(clicked()),newView,SLOT(saveMail()),TRUE,"Save Mail"); pixmap.load(pixdir+"fileprint.xpm"); toolBar->insertItem(pixmap,1,SIGNAL(clicked()),this,SLOT(toDo()),TRUE,"Print"); toolBar->insertSeparator(); pixmap.load(pixdir+"reply.xpm"); toolBar->insertItem(pixmap,2,SIGNAL(clicked()),newView,SLOT(replyMessage()),TRUE,"Reply"); pixmap.load(pixdir+"reply.xpm"); toolBar->insertItem(pixmap,3,SIGNAL(clicked()),newView,SLOT(replyAll()),TRUE,"Reply all"); pixmap.load(pixdir+"kmforward.xpm"); toolBar->insertItem(pixmap,4,SIGNAL(clicked()),newView,SLOT(forwardMessage()),TRUE,"Forward"); toolBar->insertSeparator(); pixmap.load(pixdir+"down.xpm"); toolBar->insertItem(pixmap,5,SIGNAL(clicked()),newView,SLOT(nextMessage()),TRUE,"Next message"); pixmap.load(pixdir+"up.xpm"); toolBar->insertItem(pixmap,6,SIGNAL(clicked()),newView,SLOT(previousMessage()),TRUE,"Previous message"); toolBar->insertSeparator(); pixmap.load(pixdir+"maildel.xpm"); toolBar->insertItem(pixmap,7,SIGNAL(clicked()),newView,SLOT(deleteMessage()),TRUE,"Delete Message"); toolBar->insertSeparator(); pixmap.load(pixdir+"help.xpm"); toolBar->insertItem(pixmap,8,SIGNAL(clicked()),this,SLOT(invokeHelp()),TRUE,"Help"); addToolBar(toolBar); } void KMReaderWin::invokeHelp() { KApplication::getKApplication()->invokeHTMLHelp("",""); } void KMReaderWin::toDo() { // KMMainWin::doUnimplemented(); //is private :-( KMsgBox::message(this,"Ouch", "Not yet implemented!\n" "We are sorry for the inconvenience :-)",1); } void KMReaderWin::newComposer() { KMComposeWin *k = new KMComposeWin(); k->show(); k->resize(k->size()); } void KMReaderWin::newReader() { /* KMMainWin *w = new KMMainWin(); w->show(); w->resize(w->size());*/ } void KMReaderWin::about() { 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 KMReaderWin::toggleToolBar() { enableToolBar(KToolBar::Toggle); } /*void KMReaderWin::setSettings() { setWidget = new QWidget(0,NULL); setWidget->setMinimumSize(400,300); setWidget->setMaximumSize(400,300); setWidget->setCaption("Settings"); QPushButton *ok_bt = new QPushButton("OK",setWidget,NULL); ok_bt->setGeometry(220,240,70,30); connect(ok_bt,SIGNAL(clicked()),this,SLOT(applySettings())); QPushButton *cancel_bt = new QPushButton("Cancel",setWidget,NULL); cancel_bt->setGeometry(310,240,70,30); connect(cancel_bt,SIGNAL(clicked()),this,SLOT(cancelSettings())); QButtonGroup *btGrp = new QButtonGroup(setWidget,NULL); btGrp->setTitle("Options"); btGrp->setGeometry(20,20,360,200); QLabel *headerLabel = new QLabel("The Reader should display",btGrp,NULL); headerLabel->setGeometry(20,20,200,30); fullHeader = new QRadioButton("'the full header'",btGrp,NULL); fullHeader->setGeometry(30,50,150,20); halfHeader = new QRadioButton("'the most important'",btGrp,NULL); halfHeader->setGeometry(30,80,150,20); if(displayFull == false) halfHeader->setChecked(true); else fullHeader->setChecked(true); setWidget->show(); } void KMReaderWin::applySettings() { KConfig *config; if(halfHeader->isChecked()) displayFull=false; else displayFull=true; config = KApplication::getKApplication()->getConfig(); config->setGroup("Settings"); if(halfHeader->isChecked()) {displayFull=false; config->writeEntry("Header","half"); } else {displayFull=true; config->writeEntry("Header","full"); } config->sync(); newView->updateDisplay(); delete setWidget; } void KMReaderWin::cancelSettings() { delete setWidget; } */ void KMReaderWin::abort() { close(); } // **************** Protected ************************ void KMReaderWin::closeEvent(QCloseEvent *e) { KTopLevelWidget::closeEvent(e); delete this; KConfig *config = new KConfig(); config = KApplication::getKApplication()->getConfig(); config->setGroup("Settings"); if(showToolBar) config->writeEntry("Reader ShowToolBar","yes"); else config->writeEntry("Reader ShowToolBar","no"); config->sync(); }