/* This file is part of the KDE libraries and the Kate part. * * Copyright (C) 2001-2010 Christoph Cullmann * Copyright (C) 2001 Joseph Wenninger * Copyright (C) 2001 Anders Lund * Copyright (C) 2007 Dominik Haumann * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public License * along with this library; see the file COPYING.LIB. If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include "katepartpluginmanager.h" #include "moc_katepartpluginmanager.cpp" #include "kateglobal.h" #include #include #include #include #include #include #include #include #include KatePartPluginInfo::KatePartPluginInfo(KService::Ptr service) : m_pluginInfo(service) { } QString KatePartPluginInfo::saveName() const { QString saveName = m_pluginInfo.pluginName(); if (saveName.isEmpty()) saveName = service()->library(); return saveName; } KatePartPluginManager::KatePartPluginManager() : QObject(), m_config(new KConfig("katepartpluginsrc", KConfig::NoGlobals)) { setupPluginList (); loadConfig (); } KatePartPluginManager::~KatePartPluginManager() { writeConfig(); // than unload the plugins unloadAllPlugins (); delete m_config; m_config = 0; } KatePartPluginManager *KatePartPluginManager::self() { return KateGlobal::self()->pluginManager (); } void KatePartPluginManager::setupPluginList () { KService::List traderList = KServiceTypeTrader::self()-> query("KTextEditor/Plugin"); foreach(const KService::Ptr &ptr, traderList) { QVariant version = ptr->property("X-KDE-Version", QVariant::String); QStringList numbers = qvariant_cast(version).split('.'); unsigned int kdeVersion = KDE_MAKE_VERSION(numbers.value(0).toUInt(), numbers.value(1).toUInt(), numbers.value(2).toUInt()); if (KDE_MAKE_VERSION(4,0,0) <= kdeVersion && kdeVersion <= KDE::version()) { KatePartPluginInfo info(ptr); info.load = false; info.plugin = 0L; m_pluginList.push_back (info); } } } void KatePartPluginManager::addDocument(KTextEditor::Document *doc) { //kDebug() << doc; for (KatePartPluginList::iterator it = m_pluginList.begin(); it != m_pluginList.end(); ++it) { if (it->load) { it->plugin->addDocument(doc); } } } void KatePartPluginManager::removeDocument(KTextEditor::Document *doc) { //kDebug() << doc; for (KatePartPluginList::iterator it = m_pluginList.begin(); it != m_pluginList.end(); ++it) { if (it->load) { it->plugin->removeDocument(doc); } } } void KatePartPluginManager::addView(KTextEditor::View *view) { //kDebug() << view; for (KatePartPluginList::iterator it = m_pluginList.begin(); it != m_pluginList.end(); ++it) { if (it->load) { it->plugin->addView(view); } } } void KatePartPluginManager::removeView(KTextEditor::View *view) { //kDebug() << view; for (KatePartPluginList::iterator it = m_pluginList.begin(); it != m_pluginList.end(); ++it) { if (it->load) { it->plugin->removeView(view); } } } void KatePartPluginManager::loadConfig () { // first: unload the plugins unloadAllPlugins (); KConfigGroup cg = KConfigGroup(m_config, "Kate Part Plugins"); // disable all plugin if no config... foreach (const KatePartPluginInfo &plugin, m_pluginList) { bool enabledByDefault = plugin.isEnabledByDefault(); plugin.load = cg.readEntry (plugin.saveName(), enabledByDefault); } loadAllPlugins(); } void KatePartPluginManager::writeConfig() { KConfigGroup cg = KConfigGroup( m_config, "Kate Part Plugins" ); foreach(const KatePartPluginInfo &it, m_pluginList) { cg.writeEntry (it.saveName(), it.load); } } void KatePartPluginManager::loadAllPlugins () { for (KatePartPluginList::iterator it = m_pluginList.begin(); it != m_pluginList.end(); ++it) { if (it->load) { loadPlugin(*it); enablePlugin(*it); } } } void KatePartPluginManager::unloadAllPlugins () { for (KatePartPluginList::iterator it = m_pluginList.begin(); it != m_pluginList.end(); ++it) { if (it->plugin) { disablePlugin(*it); unloadPlugin(*it); } } } void KatePartPluginManager::loadPlugin (KatePartPluginInfo &item) { if (item.plugin) return; // make sure all dependencies are loaded beforehand QStringList openDependencies = item.dependencies(); if ( !openDependencies.empty() ) { for (KatePartPluginList::iterator it = m_pluginList.begin(); it != m_pluginList.end(); ++it) { if ( openDependencies.contains( it->saveName() ) ) { loadPlugin( *it ); openDependencies.removeAll( it->saveName() ); } } Q_ASSERT( openDependencies.empty() ); } // try to load, else reset load flag! QString error; item.plugin = item.service()->createInstance(this, QVariantList(), &error); if ( !item.plugin ) kWarning() << "failed to load plugin" << item.service()->name() << ":" << error; item.load = (item.plugin != 0); } void KatePartPluginManager::unloadPlugin (KatePartPluginInfo &item) { if ( !item.plugin ) return; // make sure dependent plugins are unloaded beforehand for (KatePartPluginList::iterator it = m_pluginList.begin(); it != m_pluginList.end(); ++it) { if ( !it->plugin ) continue; if ( it->dependencies().contains( item.saveName() ) ) { unloadPlugin( *it ); } } delete item.plugin; item.plugin = 0L; item.load = false; } void KatePartPluginManager::enablePlugin (KatePartPluginInfo &item) { // plugin around at all? if (!item.plugin || !item.load) return; // register docs and views foreach (KTextEditor::Document *doc, KateGlobal::self()->documents()) { if (!doc) continue; foreach (KTextEditor::View *view, doc->views()) { if (!view) continue; KXMLGUIFactory *viewFactory = view->factory(); if (viewFactory) viewFactory->removeClient(view); item.plugin->addView(view); if (viewFactory) viewFactory->addClient(view); } } } void KatePartPluginManager::disablePlugin (KatePartPluginInfo &item) { // plugin around at all? if (!item.plugin || !item.load) return; // de-register docs and views foreach (KTextEditor::Document *doc, KateGlobal::self()->documents()) { if (!doc) continue; foreach (KTextEditor::View *view, doc->views()) { if (!view) continue; KXMLGUIFactory *viewFactory = view->factory(); if (viewFactory) viewFactory->removeClient(view); item.plugin->removeView(view); if (viewFactory) viewFactory->addClient(view); } } } // kate: space-indent on; indent-width 2; replace-tabs on;