File indexing completed on 2024-04-21 04:58:14

0001 /*
0002     Extension Manager for Konqueror
0003 
0004     SPDX-FileCopyrightText: 2003 Martijn Klingens <klingens@kde.org>
0005     SPDX-FileCopyrightText: 2004 Arend van Beelen jr. <arend@auton.nl>
0006 
0007     SPDX-License-Identifier: GPL-2.0-or-later
0008 */
0009 
0010 // Own
0011 #include "konqextensionmanager.h"
0012 
0013 // Qt
0014 #include <QDialogButtonBox>
0015 #include <QPushButton>
0016 #include <QTimer>
0017 #include <QVBoxLayout>
0018 
0019 // KDE
0020 #include <kxmlguifactory.h>
0021 #include "konqdebug.h"
0022 #include "konq_kpart_plugin.h"
0023 #include <KPluginMetaData>
0024 #include <KConfigGroup>
0025 #include <KFileUtils>
0026 #include <KLocalizedString>
0027 #include <KPluginWidget>
0028 #include <KSharedConfig>
0029 #include <kstandardguiitem.h>
0030 
0031 // Local
0032 #include "konqview.h"
0033 #include "konqmainwindow.h"
0034 
0035 class KonqExtensionManagerPrivate
0036 {
0037 public:
0038     KPluginWidget *pluginSelector;
0039     KonqMainWindow *mainWindow;
0040     KParts::ReadOnlyPart *activePart;
0041     QDialogButtonBox *buttonBox;
0042     bool isChanged = false;
0043 };
0044 
0045 KonqExtensionManager::KonqExtensionManager(QWidget *parent, KonqMainWindow *mainWindow, KParts::ReadOnlyPart *activePart)
0046     : QDialog(parent)
0047 {
0048     setObjectName(QStringLiteral("extensionmanager"));
0049     setWindowTitle(i18nc("@title:window", "Configure Extensions"));
0050 
0051     QVBoxLayout *mainLayout = new QVBoxLayout(this);
0052 
0053     d = new KonqExtensionManagerPrivate;
0054 
0055     resize(QSize(640, 480)); // FIXME: hard-coded values ?
0056 
0057     d->pluginSelector = new KPluginWidget(this);
0058     mainLayout->addWidget(d->pluginSelector);
0059     connect(d->pluginSelector, SIGNAL(changed(bool)), this, SLOT(setChanged(bool)));
0060     connect(d->pluginSelector, &KPluginWidget::pluginConfigSaved, this, [this](const QString &pluginId) {
0061         reparseConfiguration(pluginId.toLocal8Bit());
0062     });
0063 
0064     d->mainWindow = mainWindow;
0065     d->activePart = activePart;
0066 
0067     auto addPluginForId = [this](const QString &pluginId) {
0068         QVector<KPluginMetaData> metaDataList = KPluginMetaData::findPlugins(pluginId + QStringLiteral("/kpartplugins"));
0069         d->pluginSelector->addPlugins(metaDataList, i18n("Extensions"));
0070     };
0071     if (activePart) {
0072         d->pluginSelector->setConfig(KSharedConfig::openConfig(activePart->metaData().pluginId() + QLatin1String("rc"))->group("KParts Plugins"));
0073         addPluginForId(activePart->metaData().pluginId());
0074     } else {
0075         d->pluginSelector->setConfig(KSharedConfig::openConfig(QStringLiteral("konquerorrc"))->group("KParts Plugins"));
0076     }
0077     addPluginForId(QStringLiteral("konqueror")); // Always add the plugins from the konqueror namespace
0078 
0079     d->buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok|QDialogButtonBox::Cancel|QDialogButtonBox::RestoreDefaults|QDialogButtonBox::Apply);
0080     QPushButton *okButton = d->buttonBox->button(QDialogButtonBox::Ok);
0081     okButton->setDefault(true);
0082     okButton->setShortcut(Qt::CTRL | Qt::Key_Return);
0083     connect(d->buttonBox, SIGNAL(accepted()), this, SLOT(accept()));
0084     connect(d->buttonBox, SIGNAL(rejected()), this, SLOT(reject()));
0085     mainLayout->addWidget(d->buttonBox);
0086     connect(okButton, SIGNAL(clicked()), SLOT(slotOk()));
0087     connect(d->buttonBox->button(QDialogButtonBox::Apply), SIGNAL(clicked()), SLOT(slotApply()));
0088     connect(d->buttonBox->button(QDialogButtonBox::RestoreDefaults), SIGNAL(clicked()), SLOT(slotDefault()));
0089 }
0090 
0091 KonqExtensionManager::~KonqExtensionManager()
0092 {
0093     delete d;
0094 }
0095 
0096 void KonqExtensionManager::reparseConfiguration(const QByteArray &conf)
0097 {
0098     KSharedConfig::openConfig(conf + QLatin1String("rc"))->reparseConfiguration();
0099 }
0100 
0101 void KonqExtensionManager::setChanged(bool c)
0102 {
0103     d->isChanged = c;
0104     d->buttonBox->button(QDialogButtonBox::Apply)->setEnabled(c);
0105 }
0106 
0107 void KonqExtensionManager::apply()
0108 {
0109     if (d->isChanged) {
0110         d->pluginSelector->save();
0111         setChanged(false);
0112 
0113         if (d->mainWindow) {
0114             QList<KonqParts::Plugin *> plugins = KonqParts::Plugin::pluginObjects(d->mainWindow);
0115 
0116             for (int i = 0; i < plugins.size(); ++i) {
0117                 d->mainWindow->factory()->addClient(plugins.at(i));
0118             }
0119         }
0120 
0121         if (d->activePart) {
0122             KonqParts::Plugin::loadPlugins(d->activePart, d->activePart, d->activePart->componentName());
0123             QList<KonqParts::Plugin *> plugins = KonqParts::Plugin::pluginObjects(d->activePart);
0124 
0125             for (int i = 0; i < plugins.size(); ++i) {
0126                 d->activePart->factory()->addClient(plugins.at(i));
0127             }
0128         }
0129     }
0130 }
0131 
0132 void KonqExtensionManager::slotOk()
0133 {
0134     apply();
0135     accept();
0136 }
0137 
0138 void KonqExtensionManager::slotApply()
0139 {
0140     apply();
0141 }
0142 
0143 void KonqExtensionManager::slotDefault()
0144 {
0145     d->pluginSelector->defaults();
0146 }
0147 
0148 void KonqExtensionManager::showEvent(QShowEvent *event)
0149 {
0150     QDialog::showEvent(event);
0151 }
0152