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