6#include "sieveconditionhasflag.h"
7#include "autocreatescripts/autocreatescriptutil_p.h"
8#include "autocreatescripts/commonwidgets/selectmatchtypecombobox.h"
9#include "autocreatescripts/sieveeditorgraphicalmodewidget.h"
10#include "editor/sieveeditorutil.h"
12#include <KLineEditEventHandler>
13#include <KLocalizedString>
16#include "libksieveui_debug.h"
20#include <QXmlStreamReader>
22using namespace KSieveUi;
23SieveConditionHasFlag::SieveConditionHasFlag(SieveEditorGraphicalModeWidget *sieveGraphicalModeWidget,
QObject *parent)
24 : SieveCondition(sieveGraphicalModeWidget, QStringLiteral(
"hasflag"),
i18n(
"Has Flag"), parent)
26 hasVariableSupport = sieveCapabilities().contains(
QLatin1StringView(
"variables"));
29QWidget *SieveConditionHasFlag::createParamWidget(
QWidget *parent)
const
31 auto w =
new QWidget(
parent);
32 auto lay =
new QHBoxLayout;
33 lay->setContentsMargins({});
35 auto selecttype =
new SelectMatchTypeComboBox(mSieveGraphicalModeWidget);
36 selecttype->setObjectName(QLatin1StringView(
"matchtype"));
37 connect(selecttype, &SelectMatchTypeComboBox::valueChanged,
this, &SieveConditionHasFlag::valueChanged);
38 lay->addWidget(selecttype);
40 auto grid =
new QGridLayout;
41 grid->setContentsMargins({});
45 if (hasVariableSupport) {
46 auto lab =
new QLabel(
i18nc(
"@label:textbox",
"Variable name\n (if empty it uses internal variable):"));
47 grid->addWidget(lab, row, 0);
49 auto variableName =
new QLineEdit;
51 variableName->setObjectName(QLatin1StringView(
"variablename"));
53 grid->addWidget(variableName, row, 1);
56 auto lab =
new QLabel(
i18nc(
"@label:textbox",
"Value:"));
57 grid->addWidget(lab, row, 0);
59 AbstractRegexpEditorLineEdit *value = AutoCreateScriptUtil::createRegexpEditorLineEdit();
60 connect(value, &AbstractRegexpEditorLineEdit::textChanged,
this, &SieveConditionHasFlag::valueChanged);
61 connect(selecttype, &SelectMatchTypeComboBox::switchToRegexp, value, &AbstractRegexpEditorLineEdit::switchToRegexpEditorLineEdit);
63 grid->addWidget(value, row, 1);
68QString SieveConditionHasFlag::code(QWidget *w)
const
70 const SelectMatchTypeComboBox *matchTypeCombo = w->
findChild<SelectMatchTypeComboBox *>(QStringLiteral(
"matchtype"));
71 bool isNegative =
false;
72 const QString matchString = matchTypeCombo->code(isNegative);
74 QString result = AutoCreateScriptUtil::negativeString(isNegative) + QStringLiteral(
"hasflag %1").
arg(matchString);
76 if (hasVariableSupport) {
77 const QLineEdit *variableName = w->
findChild<QLineEdit *>(QStringLiteral(
"variablename"));
78 const QString variableNameStr = variableName->
text();
79 if (!variableNameStr.isEmpty()) {
80 result += QLatin1StringView(
" \"") + variableNameStr + QLatin1Char(
'"');
83 const AbstractRegexpEditorLineEdit *value = w->
findChild<AbstractRegexpEditorLineEdit *>(QStringLiteral(
"value"));
84 const QString valueStr = value->code();
85 result += QLatin1StringView(
" \"") + valueStr + QLatin1Char(
'"');
87 return result + AutoCreateScriptUtil::generateConditionComment(comment());
90QStringList SieveConditionHasFlag::needRequires(QWidget *w)
const
93 if (sieveCapabilities().contains(QLatin1StringView(
"imap4flags"))) {
94 lst << QStringLiteral(
"imap4flags");
96 lst << QStringLiteral(
"imapflags");
98 if (hasVariableSupport) {
99 lst << QStringLiteral(
"variables");
101 const SelectMatchTypeComboBox *matchTypeCombo = w->
findChild<SelectMatchTypeComboBox *>(QStringLiteral(
"matchtype"));
102 lst << matchTypeCombo->needRequires();
106bool SieveConditionHasFlag::needCheckIfServerHasCapability()
const
111QString SieveConditionHasFlag::serverNeedsCapability()
const
113 return QStringLiteral(
"variables");
115 if (sieveCapabilities().contains(QLatin1StringView(
"variables"))) {
117 if (sieveCapabilities().contains(QLatin1StringView(
"imap4flags"))) {
118 return QStringLiteral(
"imap4flags");
120 return QStringLiteral(
"imapflags");
125QString SieveConditionHasFlag::help()
const
127 return i18n(
"The hasflag test evaluates to true if any of the variables matches any flag name.");
130void SieveConditionHasFlag::setParamWidgetValue(QXmlStreamReader &element, QWidget *w,
bool notCondition, QString &error)
135 const QStringView tagName = element.
name();
136 if (tagName == QLatin1StringView(
"tag")) {
137 auto matchTypeCombo = w->
findChild<SelectMatchTypeComboBox *>(QStringLiteral(
"matchtype"));
138 matchTypeCombo->setCode(AutoCreateScriptUtil::tagValueWithCondition(element.
readElementText(), notCondition), name(), error);
139 }
else if (tagName == QLatin1StringView(
"str")) {
141 }
else if (tagName == QLatin1StringView(
"crlf")) {
144 }
else if (tagName == QLatin1StringView(
"comment")) {
145 commentStr = AutoCreateScriptUtil::loadConditionComment(commentStr, element.
readElementText());
147 unknownTag(tagName, error);
148 qCDebug(LIBKSIEVEUI_LOG) <<
" SieveConditionExists::setParamWidgetValue unknown tagName " << tagName;
152 setComment(commentStr);
155 switch (strList.
count()) {
157 auto value = w->
findChild<AbstractRegexpEditorLineEdit *>(QStringLiteral(
"value"));
158 value->setCode(strList.
at(0));
162 if (hasVariableSupport) {
163 auto variableName = w->
findChild<QLineEdit *>(QStringLiteral(
"variablename"));
165 auto value = w->
findChild<AbstractRegexpEditorLineEdit *>(QStringLiteral(
"value"));
166 value->setCode(strList.
at(1));
168 qCDebug(LIBKSIEVEUI_LOG) <<
" SieveConditionHasFlag has not variable support";
172 qCDebug(LIBKSIEVEUI_LOG) <<
" SieveConditionHasFlag::setParamWidgetValue str list count not correct :" << strList.
count();
177QUrl SieveConditionHasFlag::href()
const
179 return SieveEditorUtil::helpUrl(SieveEditorUtil::strToVariableName(name()));
182#include "moc_sieveconditionhasflag.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 textChanged(const QString &text)
const_reference at(qsizetype i) const const
qsizetype count() 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
void setObjectName(QAnyStringView name)
QString arg(Args &&... args) const const
bool isEmpty() const const
QStringView name() const const
QString readElementText(ReadElementTextBehaviour behaviour)
bool readNextStartElement()
void skipCurrentElement()