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 "sieveactionaddheader.h"
0007 #include "autocreatescripts/autocreatescriptutil_p.h"
0008 #include "widgets/selectaddheaderpositioncombobox.h"
0009 #include <KLineEditEventHandler>
0010 
0011 #include <KLocalizedString>
0012 #include <QLineEdit>
0013 
0014 #include "libksieveui_debug.h"
0015 #include <QGridLayout>
0016 #include <QLabel>
0017 #include <QUrl>
0018 #include <QWidget>
0019 #include <QXmlStreamReader>
0020 
0021 using namespace KSieveUi;
0022 
0023 SieveActionAddHeader::SieveActionAddHeader(SieveEditorGraphicalModeWidget *sieveGraphicalModeWidget, QObject *parent)
0024     : SieveActionAbstractEditHeader(sieveGraphicalModeWidget, QStringLiteral("addheader"), i18n("Add header"), parent)
0025 {
0026 }
0027 
0028 QWidget *SieveActionAddHeader::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 combo = new SelectAddHeaderPositionCombobox;
0036     combo->setObjectName(QLatin1StringView("selectposition"));
0037     connect(combo, &SelectAddHeaderPositionCombobox::valueChanged, this, &SieveActionAddHeader::valueChanged);
0038     grid->addWidget(combo, 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     connect(headerEdit, &QLineEdit::textChanged, this, &SieveActionAddHeader::valueChanged);
0046     headerEdit->setObjectName(QLatin1StringView("headeredit"));
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     connect(valueEdit, &QLineEdit::textChanged, this, &SieveActionAddHeader::valueChanged);
0055     valueEdit->setObjectName(QLatin1StringView("valueedit"));
0056     grid->addWidget(valueEdit, 1, 2);
0057 
0058     return w;
0059 }
0060 
0061 void SieveActionAddHeader::setParamWidgetValue(QXmlStreamReader &element, QWidget *w, QString &error)
0062 {
0063     int index = 0;
0064     while (element.readNextStartElement()) {
0065         const QStringView tagName = element.name();
0066         if (tagName == QLatin1StringView("tag")) {
0067             auto combo = w->findChild<SelectAddHeaderPositionCombobox *>(QStringLiteral("selectposition"));
0068             combo->setCode(AutoCreateScriptUtil::tagValue(element.readElementText()), name(), error);
0069         } else if (tagName == QLatin1StringView("str")) {
0070             if (index == 0) {
0071                 auto edit = w->findChild<QLineEdit *>(QStringLiteral("headeredit"));
0072                 edit->setText(element.readElementText());
0073             } else if (index == 1) {
0074                 auto value = w->findChild<QLineEdit *>(QStringLiteral("valueedit"));
0075                 value->setText(AutoCreateScriptUtil::quoteStr(element.readElementText()));
0076             } else {
0077                 tooManyArguments(tagName, index, 2, error);
0078                 qCDebug(LIBKSIEVEUI_LOG) << " SieveActionAddHeader::setParamWidgetValue too many argument :" << index;
0079             }
0080             ++index;
0081         } else if (tagName == QLatin1StringView("crlf")) {
0082             element.skipCurrentElement();
0083             // nothing
0084         } else if (tagName == QLatin1StringView("comment")) {
0085             element.skipCurrentElement();
0086             // implement in the future ?
0087         } else {
0088             unknownTag(tagName, error);
0089             qCDebug(LIBKSIEVEUI_LOG) << "SieveActionAddHeader::setParamWidgetValue unknown tag " << tagName;
0090         }
0091     }
0092 }
0093 
0094 QString SieveActionAddHeader::code(QWidget *w) const
0095 {
0096     const SelectAddHeaderPositionCombobox *combo = w->findChild<SelectAddHeaderPositionCombobox *>(QStringLiteral("selectposition"));
0097     const QString position = combo->code();
0098 
0099     const QLineEdit *edit = w->findChild<QLineEdit *>(QStringLiteral("headeredit"));
0100     const QString headerStr = edit->text();
0101 
0102     const QLineEdit *value = w->findChild<QLineEdit *>(QStringLiteral("valueedit"));
0103     const QString valueStr = value->text();
0104 
0105     if (position.isEmpty()) {
0106         return QStringLiteral("addheader \"%1\" \"%2\";").arg(headerStr, valueStr);
0107     } else {
0108         return QStringLiteral("addheader %1 \"%2\" \"%3\";").arg(position, headerStr, valueStr);
0109     }
0110 }
0111 
0112 QString SieveActionAddHeader::help() const
0113 {
0114     return i18n("The addheader action adds a header field to the existing message header.");
0115 }
0116 
0117 QUrl SieveActionAddHeader::href() const
0118 {
0119     return QUrl(QStringLiteral("https://tools.ietf.org/html/rfc5293"));
0120 }
0121 
0122 #include "moc_sieveactionaddheader.cpp"