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.
272 lines
8.7 KiB
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>").arg(*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>").arg(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"
|