* better addressbook integration

* popup menus on URLs in the reader
* small bugfix: auto-pgp-sign in composer not always on per default now

svn path=/trunk/kdenetwork/kmail/; revision=4076
wilder-work
Stefan Taferner 29 years ago
parent 898d477166
commit 2365b92b60
  1. 6
      kmaddrbookdlg.cpp
  2. 9
      kmaddrbookdlg.h
  3. 57
      kmcomposewin.cpp
  4. 12
      kmcomposewin.h
  5. 170
      kmmainwin.cpp
  6. 17
      kmmainwin.h
  7. 8
      kmmessage.cpp
  8. 36
      kmreaderwin.cpp
  9. 5
      kmreaderwin.h

@ -17,6 +17,7 @@ KMAddrBookSelDlg::KMAddrBookSelDlg(KMAddrBook* aAddrBook, const char* aCap):
const char* addr;
initMetaObject();
setCaption(aCap ? aCap : klocale->translate("Addressbook"));
assert(aAddrBook != NULL);
mAddrBook = aAddrBook;
@ -80,7 +81,7 @@ void KMAddrBookSelDlg::slotCancel()
//=============================================================================
KMAddrBookEditDlg::KMAddrBookEditDlg(KMAddrBook* aAddrBook, const char* aCap):
KMAddrBookEditDlgInherited(NULL, aCap, TRUE), mGrid(this, 3, 4),
KMAddrBookEditDlgInherited(NULL, NULL, TRUE), mGrid(this, 3, 4),
mListBox(this), mEdtAddress(this),
mBtnOk(klocale->translate("Ok"),this),
mBtnCancel(klocale->translate("Cancel"),this),
@ -90,6 +91,7 @@ KMAddrBookEditDlg::KMAddrBookEditDlg(KMAddrBook* aAddrBook, const char* aCap):
const char* addr;
initMetaObject();
setCaption(aCap ? aCap : klocale->translate("Addressbook Manager"));
assert(aAddrBook != NULL);
mAddrBook = aAddrBook;
@ -195,6 +197,8 @@ void KMAddrBookEditDlg::slotRemove()
int idx = mListBox.currentItem();
mIndex = -1;
if (idx >= 0) mListBox.removeItem(idx);
if (idx >= mListBox.count()) idx--;
mListBox.setCurrentItem(idx);
}

@ -18,11 +18,12 @@ class KMAddrBookSelDlg: public QDialog
{
Q_OBJECT
public:
KMAddrBookSelDlg(KMAddrBook* addrBook, const char* caption);
KMAddrBookSelDlg(KMAddrBook* addrBook, const char* caption=NULL);
virtual ~KMAddrBookSelDlg();
/** returns selected address or NULL if none was selected or the cancel
button was pressed. */
/** returns selected address(es) or NULL if none was selected or the cancel
button was pressed. If multiple addresses were selected they
are returned comma separated. */
virtual const QString address(void) const { return mAddress; }
protected slots:
@ -45,7 +46,7 @@ class KMAddrBookEditDlg: public QDialog
{
Q_OBJECT
public:
KMAddrBookEditDlg(KMAddrBook* addrBook, const char* caption);
KMAddrBookEditDlg(KMAddrBook* addrBook, const char* caption=NULL);
virtual ~KMAddrBookEditDlg();
protected slots:

@ -11,6 +11,7 @@
#include "kbusyptr.h"
#include "kmmsgpartdlg.h"
#include "kpgp.h"
#include "kmaddrbookdlg.h"
#include <assert.h>
#include <drag.h>
@ -81,7 +82,9 @@ KMComposeWin::KMComposeWin(KMMessage *aMsg) : KMComposeWinInherited(),
mEdtFrom(&mMainWidget), mEdtReplyTo(&mMainWidget), mEdtTo(&mMainWidget),
mEdtCc(&mMainWidget), mEdtBcc(&mMainWidget), mEdtSubject(&mMainWidget),
mLblFrom(&mMainWidget), mLblReplyTo(&mMainWidget), mLblTo(&mMainWidget),
mLblCc(&mMainWidget), mLblBcc(&mMainWidget), mLblSubject(&mMainWidget)
mLblCc(&mMainWidget), mLblBcc(&mMainWidget), mLblSubject(&mMainWidget),
mBtnTo("...",&mMainWidget), mBtnCc("...",&mMainWidget),
mBtnBcc("...",&mMainWidget)
/* start added for KRN */
,mEdtNewsgroups(&mMainWidget),mEdtFollowupTo(&mMainWidget),
mLblNewsgroups(&mMainWidget),mLblFollowupTo(&mMainWidget)
@ -116,6 +119,9 @@ KMComposeWin::KMComposeWin(KMMessage *aMsg) : KMComposeWinInherited(),
connect(&mEdtSubject,SIGNAL(textChanged(const char *)),
SLOT(slotUpdWinTitle(const char *)));
connect(&mBtnTo,SIGNAL(clicked()),SLOT(slotAddrBookTo()));
connect(&mBtnCc,SIGNAL(clicked()),SLOT(slotAddrBookCc()));
connect(&mBtnBcc,SIGNAL(clicked()),SLOT(slotAddrBookBcc()));
mDropZone = new KDNDDropZone(mEditor, DndURL);
connect(mDropZone, SIGNAL(dropAction(KDNDDropZone *)),
@ -240,11 +246,11 @@ void KMComposeWin::rethinkFields(void)
rethinkHeaderLine(showHeaders,HDR_REPLY_TO,row,nls->translate("&Reply to:"),
&mLblReplyTo, &mEdtReplyTo);
rethinkHeaderLine(showHeaders,HDR_TO, row, nls->translate("&To:"),
&mLblTo, &mEdtTo);
&mLblTo, &mEdtTo, &mBtnTo);
rethinkHeaderLine(showHeaders,HDR_CC, row, nls->translate("&Cc:"),
&mLblCc, &mEdtCc);
&mLblCc, &mEdtCc, &mBtnCc);
rethinkHeaderLine(showHeaders,HDR_BCC, row, nls->translate("&Bcc:"),
&mLblBcc, &mEdtBcc);
&mLblBcc, &mEdtBcc, &mBtnBcc);
rethinkHeaderLine(showHeaders,HDR_SUBJECT, row, nls->translate("&Subject:"),
&mLblSubject, &mEdtSubject);
rethinkHeaderLine(showHeaders,HDR_NEWSGROUPS, row, nls->translate("&Newsgroups:"),
@ -457,7 +463,7 @@ void KMComposeWin::setupToolBar(void)
mToolBar->insertButton(loader->loadIcon("feather_white.xpm"), mBtnIdSign,
TRUE, nls->translate("sign message"));
mToolBar->setToggle(mBtnIdSign);
mToolBar->setButton(mBtnIdSign,mShowToolBar);
mToolBar->setButton(mBtnIdSign, mAutoPgpSign);
mBtnIdEncrypt = 10;
mToolBar->insertButton(loader->loadIcon("pub_key_red.xpm"), mBtnIdEncrypt,
TRUE, nls->translate("encrypt message"));
@ -813,6 +819,45 @@ void KMComposeWin::removeAttach(int idx)
}
//-----------------------------------------------------------------------------
void KMComposeWin::addrBookSelInto(KMLineEdit* aLineEdit)
{
KMAddrBookSelDlg dlg(addrBook);
QString txt;
assert(aLineEdit!=NULL);
if (dlg.exec()==QDialog::Rejected) return;
txt = QString(aLineEdit->text()).stripWhiteSpace();
if (!txt.isEmpty())
{
if (txt.right(1)!=',') txt += ", ";
else txt += ' ';
}
aLineEdit->setText(txt + dlg.address());
}
//-----------------------------------------------------------------------------
void KMComposeWin::slotAddrBookTo()
{
addrBookSelInto(&mEdtTo);
}
//-----------------------------------------------------------------------------
void KMComposeWin::slotAddrBookCc()
{
addrBookSelInto(&mEdtCc);
}
//-----------------------------------------------------------------------------
void KMComposeWin::slotAddrBookBcc()
{
addrBookSelInto(&mEdtBcc);
}
//-----------------------------------------------------------------------------
void KMComposeWin::slotAttachFile()
{
@ -832,6 +877,7 @@ void KMComposeWin::slotAttachFile()
}
//-----------------------------------------------------------------------------
void KMComposeWin::slotInsertFile()
{
// Create File Dialog and return selected file
@ -865,6 +911,7 @@ void KMComposeWin::slotInsertFile()
f->close();
}
//-----------------------------------------------------------------------------
void KMComposeWin::slotAttachPopupMenu(int index, int)
{

@ -11,6 +11,7 @@
#include <qlist.h>
#include <qevent.h>
#include <qwidget.h>
#include <qpushbt.h>
#include <qclipbrd.h>
#include <qpalette.h>
#include <kmsgbox.h>
@ -124,6 +125,12 @@ public slots:
/** Change visibility of a header field. */
void slotMenuViewActivated(int id);
/** Select an email from the addressbook and add it to the line
the pressed button belongs to. */
void slotAddrBookTo();
void slotAddrBookCc();
void slotAddrBookBcc();
protected:
/** Install grid management and header fields. If fields exist that
should not be there they are removed. Those that are needed are
@ -166,6 +173,10 @@ protected:
the given message part. */
virtual const QString msgPartLbxString(KMMessagePart* msgPart) const;
/** Open addressbook and append selected addresses to the given
edit field. */
virtual void addrBookSelInto(KMLineEdit* destEdit);
private:
/** Get message including signing and encrypting it */
virtual const QString pgpProcessedMsg(void);
@ -174,6 +185,7 @@ protected:
QWidget mMainWidget;
KMLineEdit mEdtFrom, mEdtReplyTo, mEdtTo, mEdtCc, mEdtBcc, mEdtSubject;
QLabel mLblFrom, mLblReplyTo, mLblTo, mLblCc, mLblBcc, mLblSubject;
QPushButton mBtnTo, mBtnCc, mBtnBcc;
/* start Added for KRN */
KMLineEdit mEdtNewsgroups, mEdtFollowupTo;
QLabel mLblNewsgroups, mLblFollowupTo;

@ -21,7 +21,9 @@
#include "kmversion.h"
#include "kmsender.h"
#include "kmaddrbookdlg.h"
#include "kmaddrbook.h"
#include <qclipbrd.h>
#include <qaccel.h>
#include <qstring.h>
#include <qpixmap.h>
@ -81,8 +83,8 @@ KMMainWin::KMMainWin(QWidget *, char *name) :
mMsgView = new KMReaderWin(mVertPanner);
connect(mMsgView, SIGNAL(statusMsg(const char*)),
this, SLOT(statusMsg(const char*)));
connect(mMsgView, SIGNAL(popupMenu(const QPoint&)),
this, SLOT(slotMsgPopup(const QPoint&)));
connect(mMsgView, SIGNAL(popupMenu(const char*,const QPoint&)),
this, SLOT(slotMsgPopup(const char*,const QPoint&)));
connect(mMsgView, SIGNAL(urlClicked(const char*,int)),
this, SLOT(slotUrlClicked(const char*,int)));
accel->connectItem(accel->insertItem(Key_Up),
@ -112,8 +114,8 @@ KMMainWin::KMMainWin(QWidget *, char *name) :
idx = mFolderTree->indexOfFolder(inboxFolder);
if (idx>=0) mFolderTree->setCurrentItem(idx);
connect(sender, SIGNAL(statusMsg(const char*)),
this, SLOT(statusMsg(const char*)));
connect(msgSender, SIGNAL(statusMsg(const char*)),
SLOT(statusMsg(const char*)));
}
@ -248,7 +250,7 @@ void KMMainWin::slotFilter()
//-----------------------------------------------------------------------------
void KMMainWin::slotAddrBook()
{
KMAddrBookEditDlg dlg(addrBook, nls->translate("Addressbook"));
KMAddrBookEditDlg dlg(addrBook);
dlg.exec();
}
@ -532,29 +534,152 @@ void KMMainWin::slotUrlClicked(const char* aUrl, int)
else if (!strnicmp(aUrl, "http:", 5) || !strnicmp(aUrl, "ftp:", 4) ||
!strnicmp(aUrl, "file:", 5))
{
statusMsg(nls->translate("Opening URL..."));
system("kfmclient openURL \""+QString(aUrl)+"\"");
}
}
//-----------------------------------------------------------------------------
void KMMainWin::slotMsgPopup(const QPoint& aPoint)
void KMMainWin::slotMailtoCompose()
{
KMComposeWin *win;
KMMessage *msg = new KMMessage;
msg->initHeader();
msg->setTo(mUrlCurrent.mid(7,255));
kbp->busy();
win = new KMComposeWin(msg);
win->show();
kbp->idle();
}
//-----------------------------------------------------------------------------
void KMMainWin::slotMailtoReply()
{
KMComposeWin *win;
KMMessage *msg;
if (!(msg = mHeaders->getMsg(-1))) return;
msg = msg->createReply(FALSE);
msg->setTo(mUrlCurrent.mid(7,255));
kbp->busy();
win = new KMComposeWin(msg);
win->show();
kbp->idle();
}
//-----------------------------------------------------------------------------
void KMMainWin::slotMailtoForward()
{
KMComposeWin *win;
KMMessage *msg;
if (!(msg = mHeaders->getMsg(-1))) return;
msg = msg->createForward();
msg->setTo(mUrlCurrent.mid(7,255));
kbp->busy();
win = new KMComposeWin(msg);
win->show();
kbp->idle();
}
//-----------------------------------------------------------------------------
void KMMainWin::slotMailtoAddAddrBook()
{
if (mUrlCurrent.isEmpty()) return;
addrBook->insert(mUrlCurrent.mid(7,255));
statusMsg(nls->translate("Address added to addressbook."));
}
//-----------------------------------------------------------------------------
void KMMainWin::slotUrlCopy()
{
QClipboard* clip = QApplication::clipboard();
if (strnicmp(mUrlCurrent,"mailto:",7)==0)
{
clip->setText(mUrlCurrent.mid(7,255));
statusMsg(nls->translate("Address copied to clipboard."));
}
else
{
clip->setText(mUrlCurrent);
statusMsg(nls->translate("URL copied to clipboard."));
}
}
//-----------------------------------------------------------------------------
void KMMainWin::slotUrlOpen()
{
if (mUrlCurrent.isEmpty()) return;
mMsgView->slotUrlOpen(mUrlCurrent,0);
}
//-----------------------------------------------------------------------------
void KMMainWin::slotMsgPopup(const char* aUrl, const QPoint& aPoint)
{
QPopupMenu* menu = new QPopupMenu;
menu->insertItem(nls->translate("&Reply..."), this, SLOT(slotReplyToMsg()));
menu->insertItem(nls->translate("Reply &All..."), this,
SLOT(slotReplyAllToMsg()));
menu->insertItem(nls->translate("&Forward..."), this,
SLOT(slotForwardMsg()), Key_F);
menu->insertSeparator();
menu->insertItem(nls->translate("&Move..."), this,
SLOT(slotMoveMsg()), Key_M);
menu->insertItem(nls->translate("&Copy..."), this,
SLOT(slotCopyText()), Key_S);
menu->insertItem(nls->translate("&Delete"), this,
SLOT(slotDeleteMsg()), Key_D);
menu->popup(aPoint, 0);
mUrlCurrent = aUrl;
mUrlCurrent.detach();
if (aUrl)
{
if (strnicmp(aUrl,"mailto:",7)==0)
{
// popup on a mailto URL
menu = new QPopupMenu();
menu->insertItem(nls->translate("Send to..."), this,
SLOT(slotMailtoCompose()));
menu->insertItem(nls->translate("Send reply to..."), this,
SLOT(slotMailtoReply()));
menu->insertItem(nls->translate("Forward to..."), this,
SLOT(slotMailtoForward()));
menu->insertSeparator();
menu->insertItem(nls->translate("Add to addressbook"), this,
SLOT(slotMailtoAddAddrBook()));
menu->insertItem(nls->translate("Copy to clipboard"), this,
SLOT(slotUrlCopy()));
menu->popup(aPoint,0);
}
else
{
// popup on a not-mailto URL
menu->insertItem(nls->translate("Open URL..."), this,
SLOT(slotUrlOpen()));
menu->insertItem(nls->translate("Copy to clipboard"), this,
SLOT(slotUrlCopy()));
menu->popup(aPoint,0);
}
}
else
{
// popup somewhere else on the document
menu->insertItem(nls->translate("&Reply..."), this,
SLOT(slotReplyToMsg()));
menu->insertItem(nls->translate("Reply &All..."), this,
SLOT(slotReplyAllToMsg()));
menu->insertItem(nls->translate("&Forward..."), this,
SLOT(slotForwardMsg()), Key_F);
menu->insertSeparator();
menu->insertItem(nls->translate("&Move..."), this,
SLOT(slotMoveMsg()), Key_M);
menu->insertItem(nls->translate("&Copy..."), this,
SLOT(slotCopyText()), Key_S);
menu->insertItem(nls->translate("&Delete"), this,
SLOT(slotDeleteMsg()), Key_D);
menu->popup(aPoint, 0);
}
}
@ -743,6 +868,13 @@ void KMMainWin::setupToolBar()
SLOT(slotDeleteMsg()), TRUE,
nls->translate("Delete message"));
mToolBar->insertSeparator();
mToolBar->insertButton(loader->loadIcon("openbook.xpm"), 0,
SIGNAL(clicked()), this,
SLOT(slotAddrBook()), TRUE,
nls->translate("Open addressbook..."));
addToolBar(mToolBar);
}

@ -83,10 +83,11 @@ protected slots:
void slotShowMsgSrc();
void slotSetHeaderStyle(int);
void slotSendQueued();
void slotMsgPopup(const QPoint&);
void slotMsgPopup(const char* url, const QPoint&);
void slotUrlClicked(const char* url, int button);
void slotCopyText();
/** etc. */
void folderSelected(KMFolder*);
void slotMsgSelected(KMMessage*);
void slotMsgActivated(KMMessage*);
@ -96,6 +97,19 @@ protected slots:
//void initIntegrated();
//void initSeparated();
/** Operations on mailto: URLs. */
void slotMailtoCompose();
void slotMailtoReply();
void slotMailtoForward();
void slotMailtoAddAddrBook();
/** Open URL in mUrlCurrent using Kfm. */
void slotUrlOpen();
/** Copy URL in mUrlCurrent to clipboard. Removes "mailto:" at
beginning of URL before copying. */
void slotUrlCopy();
protected:
KMenuBar *mMenuBar;
KToolBar *mToolBar;
@ -109,6 +123,7 @@ protected:
bool mIntegrated;
int mMessageStatusId;
int mHorizPannerSep, mVertPannerSep;
QString mUrlCurrent;
};
#endif

@ -1074,7 +1074,7 @@ const QString KMMessage::stripEmailAddr(const QString aStr)
//-----------------------------------------------------------------------------
const QString KMMessage::emailAddrAsAnchor(const QString aEmail, bool stripped)
{
QString result, addr;
QString result, addr, tmp;
const char *pos;
char ch;
QString email = decodeQuotedPrintableString(aEmail);
@ -1085,15 +1085,15 @@ const QString KMMessage::emailAddrAsAnchor(const QString aEmail, bool stripped)
for (pos=email.data(); *pos; pos++)
{
ch = *pos;
if (ch == '"') addr += "'";
else if (ch == '<') addr += "&lt;";
if (ch == '<') addr += "&lt;";
else if (ch == '>') addr += "&gt;";
else if (ch == '&') addr += "&amp;";
else if (ch != ',') addr += ch;
if (ch == ',' || !pos[1])
{
result += addr;
tmp = addr.copy();
result += tmp.replace(QRegExp("\""),"");
result += "\">";
if (stripped) result += KMMessage::stripEmailAddr(addr);
else result += addr;

@ -253,13 +253,13 @@ void KMReaderWin::writeMsgHeader(void)
mViewer->write(nls->translate("From: ") +
KMMessage::emailAddrAsAnchor(mMsg->from()) + "<BR>");
mViewer->write(nls->translate("To: ") +
KMMessage::emailAddrAsAnchor(mMsg->to()) + "<BR><BR>");
KMMessage::emailAddrAsAnchor(mMsg->to()) + "<BR>");
#ifdef KRN
if (!mMsg->references().isEmpty())
mViewer->write(nls->translate("References: ") +
KMMessage::refsAsAnchor(mMsg->references()) + "<BR><BR>");
KMMessage::refsAsAnchor(mMsg->references()) + "<BR>");
#endif
mViewer->write("<BR>");
break;
case HdrFancy:
@ -284,7 +284,30 @@ void KMReaderWin::writeMsgHeader(void)
break;
case HdrLong:
emit statusMsg("`long' header style not yet implemented.");
mViewer->write("<FONT SIZE=+1><B>" +
strToHtml(mMsg->subject()) + "</B></FONT><BR>");
mViewer->write(nls->translate("Date: ")+strToHtml(mMsg->dateStr())+"<BR>");
mViewer->write(nls->translate("From: ") +
KMMessage::emailAddrAsAnchor(mMsg->from()) + "<BR>");
mViewer->write(nls->translate("To: ") +
KMMessage::emailAddrAsAnchor(mMsg->to()) + "<BR>");
if (!mMsg->cc().isEmpty())
mViewer->write(nls->translate("Cc: ")+
KMMessage::emailAddrAsAnchor(mMsg->cc()) + "<BR>");
if (!mMsg->bcc().isEmpty())
mViewer->write(nls->translate("Bcc: ")+
KMMessage::emailAddrAsAnchor(mMsg->bcc()) + "<BR>");
if (!mMsg->replyTo().isEmpty())
mViewer->write(nls->translate("Reply to: ")+
KMMessage::emailAddrAsAnchor(mMsg->replyTo()) + "<BR>");
#ifdef KRN
if (!mMsg->references().isEmpty())
mViewer->write(nls->translate("References: ") +
KMMessage::refsAsAnchor(mMsg->references()) + "<BR>");
if (!mMsg->groups().isEmpty())
mViewer->write(nls->translate("Groups: ")+mMsg->groups()+"<BR>");
#endif
mViewer->write("<BR>");
break;
case HdrAll:
@ -507,7 +530,7 @@ void KMReaderWin::slotUrlOn(const char* aUrl)
else
{
mMsg->bodyPart(id-1, &msgPart);
emit statusMsg(msgPart.name());
emit statusMsg(nls->translate("Attachment: ") + msgPart.name());
}
}
@ -536,9 +559,10 @@ void KMReaderWin::slotUrlPopup(const char* aUrl, const QPoint& aPos)
QPopupMenu *menu;
id = msgPartFromUrl(aUrl);
if (id <= 0) emit popupMenu(aPos);
if (id <= 0) emit popupMenu(aUrl, aPos);
else
{
// Attachment popup
mAtmCurrent = id-1;
menu = new QPopupMenu();
menu->insertItem(nls->translate("Open..."), this, SLOT(slotAtmOpen()));

@ -72,8 +72,8 @@ signals:
/** Emitted to show a text on the status line. */
void statusMsg(const char* text);
/** The user presses the right mouse button. */
void popupMenu(const QPoint& mousePos);
/** The user presses the right mouse button. 'url' may be NULL. */
void popupMenu(const char* url, const QPoint& mousePos);
/** The user has clicked onto an URL that is no attachment. */
void urlClicked(const char* url, int button);
@ -98,6 +98,7 @@ public slots:
/** The user presses the right mouse button on an URL. */
void slotUrlPopup(const char* url, const QPoint& mousePos);
protected slots:
/** Some attachment operations. */
void slotAtmOpen();
void slotAtmPrint();

Loading…
Cancel
Save