Libksieve

vacationeditwidget.cpp
1/*
2 SPDX-FileCopyrightText: 2013-2024 Laurent Montel <montel@kde.org>
3
4 SPDX-License-Identifier: LGPL-2.0-or-later
5*/
6
7#include "vacationeditwidget.h"
8#include "vacationmailactionwidget.h"
9#include "vacationmaillineedit.h"
10
11#include <KDateComboBox>
12#include <KLocalizedString>
13#include <KTimeComboBox>
14#include <QLineEdit>
15#include <QRegularExpressionValidator>
16#include <QSpinBox>
17
18#include "libksieveui_debug.h"
19#include <KLineEditEventHandler>
20#include <TextCustomEditor/PlainTextEditor>
21#include <TextCustomEditor/PlainTextEditorWidget>
22
23#include <KMime/HeaderParsing>
24
25#include <PimCommon/SpellCheckLineEdit>
26#include <QCheckBox>
27#include <QGridLayout>
28#include <QLabel>
29
30using KMime::HeaderParsing::parseAddressList;
31using KMime::Types::AddressList;
33using KMime::Types::MailboxList;
34
35using namespace KSieveUi;
36VacationEditWidget::VacationEditWidget(QWidget *parent)
37 : QWidget(parent)
38{
39 int row = -1;
40
41 auto glay = new QGridLayout(this);
42 glay->setContentsMargins({});
43 glay->setColumnStretch(1, 1);
44
45 // explanation label:
46 ++row;
47 auto configureVacationLabel = new QLabel(i18n("Configure vacation "
48 "notifications to be sent:"),
49 this);
50 configureVacationLabel->setObjectName(QLatin1StringView("configureVacationLabel"));
51 glay->addWidget(configureVacationLabel, row, 0, 1, 2);
52
53 // Activate checkbox:
54 ++row;
55 mActiveCheck = new QCheckBox(i18n("&Activate vacation notifications"), this);
56 mActiveCheck->setObjectName(QLatin1StringView("mActiveCheck"));
57 glay->addWidget(mActiveCheck, row, 0, 1, 2);
58 connect(mActiveCheck, &QCheckBox::clicked, this, &VacationEditWidget::setWasChanged);
59
60 // Message text edit:
61 ++row;
62 glay->setRowStretch(row, 1);
63 mTextEdit = new TextCustomEditor::PlainTextEditorWidget(this);
64 mTextEdit->setObjectName(QLatin1StringView("mTextEdit"));
65 glay->addWidget(mTextEdit, row, 0, 1, 2);
66 connect(mTextEdit->editor(), &TextCustomEditor::PlainTextEditor::textChanged, this, &VacationEditWidget::setWasChanged);
67
68 // Subject
69 ++row;
70 mSubject = new PimCommon::SpellCheckLineEdit(this, QString());
72 mSubject->setObjectName(QLatin1StringView("mSubject"));
73 connect(mSubject, &PimCommon::SpellCheckLineEdit::textChanged, this, &VacationEditWidget::setWasChanged);
74 // mSubject->setClearButtonEnabled(true);
75 auto subjectOfVacationLabel = new QLabel(i18n("&Subject of the vacation mail:"), this);
76 subjectOfVacationLabel->setObjectName(QLatin1StringView("subjectOfVacationLabel"));
77 subjectOfVacationLabel->setBuddy(mSubject);
78 glay->addWidget(subjectOfVacationLabel, row, 0);
79 glay->addWidget(mSubject, row, 1);
80 ++row;
81
82 auto timeLayout = new QHBoxLayout;
83 // Start date
84 mStartDate = new KDateComboBox(this);
85 KLineEditEventHandler::catchReturnKey(mStartDate->lineEdit());
86 mStartDate->setObjectName(QLatin1StringView("mStartDate"));
88 connect(mStartDate, &KDateComboBox::dateChanged, this, &VacationEditWidget::setWasChanged);
89 connect(mStartDate, &KDateComboBox::dateEdited, this, &VacationEditWidget::setWasChanged);
90
91 mStartTime = new KTimeComboBox(this);
92 KLineEditEventHandler::catchReturnKey(mStartTime->lineEdit());
93 mStartTime->setObjectName(QLatin1StringView("mStartTime"));
95 mStartTime->setEnabled(false); // Disable by default - we need an extension to support this
96 connect(mStartTime, &KTimeComboBox::timeChanged, this, &VacationEditWidget::setWasChanged);
97 connect(mStartTime, &KTimeComboBox::timeEdited, this, &VacationEditWidget::setWasChanged);
98
99 mStartTimeActive = new QCheckBox(this);
100 mStartTimeActive->setObjectName(QLatin1StringView("mStartTimeActive"));
101 connect(mStartTimeActive, &QCheckBox::toggled, mStartTime, &KTimeComboBox::setEnabled);
102
103 timeLayout->addWidget(mStartDate);
104 timeLayout->addWidget(mStartTimeActive);
105 timeLayout->addWidget(mStartTime);
106
107 mStartDateLabel = new QLabel(i18n("Start date:"), this);
108 mStartDateLabel->setObjectName(QLatin1StringView("mStartDateLabel"));
109 mStartDateLabel->setBuddy(mStartDate);
110 glay->addWidget(mStartDateLabel, row, 0);
111 glay->addLayout(timeLayout, row, 1);
112
113 ++row;
114 // End date
115 timeLayout = new QHBoxLayout;
116
117 mEndDate = new KDateComboBox(this);
118 KLineEditEventHandler::catchReturnKey(mEndDate->lineEdit());
119 mEndDate->setObjectName(QLatin1StringView("mEndDate"));
121 connect(mEndDate, &KDateComboBox::dateChanged, this, &VacationEditWidget::setWasChanged);
122 connect(mEndDate, &KDateComboBox::dateEdited, this, &VacationEditWidget::setWasChanged);
123
124 mEndTime = new KTimeComboBox(this);
125 mEndTime->setObjectName(QLatin1StringView("mEndTime"));
126 KLineEditEventHandler::catchReturnKey(mEndTime->lineEdit());
128 mEndTime->setEnabled(false); // Disable by default - we need an extension to support this
129 connect(mEndTime, &KTimeComboBox::timeChanged, this, &VacationEditWidget::setWasChanged);
130 connect(mEndTime, &KTimeComboBox::timeEdited, this, &VacationEditWidget::setWasChanged);
131
132 mEndTimeActive = new QCheckBox(this);
133 mEndTimeActive->setObjectName(QLatin1StringView("mEndTimeActive"));
134 connect(mEndTimeActive, &QCheckBox::toggled, mEndTime, &KTimeComboBox::setEnabled);
135 connect(mEndTimeActive, &QCheckBox::toggled, this, &VacationEditWidget::setWasChanged);
136
137 mEndDateLabel = new QLabel(i18n("End date:"), this);
138 mEndDateLabel->setObjectName(QLatin1StringView("mEndDateLabel"));
139 mEndDateLabel->setBuddy(mEndDate);
140 glay->addWidget(mEndDateLabel, row, 0);
141
142 timeLayout->addWidget(mEndDate);
143 timeLayout->addWidget(mEndTimeActive);
144 timeLayout->addWidget(mEndTime);
145 glay->addLayout(timeLayout, row, 1);
146
147 // Hide the date edits by default - they must be enabled by caller when the
148 // server supports this feature
149 enableDates(false);
150
151 // "Resent only after" spinbox and label:
152 ++row;
153 int defDayInterval = 7; // default day interval
154 mIntervalSpin = new QSpinBox(this);
155 mIntervalSpin->setMaximum(356);
156 mIntervalSpin->setMinimum(1);
157 mIntervalSpin->setSingleStep(1);
158 mIntervalSpin->setValue(defDayInterval);
159 mIntervalSpin->setObjectName(QLatin1StringView("mIntervalSpin"));
160 mIntervalSpin->setSuffix(i18np(" day", " days", defDayInterval));
161 connect(mIntervalSpin, &QSpinBox::valueChanged, this, &VacationEditWidget::slotIntervalSpinChanged);
162 auto resendNotificationLabel = new QLabel(i18n("&Resend notification only after:"), this);
163 resendNotificationLabel->setObjectName(QLatin1StringView("resendNotificationLabel"));
164 resendNotificationLabel->setBuddy(mIntervalSpin);
165 glay->addWidget(resendNotificationLabel, row, 0);
166 glay->addWidget(mIntervalSpin, row, 1);
167
168 // "Send responses for these addresses" lineedit and label:
169 ++row;
170 mMailAliasesEdit = new KSieveUi::VacationMailLineEdit(this);
171 mMailAliasesEdit->setObjectName(QLatin1StringView("mMailAliasesEdit"));
172 mMailAliasesEdit->setClearButtonEnabled(true);
174 connect(mMailAliasesEdit, &KSieveUi::VacationMailLineEdit::textChanged, this, &VacationEditWidget::setWasChanged);
175 auto sendResponseLabel = new QLabel(i18n("&Send responses for these addresses:"), this);
176 sendResponseLabel->setObjectName(QLatin1StringView("sendResponseLabel"));
177 sendResponseLabel->setBuddy(mMailAliasesEdit);
178 glay->addWidget(sendResponseLabel, row, 0);
179 glay->addWidget(mMailAliasesEdit, row, 1);
180
181 // Action for incoming mails
182 mMailAction = new QComboBox(this);
183 for (int i = 0; i < 4; ++i) {
184 mMailAction->addItem(KSieveCore::VacationUtils::mailAction(static_cast<KSieveCore::VacationUtils::MailAction>(i)));
185 }
186 mMailAction->setObjectName(QLatin1StringView("mMailAction"));
187 connect(mMailAction, &QComboBox::currentIndexChanged, this, &VacationEditWidget::mailActionChanged);
188
189 // Add imap select folder plugin here.
190 mMailActionRecipient = new VacationMailActionWidget(this);
191 mMailActionRecipient->setObjectName(QLatin1StringView("mMailActionRecipient"));
192 connect(mMailActionRecipient, &VacationMailActionWidget::wasChanged, this, &VacationEditWidget::setWasChanged);
193 // Add setChanged here too
194
195 auto hLayout = new QHBoxLayout;
196
197 hLayout->addWidget(mMailAction);
198 hLayout->addWidget(mMailActionRecipient);
199
200 ++row;
201 auto actionIncomingMailsLabel = new QLabel(i18n("&Action for incoming mails:"), this);
202 actionIncomingMailsLabel->setBuddy(mMailAction);
203 actionIncomingMailsLabel->setObjectName(QLatin1StringView("actionIncomingMailsLabel"));
204 glay->addWidget(actionIncomingMailsLabel, row, 0);
205 glay->addLayout(hLayout, row, 1);
206
207 // "Send responses also to SPAM mail" checkbox:
208 ++row;
209 mSpamCheck = new QCheckBox(i18n("Do not send vacation replies to spam messages"), this);
210 mSpamCheck->setObjectName(QLatin1StringView("mSpamCheck"));
211 mSpamCheck->setChecked(true);
212 glay->addWidget(mSpamCheck, row, 0, 1, 2);
213 connect(mSpamCheck, &QCheckBox::clicked, this, &VacationEditWidget::setWasChanged);
214
215 // domain checkbox and linedit:
216 ++row;
217 mDomainCheck = new QCheckBox(i18n("Only react to mail coming from domain:"), this);
218 mDomainCheck->setObjectName(QLatin1StringView("mDomainCheck"));
219 mDomainCheck->setChecked(false);
220 connect(mDomainCheck, &QCheckBox::clicked, this, &VacationEditWidget::setWasChanged);
221
222 mDomainEdit = new QLineEdit(this);
224 mDomainEdit->setObjectName(QLatin1StringView("mDomainEdit"));
225 mDomainEdit->setClearButtonEnabled(true);
226 mDomainEdit->setEnabled(false);
227 mDomainEdit->setValidator(new QRegularExpressionValidator(QRegularExpression(QStringLiteral("[a-zA-Z0-9+-]+(?:\\.[a-zA-Z0-9+-]+)*")), mDomainEdit));
228 glay->addWidget(mDomainCheck, row, 0);
229 glay->addWidget(mDomainEdit, row, 1);
230 connect(mDomainCheck, &QCheckBox::toggled, mDomainEdit, &QLineEdit::setEnabled);
231 connect(mDomainEdit, &QLineEdit::textChanged, this, &VacationEditWidget::setWasChanged);
232}
233
234VacationEditWidget::~VacationEditWidget() = default;
235
236bool VacationEditWidget::activateVacation() const
237{
238 return mActiveCheck->isChecked();
239}
240
241void VacationEditWidget::setActivateVacation(bool activate)
242{
243 mActiveCheck->setChecked(activate);
244}
245
246QString VacationEditWidget::messageText() const
247{
248 return mTextEdit->toPlainText().trimmed();
249}
250
251void VacationEditWidget::setMessageText(const QString &text)
252{
253 mTextEdit->setPlainText(text);
254 const int height = (mTextEdit->fontMetrics().lineSpacing() + 1) * 11;
255 mTextEdit->setMinimumHeight(height);
256}
257
258int VacationEditWidget::notificationInterval() const
259{
260 return mIntervalSpin->value();
261}
262
263void VacationEditWidget::setNotificationInterval(int days)
264{
265 mIntervalSpin->setValue(days);
266}
267
268AddrSpecList VacationEditWidget::mailAliases(bool &ok) const
269{
270 QByteArray text = mMailAliasesEdit->text().toLatin1(); // ### IMAA: !ok
271 AddressList al;
272 const char *s = text.cbegin();
273 AddrSpecList asl;
274 if (parseAddressList(s, text.cend(), al)) {
275 AddressList::const_iterator end(al.constEnd());
276 for (AddressList::const_iterator it = al.constBegin(); it != end; ++it) {
277 const MailboxList &mbl = (*it).mailboxList;
278 MailboxList::const_iterator endJt = mbl.constEnd();
279 for (MailboxList::const_iterator jt = mbl.constBegin(); jt != endJt; ++jt) {
280 asl.push_back((*jt).addrSpec());
281 }
282 }
283 ok = true;
284 } else {
285 qCWarning(LIBKSIEVEUI_LOG) << "Impossible to parse email!" << text;
286 ok = false;
287 }
288 mMailAliasesEdit->setInvalidEmail(!ok);
289 return asl;
290}
291
292void VacationEditWidget::setMailAliases(const AddrSpecList &aliases)
293{
294 QStringList sl;
295 sl.reserve(aliases.count());
296 for (const auto &str : aliases) {
297 sl.push_back(str.asString());
298 }
299 mMailAliasesEdit->setText(sl.join(QLatin1StringView(", ")));
300}
301
302void VacationEditWidget::setMailAliases(const QString &aliases)
303{
304 mMailAliasesEdit->setText(aliases);
305}
306
307void VacationEditWidget::slotIntervalSpinChanged(int value)
308{
309 mIntervalSpin->setSuffix(i18np(" day", " days", value));
310 setWasChanged();
311}
312
313QString VacationEditWidget::domainName() const
314{
315 return mDomainCheck->isChecked() ? mDomainEdit->text() : QString();
316}
317
318void VacationEditWidget::setDomainName(const QString &domain)
319{
320 if (!domain.isEmpty()) {
321 mDomainEdit->setText(domain);
322 mDomainCheck->setChecked(true);
323 }
324}
325
326bool VacationEditWidget::domainCheck() const
327{
328 return mDomainCheck->isChecked();
329}
330
331void VacationEditWidget::setDomainCheck(bool check)
332{
333 mDomainCheck->setChecked(check);
334}
335
336bool VacationEditWidget::sendForSpam() const
337{
338 return !mSpamCheck->isChecked();
339}
340
341void VacationEditWidget::setSendForSpam(bool enable)
342{
343 mSpamCheck->setChecked(!enable);
344}
345
346QDate VacationEditWidget::endDate() const
347{
348 if (mEndDate->isEnabled()) {
349 return mEndDate->date();
350 } else {
351 return {};
352 }
353}
354
355void VacationEditWidget::setEndDate(QDate endDate)
356{
357 mEndDate->setDate(endDate);
358}
359
360QTime VacationEditWidget::endTime() const
361{
362 if (mEndTime->isEnabled()) {
363 return mEndTime->time();
364 } else {
365 return {};
366 }
367}
368
369void VacationEditWidget::setEndTime(QTime endTime)
370{
371 mEndTimeActive->setChecked(endTime.isValid());
372 mEndTime->setEnabled(endTime.isValid());
373 mEndTime->setTime(endTime);
374}
375
376QDate VacationEditWidget::startDate() const
377{
378 if (mStartDate->isEnabled()) {
379 return mStartDate->date();
380 } else {
381 return {};
382 }
383}
384
385void VacationEditWidget::setStartDate(QDate startDate)
386{
387 mStartDate->setDate(startDate);
388}
389
390QTime VacationEditWidget::startTime() const
391{
392 if (mStartTime->isEnabled()) {
393 return mStartTime->time();
394 } else {
395 return {};
396 }
397}
398
399void VacationEditWidget::setStartTime(QTime startTime)
400{
401 mStartTimeActive->setChecked(startTime.isValid());
402 mStartTime->setEnabled(startTime.isValid());
403 mStartTime->setTime(startTime);
404}
405
406void VacationEditWidget::setSubject(const QString &subject)
407{
408 mSubject->setText(subject);
409}
410
411QString VacationEditWidget::subject() const
412{
413 if (mSubject->isEnabled()) {
414 return mSubject->toPlainText();
415 } else {
416 return {};
417 }
418}
419
420void VacationEditWidget::enableDates(bool enable)
421{
422 mStartDate->setVisible(enable);
423 mStartDateLabel->setVisible(enable);
424 mEndDate->setVisible(enable);
425 mEndDateLabel->setVisible(enable);
426 mStartTime->setVisible(enable);
427 mStartTimeActive->setVisible(enable);
428 mEndTime->setVisible(enable);
429 mEndTimeActive->setVisible(enable);
430}
431
432void VacationEditWidget::mailActionChanged(int action)
433{
434 mMailActionRecipient->mailActionChanged(static_cast<KSieveCore::VacationUtils::MailAction>(action));
435 setWasChanged();
436}
437
438void VacationEditWidget::setWasChanged()
439{
440 mChanged = true;
441}
442
443bool VacationEditWidget::changed() const
444{
445 return mChanged;
446}
447
448void VacationEditWidget::setChanged(bool changed)
449{
450 mChanged = changed;
451}
452
453void VacationEditWidget::setMailAction(KSieveCore::VacationUtils::MailAction action, const QString &recipient)
454{
455 mMailAction->setCurrentIndex(action);
456 mMailActionRecipient->setMailAction(action, recipient);
457}
458
459void VacationEditWidget::setSieveImapAccountSettings(const KSieveCore::SieveImapAccountSettings &account)
460{
461 mMailActionRecipient->setSieveImapAccountSettings(account);
462}
463
464KSieveCore::VacationUtils::MailAction VacationEditWidget::mailAction() const
465{
466 return static_cast<KSieveCore::VacationUtils::MailAction>(mMailAction->currentIndex());
467}
468
469QString VacationEditWidget::mailActionRecipient(bool &valid) const
470{
471 return mMailActionRecipient->mailActionRecipient(valid);
472}
473
474void VacationEditWidget::enableDomainAndSendForSpam(bool enable)
475{
476 mDomainCheck->setEnabled(enable);
477 mDomainEdit->setEnabled(enable && mDomainCheck->isChecked());
478 mSpamCheck->setEnabled(enable);
479}
480
481void VacationEditWidget::setDefault()
482{
483 setActivateVacation(true);
484 setMessageText(KSieveCore::VacationUtils::defaultMessageText());
485 setSubject(KSieveCore::VacationUtils::defaultSubject());
486 setNotificationInterval(KSieveCore::VacationUtils::defaultNotificationInterval());
487 setMailAliases(KSieveCore::VacationUtils::defaultMailAliases());
488 setSendForSpam(KSieveCore::VacationUtils::defaultSendForSpam());
489 setDomainName(KSieveCore::VacationUtils::defaultDomainName());
490 setMailAction(KSieveCore::VacationUtils::defaultMailAction(), QString());
491 mStartTimeActive->setChecked(false);
492 mEndTimeActive->setChecked(false);
493 mStartTime->setTime(QTime());
494 mEndTime->setTime(QTime());
495 mStartDate->setDate(QDate());
496 mEndDate->setDate(QDate());
497 setDomainCheck(false);
498 mDomainEdit->clear();
499}
500
501#include "moc_vacationeditwidget.cpp"
void dateEdited(const QDate &date)
void setDate(const QDate &date)
QDate date() const
void dateChanged(const QDate &date)
The SieveImapAccountSettings class.
QTime time() const
void setTime(const QTime &time)
void timeChanged(const QTime &time)
void timeEdited(const QTime &time)
QString i18np(const char *singular, const char *plural, const TYPE &arg...)
QString i18n(const char *text, const TYPE &arg...)
void catchReturnKey(QObject *lineEdit)
const QList< QKeySequence > & end()
bool isChecked() const const
void clicked(bool checked)
void toggled(bool checked)
void addWidget(QWidget *widget, int stretch, Qt::Alignment alignment)
const_iterator cbegin() const const
const_iterator cend() const const
void setCurrentIndex(int index)
void currentIndexChanged(int index)
void clear()
void textChanged(const QString &text)
void push_back(parameter_type value)
void reserve(qsizetype size)
void setSuffix(const QString &suffix)
void valueChanged(int i)
bool isEmpty() const const
QString join(QChar separator) const const
QFuture< ArgsType< Signal > > connect(Sender *sender, Signal signal)
bool isValid(int h, int m, int s, int ms)
void setEnabled(bool)
virtual void setVisible(bool visible)
This file is part of the KDE documentation.
Documentation copyright © 1996-2024 The KDE developers.
Generated on Tue Mar 26 2024 11:17:19 by doxygen 1.10.0 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.