7#include "sieveincludewidget.h"
8#include "autocreatescripts/autocreatescriptutil_p.h"
9#include "autocreatescriptutil_p.h"
10#include "commonwidgets/sievehelpbutton.h"
11#include "sievescriptblockwidget.h"
12#include "widgets/includefilelineedit.h"
13#include <KLineEditEventHandler>
15#include <KLocalizedString>
20#include "libksieveui_debug.h"
25#include <QXmlStreamReader>
27using namespace KSieveUi;
29static const int MINIMUMINCLUDEACTION = 1;
30static const int MAXIMUMINCLUDEACTION = 20;
32SieveIncludeLocation::SieveIncludeLocation(
QWidget *parent)
39SieveIncludeLocation::~SieveIncludeLocation() =
default;
41void SieveIncludeLocation::initialize()
43 addItem(
i18n(
"personal"), QStringLiteral(
":personal"));
47QString SieveIncludeLocation::code()
const
52void SieveIncludeLocation::setCode(
const QString &code, QString &error)
58 error +=
i18n(
"Unknown location type \"%1\" during parsing includes", code) + QLatin1Char(
'\n');
63SieveIncludeActionWidget::SieveIncludeActionWidget(QWidget *parent)
69SieveIncludeActionWidget::~SieveIncludeActionWidget() =
default;
71void SieveIncludeActionWidget::clear()
73 mOptional->setChecked(
false);
74 mOnce->setChecked(
false);
75 mLocation->setCurrentIndex(0);
76 mIncludeFileName->clear();
79void SieveIncludeActionWidget::setListOfIncludeFile(
const QStringList &listOfIncludeFile)
81 mIncludeFileName->setListOfIncludeFile(listOfIncludeFile);
84void SieveIncludeActionWidget::loadScript(QXmlStreamReader &element, QString &error)
87 const QStringView tagName = element.
name();
88 if (tagName == QLatin1StringView(
"tag")) {
90 if (tagValue == QLatin1StringView(
"personal") || tagValue == QLatin1StringView(
"global")) {
91 mLocation->setCode(AutoCreateScriptUtil::tagValue(tagValue), error);
92 }
else if (tagValue == QLatin1StringView(
"optional")) {
93 mOptional->setChecked(
true);
94 }
else if (tagValue == QLatin1StringView(
"once")) {
95 mOnce->setChecked(
true);
97 qCDebug(LIBKSIEVEUI_LOG) <<
" SieveIncludeActionWidget::loadScript unknown tagValue " <<
tagValue;
99 }
else if (tagName == QLatin1StringView(
"str")) {
102 qCDebug(LIBKSIEVEUI_LOG) <<
" SieveIncludeActionWidget::loadScript unknown tagName " << tagName;
107void SieveIncludeActionWidget::generatedScript(QString &script)
109 const QString includeName = mIncludeFileName->text().trimmed();
113 script += QLatin1StringView(
"include ");
114 script += mLocation->code() + QLatin1Char(
' ');
115 if (mOptional->isChecked()) {
116 script += QLatin1StringView(
":optional ");
118 if (mOnce->isChecked()) {
119 script += QLatin1StringView(
":once ");
121 script += QStringLiteral(
"\"%1\";\n").
arg(includeName);
124void SieveIncludeActionWidget::initWidget()
126 mLayout =
new QGridLayout(
this);
127 mLayout->setContentsMargins({});
129 auto lab =
new QLabel(
i18nc(
"@label:textbox",
"Include:"),
this);
130 mLayout->addWidget(lab, 1, 0);
131 mLocation =
new SieveIncludeLocation(
this);
132 connect(mLocation, &SieveIncludeLocation::valueChanged,
this, &SieveIncludeActionWidget::valueChanged);
133 mLayout->addWidget(mLocation, 1, 1);
135 lab =
new QLabel(
i18nc(
"@label:textbox",
"Name:"),
this);
136 mLayout->addWidget(lab, 1, 2);
138 mIncludeFileName =
new IncludeFileLineEdit(
this);
140 mIncludeFileName->setClearButtonEnabled(
true);
142 mLayout->addWidget(mIncludeFileName, 1, 3);
144 mOptional =
new QCheckBox(
i18nc(
"@option:check",
"Optional"),
this);
146 mLayout->addWidget(mOptional, 1, 4);
148 mOnce =
new QCheckBox(
i18nc(
"@option:check",
"Once"),
this);
150 mLayout->addWidget(mOnce, 1, 5);
152 mAdd =
new QPushButton(
this);
156 mRemove =
new QPushButton(
this);
159 mLayout->addWidget(mAdd, 1, 6);
160 mLayout->addWidget(mRemove, 1, 7);
166void SieveIncludeActionWidget::slotAddWidget()
172void SieveIncludeActionWidget::slotRemoveWidget()
175 Q_EMIT removeWidget(
this);
178bool SieveIncludeActionWidget::isInitialized()
const
180 return !mIncludeFileName->text().isEmpty();
183void SieveIncludeActionWidget::updateAddRemoveButton(
bool addButtonEnabled,
bool removeButtonEnabled)
185 mAdd->setEnabled(addButtonEnabled);
186 mRemove->setEnabled(removeButtonEnabled);
189SieveIncludeWidget::SieveIncludeWidget(QWidget *parent)
190 : SieveWidgetPageAbstract(parent)
193 mHelpButton =
new SieveHelpButton(
this);
194 lay->addWidget(mHelpButton);
197 mIncludeLister =
new SieveIncludeWidgetLister(
this);
198 connect(mIncludeLister, &SieveIncludeWidgetLister::valueChanged,
this, &SieveIncludeWidget::valueChanged);
201 scrollArea->setAutoFillBackground(
false);
202 scrollArea->setWidget(mIncludeLister);
203 scrollArea->setWidgetResizable(
true);
205 lay->addWidget(scrollArea);
207 setPageType(KSieveUi::SieveScriptBlockWidget::Include);
210SieveIncludeWidget::~SieveIncludeWidget() =
default;
212void SieveIncludeWidget::setListOfIncludeFile(
const QStringList &lst)
214 mIncludeLister->setListOfIncludeFile(lst);
217void SieveIncludeWidget::slotHelp()
220 "The \"include\" command takes an optional \"location\" parameter, an optional \":once\" parameter, an optional \":optional\" parameter, and a single "
221 "string argument representing the name of the script to include for processing at that point.");
222 const QString href = QStringLiteral(
"https://tools.ietf.org/html/rfc6609#page-4");
223 const QString fullWhatsThis = AutoCreateScriptUtil::createFullWhatsThis(help, href);
227void SieveIncludeWidget::generatedScript(QString &script, QStringList &requireModules,
bool inForEveryPartLoop)
229 Q_UNUSED(inForEveryPartLoop)
232 mIncludeLister->generatedScript(result, lst);
235 requireModules << lst;
239void SieveIncludeWidget::loadScript(QXmlStreamReader &element, QString &error)
241 mIncludeLister->loadScript(element, error);
244SieveIncludeWidgetLister::SieveIncludeWidgetLister(QWidget *parent)
245 : KPIM::KWidgetLister(false, MINIMUMINCLUDEACTION, MAXIMUMINCLUDEACTION, parent)
248 updateAddRemoveButton();
251SieveIncludeWidgetLister::~SieveIncludeWidgetLister() =
default;
253void SieveIncludeWidgetLister::slotAddWidget(
QWidget *w)
256 updateAddRemoveButton();
259void SieveIncludeWidgetLister::slotRemoveWidget(QWidget *w)
262 updateAddRemoveButton();
265void SieveIncludeWidgetLister::updateAddRemoveButton()
267 QList<QWidget *> widgetList =
widgets();
268 const int numberOfWidget(widgetList.
count());
269 bool addButtonEnabled =
false;
270 bool removeButtonEnabled =
false;
272 addButtonEnabled =
true;
273 removeButtonEnabled =
false;
275 addButtonEnabled =
false;
276 removeButtonEnabled =
true;
278 addButtonEnabled =
true;
279 removeButtonEnabled =
true;
283 for (; wIt != wEnd; ++wIt) {
285 w->updateAddRemoveButton(addButtonEnabled, removeButtonEnabled);
289void SieveIncludeWidgetLister::setListOfIncludeFile(
const QStringList &listOfIncludeFile)
291 mListOfIncludeFile = listOfIncludeFile;
293 const QList<QWidget *> widgetList =
widgets();
296 for (; wIt != wEnd; ++wIt) {
298 w->setListOfIncludeFile(mListOfIncludeFile);
302void SieveIncludeWidgetLister::generatedScript(QString &script, QStringList &requireModules)
304 requireModules << QStringLiteral(
"include");
305 const QList<QWidget *> widgetList =
widgets();
308 for (; wIt != wEnd; ++wIt) {
310 w->generatedScript(script);
314void SieveIncludeWidgetLister::reconnectWidget(SieveIncludeActionWidget *w)
321void SieveIncludeWidgetLister::clearWidget(QWidget *aWidget)
324 auto widget =
static_cast<SieveIncludeActionWidget *
>(aWidget);
326 updateAddRemoveButton();
331QWidget *SieveIncludeWidgetLister::createWidget(QWidget *parent)
333 auto w =
new SieveIncludeActionWidget(
parent);
334 w->setListOfIncludeFile(mListOfIncludeFile);
339void SieveIncludeWidgetLister::loadScript(QXmlStreamReader &element, QString &error)
341 if (
widgets().count() == MAXIMUMINCLUDEACTION) {
342 error += QLatin1Char(
'\n') +
i18n(
"We can not add more includes elements.") + QLatin1Char(
'\n');
345 SieveIncludeActionWidget *w =
static_cast<SieveIncludeActionWidget *
>(
widgets().constLast());
346 if (w->isInitialized()) {
348 w =
static_cast<SieveIncludeActionWidget *
>(
widgets().constLast());
350 w->loadScript(element, error);
353#include "moc_sieveincludewidget.cpp"
QString i18nc(const char *context, const char *text, const TYPE &arg...)
QString i18n(const char *text, const TYPE &arg...)
void catchReturnKey(QObject *lineEdit)
void error(QWidget *parent, const QString &text, const QString &title, const KGuiItem &buttonOk, Options options=Notify)
void initialize(StandardShortcut id)
QByteArray tagValue(const Elem &elem, const char *keyName)
void activated(int index)
void addItem(const QIcon &icon, const QString &text, const QVariant &userData)
int findData(const QVariant &data, int role, Qt::MatchFlags flags) const const
QVariant itemData(int index, int role) const const
QIcon fromTheme(const QString &name)
void textChanged(const QString &text)
const_iterator constBegin() const const
const_iterator constEnd() const const
qsizetype count() const const
QMetaObject::Connection connect(const QObject *sender, PointerToMemberFunction signal, Functor functor)
QObject * parent() const const
T qobject_cast(QObject *object)
QString arg(Args &&... args) const const
bool isEmpty() const const
QFuture< ArgsType< Signal > > connect(Sender *sender, Signal signal)
QString toString() const const
void showText(const QPoint &pos, const QString &text, QWidget *w)
QStringView name() const const
QString readElementText(ReadElementTextBehaviour behaviour)
bool readNextStartElement()