You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdewebdev/quanta/plugins/quantaplugininterface.cpp

272 lines
8.7 KiB

/***************************************************************************
quantaplugininterface.cpp - General interface to the plugin system
-------------------
begin : Mon Sep 16 2002
copyright : (C) 2002 by Marc Britton <consume@optushome.com.au>
(C) 2003-2004 by Andras Mantia <amantia@kde.org>
***************************************************************************/
/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
/* KDE INCLUDES */
#include <kactioncollection.h>
#include <kconfig.h>
#include <kstandarddirs.h>
#include <kmainwindow.h>
#include <klocale.h>
#include <kdebug.h>
#include <kmessagebox.h>
/* QT INCLUDES */
#include <tqdict.h>
#include <tqstring.h>
#include <tqstringlist.h>
#include <tqfileinfo.h>
/* OTHER INCLUDES */
#include "quantaplugininterface.h"
#include "quantaplugineditor.h"
#include "quantaplugin.h"
#include "resource.h"
#include "quantacommon.h"
QuantaPluginInterface::QuantaPluginInterface(TQWidget *parent)
{
m_parent = parent;
(void) new KAction( i18n( "Configure &Plugins..." ), 0, 0,
this, TQT_SLOT( slotPluginsEdit() ),
((KMainWindow*)parent)->actionCollection(), "configure_plugins" );
m_pluginMenu = 0L;
// m_plugins.setAutoDelete(true);
}
QuantaPluginInterface::~QuantaPluginInterface()
{
m_plugins.clear();
// TODO : free plugins
}
void QuantaPluginInterface::readConfigFile(const TQString& configFile)
{
KConfig *config = new KConfig(configFile);
config->setGroup("General");
TQStringList pList = config->readListEntry("Plugins");
for(TQStringList::Iterator it = pList.begin();it != pList.end(); ++it)
(*it) = (*it).stripWhiteSpace();
//setPluginNames(pList);
TQStringList paths = QuantaCommon::readPathListEntry(config, "SearchPaths");
for(TQStringList::Iterator it = paths.begin();it != paths.end(); ++it)
(*it) = (*it).stripWhiteSpace();
qConfig.pluginSearchPaths = paths;
// now that we have a list of the plugins, go through and get the details of them
for(TQStringList::Iterator it = pList.begin();it != pList.end();++it)
{
if (m_plugins.find(*it))
continue;
config->setGroup(*it);
QuantaPlugin *newPlugin = 0;
TQString pluginType = config->readEntry("Type", "KPart");
bool isStandard = config->readBoolEntry("Standard",false);
/* if (isStandard)
{
TQString stdName = config->readEntry("Standard Name");
if (newPlugin)
{
newPlugin->setStandardName(stdName);
}
} else */
{
if (pluginType == "Command Line")
{
emit hideSplash();
KMessageBox::information(m_parent, i18n("<qt><b>%1</b> is a command line plugin. We have removed support for command-line plugins. However, the functionality has not been lost as script actions can still be used to run command-line tools. </qt>").tqarg(*it), i18n("Unsupported Plugin Type"), "CommandLinePluginWarning");
continue;
}
newPlugin = new QuantaPlugin();
}
newPlugin->setStandard(isStandard);
newPlugin->setPluginName(*it);
newPlugin->setFileName(config->readEntry("FileName"));
newPlugin->setLocation(config->readEntry("Location"));
newPlugin->setIcon(config->readEntry("Icon"));
TQString type = config->readEntry("OutputWindow");
if (type == "Message Frame" || type == "Separate Toolview")
type = i18n("Separate Toolview");
else
type = i18n("Editor Tab");
newPlugin->setOutputWindow(type);
newPlugin->setInput(config->readNumEntry("Input", 0));
newPlugin->setReadOnlyPart(config->readBoolEntry("ReadOnly", true));
m_plugins.insert(*it, newPlugin);
}
delete config;
}
/** Reads the plugin settings from the rc file */
void QuantaPluginInterface::readConfig()
{
m_plugins.clear();
// read the local plugins.rc
TQString configFile = locateLocal("appdata", "plugins.rc");
if (TQFileInfo(configFile).exists())
readConfigFile(configFile);
// read the global plugins.rc
configFile = qConfig.globalDataDir + resourceDir + "plugins.rc";
readConfigFile(configFile);
}
/** Writes the plugin settings to the rc file */
void QuantaPluginInterface::writeConfig()
{
// write the plugin settings to the rc file
KConfig *config = new KConfig(locateLocal("appdata", "plugins.rc"));
TQStringList names = pluginNames();
config->setGroup("General");
config->writeEntry("Plugins", names);
config->writePathEntry("SearchPaths", qConfig.pluginSearchPaths);
for(TQStringList::Iterator it = names.begin();it != names.end(); ++it)
{
config->setGroup(*it);
QuantaPlugin *curPlugin = m_plugins[*it];
if(curPlugin)
{
config->writeEntry("FileName", curPlugin->fileName());
config->writeEntry("Type", "KPart"); //not used, but just to be compatible
config->writeEntry("Location", curPlugin->location());
config->writeEntry("Icon", curPlugin->icon());
TQString type = curPlugin->outputWindow();
if (type == i18n("Editor Tab")) type = "Editor Tab";
if (type == i18n("Separate Toolview")) type = "Separate Toolview";
config->writeEntry("OutputWindow", type);
config->writeEntry("Input", curPlugin->input());
config->writeEntry("Standard", curPlugin->isStandard());
if (curPlugin->isStandard()) config->writeEntry("Standard Name", curPlugin->standardName());
config->writeEntry("ReadOnly", curPlugin->readOnlyPart());
}
}
config->sync();
if (config->isReadOnly())
{
kdWarning() << "Plugin config file " << locateLocal("appdata", "plugins.rc") << " is read only! Plugin settings were not saved!" << endl;
}
delete config;
}
/** Returns true if the plugin is available */
bool QuantaPluginInterface::pluginAvailable(const TQString &a_name)
{
if (a_name.isEmpty())
return false;
QuantaPlugin *availPlugin = m_plugins.find(a_name);
if(availPlugin && QuantaPlugin::validatePlugin(availPlugin))
return true;
return false;
}
/** Gets the plugin names */
TQStringList QuantaPluginInterface::pluginNames() const
{
TQStringList names;
TQDictIterator<QuantaPlugin> it(m_plugins);
for(;it.current();++it)
{
names << (*it)->pluginName();
}
return names;
}
/** Gets the plugin specified by a_name */
QuantaPlugin *QuantaPluginInterface::plugin(const TQString &a_name)
{
if (a_name.isEmpty())
return 0L;
return m_plugins[a_name];
}
/** Builds the plugins menu */
void QuantaPluginInterface::buildPluginMenu()
{
m_pluginMenu->clear();
// m_pluginMenu->setCheckable(true);
TQDictIterator<QuantaPlugin> it(m_plugins);
for(;it.current() != 0;++it)
{
QuantaPlugin *curPlugin = it.current();
if(curPlugin)
{
// int id = m_pluginMenu->insertItem(curPlugin->pluginName());
// if(curPlugin->isRunning())
// m_pluginMenu->setItemChecked(id, true);
curPlugin->plugAction(m_pluginMenu);
}
}
}
void QuantaPluginInterface::slotPluginsEdit()
{
QuantaPluginEditor *editor = new QuantaPluginEditor(m_parent, "plugin_editor");
editor->setSearchPaths(qConfig.pluginSearchPaths);
editor->setPlugins(plugins());
editor->exec();
qConfig.pluginSearchPaths = editor->searchPathList();
setPlugins(editor->plugins());
writeConfig();
buildPluginMenu();
slotPluginsValidate();
}
void QuantaPluginInterface::slotPluginsValidate()
{
TQValueList<QuantaPlugin*> invalidPlugins;
TQDictIterator<QuantaPlugin> it(m_plugins);
for(;it.current();++it)
{
if(!QuantaPlugin::validatePlugin(it.current()))
{
invalidPlugins.append(it.current());
}
}
uint invalidCount = invalidPlugins.count();
if (invalidCount > 0)
{
TQString invalidNames;
for (uint i=0; i < invalidCount; i++)
{
invalidNames += "<br>" + invalidPlugins[i]->name();
}
int answer = KMessageBox::questionYesNo(m_parent, i18n("<qt>The following plugins seems to be invalid:<b>%1</b>.<br><br>Do you want to edit the plugins?</qt>").tqarg(invalidNames), i18n("Invalid Plugins"), i18n("Edit Plugins"), i18n("Do Not Edit"));
if(answer == KMessageBox::Yes)
{
slotPluginsEdit();
}
return;
} else
emit statusMsg(i18n("All plugins validated successfully."));
}
#include "quantaplugininterface.moc"