7 #include "sieveincludewidget.h" 8 #include "autocreatescripts/autocreatescriptutil_p.h" 9 #include "autocreatescriptutil_p.h" 10 #include "commonwidgets/sievehelpbutton.h" 11 #include "editor/sieveeditorutil.h" 12 #include "sievescriptblockwidget.h" 13 #include "widgets/includefilelineedit.h" 14 #include <Libkdepim/LineEditCatchReturnKey> 16 #include <KLocalizedString> 18 #include <QPushButton> 20 #include "libksieve_debug.h" 22 #include <QGridLayout> 25 #include <QXmlStreamReader> 29 static const int MINIMUMINCLUDEACTION = 1;
30 static const int MAXIMUMINCLUDEACTION = 20;
32 SieveIncludeLocation::SieveIncludeLocation(
QWidget *parent)
36 connect(
this, QOverload<int>::of(&SieveIncludeLocation::activated),
this, &SieveIncludeLocation::valueChanged);
39 SieveIncludeLocation::~SieveIncludeLocation()
43 void SieveIncludeLocation::initialize()
45 addItem(
i18n(
"personal"), QStringLiteral(
":personal"));
46 addItem(
i18n(
"global"), QStringLiteral(
":global"));
49 QString SieveIncludeLocation::code()
const 51 return itemData(currentIndex()).toString();
54 void SieveIncludeLocation::setCode(
const QString &code,
QString &error)
56 const int index = findData(code);
58 setCurrentIndex(index);
60 error +=
i18n(
"Unknown location type \"%1\" during parsing includes", code) +
QLatin1Char(
'\n');
65 SieveIncludeActionWidget::SieveIncludeActionWidget(
QWidget *parent)
71 SieveIncludeActionWidget::~SieveIncludeActionWidget()
75 void SieveIncludeActionWidget::clear()
77 mOptional->setChecked(
false);
78 mOnce->setChecked(
false);
79 mLocation->setCurrentIndex(0);
80 mIncludeFileName->clear();
83 void SieveIncludeActionWidget::setListOfIncludeFile(
const QStringList &listOfIncludeFile)
85 mIncludeFileName->setListOfIncludeFile(listOfIncludeFile);
95 mLocation->setCode(AutoCreateScriptUtil::tagValue(tagValue), error);
97 mOptional->setChecked(
true);
99 mOnce->setChecked(
true);
101 qCDebug(LIBKSIEVE_LOG) <<
" SieveIncludeActionWidget::loadScript unknown tagValue " << tagValue;
106 qCDebug(LIBKSIEVE_LOG) <<
" SieveIncludeActionWidget::loadScript unknown tagName " << tagName;
111 void SieveIncludeActionWidget::generatedScript(
QString &script)
113 const QString includeName = mIncludeFileName->text();
119 if (mOptional->isChecked()) {
122 if (mOnce->isChecked()) {
125 script += QStringLiteral(
"\"%1\";\n").
arg(includeName);
128 void SieveIncludeActionWidget::initWidget()
131 mLayout->setContentsMargins({});
133 auto lab =
new QLabel(
i18n(
"Include:"),
this);
134 mLayout->addWidget(lab, 1, 0);
135 mLocation =
new SieveIncludeLocation(
this);
136 connect(mLocation, &SieveIncludeLocation::valueChanged,
this, &SieveIncludeActionWidget::valueChanged);
137 mLayout->addWidget(mLocation, 1, 1);
140 mLayout->addWidget(lab, 1, 2);
142 mIncludeFileName =
new IncludeFileLineEdit(
this);
144 mIncludeFileName->setClearButtonEnabled(
true);
146 mLayout->addWidget(mIncludeFileName, 1, 3);
150 mLayout->addWidget(mOptional, 1, 4);
154 mLayout->addWidget(mOnce, 1, 5);
163 mLayout->addWidget(mAdd, 1, 6);
164 mLayout->addWidget(mRemove, 1, 7);
170 void SieveIncludeActionWidget::slotAddWidget()
176 void SieveIncludeActionWidget::slotRemoveWidget()
179 Q_EMIT removeWidget(
this);
182 bool SieveIncludeActionWidget::isInitialized()
const 184 return !mIncludeFileName->text().isEmpty();
187 void SieveIncludeActionWidget::updateAddRemoveButton(
bool addButtonEnabled,
bool removeButtonEnabled)
189 mAdd->setEnabled(addButtonEnabled);
190 mRemove->setEnabled(removeButtonEnabled);
193 SieveIncludeWidget::SieveIncludeWidget(
QWidget *parent)
194 : SieveWidgetPageAbstract(parent)
197 mHelpButton =
new SieveHelpButton(
this);
198 lay->addWidget(mHelpButton);
199 connect(mHelpButton, &SieveHelpButton::clicked,
this, &SieveIncludeWidget::slotHelp);
201 mIncludeLister =
new SieveIncludeWidgetLister(
this);
202 connect(mIncludeLister, &SieveIncludeWidgetLister::valueChanged,
this, &SieveIncludeWidget::valueChanged);
204 setPageType(KSieveUi::SieveScriptBlockWidget::Include);
207 SieveIncludeWidget::~SieveIncludeWidget()
211 void SieveIncludeWidget::setListOfIncludeFile(
const QStringList &lst)
213 mIncludeLister->setListOfIncludeFile(lst);
216 void SieveIncludeWidget::slotHelp()
219 "The \"include\" command takes an optional \"location\" parameter, an optional \":once\" parameter, an optional \":optional\" parameter, and a single " 220 "string argument representing the name of the script to include for processing at that point.");
221 const QString href = QStringLiteral(
"https://tools.ietf.org/html/rfc6609#page-4");
222 const QString fullWhatsThis = AutoCreateScriptUtil::createFullWhatsThis(help, href);
226 void SieveIncludeWidget::generatedScript(
QString &script,
QStringList &requireModules,
bool inForEveryPartLoop)
228 Q_UNUSED(inForEveryPartLoop)
231 mIncludeLister->generatedScript(result, lst);
232 if (!result.isEmpty()) {
234 requireModules << lst;
240 mIncludeLister->loadScript(element, error);
243 SieveIncludeWidgetLister::SieveIncludeWidgetLister(
QWidget *parent)
244 :
KPIM::KWidgetLister(false, MINIMUMINCLUDEACTION, MAXIMUMINCLUDEACTION, parent)
247 updateAddRemoveButton();
250 SieveIncludeWidgetLister::~SieveIncludeWidgetLister()
254 void SieveIncludeWidgetLister::slotAddWidget(
QWidget *w)
256 addWidgetAfterThisWidget(w);
257 updateAddRemoveButton();
260 void SieveIncludeWidgetLister::slotRemoveWidget(
QWidget *w)
263 updateAddRemoveButton();
266 void SieveIncludeWidgetLister::updateAddRemoveButton()
269 const int numberOfWidget(widgetList.
count());
270 bool addButtonEnabled =
false;
271 bool removeButtonEnabled =
false;
272 if (numberOfWidget <= widgetsMinimum()) {
273 addButtonEnabled =
true;
274 removeButtonEnabled =
false;
275 }
else if (numberOfWidget >= widgetsMaximum()) {
276 addButtonEnabled =
false;
277 removeButtonEnabled =
true;
279 addButtonEnabled =
true;
280 removeButtonEnabled =
true;
284 for (; wIt != wEnd; ++wIt) {
285 auto w =
qobject_cast<SieveIncludeActionWidget *>(*wIt);
286 w->updateAddRemoveButton(addButtonEnabled, removeButtonEnabled);
290 void SieveIncludeWidgetLister::setListOfIncludeFile(
const QStringList &listOfIncludeFile)
292 mListOfIncludeFile = listOfIncludeFile;
297 for (; wIt != wEnd; ++wIt) {
298 auto w =
qobject_cast<SieveIncludeActionWidget *>(*wIt);
299 w->setListOfIncludeFile(mListOfIncludeFile);
303 void SieveIncludeWidgetLister::generatedScript(
QString &script,
QStringList &requireModules)
305 requireModules << QStringLiteral(
"include");
309 for (; wIt != wEnd; ++wIt) {
310 auto w =
qobject_cast<SieveIncludeActionWidget *>(*wIt);
311 w->generatedScript(script);
315 void SieveIncludeWidgetLister::reconnectWidget(SieveIncludeActionWidget *w)
322 void SieveIncludeWidgetLister::clearWidget(
QWidget *aWidget)
325 auto widget =
static_cast<SieveIncludeActionWidget *
>(aWidget);
333 auto w =
new SieveIncludeActionWidget(parent);
334 w->setListOfIncludeFile(mListOfIncludeFile);
341 if (widgets().count() == MAXIMUMINCLUDEACTION) {
345 SieveIncludeActionWidget *w =
static_cast<SieveIncludeActionWidget *
>(widgets().constLast());
346 if (w->isInitialized()) {
347 addWidgetAfterThisWidget(widgets().constLast());
348 w =
static_cast<SieveIncludeActionWidget *
>(widgets().constLast());
350 w->loadScript(element, error);
void showText(const QPoint &pos, const QString &text, QWidget *w)
bool readNextStartElement()
KCRASH_EXPORT void initialize()
void textChanged(const QString &text)
int count(const T &value) const const
const QList< QKeySequence > & help()
QString readElementText(QXmlStreamReader::ReadElementTextBehaviour behaviour)
QByteArray tagValue(const Elem &elem, TagKey key)
bool isEmpty() const const
QString trimmed() const const
QString i18n(const char *text, const TYPE &arg...)
QString arg(qlonglong a, int fieldWidth, int base, QChar fillChar) const const
QIcon fromTheme(const QString &name)
QList::const_iterator constEnd() const const
QList::const_iterator constBegin() const const
QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
T qobject_cast(QObject *object)
QStringRef name() const const