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 <tdeversion.h>
29#include <tdefiledialog.h>
30#include <kiconloader.h>
31#include <tdelistview.h>
32#include <tdelocale.h>
33#include <tdemessagebox.h>
34#include <kpushbutton.h>
35#include <kstandarddirs.h>
36#include <tdetoolbar.h>
37
38#if KDE_IS_VERSION(3, 4, 0)
39 // The TDENewStuffSecure we use internaly for the GetHotNewStuff-functionality
40 // was introduced with KDE 3.4.
41 #define KROSS_SUPPORT_NEWSTUFF
42#endif
43
44#ifdef KROSS_SUPPORT_NEWSTUFF
45 #include <tdenewstuff/provider.h>
46 #include <tdenewstuff/engine.h>
47 #include <tdenewstuff/downloaddialog.h>
48 #include <tdenewstuff/knewstuffsecure.h>
49#endif
50
51#include "scriptguiclient.h"
52#include "scriptaction.h"
53
54namespace Kross { namespace Api {
55
56#ifdef KROSS_SUPPORT_NEWSTUFF
57class ScriptNewStuff : public TDENewStuffSecure
58{
59 public:
60 ScriptNewStuff(ScriptGUIClient* scripguiclient, const TQString& type, TQWidget *parentWidget = 0)
61 : TDENewStuffSecure(type, parentWidget)
62 , m_scripguiclient(scripguiclient) {}
63 virtual ~ScriptNewStuff() {}
64 private:
65 ScriptGUIClient* m_scripguiclient;
66 virtual void installResource() { m_scripguiclient->installScriptPackage( m_tarName ); }
67};
68#endif
69
70class ListItem : public TQListViewItem
71{
72 private:
73 ScriptActionCollection* m_collection;
74 ScriptAction::Ptr m_action;
75 public:
76 ListItem(TQListView* parentview, ScriptActionCollection* collection)
77 : TQListViewItem(parentview), m_collection(collection), m_action(0) {}
78
79 ListItem(ListItem* parentitem, TQListViewItem* afteritem, ScriptAction::Ptr action)
80 : TQListViewItem(parentitem, afteritem), m_collection( parentitem->collection() ), m_action(action) {}
81
82 ScriptAction::Ptr action() const { return m_action; }
83 ScriptActionCollection* collection() const { return m_collection; }
84 //ScriptActionMenu* actionMenu() const { return m_menu; }
85};
86
87class ToolTip : public TQToolTip
88{
89 public:
90 ToolTip(TDEListView* parent) : TQToolTip(parent->viewport()), m_parent(parent) {}
91 virtual ~ToolTip () { remove(m_parent->viewport()); }
92 protected:
93 virtual void maybeTip(const TQPoint& p) {
94 ListItem* item = dynamic_cast<ListItem*>( m_parent->itemAt(p) );
95 if(item) {
96 TQRect r( m_parent->itemRect(item) );
97 if(r.isValid() && item->action()) {
98 tip(r, TQString("<qt>%1</qt>").arg(item->action()->toolTip()));
99 }
100 }
101 }
102 private:
103 TDEListView* m_parent;
104};
105
106class WdgScriptsManagerPrivate
107{
108 friend class WdgScriptsManager;
109 ScriptGUIClient* m_scripguiclient;
110 ToolTip* m_tooltip;
111#ifdef KROSS_SUPPORT_NEWSTUFF
112 ScriptNewStuff* newstuff;
113#endif
114 //enum { LoadBtn = 0, UnloadBtn, InstallBtn, UninstallBtn, ExecBtn, NewStuffBtn };
115};
116
117WdgScriptsManager::WdgScriptsManager(ScriptGUIClient* scr, TQWidget* parent, const char* name, WFlags fl )
118 : WdgScriptsManagerBase(parent, name, fl)
119 , d(new WdgScriptsManagerPrivate)
120{
121 d->m_scripguiclient = scr;
122 d->m_tooltip = new ToolTip(scriptsList);
123#ifdef KROSS_SUPPORT_NEWSTUFF
124 d->newstuff = 0;
125#endif
126
127 scriptsList->header()->hide();
128 //scriptsList->header()->setClickEnabled(false);
129 scriptsList->setAllColumnsShowFocus(true);
130 //scriptsList->setRootIsDecorated(true);
131 scriptsList->setSorting(-1);
132 scriptsList->addColumn("text");
133 //scriptsList->setColumnWidthMode(1, TQListView::Manual);
134
135 slotFillScriptsList();
136
137 slotSelectionChanged(0);
138 connect(scriptsList, TQ_SIGNAL(selectionChanged(TQListViewItem*)), this, TQ_SLOT(slotSelectionChanged(TQListViewItem*)));
139
140 btnExec->setIconSet(TDEGlobal::instance()->iconLoader()->loadIconSet( "application-x-executable", TDEIcon::MainToolbar, 16 ));
141 connect(btnExec, TQ_SIGNAL(clicked()), this, TQ_SLOT(slotExecuteScript()));
142 btnLoad->setIconSet(TDEGlobal::instance()->iconLoader()->loadIconSet( "document-open", TDEIcon::MainToolbar, 16 ));
143 connect(btnLoad, TQ_SIGNAL(clicked()), this, TQ_SLOT(slotLoadScript()));
144 btnUnload->setIconSet(TDEGlobal::instance()->iconLoader()->loadIconSet( "window-close", TDEIcon::MainToolbar, 16 ));
145 connect(btnUnload, TQ_SIGNAL(clicked()), this, TQ_SLOT(slotUnloadScript()));
146 btnInstall->setIconSet(TDEGlobal::instance()->iconLoader()->loadIconSet( "fileimport", TDEIcon::MainToolbar, 16 ));
147 connect(btnInstall, TQ_SIGNAL(clicked()), this, TQ_SLOT(slotInstallScript()));
148 btnUninstall->setIconSet(TDEGlobal::instance()->iconLoader()->loadIconSet( "window-close", TDEIcon::MainToolbar, 16 ));
149 connect(btnUninstall, TQ_SIGNAL(clicked()), this, TQ_SLOT(slotUninstallScript()));
150#ifdef KROSS_SUPPORT_NEWSTUFF
151 btnNewStuff->setIconSet(TDEGlobal::instance()->iconLoader()->loadIconSet( "knewstuff", TDEIcon::MainToolbar, 16 ));
152 connect(btnNewStuff, TQ_SIGNAL(clicked()), this, TQ_SLOT(slotGetNewScript()));
153#endif
154/*
155 toolBar->setIconText( TDEToolBar::IconTextRight );
156
157 toolBar->insertButton("application-x-executable", WdgScriptsManagerPrivate::ExecBtn, false, i18n("Execute"));
158 toolBar->addConnection(WdgScriptsManagerPrivate::ExecBtn, TQ_SIGNAL(clicked()), this, TQ_SLOT(slotExecuteScript()));
159 toolBar->insertLineSeparator();
160 toolBar->insertButton("document-open", WdgScriptsManagerPrivate::LoadBtn, true, i18n("Load"));
161 toolBar->addConnection(WdgScriptsManagerPrivate::LoadBtn, TQ_SIGNAL(clicked()), this, TQ_SLOT(slotLoadScript()));
162 toolBar->insertButton("window-close", WdgScriptsManagerPrivate::UnloadBtn, false, i18n("Unload"));
163 toolBar->addConnection(WdgScriptsManagerPrivate::UnloadBtn, TQ_SIGNAL(clicked()), this, TQ_SLOT(slotUnloadScript()));
164 toolBar->insertLineSeparator();
165 toolBar->insertButton("fileimport", WdgScriptsManagerPrivate::InstallBtn, true, i18n("Install"));
166 toolBar->addConnection(WdgScriptsManagerPrivate::InstallBtn, TQ_SIGNAL(clicked()), this, TQ_SLOT(slotInstallScript()));
167 toolBar->insertButton("window-close", WdgScriptsManagerPrivate::UninstallBtn, false, i18n("Uninstall"));
168 toolBar->addConnection(WdgScriptsManagerPrivate::UninstallBtn, TQ_SIGNAL(clicked()), this, TQ_SLOT(slotUninstallScript()));
169#ifdef KROSS_SUPPORT_NEWSTUFF
170 toolBar->insertLineSeparator();
171 toolBar->insertButton("knewstuff", WdgScriptsManagerPrivate::NewStuffBtn, true, i18n("Get More Scripts"));
172 toolBar->addConnection(WdgScriptsManagerPrivate::NewStuffBtn, TQ_SIGNAL(clicked()), this, TQ_SLOT(slotGetNewScript()));
173#endif
174*/
175 connect(scr, TQ_SIGNAL( collectionChanged(ScriptActionCollection*) ),
176 this, TQ_SLOT( slotFillScriptsList() ));
177}
178
179WdgScriptsManager::~WdgScriptsManager()
180{
181 delete d->m_tooltip;
182 delete d;
183}
184
185void WdgScriptsManager::slotFillScriptsList()
186{
187 scriptsList->clear();
188
189 addItem( d->m_scripguiclient->getActionCollection("executedscripts") );
190 addItem( d->m_scripguiclient->getActionCollection("loadedscripts") );
191 addItem( d->m_scripguiclient->getActionCollection("installedscripts") );
192}
193
194void WdgScriptsManager::addItem(ScriptActionCollection* collection)
195{
196 if(! collection)
197 return;
198
199 ListItem* i = new ListItem(scriptsList, collection);
200 i->setText(0, collection->actionMenu()->text());
201 i->setOpen(true);
202
203 TQValueList<ScriptAction::Ptr> list = collection->actions();
204 TQListViewItem* lastitem = 0;
205 for(TQValueList<ScriptAction::Ptr>::Iterator it = list.begin(); it != list.end(); ++it)
206 lastitem = addItem(*it, i, lastitem);
207}
208
209TQListViewItem* WdgScriptsManager::addItem(ScriptAction::Ptr action, TQListViewItem* parentitem, TQListViewItem* afteritem)
210{
211 if(! action)
212 return 0;
213
214 ListItem* i = new ListItem(dynamic_cast<ListItem*>(parentitem), afteritem, action);
215 i->setText(0, action->text()); // FIXME: i18nise it for ko2.0
216 //i->setText(1, action->getDescription()); // FIXME: i18nise it for ko2.0
217 //i->setText(2, action->name());
218
219 TQPixmap pm;
220 if(action->hasIcon()) {
221 TDEIconLoader* icons = TDEGlobal::iconLoader();
222 pm = icons->loadIconSet(action->icon(), TDEIcon::Small).pixmap(TQIconSet::Small, TQIconSet::Active);
223 }
224 else {
225 pm = action->iconSet(TDEIcon::Small, 16).pixmap(TQIconSet::Small, TQIconSet::Active);
226 }
227 if(! pm.isNull())
228 i->setPixmap(0, pm); // display the icon
229
230 return i;
231}
232
233void WdgScriptsManager::slotSelectionChanged(TQListViewItem* item)
234{
235 ListItem* i = dynamic_cast<ListItem*>(item);
236 Kross::Api::ScriptActionCollection* installedcollection = d->m_scripguiclient->getActionCollection("installedscripts");
237
238 //toolBar->setItemEnabled(WdgScriptsManagerPrivate::ExecBtn, i && i->action());
239 //toolBar->setItemEnabled(WdgScriptsManagerPrivate::UninstallBtn, i && i->action() && i->collection() == installedcollection);
240 //toolBar->setItemEnabled(WdgScriptsManagerPrivate::UnloadBtn, i && i->action() && i->collection() != installedcollection);
241 btnExec->setEnabled(i && i->action());
242 btnUnload->setEnabled(i && i->action() && i->collection() != installedcollection);
243 btnUninstall->setEnabled(i && i->action() && i->collection() == installedcollection);
244}
245
246void WdgScriptsManager::slotLoadScript()
247{
248 if(d->m_scripguiclient->loadScriptFile())
249 slotFillScriptsList();
250}
251
252void WdgScriptsManager::slotInstallScript()
253{
254 KFileDialog* filedialog = new KFileDialog(
255 TQString(), // startdir
256 "*.tar.gz *.tgz *.bz2", // filter
257 this, // parent widget
258 "WdgScriptsManagerInstallFileDialog", // name
259 true // modal
260 );
261 filedialog->setCaption( i18n("Install Script Package") );
262
263 if(! filedialog->exec())
264 return;
265
266 if(! d->m_scripguiclient->installScriptPackage( filedialog->selectedURL().path() )) {
267 krosswarning("Failed to install scriptpackage");
268 return;
269 }
270
271 slotFillScriptsList();
272}
273
274void WdgScriptsManager::slotUninstallScript()
275{
276 ListItem* item = dynamic_cast<ListItem*>( scriptsList->currentItem() );
277 if( !item || !item->action() )
278 return;
279
280 Kross::Api::ScriptActionCollection* installedcollection = d->m_scripguiclient->getActionCollection("installedscripts");
281 if( !item->collection() || item->collection() != installedcollection)
282 return;
283
284 const TQString packagepath = item->action()->getPackagePath();
285 if( !packagepath)
286 return;
287
289 i18n("Uninstall the script package \"%1\" and delete the package's folder \"%2\"?")
290 .arg(item->action()->text()).arg(packagepath),
291 i18n("Uninstall")) != KMessageBox::Continue )
292 {
293 return;
294 }
295
296 if(! d->m_scripguiclient->uninstallScriptPackage(packagepath)) {
297 krosswarning("Failed to uninstall scriptpackage");
298 return;
299 }
300
301 slotFillScriptsList();
302}
303
304void WdgScriptsManager::slotExecuteScript()
305{
306 ListItem* item = dynamic_cast<ListItem*>( scriptsList->currentItem() );
307 if(item && item->action())
308 item->action()->activate();
309}
310
311void WdgScriptsManager::slotUnloadScript()
312{
313 ListItem* item = dynamic_cast<ListItem*>( scriptsList->currentItem() );
314 if(item && item->action()) {
315 item->collection()->detach( item->action() );
316 slotFillScriptsList();
317 }
318}
319
320void WdgScriptsManager::slotGetNewScript()
321{
322#ifdef KROSS_SUPPORT_NEWSTUFF
323 const TQString appname = TDEApplication::kApplication()->name();
324 const TQString type = TQString("%1 1.x script").arg(appname);
325
326 if(! d->newstuff) {
327 d->newstuff = new ScriptNewStuff(d->m_scripguiclient, type);
328 connect(d->newstuff, TQ_SIGNAL(installFinished()), this, TQ_SLOT(slotResourceInstalled()));
329 }
330
331 KNS::Engine *engine = new KNS::Engine(d->newstuff, type, this);
332 KNS::DownloadDialog *d = new KNS::DownloadDialog( engine, this );
333 d->setType(type);
334
335 KNS::ProviderLoader *p = new KNS::ProviderLoader(this);
336 TQObject::connect(p, TQ_SIGNAL(providersLoaded(Provider::List*)),
337 d, TQ_SLOT(slotProviders(Provider::List*)));
338
339 p->load(type, "https://www.trinitydesktop.org/ocs/providers.xml");
340 d->exec();
341#endif
342}
343
344void WdgScriptsManager::slotResourceInstalled()
345{
346 // Delete TDENewStuff's configuration entries. These entries reflect what has
347 // already been installed. As we cannot yet keep them in sync after uninstalling
348 // scripts, we deactivate the check marks entirely.
349 TDEGlobal::config()->deleteGroup("TDENewStuffStatus");
350}
351
352}}
353
354#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.
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 Kross scripting bridge to embed scripting functionality into an application.
Definition callable.h:31
void krosswarning(const TQString &s)
Warning function.