File indexing completed on 2024-06-02 05:20:34

0001 /*
0002    SPDX-FileCopyrightText: 2018-2024 Laurent Montel <montel@kde.org>
0003 
0004    SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include "emaillineedit.h"
0008 #include "sieveeditoremaillineditplugin_debug.h"
0009 #include <Akonadi/EmailAddressSelectionDialog>
0010 #include <KPluginFactory>
0011 #include <KStatefulBrush>
0012 
0013 #include <KColorScheme>
0014 #include <KLocalizedString>
0015 #include <QHBoxLayout>
0016 #include <QLineEdit>
0017 #include <QToolButton>
0018 #include <QTreeView>
0019 #include <memory>
0020 
0021 K_PLUGIN_CLASS_WITH_JSON(EmailLineEdit, "emaillineedit.json")
0022 
0023 EmailLineEdit::EmailLineEdit(QWidget *parent, const QList<QVariant> &)
0024     : KSieveUi::AbstractSelectEmailLineEdit(parent)
0025     , mLineEdit(new QLineEdit(this))
0026     , mEmailButton(new QToolButton(this))
0027 {
0028     auto mainLayout = new QHBoxLayout(this);
0029     mainLayout->setObjectName(QLatin1StringView("mainlayout"));
0030     mainLayout->setContentsMargins({});
0031 
0032     mLineEdit->setObjectName(QLatin1StringView("lineedit"));
0033     mLineEdit->setClearButtonEnabled(true);
0034     mLineEdit->setPlaceholderText(i18n("Click on button for selecting contacts..."));
0035     connect(mLineEdit, &QLineEdit::textChanged, this, &EmailLineEdit::slotTextChanged);
0036     mainLayout->addWidget(mLineEdit);
0037 
0038     mEmailButton->setText(i18n("..."));
0039     mEmailButton->setObjectName(QLatin1StringView("emailbutton"));
0040     mEmailButton->setToolTip(i18n("Select Emails"));
0041     mainLayout->addWidget(mEmailButton);
0042     connect(mEmailButton, &QToolButton::clicked, this, &EmailLineEdit::slotSelectEmail);
0043     verifyAkonadiStatus();
0044     connect(Akonadi::ServerManager::self(), &Akonadi::ServerManager::stateChanged, this, &EmailLineEdit::akonadiStateChanged);
0045     verifyAddress();
0046 }
0047 
0048 EmailLineEdit::~EmailLineEdit() = default;
0049 
0050 void EmailLineEdit::akonadiStateChanged(Akonadi::ServerManager::State state)
0051 {
0052     mEmailButton->setVisible(state == Akonadi::ServerManager::Running);
0053 }
0054 
0055 void EmailLineEdit::verifyAkonadiStatus()
0056 {
0057     const Akonadi::ServerManager::State state = Akonadi::ServerManager::self()->state();
0058     mEmailButton->setVisible(state == Akonadi::ServerManager::Running);
0059 }
0060 
0061 void EmailLineEdit::insertAddresses(const KContacts::Addressee::List &list)
0062 {
0063     QString currentText = mLineEdit->text();
0064     bool firstElement = currentText.isEmpty();
0065     for (const KContacts::Addressee &contact : list) {
0066         if (!firstElement) {
0067             currentText.append(QLatin1Char(';'));
0068         } else {
0069             firstElement = false;
0070         }
0071         currentText.append(contact.preferredEmail());
0072     }
0073     mLineEdit->setText(currentText);
0074 }
0075 
0076 void EmailLineEdit::slotSelectEmail()
0077 {
0078     std::unique_ptr<Akonadi::AbstractEmailAddressSelectionDialog> dlg;
0079     const KPluginMetaData editWidgetPlugin(QStringLiteral("pim6/akonadi/emailaddressselectionldapdialogplugin"));
0080 
0081     const auto result = KPluginFactory::instantiatePlugin<Akonadi::AbstractEmailAddressSelectionDialog>(editWidgetPlugin);
0082     if (result) {
0083         dlg.reset(result.plugin);
0084     } else {
0085         dlg = std::make_unique<Akonadi::EmailAddressSelectionDialog>(this);
0086     }
0087     dlg->setWindowTitle(i18nc("@title:window", "Select Emails"));
0088     dlg->view()->view()->setSelectionMode(multiSelection() ? QAbstractItemView::MultiSelection : QAbstractItemView::SingleSelection);
0089     connect(dlg.get(), &Akonadi::AbstractEmailAddressSelectionDialog::insertAddresses, this, &EmailLineEdit::insertAddresses);
0090     if (dlg->exec()) {
0091         const Akonadi::EmailAddressSelection::List lstAddress = dlg->selectedAddresses();
0092         if (!lstAddress.isEmpty()) {
0093             bool firstElement = true;
0094             QString result;
0095             for (const Akonadi::EmailAddressSelection &value : lstAddress) {
0096                 if (!firstElement) {
0097                     result.append(QLatin1Char(';'));
0098                 } else {
0099                     firstElement = false;
0100                 }
0101                 result.append(value.email());
0102             }
0103             mLineEdit->setText(result);
0104         }
0105     }
0106 }
0107 
0108 void EmailLineEdit::setText(const QString &str)
0109 {
0110     mLineEdit->setText(str);
0111 }
0112 
0113 QString EmailLineEdit::text() const
0114 {
0115     return mLineEdit->text();
0116 }
0117 
0118 bool EmailLineEdit::isValid() const
0119 {
0120     return mEmailIsValid;
0121 }
0122 
0123 void EmailLineEdit::slotTextChanged()
0124 {
0125     verifyAddress();
0126     Q_EMIT valueChanged();
0127 }
0128 
0129 void EmailLineEdit::verifyAddress()
0130 {
0131 #ifndef QT_NO_STYLE_STYLESHEET
0132     QString styleSheet;
0133     const QString lineEditText = text();
0134     mEmailIsValid = lineEditText.contains(QLatin1Char('@'));
0135     if (mNegativeBackground.isEmpty()) {
0136         KStatefulBrush bgBrush = KStatefulBrush(KColorScheme::View, KColorScheme::NegativeText);
0137         mNegativeBackground = QStringLiteral("QLineEdit{ background-color:%1 }").arg(bgBrush.brush(palette()).color().name());
0138     }
0139     if (!mEmailIsValid) {
0140         styleSheet = mNegativeBackground;
0141     }
0142     mLineEdit->setStyleSheet(styleSheet);
0143 #endif
0144 }
0145 
0146 #include "emaillineedit.moc"
0147 
0148 #include "moc_emaillineedit.cpp"