8#include "filteractionaddtoaddressbook.h"
10#include <Akonadi/AddContactJob>
12#include <Akonadi/TagSelectionDialog>
13#include <Akonadi/TagWidget>
15#include <Akonadi/CollectionComboBox>
17#include <KContacts/Addressee>
18#include <KEmailAddress>
19#include <KLocalizedString>
28 return new FilterActionAddToAddressBook;
31FilterActionAddToAddressBook::FilterActionAddToAddressBook(QObject *parent)
33 , mFromStr(
i18nc(
"Email sender",
"From"))
34 , mToStr(
i18nc(
"Email recipient",
"To"))
36 , mBCCStr(
i18n(
"BCC"))
37 , mHeaderType(UnknownHeader)
39 , mCategory(
i18n(
"KMail Filter"))
43bool FilterActionAddToAddressBook::isEmpty()
const
45 return (mCollectionId == -1) || (mHeaderType == UnknownHeader);
57 switch (mHeaderType) {
59 headerLine = msg->from()->asUnicodeString();
62 headerLine = msg->to()->asUnicodeString();
65 headerLine = msg->cc()->asUnicodeString();
68 headerLine = msg->bcc()->asUnicodeString();
73 if (headerLine.isEmpty()) {
79 for (
const QString &singleEmail : emails) {
84 KContacts::Addressee contact;
86 KContacts::Email email(emailString);
87 email.setPreferred(
true);
89 if (!mCategory.isEmpty()) {
93 auto job =
new Akonadi::AddContactJob(contact, Akonadi::Collection(mCollectionId));
94 job->showMessageBox(
false);
106QWidget *FilterActionAddToAddressBook::createParamWidget(QWidget *parent)
const
108 auto widget =
new QWidget(
parent);
109 auto layout =
new QGridLayout(widget);
111 const auto headerCombo =
new KComboBox(widget);
112 headerCombo->setMinimumWidth(50);
113 headerCombo->setObjectName(QLatin1StringView(
"HeaderComboBox"));
116 auto label =
new QLabel(
i18nc(
"@label:textbox",
"with category"), widget);
117 label->setObjectName(QLatin1StringView(
"label_with_category"));
118 layout->addWidget(
label, 0, 1);
120 auto categoryEdit =
new Akonadi::TagWidget(widget);
121 categoryEdit->setObjectName(QLatin1StringView(
"CategoryEdit"));
122 layout->addWidget(categoryEdit, 0, 2);
124 label =
new QLabel(
i18nc(
"@label:textbox",
"in address book"), widget);
125 label->setObjectName(QLatin1StringView(
"label_in_addressbook"));
126 layout->addWidget(
label, 1, 1);
128 auto collectionComboBox =
new Akonadi::CollectionComboBox(widget);
132 collectionComboBox->setObjectName(QLatin1StringView(
"AddressBookComboBox"));
133 collectionComboBox->setToolTip(
134 i18n(
"This defines the preferred address book.\n"
135 "If it is not accessible, the filter will fallback to the default address book."));
136 layout->addWidget(collectionComboBox, 1, 2);
141 setParamWidgetValue(widget);
148Akonadi::Tag::List namesToTags(
const QStringList &names)
150 Akonadi::Tag::List tags;
151 tags.reserve(names.
size());
152 std::transform(names.
cbegin(), names.
cend(), std::back_inserter(tags), [](
const QString &name) {
153 return Akonadi::Tag{name};
158QStringList tagsToNames(
const Akonadi::Tag::List &tags)
162 std::transform(tags.cbegin(), tags.cend(), std::back_inserter(names), std::bind(&Akonadi::Tag::name, std::placeholders::_1));
167void FilterActionAddToAddressBook::setParamWidgetValue(QWidget *paramWidget)
const
169 const auto headerCombo = paramWidget->
findChild<KComboBox *>(QStringLiteral(
"HeaderComboBox"));
170 Q_ASSERT(headerCombo);
171 headerCombo->clear();
172 headerCombo->addItem(mFromStr, FromHeader);
173 headerCombo->addItem(mToStr, ToHeader);
174 headerCombo->addItem(mCCStr, CcHeader);
175 headerCombo->addItem(mBCCStr, BccHeader);
177 headerCombo->setCurrentIndex(headerCombo->findData(mHeaderType));
179 auto categoryEdit = paramWidget->
findChild<Akonadi::TagWidget *>(QStringLiteral(
"CategoryEdit"));
180 Q_ASSERT(categoryEdit);
181 categoryEdit->setSelection(namesToTags(mCategory.split(QLatin1Char(
';'))));
183 auto collectionComboBox = paramWidget->
findChild<Akonadi::CollectionComboBox *>(QStringLiteral(
"AddressBookComboBox"));
184 Q_ASSERT(collectionComboBox);
185 collectionComboBox->setDefaultCollection(Akonadi::Collection(mCollectionId));
186 collectionComboBox->setProperty(
"collectionId", mCollectionId);
189void FilterActionAddToAddressBook::applyParamWidgetValue(QWidget *paramWidget)
191 const auto headerCombo = paramWidget->
findChild<QComboBox *>(QStringLiteral(
"HeaderComboBox"));
192 Q_ASSERT(headerCombo);
193 mHeaderType =
static_cast<HeaderType
>(headerCombo->itemData(headerCombo->currentIndex()).toInt());
195 const auto categoryEdit = paramWidget->
findChild<Akonadi::TagWidget *>(QStringLiteral(
"CategoryEdit"));
196 Q_ASSERT(categoryEdit);
197 mCategory = tagsToNames(categoryEdit->selection()).join(QLatin1Char(
';'));
199 const Akonadi::CollectionComboBox *collectionComboBox = paramWidget->
findChild<Akonadi::CollectionComboBox *>(QStringLiteral(
"AddressBookComboBox"));
200 Q_ASSERT(collectionComboBox);
206 mCollectionId = collection.
id();
209 const QVariant value = collectionComboBox->
property(
"collectionId");
216void FilterActionAddToAddressBook::clearParamWidget(QWidget *paramWidget)
const
218 const auto headerCombo = paramWidget->
findChild<QComboBox *>(QStringLiteral(
"HeaderComboBox"));
219 Q_ASSERT(headerCombo);
220 headerCombo->setCurrentIndex(0);
222 auto categoryEdit = paramWidget->
findChild<Akonadi::TagWidget *>(QStringLiteral(
"CategoryEdit"));
223 Q_ASSERT(categoryEdit);
224 categoryEdit->setSelection(namesToTags(mCategory.split(QLatin1Char(
';'))));
227QString FilterActionAddToAddressBook::argsAsString()
const
231 switch (mHeaderType) {
233 result = QStringLiteral(
"From");
236 result = QStringLiteral(
"To");
239 result = QStringLiteral(
"CC");
242 result = QStringLiteral(
"BCC");
248 result += QLatin1Char(
'\t');
250 result += QLatin1Char(
'\t');
256void FilterActionAddToAddressBook::argsFromString(
const QString &argsStr)
259 const QString firstElement = parts[0];
260 if (firstElement == QLatin1StringView(
"From")) {
261 mHeaderType = FromHeader;
262 }
else if (firstElement == QLatin1StringView(
"To")) {
263 mHeaderType = ToHeader;
264 }
else if (firstElement == QLatin1StringView(
"CC")) {
265 mHeaderType = CcHeader;
266 }
else if (firstElement == QLatin1StringView(
"BCC")) {
267 mHeaderType = BccHeader;
269 mHeaderType = UnknownHeader;
271 if (parts.
count() >= 2) {
272 mCollectionId = parts[1].toLongLong();
275 if (parts.
count() < 3) {
278 mCategory = parts[2];
282QString FilterActionAddToAddressBook::informationAboutNotValidAction()
const
285 if (mHeaderType == UnknownHeader) {
286 result =
i18n(
"Header type selected is unknown.");
288 if (mCollectionId == -1) {
290 result += QLatin1Char(
'\n');
292 result +=
i18n(
"No addressbook selected.");
297#include "moc_filteractionaddtoaddressbook.cpp"
Akonadi::Collection currentCollection() const
QSharedPointer< Message > Ptr
Abstract base class for filter actions with a fixed set of string parameters.
Abstract base class for mail filter actions.
QString name() const
Returns identifier name, ie.
ReturnCode
Describes the possible return codes of filter processing:
@ ErrorButGoOn
A non-critical error occurred.
@ GoOn
Go on with applying filter actions.
void filterActionModified()
Called to notify that the current FilterAction has had some value modification.
QString label() const
Returns i18n'd label, ie.
A helper class for the filtering process.
Akonadi::Item & item()
Returns the item of the context.
RequiredPart
Possible required parts.
KCODECS_EXPORT QStringList splitAddressList(const QString &aStr)
QString i18nc(const char *context, const char *text, const TYPE &arg...)
QString i18n(const char *text, const TYPE &arg...)
void activated(int index)
void currentIndexChanged(int index)
const_iterator cbegin() const const
const_iterator cend() const const
qsizetype count() const const
void reserve(qsizetype size)
qsizetype size() const const
QMetaObject::Connection connect(const QObject *sender, PointerToMemberFunction signal, Functor functor)
T findChild(const QString &name, Qt::FindChildOptions options) const const
QObject * parent() const const
QVariant property(const char *name) const const
bool isEmpty() const const
QString number(double n, char format, int precision)
QStringList split(QChar sep, Qt::SplitBehavior behavior, Qt::CaseSensitivity cs) const const
bool isValid() const const
qlonglong toLongLong(bool *ok) const const