lib

wdgscriptsmanager.cpp
1/*
2 * This file is part of the KDE project
3 *
4 * Copyright (c) 2005 Cyrille Berger <cberger@cberger.net>
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU Library General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18 */
19#include "wdgscriptsmanager.h"
20
21#include <tqfile.h>
22#include <tqfileinfo.h>
23#include <tqheader.h>
24#include <tqobjectlist.h>
25#include <tqtooltip.h>
26
27#include <tdeapplication.h>
28#include <tdefiledialog.h>
29#include <kiconloader.h>
30#include <tdelistview.h>
31#include <tdelocale.h>
32#include <tdemessagebox.h>
33#include <kpushbutton.h>
34#include <kstandarddirs.h>
35#include <tdetoolbar.h>
36
37#include <tdenewstuff/provider.h>
38#include <tdenewstuff/engine.h>
39#include <tdenewstuff/downloaddialog.h>
40#include <tdenewstuff/knewstuffsecure.h>
41
42#include "scriptguiclient.h"
43#include "scriptaction.h"
44
45namespace Kross { namespace Api {
46
47class ScriptNewStuff : public TDENewStuffSecure
48{
49 public:
50 ScriptNewStuff(ScriptGUIClient* scripguiclient, const TQString& type, TQWidget *parentWidget = 0)
51 : TDENewStuffSecure(type, parentWidget)
52 , m_scripguiclient(scripguiclient) {}
53 virtual ~ScriptNewStuff() {}
54 private:
55 ScriptGUIClient* m_scripguiclient;
56 virtual void installResource() { m_scripguiclient->installScriptPackage( m_tarName ); }
57};
58
59class ListItem : public TQListViewItem
60{
61 private:
62 ScriptActionCollection* m_collection;
63 ScriptAction::Ptr m_action;
64 public:
65 ListItem(TQListView* parentview, ScriptActionCollection* collection)
66 : TQListViewItem(parentview), m_collection(collection), m_action(0) {}
67
68 ListItem(ListItem* parentitem, TQListViewItem* afteritem, ScriptAction::Ptr action)
69 : TQListViewItem(parentitem, afteritem), m_collection( parentitem->collection() ), m_action(action) {}
70
71 ScriptAction::Ptr action() const { return m_action; }
72 ScriptActionCollection* collection() const { return m_collection; }
73 //ScriptActionMenu* actionMenu() const { return m_menu; }
74};
75
76class ToolTip : public TQToolTip
77{
78 public:
79 ToolTip(TDEListView* parent) : TQToolTip(parent->viewport()), m_parent(parent) {}
80 virtual ~ToolTip () { remove(m_parent->viewport()); }
81 protected:
82 virtual void maybeTip(const TQPoint& p) {
83 ListItem* item = dynamic_cast<ListItem*>( m_parent->itemAt(p) );
84 if(item) {
85 TQRect r( m_parent->itemRect(item) );
86 if(r.isValid() && item->action()) {
87 tip(r, TQString("<qt>%1</qt>").arg(item->action()->toolTip()));
88 }
89 }
90 }
91 private:
92 TDEListView* m_parent;
93};
94
95class WdgScriptsManagerPrivate
96{
97 friend class WdgScriptsManager;
98 ScriptGUIClient* m_scripguiclient;
99 ToolTip* m_tooltip;
100 ScriptNewStuff* newstuff;
101 //enum { LoadBtn = 0, UnloadBtn, InstallBtn, UninstallBtn, ExecBtn, NewStuffBtn };
102};
103
104WdgScriptsManager::WdgScriptsManager(ScriptGUIClient* scr, TQWidget* parent, const char* name, WFlags fl )
105 : WdgScriptsManagerBase(parent, name, fl)
106 , d(new WdgScriptsManagerPrivate)
107{
108 d->m_scripguiclient = scr;
109 d->m_tooltip = new ToolTip(scriptsList);
110 d->newstuff = 0;
111
112 scriptsList->header()->hide();
113 //scriptsList->header()->setClickEnabled(false);
114 scriptsList->setAllColumnsShowFocus(true);
115 //scriptsList->setRootIsDecorated(true);
116 scriptsList->setSorting(-1);
117 scriptsList->addColumn("text");
118 //scriptsList->setColumnWidthMode(1, TQListView::Manual);
119
120 slotFillScriptsList();
121
122 slotSelectionChanged(0);
123 connect(scriptsList, TQ_SIGNAL(selectionChanged(TQListViewItem*)), this, TQ_SLOT(slotSelectionChanged(TQListViewItem*)));
124
125 btnExec->setIconSet(TDEGlobal::instance()->iconLoader()->loadIconSet( "application-x-executable", TDEIcon::MainToolbar, 16 ));
126 connect(btnExec, TQ_SIGNAL(clicked()), this, TQ_SLOT(slotExecuteScript()));
127 btnLoad->setIconSet(TDEGlobal::instance()->iconLoader()->loadIconSet( "document-open", TDEIcon::MainToolbar, 16 ));
128 connect(btnLoad, TQ_SIGNAL(clicked()), this, TQ_SLOT(slotLoadScript()));
129 btnUnload->setIconSet(TDEGlobal::instance()->iconLoader()->loadIconSet( "window-close", TDEIcon::MainToolbar, 16 ));
130 connect(btnUnload, TQ_SIGNAL(clicked()), this, TQ_SLOT(slotUnloadScript()));
131 btnInstall->setIconSet(TDEGlobal::instance()->iconLoader()->loadIconSet( "fileimport", TDEIcon::MainToolbar, 16 ));
132 connect(btnInstall, TQ_SIGNAL(clicked()), this, TQ_SLOT(slotInstallScript()));
133 btnUninstall->setIconSet(TDEGlobal::instance()->iconLoader()->loadIconSet( "window-close", TDEIcon::MainToolbar, 16 ));
134 connect(btnUninstall, TQ_SIGNAL(clicked()), this, TQ_SLOT(slotUninstallScript()));
135 btnNewStuff->setIconSet(TDEGlobal::instance()->iconLoader()->loadIconSet( "knewstuff", TDEIcon::MainToolbar, 16 ));
136 connect(btnNewStuff, TQ_SIGNAL(clicked()), this, TQ_SLOT(slotGetNewScript()));
137/*
138 toolBar->setIconText( TDEToolBar::IconTextRight );
139
140 toolBar->insertButton("application-x-executable", WdgScriptsManagerPrivate::ExecBtn, false, i18n("Execute"));
141 toolBar->addConnection(WdgScriptsManagerPrivate::ExecBtn, TQ_SIGNAL(clicked()), this, TQ_SLOT(slotExecuteScript()));
142 toolBar->insertLineSeparator();
143 toolBar->insertButton("document-open", WdgScriptsManagerPrivate::LoadBtn, true, i18n("Load"));
144 toolBar->addConnection(WdgScriptsManagerPrivate::LoadBtn, TQ_SIGNAL(clicked()), this, TQ_SLOT(slotLoadScript()));
145 toolBar->insertButton("window-close", WdgScriptsManagerPrivate::UnloadBtn, false, i18n("Unload"));
146 toolBar->addConnection(WdgScriptsManagerPrivate::UnloadBtn, TQ_SIGNAL(clicked()), this, TQ_SLOT(slotUnloadScript()));
147 toolBar->insertLineSeparator();
148 toolBar->insertButton("fileimport", WdgScriptsManagerPrivate::InstallBtn, true, i18n("Install"));
149 toolBar->addConnection(WdgScriptsManagerPrivate::InstallBtn, TQ_SIGNAL(clicked()), this, TQ_SLOT(slotInstallScript()));
150 toolBar->insertButton("window-close", WdgScriptsManagerPrivate::UninstallBtn, false, i18n("Uninstall"));
151 toolBar->addConnection(WdgScriptsManagerPrivate::UninstallBtn, TQ_SIGNAL(clicked()), this, TQ_SLOT(slotUninstallScript()));
152 toolBar->insertLineSeparator();
153 toolBar->insertButton("knewstuff", WdgScriptsManagerPrivate::NewStuffBtn, true, i18n("Get More Scripts"));
154 toolBar->addConnection(WdgScriptsManagerPrivate::NewStuffBtn, TQ_SIGNAL(clicked()), this, TQ_SLOT(slotGetNewScript()));
155*/
156 connect(scr, TQ_SIGNAL( collectionChanged(ScriptActionCollection*) ),
157 this, TQ_SLOT( slotFillScriptsList() ));
158}
159
160WdgScriptsManager::~WdgScriptsManager()
161{
162 delete d->m_tooltip;
163 delete d;
164}
165
166void WdgScriptsManager::slotFillScriptsList()
167{
168 scriptsList->clear();
169
170 addItem( d->m_scripguiclient->getActionCollection("executedscripts") );
171 addItem( d->m_scripguiclient->getActionCollection("loadedscripts") );
172 addItem( d->m_scripguiclient->getActionCollection("installedscripts") );
173}
174
175void WdgScriptsManager::addItem(ScriptActionCollection* collection)
176{
177 if(! collection)
178 return;
179
180 ListItem* i = new ListItem(scriptsList, collection);
181 i->setText(0, collection->actionMenu()->text());
182 i->setOpen(true);
183
184 TQValueList<ScriptAction::Ptr> list = collection->actions();
185 TQListViewItem* lastitem = 0;
186 for(TQValueList<ScriptAction::Ptr>::Iterator it = list.begin(); it != list.end(); ++it)
187 lastitem = addItem(*it, i, lastitem);
188}
189
190TQListViewItem* WdgScriptsManager::addItem(ScriptAction::Ptr action, TQListViewItem* parentitem, TQListViewItem* afteritem)
191{
192 if(! action)
193 return 0;
194
195 ListItem* i = new ListItem(dynamic_cast<ListItem*>(parentitem), afteritem, action);
196 i->setText(0, action->text()); // FIXME: i18nise it for ko2.0
197 //i->setText(1, action->getDescription()); // FIXME: i18nise it for ko2.0
198 //i->setText(2, action->name());
199
200 TQPixmap pm;
201 if(action->hasIcon()) {
202 TDEIconLoader* icons = TDEGlobal::iconLoader();
203 pm = icons->loadIconSet(action->icon(), TDEIcon::Small).pixmap(TQIconSet::Small, TQIconSet::Active);
204 }
205 else {
206 pm = action->iconSet(TDEIcon::Small, 16).pixmap(TQIconSet::Small, TQIconSet::Active);
207 }
208 if(! pm.isNull())
209 i->setPixmap(0, pm); // display the icon
210
211 return i;
212}
213
214void WdgScriptsManager::slotSelectionChanged(TQListViewItem* item)
215{
216 ListItem* i = dynamic_cast<ListItem*>(item);
217 Kross::Api::ScriptActionCollection* installedcollection = d->m_scripguiclient->getActionCollection("installedscripts");
218
219 //toolBar->setItemEnabled(WdgScriptsManagerPrivate::ExecBtn, i && i->action());
220 //toolBar->setItemEnabled(WdgScriptsManagerPrivate::UninstallBtn, i && i->action() && i->collection() == installedcollection);
221 //toolBar->setItemEnabled(WdgScriptsManagerPrivate::UnloadBtn, i && i->action() && i->collection() != installedcollection);
222 btnExec->setEnabled(i && i->action());
223 btnUnload->setEnabled(i && i->action() && i->collection() != installedcollection);
224 btnUninstall->setEnabled(i && i->action() && i->collection() == installedcollection);
225}
226
227void WdgScriptsManager::slotLoadScript()
228{
229 if(d->m_scripguiclient->loadScriptFile())
230 slotFillScriptsList();
231}
232
233void WdgScriptsManager::slotInstallScript()
234{
235 KFileDialog* filedialog = new KFileDialog(
236 TQString(), // startdir
237 "*.tar.gz *.tgz *.bz2", // filter
238 this, // parent widget
239 "WdgScriptsManagerInstallFileDialog", // name
240 true // modal
241 );
242 filedialog->setCaption( i18n("Install Script Package") );
243
244 if(! filedialog->exec())
245 return;
246
247 if(! d->m_scripguiclient->installScriptPackage( filedialog->selectedURL().path() )) {
248 krosswarning("Failed to install scriptpackage");
249 return;
250 }
251
252 slotFillScriptsList();
253}
254
255void WdgScriptsManager::slotUninstallScript()
256{
257 ListItem* item = dynamic_cast<ListItem*>( scriptsList->currentItem() );
258 if( !item || !item->action() )
259 return;
260
261 Kross::Api::ScriptActionCollection* installedcollection = d->m_scripguiclient->getActionCollection("installedscripts");
262 if( !item->collection() || item->collection() != installedcollection)
263 return;
264
265 const TQString packagepath = item->action()->getPackagePath();
266 if( !packagepath)
267 return;
268
270 i18n("Uninstall the script package \"%1\" and delete the package's folder \"%2\"?")
271 .arg(item->action()->text()).arg(packagepath),
272 i18n("Uninstall")) != KMessageBox::Continue )
273 {
274 return;
275 }
276
277 if(! d->m_scripguiclient->uninstallScriptPackage(packagepath)) {
278 krosswarning("Failed to uninstall scriptpackage");
279 return;
280 }
281
282 slotFillScriptsList();
283}
284
285void WdgScriptsManager::slotExecuteScript()
286{
287 ListItem* item = dynamic_cast<ListItem*>( scriptsList->currentItem() );
288 if(item && item->action())
289 item->action()->activate();
290}
291
292void WdgScriptsManager::slotUnloadScript()
293{
294 ListItem* item = dynamic_cast<ListItem*>( scriptsList->currentItem() );
295 if(item && item->action()) {
296 item->collection()->detach( item->action() );
297 slotFillScriptsList();
298 }
299}
300
301void WdgScriptsManager::slotGetNewScript()
302{
303 const TQString appname = TDEApplication::kApplication()->name();
304 const TQString type = TQString("%1 1.x script").arg(appname);
305
306 if(! d->newstuff) {
307 d->newstuff = new ScriptNewStuff(d->m_scripguiclient, type);
308 connect(d->newstuff, TQ_SIGNAL(installFinished()), this, TQ_SLOT(slotResourceInstalled()));
309 }
310
311 KNS::Engine *engine = new KNS::Engine(d->newstuff, type, this);
312 KNS::DownloadDialog *d = new KNS::DownloadDialog( engine, this );
313 d->setType(type);
314
315 KNS::ProviderLoader *p = new KNS::ProviderLoader(this);
316 TQObject::connect(p, TQ_SIGNAL(providersLoaded(Provider::List*)),
317 d, TQ_SLOT(slotProviders(Provider::List*)));
318
319 p->load(type, "https://www.trinitydesktop.org/ocs/providers.xml");
320 d->exec();
321}
322
323void WdgScriptsManager::slotResourceInstalled()
324{
325 // Delete TDENewStuff's configuration entries. These entries reflect what has
326 // already been installed. As we cannot yet keep them in sync after uninstalling
327 // scripts, we deactivate the check marks entirely.
328 TDEGlobal::config()->deleteGroup("TDENewStuffStatus");
329}
330
331}}
332
333#include "wdgscriptsmanager.moc"
static int warningContinueCancel(TQWidget *parent, const TQString &text, const TQString &caption=TQString::null, const KGuiItem &buttonContinue=KStdGuiItem::cont(), const TQString &dontAskAgainName=TQString::null, int options=Notify)
A collection to store ScriptAction shared pointers.
TDESharedPtr< ScriptAction > Ptr
The name of the interpreter used to execute the scripting code.
The ScriptGUIClient class provides abstract access to scripting code used to extend an applications f...
virtual TQIconSet iconSet(TDEIcon::Group group, int size=0) const
virtual TQString text() const
TDEAction * action(StdAction act_enum, const TQObject *recvr, const char *slot, TDEActionCollection *parent, const char *name=0L)
const char * name(StdAction id)
The common Kross API used as common codebase.
Definition callable.h:31
The Kross scripting bridge to embed scripting functionality into an application.
Definition callable.h:31
void krosswarning(const TQString &s)
Warning function.