File indexing completed on 2024-06-23 05:18:35
0001 /* 0002 SPDX-FileCopyrightText: 2019-2024 Laurent Montel <montel@kde.org> 0003 0004 SPDX-License-Identifier: LGPL-2.0-or-later 0005 */ 0006 0007 #include "plugineditorgrammarmanager.h" 0008 #include "messagecomposer_debug.h" 0009 #include "plugineditorgrammarcustomtoolsviewinterface.h" 0010 #include <KPluginFactory> 0011 #include <KPluginMetaData> 0012 #include <PimCommon/CustomToolsPlugin> 0013 #include <QFileInfo> 0014 0015 using namespace MessageComposer; 0016 0017 class PluginEditorGrammarInfo 0018 { 0019 public: 0020 PluginEditorGrammarInfo() = default; 0021 0022 PimCommon::PluginUtilData pluginData; 0023 QString metaDataFileNameBaseName; 0024 QString metaDataFileName; 0025 KPluginMetaData data; 0026 PimCommon::CustomToolsPlugin *plugin = nullptr; 0027 bool isEnabled = true; 0028 }; 0029 0030 namespace 0031 { 0032 QString pluginEditorGrammarVersion() 0033 { 0034 return QStringLiteral("1.0"); 0035 } 0036 } 0037 0038 class MessageComposer::PluginEditorGrammarManagerPrivate 0039 { 0040 public: 0041 PluginEditorGrammarManagerPrivate(PluginEditorGrammarManager *qq) 0042 : q(qq) 0043 { 0044 initializePlugins(); 0045 } 0046 0047 void loadPlugin(PluginEditorGrammarInfo *item); 0048 [[nodiscard]] QList<PimCommon::CustomToolsPlugin *> pluginsList() const; 0049 void initializePlugins(); 0050 QList<PluginEditorGrammarInfo> mPluginList; 0051 [[nodiscard]] QString configPrefixSettingKey() const; 0052 [[nodiscard]] QString configGroupName() const; 0053 [[nodiscard]] QList<PimCommon::PluginUtilData> pluginsDataList() const; 0054 PimCommon::CustomToolsPlugin *pluginFromIdentifier(const QString &id); 0055 0056 private: 0057 QList<PimCommon::PluginUtilData> mPluginDataList; 0058 PluginEditorGrammarManager *const q; 0059 }; 0060 0061 QString PluginEditorGrammarManagerPrivate::configGroupName() const 0062 { 0063 return QStringLiteral("KMailPluginEditorGrammar"); 0064 } 0065 0066 QString PluginEditorGrammarManagerPrivate::configPrefixSettingKey() const 0067 { 0068 return QStringLiteral("PluginEditorGrammar"); 0069 } 0070 0071 QList<PimCommon::PluginUtilData> PluginEditorGrammarManagerPrivate::pluginsDataList() const 0072 { 0073 return mPluginDataList; 0074 } 0075 0076 void PluginEditorGrammarManagerPrivate::initializePlugins() 0077 { 0078 const QList<KPluginMetaData> plugins = KPluginMetaData::findPlugins(QStringLiteral("pim6/kmail/plugineditorgrammar")); 0079 0080 const QPair<QStringList, QStringList> pair = PimCommon::PluginUtil::loadPluginSetting(configGroupName(), configPrefixSettingKey()); 0081 0082 QListIterator<KPluginMetaData> i(plugins); 0083 i.toBack(); 0084 while (i.hasPrevious()) { 0085 PluginEditorGrammarInfo info; 0086 const KPluginMetaData data = i.previous(); 0087 0088 // 1) get plugin data => name/description etc. 0089 info.pluginData = PimCommon::PluginUtil::createPluginMetaData(data); 0090 // 2) look at if plugin is activated 0091 const bool isPluginActivated = 0092 PimCommon::PluginUtil::isPluginActivated(pair.first, pair.second, info.pluginData.mEnableByDefault, info.pluginData.mIdentifier); 0093 info.isEnabled = isPluginActivated; 0094 info.metaDataFileNameBaseName = QFileInfo(data.fileName()).baseName(); 0095 info.metaDataFileName = data.fileName(); 0096 info.data = data; 0097 if (pluginEditorGrammarVersion() == data.version()) { 0098 info.plugin = nullptr; 0099 mPluginList.push_back(info); 0100 } else { 0101 qCWarning(MESSAGECOMPOSER_LOG) << "Plugin " << data.name() << " doesn't have correction plugin version. It will not be loaded."; 0102 } 0103 } 0104 QList<PluginEditorGrammarInfo>::iterator end(mPluginList.end()); 0105 for (QList<PluginEditorGrammarInfo>::iterator it = mPluginList.begin(); it != end; ++it) { 0106 loadPlugin(&(*it)); 0107 } 0108 } 0109 0110 void PluginEditorGrammarManagerPrivate::loadPlugin(PluginEditorGrammarInfo *item) 0111 { 0112 if (auto plugin = KPluginFactory::instantiatePlugin<PimCommon::CustomToolsPlugin>(item->data, q, QVariantList() << item->metaDataFileName).plugin) { 0113 item->plugin = plugin; 0114 item->plugin->setIsEnabled(item->isEnabled); 0115 item->pluginData.mHasConfigureDialog = item->plugin->hasConfigureDialog(); 0116 mPluginDataList.append(item->pluginData); 0117 } 0118 } 0119 0120 QList<PimCommon::CustomToolsPlugin *> PluginEditorGrammarManagerPrivate::pluginsList() const 0121 { 0122 QList<PimCommon::CustomToolsPlugin *> lst; 0123 QList<PluginEditorGrammarInfo>::ConstIterator end(mPluginList.constEnd()); 0124 for (QList<PluginEditorGrammarInfo>::ConstIterator it = mPluginList.constBegin(); it != end; ++it) { 0125 if (auto plugin = (*it).plugin) { 0126 lst << plugin; 0127 } 0128 } 0129 return lst; 0130 } 0131 0132 PimCommon::CustomToolsPlugin *PluginEditorGrammarManagerPrivate::pluginFromIdentifier(const QString &id) 0133 { 0134 QList<PluginEditorGrammarInfo>::ConstIterator end(mPluginList.constEnd()); 0135 for (QList<PluginEditorGrammarInfo>::ConstIterator it = mPluginList.constBegin(); it != end; ++it) { 0136 if ((*it).pluginData.mIdentifier == id) { 0137 return (*it).plugin; 0138 } 0139 } 0140 return {}; 0141 } 0142 0143 PluginEditorGrammarManager::PluginEditorGrammarManager(QObject *parent) 0144 : QObject(parent) 0145 , d(new MessageComposer::PluginEditorGrammarManagerPrivate(this)) 0146 { 0147 qRegisterMetaType<MessageComposer::PluginGrammarAction>(); 0148 } 0149 0150 PluginEditorGrammarManager::~PluginEditorGrammarManager() = default; 0151 0152 PluginEditorGrammarManager *PluginEditorGrammarManager::self() 0153 { 0154 static PluginEditorGrammarManager s_self; 0155 return &s_self; 0156 } 0157 0158 QList<PimCommon::CustomToolsPlugin *> PluginEditorGrammarManager::pluginsList() const 0159 { 0160 return d->pluginsList(); 0161 } 0162 0163 QString PluginEditorGrammarManager::configGroupName() const 0164 { 0165 return d->configGroupName(); 0166 } 0167 0168 QString PluginEditorGrammarManager::configPrefixSettingKey() const 0169 { 0170 return d->configPrefixSettingKey(); 0171 } 0172 0173 QList<PimCommon::PluginUtilData> PluginEditorGrammarManager::pluginsDataList() const 0174 { 0175 return d->pluginsDataList(); 0176 } 0177 0178 PimCommon::CustomToolsPlugin *PluginEditorGrammarManager::pluginFromIdentifier(const QString &id) 0179 { 0180 return d->pluginFromIdentifier(id); 0181 } 0182 0183 #include "moc_plugineditorgrammarmanager.cpp"