You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

757 lines
19 KiB

// kmreaderwin.cpp
#include "kmfolder.h"
#include "kmmessage.h"
#include "kmmsgpart.h"
#include "kmfoldermgr.h"
#include "kmglobal.h"
#include "kmreaderwin.h"
#include "kmreaderwin.moc"
#define FORWARD 0
#define REPLY 1
#define REPLYALL 2
KMReaderView::KMReaderView(QWidget *parent =0, const char *name = 0, int msgno = 0,KMFolder *f = 0)
:QWidget(parent,name)
{
printf("Entering view: msgno = %i \n",msgno);
kdeDir = getenv("KDEDIR");
if(!kdeDir)
{KMsgBox::message(0,"Ouuch","$KDEDIR not set.\nPlease do so");
qApp->quit();
}
picsDir.append(kdeDir);
picsDir +="/lib/pics";
currentFolder = new KMFolder();
currentFolder = f;
currentMessage = new KMMessage();
currentIndex = msgno;
if(f !=0)
currentMessage = f->getMsg(msgno);
else
currentMessage= NULL;
printf("After getmsg\n");
// Let's initialize the HTMLWidget
messageCanvas = new KHTMLWidget(this,0,picsDir);
messageCanvas->setURLCursor(upArrowCursor);
messageCanvas->resize(parent->width()-16,parent->height()-110); //16
connect(messageCanvas,SIGNAL(URLSelected(const char *,int)),this,SLOT(openURL(const char *,int)));
connect(messageCanvas,SIGNAL(popupMenu(const char *, const QPoint &)), SLOT(popupMenu(const char *, const QPoint &)));
vert = new QScrollBar( 0, 110, 12, messageCanvas->height()-110, 0,
QScrollBar::Vertical, this, "vert" );
horz = new QScrollBar( 0, 0, 24, messageCanvas->width()-16, 0,
QScrollBar::Horizontal, this, "horz" );
connect( messageCanvas, SIGNAL( scrollVert( int ) ), SLOT( slotScrollVert(int)));
connect( messageCanvas, SIGNAL( scrollHorz( int ) ), SLOT( slotScrollHorz(int)));
connect( vert, SIGNAL(valueChanged(int)), messageCanvas, SLOT(slotScrollVert(int)));
connect( horz, SIGNAL(valueChanged(int)), messageCanvas, SLOT(slotScrollHorz(int)));
connect( messageCanvas, SIGNAL( documentChanged() ), SLOT( slotDocumentChanged() ) );
connect( messageCanvas, 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
messageCanvas->begin(picsDir);
messageCanvas->write("<HTML><BODY BGCOLOR=WHITE></BODY></HTML>");
messageCanvas->end();
messageCanvas->parse();
}
void KMReaderView::updateDisplay()
{
}
// ********************** Protected **********************
void KMReaderView::resizeEvent(QResizeEvent *)
{
messageCanvas->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(KMMessage *message)
{
QString strTemp;
QString str1Temp;
QString subjStr;
QString text;
QString header;
QString dateStr;
QString fromStr;
QString toStr;
QString ccStr;
long length;
int pos=0;
int numParts = message->numBodyParts();
currentMessage = message; // To make sure currentMessage is set.
printf("Debug numBodyparts=%i\n", numParts);
text = message->body(&length);
if (numParts <= 1) text.truncate(length);
dateStr.sprintf("Date: %s<br>",message->dateStr());
strTemp.sprintf("%s",message->from());
if((pos=strTemp.find("<",0,0)) != -1)
{strTemp.remove(0,pos+1);
strTemp.replace(QRegExp(">",0,0),"");}
fromStr.sprintf("From: <A HREF=\"mailto:");
fromStr.append(strTemp + "\">");
if(pos != -1)
{strTemp.sprintf("%s",message->from());
strTemp.truncate(pos);
}
strTemp = strTemp.stripWhiteSpace();
fromStr.append(strTemp + "</A>"+"<br>");
ccStr = message->cc();
if(ccStr.isEmpty())
ccStr = "";
else
{ccStr="";
ccStr.sprintf("Cc: %s<br>",message->cc());}
subjStr.sprintf("Subject: %s<br><P>",message->subject());
toStr.sprintf("To: %s<br>", message->to());
// Init messageCanvas
messageCanvas->begin(picsDir);
// header
messageCanvas->write("<TABLE><TR><TD><IMG SRC=\"" + picsDir +"/kdelogo.xpm\"></TD><TD HSPACE=50><B>");
messageCanvas->write(subjStr);
messageCanvas->write(fromStr);
messageCanvas->write(toStr);
messageCanvas->write(ccStr);
messageCanvas->write(dateStr);
messageCanvas->write("</B></TD></TR></TABLE><br><br>");
// Prepare text
//***** 1. Search for hyperlinks (http, ftp , @) ********//
// ****** 2. Check if message body is html. Search for <html> tag ********//
/*
if((text.find(QRegExp("<html>",0,0)) != -1) && (text.find(QRegExp("</html>",0,0)) != -1)) // we found the tags
printf("Found html tags!\n");
else
{// First of all convert escape sequences etc to html*/
text.replace(QRegExp("\n"),"<BR>");
text.replace(QRegExp("\\x20",FALSE,FALSE),"&nbsp"); // SP
messageCanvas->write("<HTML><HEAD><TITLE></TITLE></HEAD>");
messageCanvas->write("<BODY BGCOLOR=WHITE>");
//}
// Okay! Let's write it to the canvas
messageCanvas->write(text);
printf("before part\n");
/* int x=0;
for(x=1;x <= numParts;x++)
{printf("x : %i\n",x);
KMMessagePart *part = new KMMessagePart;
currentMessage->bodyPart(x,part);
cout << part->typeStr();
cout << part->subtypeStr();
delete part;
}*/
messageCanvas->write("</BODY></HTML>");
messageCanvas->end();
messageCanvas->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 mailString;
QString fileName;
QFile *file;
fileName = QFileDialog::getSaveFileName(NULL,"*.kmail",0);
if(fileName.isEmpty())
return;
file = new QFile(fileName);
if(file->exists())
{int i = KMsgBox::yesNoCancel(0,"Question?","The file you selected already exists! Overwrite?");
printf("i = %i\n",i);
if(i==1); // How do I remove a file with QT??
else if(i==2)
{delete file;
saveMail();}
else if(i==3)
{delete file;
return; }
}
if(!file->open(IO_ReadWrite))
{KMsgBox::message(0,"Ouuch","Could not open file!");
return;}
mailString = currentMessage->asString();
file->writeBlock(mailString,mailString.length()-1);
file->close();
}
void KMReaderView::printMail()
{
}
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 ( messageCanvas->docHeight() > messageCanvas->height() )
vert->setRange( 0, messageCanvas->docHeight() - messageCanvas->height() );
else
vert->setRange( 0, 0 );
if ( messageCanvas->docWidth() > messageCanvas->width() )
horz->setRange( 0, messageCanvas->docWidth() - messageCanvas->width() );
else
horz->setRange( 0, 0 );
}
void KMReaderView::slotDocumentDone()
{
vert->setValue( 0 );
}
void KMReaderView::openURL(const char *url, int)
{
printf("URL selected\n");
QString fullURL;
fullURL = url;
cout << fullURL << "\n";
if ( fullURL.find( "http:" ) >= 0 )
{QString cmd = "kfmclient exec ";
cmd += fullURL;
cmd += " Open";
system( cmd );
}
else if ( fullURL.find( "ftp:" ) >= 0 )
{
QString cmd = "kfmclient exec ";
cmd += fullURL;
cmd += " Open";
system( cmd );
}
else if ( fullURL.find( "mailto:" ) >= 0 )
{ fullURL.remove(0,7);
KMComposeWin *w = new KMComposeWin(0,0,fullURL);
w->show();
w->resize(w->size());
}
}
void KMReaderView::popupHeaderMenu(const char *_url, const QPoint &cords)
{
printf("Right mouse button pressed on headerCanvas\n");
QString url = _url;
if(!url.isEmpty())
{printf("Mouse was pressed over an url!\n");
QPopupMenu *p = new QPopupMenu();
p->insertItem("Add to Addressbook");
p->insertItem("Properties");
p->popup(cords,0);}
}
void KMReaderView::popupMenu(const char *_url, const QPoint &cords)
{
QString temp=_url;
int number;
printf("Right mouse button pressed on messageCanvas\n");
if(temp.isEmpty())
{printf("Mouse was not over an url!\n"); // Pressed outside url
QPopupMenu *p = new QPopupMenu();
p->insertItem("Reply to Sender",this,SLOT(replyMessage()));
p->insertItem("Reply to All Recipients",this,SLOT(replyAll()));
p->insertItem("Forward Message",this,SLOT(forwardMessage()));
p->insertSeparator();
QPopupMenu *folderMenu = new QPopupMenu(); // dummy
folderMenu->insertItem("Inbox");
folderMenu->insertItem("Sent messages");
folderMenu->insertItem("Trash");
p->insertItem("Send Message to Folder",folderMenu);
p->insertItem("Delete Message");
p->insertItem("Save Message",this,SLOT(saveMail()));
p->insertItem("Print Message",this,SLOT(printMail()));
p->popup(cords,0);}
else
{printf("Mouse was pressed over an url: %s\n",_url); // Pressed over url
temp.replace(QRegExp("file:/"),"");
cout << temp << "\n";
number = temp.toUInt();
printf("Attachment : %i",number);
currentAtmnt = number;
QPopupMenu *p = new QPopupMenu();
p->insertItem("Open...",this,SLOT(openAtmnt()));
p->insertItem("Print...",this,SLOT(printAtmnt()));
p->insertItem("Save as...",this,SLOT(saveAtmnt()));
p->insertItem("Quick View...",this,SLOT(viewAtmnt()));
p->popup(cords,0);}
}
void KMReaderView::saveURL(int)
{
printf("Entering saveURL()\n");
}
void KMReaderView::copy()
{
messageCanvas->getSelectedText(selectedText);
}
void KMReaderView::markAll()
{
}
void KMReaderView::viewSource()
{
QString text;
KMProperties *p = new KMProperties(0,0,currentMessage);
p->show();
p->resize(p->size());
}
/***************************************************************************/
/***************************************************************************/
KMReaderWin::KMReaderWin(QWidget *, const char *, int msgno = 0,KMFolder *f =0)
:KTopLevelWidget(NULL)
{
tempFolder = new KMFolder();
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);
}
void KMReaderWin::show()
{
KTopLevelWidget::show();
resize(size());
}
// ******************** 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;
}
// ***************** 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...",newView,SLOT(printMail()),ALT+Key_P);
menu->insertItem("Properties",newView,SLOT(viewSource()),ALT+Key_O);
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",newView,SLOT(copy()),CTRL+Key_C);
menu->insertItem("Mark all",newView,SLOT(markAll()));
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
{KMsgBox::message(0,"Oucch","$KDEDIR not set. Please do so");
qApp->quit();
}
pixdir += "/lib/pics/toolbar/";
toolBar = new KToolBar(this);
QPixmap pixmap;
pixmap.load(pixdir+"kmsave.xpm");
toolBar->insertButton(pixmap,0,SIGNAL(clicked()),newView,SLOT(saveMail()),TRUE,"Save Mail");
pixmap.load(pixdir+"kmprint.xpm");
toolBar->insertButton(pixmap,1,SIGNAL(clicked()),newView,SLOT(printMail()),TRUE,"Print");
toolBar->insertSeparator();
pixmap.load(pixdir+"kmreply.xpm");
toolBar->insertButton(pixmap,2,SIGNAL(clicked()),newView,SLOT(replyMessage()),TRUE,"Reply");
pixmap.load(pixdir+"kmreply.xpm");
toolBar->insertButton(pixmap,3,SIGNAL(clicked()),newView,SLOT(replyAll()),TRUE,"Reply all");
pixmap.load(pixdir+"kmforward.xpm");
toolBar->insertButton(pixmap,4,SIGNAL(clicked()),newView,SLOT(forwardMessage()),TRUE,"Forward");
toolBar->insertSeparator();
pixmap.load(pixdir+"down.xpm");
toolBar->insertButton(pixmap,5,SIGNAL(clicked()),newView,SLOT(nextMessage()),TRUE,"Next message");
pixmap.load(pixdir+"up.xpm");
toolBar->insertButton(pixmap,6,SIGNAL(clicked()),newView,SLOT(previousMessage()),TRUE,"Previous message");
toolBar->insertSeparator();
pixmap.load(pixdir+"kmdel.xpm");
toolBar->insertButton(pixmap,7,SIGNAL(clicked()),newView,SLOT(deleteMessage()),TRUE,"Delete Message");
toolBar->insertSeparator();
pixmap.load(pixdir+"help.xpm");
toolBar->insertButton(pixmap,8,SIGNAL(clicked()),this,SLOT(invokeHelp()),TRUE,"Help");
addToolBar(toolBar);
}
void KMReaderWin::invokeHelp()
{
KApplication::getKApplication()->invokeHTMLHelp("","");
}
void KMReaderWin::toDo()
{
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 <lynx@topaz.hknet.com>\n"
"Stephan Meyer <Stephan.Meyer@munich.netsurf.de>\n"
"Stefan Taferner <taferner@alpin.or.at>\n"
"Markus W<EFBFBD>bben <markus.wuebben@kde.org>\n\n"
"This program is covered by the GPL.",1);
}
void KMReaderWin::toggleToolBar()
{
enableToolBar(KToolBar::Toggle);
}
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();
}
KMProperties::KMProperties(QWidget *parent=0, const char *name=0, KMMessage *cM=0)
: QDialog(parent, name)
{
QString text = cM->asString();
setMaximumSize(410,472);
setMinimumSize(410,472);
tabDialog = new QTabDialog(this,"main",FALSE,0);
tabDialog->move(0,0);
topLevel = new KMGeneral(tabDialog,"kfs",cM);
tabDialog->addTab(topLevel,"General");
sourceWidget = new KMSource(tabDialog,"Source", text);
tabDialog->addTab(sourceWidget,"Source");
connect(tabDialog,SIGNAL(applyButtonPressed()),qApp,SLOT(quit()) );
}
KMProperties::~KMProperties()
{
delete topLevel;
delete sourceWidget;
delete tabDialog;
}
KMGeneral::KMGeneral(QWidget *parent=0, const char *name=0, KMMessage *cM=0)
: QDialog(parent, name)
{
setMinimumSize(400,370);
setMaximumSize(400,370);
tempMes = new KMMessage();
tempMes =cM;
}
void KMGeneral::paintEvent(QPaintEvent *)
{
QPainter p;
QString temp;
p.begin(this);
QPoint point(20,30);
QPixmap pix("/usr/local/kde/lib/pics/kmsend.xpm");
p.drawPixmap(point,pix);
p.setPen(black);
temp.sprintf("Subject: %s", tempMes->subject());
p.drawText(60, 30, temp);
temp.sprintf("From: %s", tempMes->from());
p.drawText(60, 60, temp);
p.drawLine(10,80,380,80);
temp = tempMes->asString();
temp.sprintf("Size: %i kb",temp.length()/1024);
p.drawText(20,100,temp);
p.drawText(20,130,"Folder:");
p.drawLine(10,150,380,150);
temp.sprintf("Attachments: %i", tempMes->numBodyParts());
p.drawText(20,170,temp);
p.drawText(20,200,"Format:");
p.drawLine(10,220,380,220);
temp.sprintf("Sent: %s", tempMes->dateStr());
p.drawText(20,240,temp);
p.drawText(20,270,"Recieved on:");
p.end();
}
KMSource::KMSource(QWidget *parent=0, const char *name=0,QString text=0)
: QDialog(parent, name)
{
edit = new QMultiLineEdit(this);
edit->resize(360,340);
edit->move(20,20);
edit->setText(text);
edit->setReadOnly(TRUE);
}