[kde-doc-english] [trojita] src: GUI: use the new replying code
Jan Kundrát
jkt at flaska.net
Sat Jan 5 15:04:28 UTC 2013
Git commit 87b20815f8fe1d484bb5010021e8e3f14c5d3667 by Jan Kundrát.
Committed on 05/01/2013 at 14:31.
Pushed by jkt into branch 'master'.
GUI: use the new replying code
M +54 -0 src/Gui/ComposeWidget.cpp
M +3 -0 src/Gui/ComposeWidget.h
M +12 -19 src/Gui/MessageView.cpp
M +4 -3 src/Gui/Window.cpp
M +6 -5 src/Gui/Window.h
M +9 -0 src/Imap/Parser/MailAddress.cpp
M +1 -0 src/Imap/Parser/MailAddress.h
http://commits.kde.org/trojita/87b20815f8fe1d484bb5010021e8e3f14c5d3667
diff --git a/src/Gui/ComposeWidget.cpp b/src/Gui/ComposeWidget.cpp
index 554bbc7..d35828b 100644
--- a/src/Gui/ComposeWidget.cpp
+++ b/src/Gui/ComposeWidget.cpp
@@ -42,6 +42,8 @@
#include "Common/SettingsNames.h"
#include "MSA/Sendmail.h"
#include "MSA/SMTP.h"
+#include "Imap/Model/ItemRoles.h"
+#include "Imap/Model/MailboxTree.h"
#include "Imap/Model/Model.h"
#include "Imap/Tasks/AppendTask.h"
#include "Imap/Tasks/GenUrlAuthTask.h"
@@ -710,5 +712,57 @@ bool ComposeWidget::shouldBuildMessageLocally() const
&& QSettings().value(Common::SettingsNames::smtpUseBurlKey, false).toBool());
}
+/** @short Massage the list of recipients so that they match the desired type of reply
+
+In case of an error, the original list of recipients is left as is.
+*/
+bool ComposeWidget::setReplyMode(const Composer::ReplyMode mode)
+{
+ if (!m_replyingTo.isValid())
+ return false;
+
+ using namespace Imap::Mailbox;
+ using namespace Imap::Message;
+ Model *model = dynamic_cast<Model *>(const_cast<QAbstractItemModel *>(m_replyingTo.model()));
+ TreeItemMessage *messagePtr = dynamic_cast<TreeItemMessage *>(static_cast<TreeItem *>(m_replyingTo.internalPointer()));
+ Envelope envelope = messagePtr->envelope(model);
+
+ // Prepare the list of recipients
+ Composer::RecipientList originalRecipients;
+ Q_FOREACH(const MailAddress &addr, envelope.from)
+ originalRecipients << qMakePair(Composer::ADDRESS_FROM, addr);
+ Q_FOREACH(const MailAddress &addr, envelope.to)
+ originalRecipients << qMakePair(Composer::ADDRESS_TO, addr);
+ Q_FOREACH(const MailAddress &addr, envelope.cc)
+ originalRecipients << qMakePair(Composer::ADDRESS_CC, addr);
+ Q_FOREACH(const MailAddress &addr, envelope.bcc)
+ originalRecipients << qMakePair(Composer::ADDRESS_BCC, addr);
+ Q_FOREACH(const MailAddress &addr, envelope.sender)
+ originalRecipients << qMakePair(Composer::ADDRESS_SENDER, addr);
+ Q_FOREACH(const MailAddress &addr, envelope.replyTo)
+ originalRecipients << qMakePair(Composer::ADDRESS_REPLY_TO, addr);
+
+ // The List-Post header
+ QList<QUrl> headerListPost;
+ Q_FOREACH(const QVariant &item, m_replyingTo.data(RoleMessageHeaderListPost).toList())
+ headerListPost << item.toUrl();
+
+ // Determine the new list of reicpients
+ Composer::RecipientList list;
+ if (!Composer::Util::replyRecipientList(
+ mode, originalRecipients, headerListPost, m_replyingTo.data(RoleMessageHeaderListPostNo).toBool(), list)) {
+ return false;
+ }
+
+ while (!m_recipients.isEmpty())
+ removeRecipient(0);
+
+ Q_FOREACH(const Composer::RecipientList::value_type &recipient, list) {
+ addRecipient(m_recipients.size(), recipient.first, recipient.second.asPrettyString());
+ }
+
+ return true;
+}
+
}
diff --git a/src/Gui/ComposeWidget.h b/src/Gui/ComposeWidget.h
index d018d47..9990e9e 100644
--- a/src/Gui/ComposeWidget.h
+++ b/src/Gui/ComposeWidget.h
@@ -64,6 +64,9 @@ protected:
void changeEvent(QEvent *e);
bool eventFilter(QObject *o, QEvent *e);
+public slots:
+ bool setReplyMode(const Composer::ReplyMode mode);
+
private slots:
void collapseRecipients();
void completeRecipient(QAction *act);
diff --git a/src/Gui/MessageView.cpp b/src/Gui/MessageView.cpp
index cd5ea9d..924d044 100644
--- a/src/Gui/MessageView.cpp
+++ b/src/Gui/MessageView.cpp
@@ -47,6 +47,7 @@
#include "TagListWidget.h"
#include "UserAgentWebPage.h"
#include "Window.h"
+#include "ComposeWidget.h"
#include "Imap/Model/MailboxTree.h"
#include "Imap/Model/MsgListModel.h"
@@ -426,25 +427,17 @@ void MessageView::reply(MainWindow *mainWindow, Composer::ReplyMode mode)
if (!message.isValid())
return;
- const Imap::Message::Envelope &e = envelope();
-
- QList<QPair<Composer::RecipientKind,QString> > recipients;
- for (QList<Imap::Message::MailAddress>::const_iterator it = e.from.begin(); it != e.from.end(); ++it) {
- recipients << qMakePair(Composer::ADDRESS_TO, QString::fromUtf8("%1@%2").arg(it->mailbox, it->host));
- }
- if (mode == Composer::REPLY_ALL) {
- for (QList<Imap::Message::MailAddress>::const_iterator it = e.to.begin(); it != e.to.end(); ++it) {
- recipients << qMakePair(Composer::ADDRESS_CC, QString::fromUtf8("%1@%2").arg(it->mailbox, it->host));
- }
- for (QList<Imap::Message::MailAddress>::const_iterator it = e.cc.begin(); it != e.cc.end(); ++it) {
- recipients << qMakePair(Composer::ADDRESS_TO, QString::fromUtf8("%1@%2").arg(it->mailbox, it->host));
- }
- }
- mainWindow->invokeComposeDialog(Composer::Util::replySubject(e.subject), quoteText(), recipients,
- QList<QByteArray>() << e.messageId,
- message.data(Imap::Mailbox::RoleMessageHeaderReferences).value<QList<QByteArray> >() << e.messageId,
- message
- );
+ QByteArray messageId = message.data(Imap::Mailbox::RoleMessageMessageId).toByteArray();
+
+ ComposeWidget *w = mainWindow->invokeComposeDialog(
+ Composer::Util::replySubject(message.data(Imap::Mailbox::RoleMessageSubject).toString()), quoteText(),
+ QList<QPair<Composer::RecipientKind,QString> >(),
+ QList<QByteArray>() << messageId,
+ message.data(Imap::Mailbox::RoleMessageHeaderReferences).value<QList<QByteArray> >() << messageId,
+ message
+ );
+ bool ok = w->setReplyMode(mode);
+ Q_ASSERT(ok);
}
void MessageView::externalsRequested(const QUrl &url)
diff --git a/src/Gui/Window.cpp b/src/Gui/Window.cpp
index dc039ed..1474a00 100644
--- a/src/Gui/Window.cpp
+++ b/src/Gui/Window.cpp
@@ -1170,9 +1170,9 @@ void MainWindow::slotComposeMailUrl(const QUrl &url)
invokeComposeDialog(QString(), QString(), recipients);
}
-void MainWindow::invokeComposeDialog(const QString &subject, const QString &body,
- const RecipientsType &recipients, const QList<QByteArray> &inReplyTo,
- const QList<QByteArray> &references, const QModelIndex &replyingToMessage)
+ComposeWidget *MainWindow::invokeComposeDialog(const QString &subject, const QString &body,
+ const RecipientsType &recipients, const QList<QByteArray> &inReplyTo,
+ const QList<QByteArray> &references, const QModelIndex &replyingToMessage)
{
QSettings s;
ComposeWidget *w = new ComposeWidget(this);
@@ -1191,6 +1191,7 @@ void MainWindow::invokeComposeDialog(const QString &subject, const QString &body
w->setData(recipients, subject, body, inReplyTo, trimmedReferences, replyingToMessage);
Util::centerWidgetOnScreen(w);
w->show();
+ return w;
}
void MainWindow::slotMailboxDeleteFailed(const QString &mailbox, const QString &msg)
diff --git a/src/Gui/Window.h b/src/Gui/Window.h
index cd1650a..3df71e1 100644
--- a/src/Gui/Window.h
+++ b/src/Gui/Window.h
@@ -63,6 +63,7 @@ namespace Gui
{
class AbstractAddressbook;
+class ComposeWidget;
class MailBoxTreeView;
class MessageView;
class MessageListWidget;
@@ -75,11 +76,11 @@ class MainWindow: public QMainWindow
typedef QList<QPair<Composer::RecipientKind,QString> > RecipientsType;
public:
MainWindow();
- void invokeComposeDialog(const QString &subject = QString(), const QString &body = QString(),
- const RecipientsType &recipients = RecipientsType(),
- const QList<QByteArray> &inReplyTo = QList<QByteArray>(),
- const QList<QByteArray> &references = QList<QByteArray>(),
- const QModelIndex &replyingToMessage = QModelIndex());
+ ComposeWidget *invokeComposeDialog(const QString &subject = QString(), const QString &body = QString(),
+ const RecipientsType &recipients = RecipientsType(),
+ const QList<QByteArray> &inReplyTo = QList<QByteArray>(),
+ const QList<QByteArray> &references = QList<QByteArray>(),
+ const QModelIndex &replyingToMessage = QModelIndex());
QSize sizeHint() const;
Imap::Mailbox::Model *imapModel() const;
diff --git a/src/Imap/Parser/MailAddress.cpp b/src/Imap/Parser/MailAddress.cpp
index b5b765b..5ae10e4 100644
--- a/src/Imap/Parser/MailAddress.cpp
+++ b/src/Imap/Parser/MailAddress.cpp
@@ -243,6 +243,15 @@ QByteArray MailAddress::asMailHeader() const
return result;
}
+/** @short The mail address usable for manipulation by user */
+QString MailAddress::asPrettyString() const
+{
+ return name.isEmpty() ?
+ QString() :
+ name + QLatin1Char(' ')
+ + QLatin1Char('<') + asSMTPMailbox() + QLatin1Char('>');
+}
+
QTextStream &operator<<(QTextStream &stream, const MailAddress &address)
{
stream << '"' << address.name << "\" <";
diff --git a/src/Imap/Parser/MailAddress.h b/src/Imap/Parser/MailAddress.h
index 05c77f9..ffe9faa 100644
--- a/src/Imap/Parser/MailAddress.h
+++ b/src/Imap/Parser/MailAddress.h
@@ -69,6 +69,7 @@ public:
QByteArray asSMTPMailbox() const;
QByteArray asMailHeader() const;
+ QString asPrettyString() const;
static QString prettyList(const QList<MailAddress> &list, FormattingMode mode);
static QString prettyList(const QVariantList &list, FormattingMode mode);
More information about the kde-doc-english
mailing list