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.
koffice/lib/kross/main/wdgscriptsmanager.cpp

355 lines
13 KiB

/*
* This file is part of the KDE project
*
* Copyright (c) 2005 Cyrille Berger <cberger@cberger.net>
* This program 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 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 "wdgscriptsmanager.h"
#include <qfile.h>
#include <qfileinfo.h>
#include <qheader.h>
#include <qobjectlist.h>
#include <qtooltip.h>
#include <kapplication.h>
#include <kdeversion.h>
#include <kfiledialog.h>
#include <kiconloader.h>
#include <klistview.h>
#include <klocale.h>
#include <kmessagebox.h>
#include <kpushbutton.h>
#include <kstandarddirs.h>
#include <ktoolbar.h>
#if KDE_IS_VERSION(3, 4, 0)
// The KNewStuffSecure we use internaly for the GetHotNewStuff-functionality
// was introduced with KDE 3.4.
#define KROSS_SUPPORT_NEWSTUFF
#endif
#ifdef KROSS_SUPPORT_NEWSTUFF
#include <knewstuff/provider.h>
#include <knewstuff/engine.h>
#include <knewstuff/downloaddialog.h>
#include <knewstuff/knewstuffsecure.h>
#endif
#include "scriptguiclient.h"
#include "scriptaction.h"
namespace Kross { namespace Api {
#ifdef KROSS_SUPPORT_NEWSTUFF
class ScriptNewStuff : public KNewStuffSecure
{
public:
ScriptNewStuff(ScriptGUIClient* scripguiclient, const QString& type, QWidget *parentWidget = 0)
: KNewStuffSecure(type, parentWidget)
, m_scripguiclient(scripguiclient) {}
virtual ~ScriptNewStuff() {}
private:
ScriptGUIClient* m_scripguiclient;
virtual void installResource() { m_scripguiclient->installScriptPackage( m_tarName ); }
};
#endif
class ListItem : public QListViewItem
{
private:
ScriptActionCollection* m_collection;
ScriptAction::Ptr m_action;
public:
ListItem(QListView* parentview, ScriptActionCollection* collection)
: QListViewItem(parentview), m_collection(collection), m_action(0) {}
ListItem(ListItem* parentitem, QListViewItem* afteritem, ScriptAction::Ptr action)
: QListViewItem(parentitem, afteritem), m_collection( parentitem->collection() ), m_action(action) {}
ScriptAction::Ptr action() const { return m_action; }
ScriptActionCollection* collection() const { return m_collection; }
//ScriptActionMenu* actionMenu() const { return m_menu; }
};
class ToolTip : public QToolTip
{
public:
ToolTip(KListView* parent) : QToolTip(parent->viewport()), m_parent(parent) {}
virtual ~ToolTip () { remove(m_parent->viewport()); }
protected:
virtual void maybeTip(const QPoint& p) {
ListItem* item = dynamic_cast<ListItem*>( m_parent->itemAt(p) );
if(item) {
QRect r( m_parent->itemRect(item) );
if(r.isValid() && item->action()) {
tip(r, QString("<qt>%1</qt>").arg(item->action()->toolTip()));
}
}
}
private:
KListView* m_parent;
};
class WdgScriptsManagerPrivate
{
friend class WdgScriptsManager;
ScriptGUIClient* m_scripguiclient;
ToolTip* m_tooltip;
#ifdef KROSS_SUPPORT_NEWSTUFF
ScriptNewStuff* newstuff;
#endif
//enum { LoadBtn = 0, UnloadBtn, InstallBtn, UninstallBtn, ExecBtn, NewStuffBtn };
};
WdgScriptsManager::WdgScriptsManager(ScriptGUIClient* scr, QWidget* parent, const char* name, WFlags fl )
: WdgScriptsManagerBase(parent, name, fl)
, d(new WdgScriptsManagerPrivate)
{
d->m_scripguiclient = scr;
d->m_tooltip = new ToolTip(scriptsList);
#ifdef KROSS_SUPPORT_NEWSTUFF
d->newstuff = 0;
#endif
scriptsList->header()->hide();
//scriptsList->header()->setClickEnabled(false);
scriptsList->setAllColumnsShowFocus(true);
//scriptsList->setRootIsDecorated(true);
scriptsList->setSorting(-1);
scriptsList->addColumn("text");
//scriptsList->setColumnWidthMode(1, QListView::Manual);
slotFillScriptsList();
slotSelectionChanged(0);
connect(scriptsList, SIGNAL(selectionChanged(QListViewItem*)), this, SLOT(slotSelectionChanged(QListViewItem*)));
btnExec->setIconSet(KGlobal::instance()->iconLoader()->loadIconSet( "exec", KIcon::MainToolbar, 16 ));
connect(btnExec, SIGNAL(clicked()), this, SLOT(slotExecuteScript()));
btnLoad->setIconSet(KGlobal::instance()->iconLoader()->loadIconSet( "fileopen", KIcon::MainToolbar, 16 ));
connect(btnLoad, SIGNAL(clicked()), this, SLOT(slotLoadScript()));
btnUnload->setIconSet(KGlobal::instance()->iconLoader()->loadIconSet( "fileclose", KIcon::MainToolbar, 16 ));
connect(btnUnload, SIGNAL(clicked()), this, SLOT(slotUnloadScript()));
btnInstall->setIconSet(KGlobal::instance()->iconLoader()->loadIconSet( "fileimport", KIcon::MainToolbar, 16 ));
connect(btnInstall, SIGNAL(clicked()), this, SLOT(slotInstallScript()));
btnUninstall->setIconSet(KGlobal::instance()->iconLoader()->loadIconSet( "fileclose", KIcon::MainToolbar, 16 ));
connect(btnUninstall, SIGNAL(clicked()), this, SLOT(slotUninstallScript()));
#ifdef KROSS_SUPPORT_NEWSTUFF
btnNewStuff->setIconSet(KGlobal::instance()->iconLoader()->loadIconSet( "knewstuff", KIcon::MainToolbar, 16 ));
connect(btnNewStuff, SIGNAL(clicked()), this, SLOT(slotGetNewScript()));
#endif
/*
toolBar->setIconText( KToolBar::IconTextRight );
toolBar->insertButton("exec", WdgScriptsManagerPrivate::ExecBtn, false, i18n("Execute"));
toolBar->addConnection(WdgScriptsManagerPrivate::ExecBtn, SIGNAL(clicked()), this, SLOT(slotExecuteScript()));
toolBar->insertLineSeparator();
toolBar->insertButton("fileopen", WdgScriptsManagerPrivate::LoadBtn, true, i18n("Load"));
toolBar->addConnection(WdgScriptsManagerPrivate::LoadBtn, SIGNAL(clicked()), this, SLOT(slotLoadScript()));
toolBar->insertButton("fileclose", WdgScriptsManagerPrivate::UnloadBtn, false, i18n("Unload"));
toolBar->addConnection(WdgScriptsManagerPrivate::UnloadBtn, SIGNAL(clicked()), this, SLOT(slotUnloadScript()));
toolBar->insertLineSeparator();
toolBar->insertButton("fileimport", WdgScriptsManagerPrivate::InstallBtn, true, i18n("Install"));
toolBar->addConnection(WdgScriptsManagerPrivate::InstallBtn, SIGNAL(clicked()), this, SLOT(slotInstallScript()));
toolBar->insertButton("fileclose", WdgScriptsManagerPrivate::UninstallBtn, false, i18n("Uninstall"));
toolBar->addConnection(WdgScriptsManagerPrivate::UninstallBtn, SIGNAL(clicked()), this, SLOT(slotUninstallScript()));
#ifdef KROSS_SUPPORT_NEWSTUFF
toolBar->insertLineSeparator();
toolBar->insertButton("knewstuff", WdgScriptsManagerPrivate::NewStuffBtn, true, i18n("Get More Scripts"));
toolBar->addConnection(WdgScriptsManagerPrivate::NewStuffBtn, SIGNAL(clicked()), this, SLOT(slotGetNewScript()));
#endif
*/
connect(scr, SIGNAL( collectionChanged(ScriptActionCollection*) ),
this, SLOT( slotFillScriptsList() ));
}
WdgScriptsManager::~WdgScriptsManager()
{
delete d->m_tooltip;
delete d;
}
void WdgScriptsManager::slotFillScriptsList()
{
scriptsList->clear();
addItem( d->m_scripguiclient->getActionCollection("executedscripts") );
addItem( d->m_scripguiclient->getActionCollection("loadedscripts") );
addItem( d->m_scripguiclient->getActionCollection("installedscripts") );
}
void WdgScriptsManager::addItem(ScriptActionCollection* collection)
{
if(! collection)
return;
ListItem* i = new ListItem(scriptsList, collection);
i->setText(0, collection->actionMenu()->text());
i->setOpen(true);
QValueList<ScriptAction::Ptr> list = collection->actions();
QListViewItem* lastitem = 0;
for(QValueList<ScriptAction::Ptr>::Iterator it = list.begin(); it != list.end(); ++it)
lastitem = addItem(*it, i, lastitem);
}
QListViewItem* WdgScriptsManager::addItem(ScriptAction::Ptr action, QListViewItem* parentitem, QListViewItem* afteritem)
{
if(! action)
return 0;
ListItem* i = new ListItem(dynamic_cast<ListItem*>(parentitem), afteritem, action);
i->setText(0, action->text()); // FIXME: i18nise it for ko2.0
//i->setText(1, action->getDescription()); // FIXME: i18nise it for ko2.0
//i->setText(2, action->name());
QPixmap pm;
if(action->hasIcon()) {
KIconLoader* icons = KGlobal::iconLoader();
pm = icons->loadIconSet(action->icon(), KIcon::Small).pixmap(QIconSet::Small, QIconSet::Active);
}
else {
pm = action->iconSet(KIcon::Small, 16).pixmap(QIconSet::Small, QIconSet::Active);
}
if(! pm.isNull())
i->setPixmap(0, pm); // display the icon
return i;
}
void WdgScriptsManager::slotSelectionChanged(QListViewItem* item)
{
ListItem* i = dynamic_cast<ListItem*>(item);
Kross::Api::ScriptActionCollection* installedcollection = d->m_scripguiclient->getActionCollection("installedscripts");
//toolBar->setItemEnabled(WdgScriptsManagerPrivate::ExecBtn, i && i->action());
//toolBar->setItemEnabled(WdgScriptsManagerPrivate::UninstallBtn, i && i->action() && i->collection() == installedcollection);
//toolBar->setItemEnabled(WdgScriptsManagerPrivate::UnloadBtn, i && i->action() && i->collection() != installedcollection);
btnExec->setEnabled(i && i->action());
btnUnload->setEnabled(i && i->action() && i->collection() != installedcollection);
btnUninstall->setEnabled(i && i->action() && i->collection() == installedcollection);
}
void WdgScriptsManager::slotLoadScript()
{
if(d->m_scripguiclient->loadScriptFile())
slotFillScriptsList();
}
void WdgScriptsManager::slotInstallScript()
{
KFileDialog* filedialog = new KFileDialog(
QString::null, // startdir
"*.tar.gz *.tgz *.bz2", // filter
this, // parent widget
"WdgScriptsManagerInstallFileDialog", // name
true // modal
);
filedialog->setCaption( i18n("Install Script Package") );
if(! filedialog->exec())
return;
if(! d->m_scripguiclient->installScriptPackage( filedialog->selectedURL().path() )) {
krosswarning("Failed to install scriptpackage");
return;
}
slotFillScriptsList();
}
void WdgScriptsManager::slotUninstallScript()
{
ListItem* item = dynamic_cast<ListItem*>( scriptsList->currentItem() );
if( !item || !item->action() )
return;
Kross::Api::ScriptActionCollection* installedcollection = d->m_scripguiclient->getActionCollection("installedscripts");
if( !item->collection() || item->collection() != installedcollection)
return;
const QString packagepath = item->action()->getPackagePath();
if( !packagepath)
return;
if( KMessageBox::warningContinueCancel(0,
i18n("Uninstall the script package \"%1\" and delete the package's folder \"%2\"?")
.arg(item->action()->text()).arg(packagepath),
i18n("Uninstall")) != KMessageBox::Continue )
{
return;
}
if(! d->m_scripguiclient->uninstallScriptPackage(packagepath)) {
krosswarning("Failed to uninstall scriptpackage");
return;
}
slotFillScriptsList();
}
void WdgScriptsManager::slotExecuteScript()
{
ListItem* item = dynamic_cast<ListItem*>( scriptsList->currentItem() );
if(item && item->action())
item->action()->activate();
}
void WdgScriptsManager::slotUnloadScript()
{
ListItem* item = dynamic_cast<ListItem*>( scriptsList->currentItem() );
if(item && item->action()) {
item->collection()->detach( item->action() );
slotFillScriptsList();
}
}
void WdgScriptsManager::slotGetNewScript()
{
#ifdef KROSS_SUPPORT_NEWSTUFF
const QString appname = KApplication::kApplication()->name();
const QString type = QString("%1/script").arg(appname);
if(! d->newstuff) {
d->newstuff = new ScriptNewStuff(d->m_scripguiclient, type);
connect(d->newstuff, SIGNAL(installFinished()), this, SLOT(slotResourceInstalled()));
}
KNS::Engine *engine = new KNS::Engine(d->newstuff, type, this);
KNS::DownloadDialog *d = new KNS::DownloadDialog( engine, this );
d->setType(type);
KNS::ProviderLoader *p = new KNS::ProviderLoader(this);
QObject::connect(p, SIGNAL(providersLoaded(Provider::List*)),
d, SLOT(slotProviders(Provider::List*)));
p->load(type, QString("http://download.kde.org/khotnewstuff/%1scripts-providers.xml").arg(appname));
d->exec();
#endif
}
void WdgScriptsManager::slotResourceInstalled()
{
// Delete KNewStuff's configuration entries. These entries reflect what has
// already been installed. As we cannot yet keep them in sync after uninstalling
// scripts, we deactivate the check marks entirely.
KGlobal::config()->deleteGroup("KNewStuffStatus");
}
}}
#include "wdgscriptsmanager.moc"