summaryrefslogtreecommitdiffstats
path: root/lib/util/tdescriptactionmanager.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/util/tdescriptactionmanager.cpp')
-rw-r--r--lib/util/tdescriptactionmanager.cpp177
1 files changed, 177 insertions, 0 deletions
diff --git a/lib/util/tdescriptactionmanager.cpp b/lib/util/tdescriptactionmanager.cpp
new file mode 100644
index 00000000..3b0aa8ac
--- /dev/null
+++ b/lib/util/tdescriptactionmanager.cpp
@@ -0,0 +1,177 @@
+/***************************************************************************
+* 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 "tdescriptactionmanager.h"
+#include <tdeparts/part.h>
+#include <tdeparts/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-TDE-ScriptName", "");
+ m_scriptName = desktop.readName();
+ m_scriptType = desktop.readType();
+ TQString scriptTypeQuery = "([X-TDE-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-TDE-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 += TDEGlobal::dirs()->findAllResources("data",
+ TQString(kapp->name())+"/scripts/*.desktop", false, true );
+
+ for( TQStringList::ConstIterator it = dirs.begin(); it != dirs.end(); ++it)
+ {
+ scripts += TDEGlobal::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 "tdescriptactionmanager.moc"