7#include "sieveactionwidgetlister.h"
8#include "autocreatescriptutil_p.h"
9#include "commonwidgets/sievehelpbutton.h"
10#include "sieveactions/sieveaction.h"
11#include "sieveactions/sieveactionlist.h"
12#include "sieveeditorgraphicalmodewidget.h"
13#include "sievescriptdescriptiondialog.h"
15#include <KLocalizedString>
20#include "libksieveui_debug.h"
28#include "autocreatescripts/sieveactions/sieveactionsetvariable.h"
30using namespace KSieveUi;
32static int MINIMUMACTION = 1;
33static int MAXIMUMACTION = 8;
35SieveActionWidget::SieveActionWidget(SieveEditorGraphicalModeWidget *graphicalModeWidget,
QWidget *parent)
37 , mSieveGraphicalModeWidget(graphicalModeWidget)
42SieveActionWidget::~SieveActionWidget()
44 qDeleteAll(mActionList);
48bool SieveActionWidget::isConfigurated()
const
50 return mComboBox->currentIndex() != (mComboBox->count() - 1);
53void SieveActionWidget::setFilterAction(QWidget *widget)
55 if (mLayout->itemAtPosition(1, 3)) {
56 delete mLayout->itemAtPosition(1, 3)->widget();
60 mLayout->addWidget(widget, 1, 3);
62 mLayout->addWidget(
new QLabel(
i18nc(
"@label:textbox",
"Please select an action."),
this), 1, 3);
66void SieveActionWidget::generatedScript(QString &script, QStringList &required,
bool onlyActions,
bool inForEveryPartLoop)
68 const int index = mComboBox->currentIndex();
69 if (index != mComboBox->count() - 1) {
70 KSieveUi::SieveAction *widgetAction = mActionList.at(mComboBox->currentIndex());
71 QWidget *currentWidget = mLayout->itemAtPosition(1, 3)->widget();
72 const QStringList lstRequires = widgetAction->needRequires(currentWidget);
73 for (
const QString &r : lstRequires) {
78 QString comment = widgetAction->comment();
81 indent += AutoCreateScriptUtil::indentation();
83 if (inForEveryPartLoop) {
84 indent += AutoCreateScriptUtil::indentation();
87 const QList<QStringView> commentList = QStringView(comment).split(QLatin1Char(
'\n'));
88 for (
const QStringView str : commentList) {
90 script += QLatin1Char(
'\n');
92 script += indent + QLatin1Char(
'#') + str + QLatin1Char(
'\n');
96 script += indent + widgetAction->code(currentWidget) + QLatin1Char(
'\n');
100void SieveActionWidget::initWidget()
102 mLayout =
new QGridLayout(
this);
103 mLayout->setContentsMargins({});
105 mComboBox =
new QComboBox;
106 mComboBox->setEditable(
false);
107 mComboBox->setMinimumWidth(50);
108 const QList<KSieveUi::SieveAction *>
list = KSieveUi::SieveActionList::actionList(mSieveGraphicalModeWidget);
109 QStringList listCapabilities = mSieveGraphicalModeWidget->sieveCapabilities();
111 if (listCapabilities.
contains(QLatin1StringView(
"imap4flags"))) {
112 listCapabilities.
append(QStringLiteral(
"imapflags"));
114 for (
const auto &action : list) {
115 if (action->needCheckIfServerHasCapability()) {
116 if (listCapabilities.
contains(action->serverNeedsCapability())) {
118 mActionList.append(action);
119 connect(action, &SieveAction::valueChanged,
this, &SieveActionWidget::valueChanged);
121 mComboBox->addItem(action->label(), action->name());
127 mActionList.append(action);
128 connect(action, &SieveAction::valueChanged,
this, &SieveActionWidget::valueChanged);
130 mComboBox->addItem(action->label(), action->name());
134 mHelpButton =
new SieveHelpButton(
this);
136 mLayout->addWidget(mHelpButton, 1, 0);
138 mCommentButton =
new QToolButton(
this);
139 mCommentButton->setToolTip(
i18nc(
"@info:tooltip",
"Add comment"));
140 mLayout->addWidget(mCommentButton, 1, 1);
141 mCommentButton->setIcon(
QIcon::fromTheme(QStringLiteral(
"view-pim-notes")));
144 mComboBox->addItem(QLatin1StringView(
""));
146 mComboBox->setMaxCount(mComboBox->count());
149 mComboBox->adjustSize();
150 mLayout->addWidget(mComboBox, 1, 2);
156 mAdd =
new QPushButton(
this);
160 mRemove =
new QPushButton(
this);
163 mLayout->addWidget(mAdd, 1, 4);
164 mLayout->addWidget(mRemove, 1, 5);
175void SieveActionWidget::slotHelp()
177 const int index = mComboBox->currentIndex();
178 if (index < mActionList.count()) {
179 KSieveUi::SieveAction *action = mActionList.at(index);
180 const QString
help = action->help();
181 const QUrl href = action->href();
182 const QString fullWhatsThis = AutoCreateScriptUtil::createFullWhatsThis(help, href.
toString());
187void SieveActionWidget::clear()
189 mComboBox->setCurrentIndex(mComboBox->count() - 1);
190 setFilterAction(
nullptr);
191 mCommentButton->setEnabled(
false);
192 mHelpButton->setEnabled(
false);
195void SieveActionWidget::slotAddComment()
197 const int index = mComboBox->currentIndex();
198 if (index < mActionList.count()) {
199 KSieveUi::SieveAction *action = mActionList.at(index);
200 const QString comment = action->comment();
201 QPointer<SieveScriptDescriptionDialog> dlg =
new SieveScriptDescriptionDialog;
202 dlg->setDescription(comment);
204 action->setComment(dlg->description());
211void SieveActionWidget::slotActionChanged(
int index)
213 if (index < mActionList.count()) {
214 KSieveUi::SieveAction *action = mActionList.at(index);
215 mHelpButton->setEnabled(!action->help().
isEmpty());
216 mCommentButton->setEnabled(
true);
217 setFilterAction(action->createParamWidget(
this));
219 const bool enableAddAction = (action->name() != QLatin1StringView(
"stop"));
220 mAdd->setEnabled(enableAddAction);
222 mAdd->setEnabled(
true);
223 mCommentButton->setEnabled(
false);
224 setFilterAction(
nullptr);
225 mHelpButton->setEnabled(
false);
230void SieveActionWidget::slotAddWidget()
236void SieveActionWidget::slotRemoveWidget()
239 Q_EMIT removeWidget(
this);
242void SieveActionWidget::updateAddRemoveButton(
bool addButtonEnabled,
bool removeButtonEnabled)
244 mAdd->setEnabled(addButtonEnabled);
245 mRemove->setEnabled(removeButtonEnabled);
248void SieveActionWidget::setLocaleVariable(
const SieveGlobalVariableActionWidget::VariableElement &var)
250 const int index = mComboBox->findData(QStringLiteral(
"set"));
252 mComboBox->setCurrentIndex(index);
253 slotActionChanged(index);
256 localVar->setLocalVariable(
this, var);
264void SieveActionWidget::setAction(
const QString &actionName, QXmlStreamReader &element,
const QString &comment, QString &error)
266 const int index = mComboBox->findData(actionName);
268 mComboBox->setCurrentIndex(index);
269 slotActionChanged(index);
270 KSieveUi::SieveAction *action = mActionList.at(index);
271 action->setParamWidgetValue(element,
this, error);
272 action->setComment(comment);
274 error +=
i18n(
"Script contains unsupported feature \"%1\"", actionName) + QLatin1Char(
'\n');
275 qCDebug(LIBKSIEVEUI_LOG) <<
"Action " << actionName <<
" not supported";
280SieveActionWidgetLister::SieveActionWidgetLister(SieveEditorGraphicalModeWidget *graphicalModeWidget, QWidget *parent)
281 : KPIM::KWidgetLister(false, MINIMUMACTION, MAXIMUMACTION, parent)
282 , mSieveGraphicalModeWidget(graphicalModeWidget)
285 updateAddRemoveButton();
288SieveActionWidgetLister::~SieveActionWidgetLister() =
default;
290void SieveActionWidgetLister::slotAddWidget(
QWidget *w)
293 updateAddRemoveButton();
296void SieveActionWidgetLister::slotRemoveWidget(QWidget *w)
299 updateAddRemoveButton();
302void SieveActionWidgetLister::updateAddRemoveButton()
304 QList<QWidget *> widgetList =
widgets();
305 const int numberOfWidget(widgetList.
count());
306 bool addButtonEnabled =
false;
307 bool removeButtonEnabled =
false;
309 addButtonEnabled =
true;
310 removeButtonEnabled =
false;
312 addButtonEnabled =
false;
313 removeButtonEnabled =
true;
315 addButtonEnabled =
true;
316 removeButtonEnabled =
true;
320 for (; wIt != wEnd; ++wIt) {
322 w->updateAddRemoveButton(addButtonEnabled, removeButtonEnabled);
326void SieveActionWidgetLister::generatedScript(QString &script, QStringList &requireModules,
bool onlyActions,
bool inForEveryPartLoop)
328 const QList<QWidget *> widgetList =
widgets();
331 for (; wIt != wEnd; ++wIt) {
333 w->generatedScript(script, requireModules, onlyActions, inForEveryPartLoop);
337void SieveActionWidgetLister::reconnectWidget(SieveActionWidget *w)
344void SieveActionWidgetLister::clearWidget(QWidget *aWidget)
347 auto widget =
static_cast<SieveActionWidget *
>(aWidget);
349 updateAddRemoveButton();
354QWidget *SieveActionWidgetLister::createWidget(QWidget *parent)
356 auto w =
new SieveActionWidget(mSieveGraphicalModeWidget,
parent);
361int SieveActionWidgetLister::actionNumber()
const
366void SieveActionWidgetLister::loadLocalVariable(
const SieveGlobalVariableActionWidget::VariableElement &var)
369 if (w->isConfigurated()) {
373 w->setLocaleVariable(var);
376void SieveActionWidgetLister::loadScript(QXmlStreamReader &element,
bool onlyActions, QString &error)
380 const QStringView tagName = element.
name();
381 if (tagName == QLatin1StringView(
"action")) {
385 if (w->isConfigurated()) {
389 w->setAction(actionName, element, comment, error);
391 }
else if (tagName == QLatin1StringView(
"crlf")) {
395 qCDebug(LIBKSIEVEUI_LOG) <<
" SieveActionWidgetLister::loadScript don't have name attribute " << tagName;
398 qCDebug(LIBKSIEVEUI_LOG) <<
" SieveActionWidgetLister::loadScript Unknown tag name " << tagName;
401 bool firstAction =
true;
402 bool previousActionWasAComment =
false;
404 const QStringView tagName = element.
name();
405 if (tagName == QLatin1StringView(
"action") || tagName == QLatin1StringView(
"control") ) {
408 if (tagName == QLatin1StringView(
"control") && actionName == QLatin1StringView(
"if")) {
409 qCDebug(LIBKSIEVEUI_LOG) <<
"We found an loop if in a loop if. Not supported";
410 error +=
i18n(
"We detected a loop if in a loop if. It's not supported") + QLatin1Char(
'\n');
418 w->setAction(actionName, element, comment, error);
421 qCDebug(LIBKSIEVEUI_LOG) <<
" SieveActionWidgetLister::loadScript don't have name attribute " << tagName;
423 previousActionWasAComment =
false;
424 }
else if (tagName == QLatin1StringView(
"comment")) {
426 comment += QLatin1Char(
'\n');
428 previousActionWasAComment =
true;
430 }
else if (tagName == QLatin1StringView(
"crlf")) {
432 if (previousActionWasAComment) {
433 comment += QLatin1Char(
'\n');
437 qCDebug(LIBKSIEVEUI_LOG) <<
" SieveActionWidgetLister::loadScript unknown tagName " << tagName;
443#include "moc_sieveactionwidgetlister.cpp"
QString i18nc(const char *context, const char *text, const TYPE &arg...)
QString i18n(const char *text, const TYPE &arg...)
void error(QWidget *parent, const QString &text, const QString &title, const KGuiItem &buttonOk, Options options=Notify)
KIOCORE_EXPORT QStringList list(const QString &fileClass)
void activated(int index)
QIcon fromTheme(const QString &name)
void append(QList< T > &&value)
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)
bool isEmpty() const const
QString trimmed() const const
bool contains(QLatin1StringView str, Qt::CaseSensitivity cs) const const
QString toString() const const
QString toString(FormattingOptions options) const const
void showText(const QPoint &pos, const QString &text, QWidget *w)
bool hasAttribute(QAnyStringView namespaceUri, QAnyStringView name) const const
QStringView value(QAnyStringView namespaceUri, QAnyStringView name) const const
QXmlStreamAttributes attributes() const const
QStringView name() const const
QString readElementText(ReadElementTextBehaviour behaviour)
bool readNextStartElement()
void skipCurrentElement()