File indexing completed on 2025-02-16 04:55:56

0001 /*
0002    SPDX-FileCopyrightText: 2013-2024 Laurent Montel <montel@kde.org>
0003 
0004    SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 #include "sieveactiondeleteheader.h"
0007 #include "autocreatescripts/autocreatescriptutil_p.h"
0008 #include "autocreatescripts/commonwidgets/selectmatchtypecombobox.h"
0009 #include "editor/sieveeditorutil.h"
0010 
0011 #include <KLineEditEventHandler>
0012 #include <KLocalizedString>
0013 #include <QLineEdit>
0014 
0015 #include "libksieveui_debug.h"
0016 #include <QGridLayout>
0017 #include <QLabel>
0018 #include <QWidget>
0019 #include <QXmlStreamReader>
0020 
0021 using namespace KSieveUi;
0022 
0023 SieveActionDeleteHeader::SieveActionDeleteHeader(SieveEditorGraphicalModeWidget *sieveGraphicalModeWidget, QObject *parent)
0024     : SieveActionAbstractEditHeader(sieveGraphicalModeWidget, QStringLiteral("deleteheader"), i18n("Delete header"), parent)
0025 {
0026 }
0027 
0028 QWidget *SieveActionDeleteHeader::createParamWidget(QWidget *parent) const
0029 {
0030     auto w = new QWidget(parent);
0031     auto grid = new QGridLayout;
0032     grid->setContentsMargins({});
0033     w->setLayout(grid);
0034 
0035     auto matchType = new SelectMatchTypeComboBox(mSieveGraphicalModeWidget);
0036     matchType->setObjectName(QLatin1StringView("matchtype"));
0037     connect(matchType, &SelectMatchTypeComboBox::valueChanged, this, &SieveActionDeleteHeader::valueChanged);
0038     grid->addWidget(matchType, 0, 0);
0039 
0040     auto lab = new QLabel(i18n("header:"));
0041     grid->addWidget(lab, 0, 1);
0042 
0043     auto headerEdit = new QLineEdit;
0044     KLineEditEventHandler::catchReturnKey(headerEdit);
0045     headerEdit->setObjectName(QLatin1StringView("headeredit"));
0046     connect(headerEdit, &QLineEdit::textChanged, this, &SieveActionDeleteHeader::valueChanged);
0047     grid->addWidget(headerEdit, 0, 2);
0048 
0049     lab = new QLabel(i18n("value:"));
0050     grid->addWidget(lab, 1, 1);
0051 
0052     auto valueEdit = new QLineEdit;
0053     KLineEditEventHandler::catchReturnKey(valueEdit);
0054     valueEdit->setObjectName(QLatin1StringView("valueedit"));
0055     connect(valueEdit, &QLineEdit::textChanged, this, &SieveActionDeleteHeader::valueChanged);
0056     grid->addWidget(valueEdit, 1, 2);
0057     return w;
0058 }
0059 
0060 void SieveActionDeleteHeader::parseValue(QXmlStreamReader &element, QWidget *w, QString &error, bool isNegative)
0061 {
0062     int index = 0;
0063     while (element.readNextStartElement()) {
0064         const QStringView tagName = element.name();
0065         if (tagName == QLatin1StringView("test")) {
0066             QString nameValue;
0067             if (element.attributes().hasAttribute(QLatin1StringView("name"))) {
0068                 nameValue = element.attributes().value(QLatin1StringView("name")).toString();
0069             }
0070             const bool isNot = (nameValue == QLatin1StringView("not"));
0071             parseValue(element, w, error, isNot);
0072             element.skipCurrentElement();
0073             return;
0074         } else if (tagName == QLatin1StringView("tag")) {
0075             auto combo = w->findChild<SelectMatchTypeComboBox *>(QStringLiteral("matchtype"));
0076             combo->setCode(AutoCreateScriptUtil::tagValueWithCondition(element.readElementText(), isNegative), name(), error);
0077         } else if (tagName == QLatin1StringView("str")) {
0078             if (index == 0) {
0079                 auto edit = w->findChild<QLineEdit *>(QStringLiteral("headeredit"));
0080                 edit->setText(element.readElementText());
0081             } else if (index == 1) {
0082                 auto value = w->findChild<QLineEdit *>(QStringLiteral("valueedit"));
0083                 value->setText(element.readElementText());
0084             } else {
0085                 tooManyArguments(tagName, index, 2, error);
0086                 qCDebug(LIBKSIEVEUI_LOG) << " SieveActionAddHeader::setParamWidgetValue too many argument :" << index;
0087             }
0088             ++index;
0089         } else if (tagName == QLatin1StringView("crlf")) {
0090             element.skipCurrentElement();
0091             // nothing
0092         } else if (tagName == QLatin1StringView("comment")) {
0093             element.skipCurrentElement();
0094             // implement in the future ?
0095         } else {
0096             unknownTag(tagName, error);
0097             qCDebug(LIBKSIEVEUI_LOG) << "SieveActionAddHeader::setParamWidgetValue unknown tag " << tagName;
0098         }
0099     }
0100 }
0101 
0102 void SieveActionDeleteHeader::setParamWidgetValue(QXmlStreamReader &element, QWidget *w, QString &error)
0103 {
0104     parseValue(element, w, error, false);
0105 }
0106 
0107 QString SieveActionDeleteHeader::code(QWidget *w) const
0108 {
0109     const SelectMatchTypeComboBox *combo = w->findChild<SelectMatchTypeComboBox *>(QStringLiteral("matchtype"));
0110     bool isNegative = false;
0111     const QString matchTypeStr = combo->code(isNegative);
0112 
0113     const QLineEdit *edit = w->findChild<QLineEdit *>(QStringLiteral("headeredit"));
0114     const QString headerStr = edit->text();
0115 
0116     const QLineEdit *value = w->findChild<QLineEdit *>(QStringLiteral("valueedit"));
0117     const QString valueStr = value->text();
0118 
0119     return QStringLiteral("deleteheader %1 \"%2\" \"%3\";").arg((isNegative ? QLatin1StringView("not ") + matchTypeStr : matchTypeStr), headerStr, valueStr);
0120 }
0121 
0122 QString SieveActionDeleteHeader::help() const
0123 {
0124     return i18n("By default, the deleteheader action deletes all occurrences of the named header field.");
0125 }
0126 
0127 QUrl SieveActionDeleteHeader::href() const
0128 {
0129     return SieveEditorUtil::helpUrl(SieveEditorUtil::strToVariableName(name()));
0130 }
0131 
0132 QStringList SieveActionDeleteHeader::needRequires(QWidget *w) const
0133 {
0134     const SelectMatchTypeComboBox *combo = w->findChild<SelectMatchTypeComboBox *>(QStringLiteral("matchtype"));
0135     return SieveActionAbstractEditHeader::needRequires(w) + combo->needRequires();
0136 }
0137 
0138 #include "moc_sieveactiondeleteheader.cpp"