|
|
|
/***************************************************************************
|
|
|
|
* Copyright (C) 2004 by ian geiser *
|
|
|
|
* geiseri@sourcextreme.com *
|
|
|
|
* *
|
|
|
|
* 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. *
|
|
|
|
* *
|
|
|
|
* This program 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 General Public License for more details. *
|
|
|
|
* *
|
|
|
|
* You should have received a copy of the GNU General Public License *
|
|
|
|
* along with this program; if not, write to the *
|
|
|
|
* Free Software Foundation, Inc., *
|
|
|
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
|
|
|
|
***************************************************************************/
|
|
|
|
#include "kscriptactionmanager.h"
|
|
|
|
#include <kparts/part.h>
|
|
|
|
#include <kparts/componentfactory.h>
|
|
|
|
#include <kapplication.h>
|
|
|
|
#include <kdesktopfile.h>
|
|
|
|
#include <kstandarddirs.h>
|
|
|
|
|
|
|
|
#include <klocale.h>
|
|
|
|
#include <kmessagebox.h>
|
|
|
|
#include <kdebug.h>
|
|
|
|
#include <scriptinterface.h>
|
|
|
|
#include <kaction.h>
|
|
|
|
#include <tqfileinfo.h>
|
|
|
|
#include <tqtimer.h>
|
|
|
|
|
|
|
|
KScriptAction::KScriptAction( const TQString &scriptDesktopFile, TQObject *interface, KActionCollection *ac )
|
|
|
|
: TQObject(interface), KScriptClientInterface( )
|
|
|
|
{
|
|
|
|
m_interface = 0L;
|
|
|
|
m_action = 0L;
|
|
|
|
m_isValid = false;
|
|
|
|
m_refs = 0;
|
|
|
|
// Read the desktop file
|
|
|
|
if(KDesktopFile::isDesktopFile(scriptDesktopFile))
|
|
|
|
{
|
|
|
|
KDesktopFile desktop(scriptDesktopFile, true);
|
|
|
|
TQFileInfo scriptPath(scriptDesktopFile);
|
|
|
|
|
|
|
|
m_scriptFile = scriptPath.dirPath(true) + "/" + desktop.readEntry("X-KDE-ScriptName", "");
|
|
|
|
m_scriptName = desktop.readName();
|
|
|
|
m_scriptType = desktop.readType();
|
|
|
|
TQString scriptTypeQuery = "([X-KDE-Script-Runner] == '" + m_scriptType + "')";
|
|
|
|
KTrader::OfferList offers = KTrader::self()->query( "KScriptRunner/KScriptRunner", scriptTypeQuery );
|
|
|
|
if ( !offers.isEmpty() )
|
|
|
|
{
|
|
|
|
m_action = new KAction(m_scriptName, KShortcut(), this, TQT_SLOT(activate()), ac, "script");
|
|
|
|
m_isValid = true;
|
|
|
|
m_timeout = new TQTimer(this);
|
|
|
|
TQString icon = desktop.readIcon();
|
|
|
|
m_action->setStatusText(desktop.readComment());
|
|
|
|
if( !icon.isEmpty() )
|
|
|
|
m_action->setIcon(icon);
|
|
|
|
m_action->setShortcutConfigurable(true);
|
|
|
|
connect( m_timeout, TQT_SIGNAL(timeout()), TQT_SLOT(cleanup()) );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
KScriptAction::~KScriptAction()
|
|
|
|
{
|
|
|
|
if( m_interface ) delete m_interface;
|
|
|
|
if( m_action ) delete m_action;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
KAction * KScriptAction::action( )
|
|
|
|
{
|
|
|
|
return m_action;
|
|
|
|
}
|
|
|
|
|
|
|
|
void KScriptAction::activate( )
|
|
|
|
{
|
|
|
|
if( m_interface == 0L)
|
|
|
|
{
|
|
|
|
TQString scriptTypeQuery = "([X-KDE-Script-Runner] == '" + m_scriptType + "')";
|
|
|
|
m_interface= KParts::ComponentFactory::createInstanceFromQuery<KScriptInterface>( "KScriptRunner/KScriptRunner", scriptTypeQuery, this );
|
|
|
|
if ( m_interface != 0L)
|
|
|
|
{
|
|
|
|
m_interface->ScriptClientInterface= this;
|
|
|
|
if( m_scriptMethod.isEmpty() )
|
|
|
|
m_interface->setScript(m_scriptFile);
|
|
|
|
else
|
|
|
|
m_interface->setScript(m_scriptFile, m_scriptMethod);
|
|
|
|
connect(this, TQT_SIGNAL(done(KScriptClientInterface::Result, const TQVariant &)), this, TQT_SLOT(scriptFinished()));
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
KMessageBox::sorry(0, i18n("Unable to get KScript Runner for type \"%1\".").arg(m_scriptType), i18n("KScript Error"));
|
|
|
|
kdDebug() << "Query string: " << scriptTypeQuery << endl;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
m_interface->run(parent(), TQVariant());
|
|
|
|
m_timeout->start(60000,FALSE); // after 1 minute unload
|
|
|
|
m_refs++;
|
|
|
|
}
|
|
|
|
|
|
|
|
void KScriptAction::cleanup()
|
|
|
|
{
|
|
|
|
if( m_interface && m_refs == 0)
|
|
|
|
{
|
|
|
|
delete m_interface;
|
|
|
|
m_interface = 0L;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void KScriptAction::scriptFinished()
|
|
|
|
{
|
|
|
|
m_refs--;
|
|
|
|
}
|
|
|
|
|
|
|
|
KScriptActionManager::KScriptActionManager( TQObject *parent, KActionCollection * ac ) : TQObject(parent), m_ac(ac)
|
|
|
|
{
|
|
|
|
m_actions.setAutoDelete(true);
|
|
|
|
}
|
|
|
|
|
|
|
|
KScriptActionManager::~ KScriptActionManager( )
|
|
|
|
{
|
|
|
|
m_actions.clear();
|
|
|
|
}
|
|
|
|
|
|
|
|
TQPtrList< KAction > KScriptActionManager::scripts( TQObject * interface , const TQStringList &dirs) const
|
|
|
|
{
|
|
|
|
m_actions.clear();
|
|
|
|
TQPtrList<KAction> actions;
|
|
|
|
TQStringList scripts;
|
|
|
|
|
|
|
|
scripts += KGlobal::dirs()->findAllResources("data",
|
|
|
|
TQString(kapp->name())+"/scripts/*.desktop", false, true );
|
|
|
|
|
|
|
|
for( TQStringList::ConstIterator it = dirs.begin(); it != dirs.end(); ++it)
|
|
|
|
{
|
|
|
|
scripts += KGlobal::dirs()->findAllResources("data",
|
|
|
|
(*it)+"/*.desktop", false, true );
|
|
|
|
}
|
|
|
|
|
|
|
|
for (TQStringList::Iterator it = scripts.begin(); it != scripts.end(); ++it )
|
|
|
|
{
|
|
|
|
kdDebug() << "Loading " << *it << endl;
|
|
|
|
KScriptAction *script = new KScriptAction(*it, interface, m_ac);
|
|
|
|
if( script->isValid())
|
|
|
|
{
|
|
|
|
actions.append(script->action());
|
|
|
|
m_actions.append(script);
|
|
|
|
connect(script, TQT_SIGNAL(error( const TQString&)), this,
|
|
|
|
TQT_SIGNAL(scriptError( const TQString&)));
|
|
|
|
connect(script, TQT_SIGNAL(warning( const TQString&)), this,
|
|
|
|
TQT_SIGNAL(scriptWarning( const TQString&)));
|
|
|
|
connect(script, TQT_SIGNAL(output( const TQString&)), this,
|
|
|
|
TQT_SIGNAL(scriptOutput( const TQString&)));
|
|
|
|
connect(script, TQT_SIGNAL(progress( int )), this,
|
|
|
|
TQT_SIGNAL(scriptProgress(int)));
|
|
|
|
connect(script, TQT_SIGNAL(done( KScriptClientInterface::Result, const TQVariant &)),this,
|
|
|
|
TQT_SIGNAL(scriptDone( KScriptClientInterface::Result, const TQVariant &)));
|
|
|
|
}
|
|
|
|
else
|
|
|
|
delete script;
|
|
|
|
}
|
|
|
|
return actions;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool KScriptAction::isValid( ) const
|
|
|
|
{
|
|
|
|
return m_isValid;
|
|
|
|
}
|
|
|
|
|
|
|
|
#include "kscriptactionmanager.moc"
|