summaryrefslogtreecommitdiffstats
path: root/quanta/treeviews/scripttreeview.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'quanta/treeviews/scripttreeview.cpp')
-rw-r--r--quanta/treeviews/scripttreeview.cpp425
1 files changed, 425 insertions, 0 deletions
diff --git a/quanta/treeviews/scripttreeview.cpp b/quanta/treeviews/scripttreeview.cpp
new file mode 100644
index 00000000..191be51c
--- /dev/null
+++ b/quanta/treeviews/scripttreeview.cpp
@@ -0,0 +1,425 @@
+/***************************************************************************
+ scripttreeview.cpp - description
+ -------------------
+ begin : Thu Sep 16 2003
+ copyright : (C) 2003-2004 by Andras Mantia <[email protected]>
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * 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; version 2 of the License. *
+ * *
+ ***************************************************************************/
+//kde includes
+#include <kapplication.h>
+#include <kiconloader.h>
+#include <klocale.h>
+#include <kmessagebox.h>
+#include <kpopupmenu.h>
+#include <kprocess.h>
+#include <krun.h>
+#include <kstandarddirs.h>
+#include <ktar.h>
+#include <ktempdir.h>
+#include <ktempfile.h>
+#include <kurl.h>
+#include <kdebug.h>
+
+//qt includes
+#include <qdir.h>
+#include <qdom.h>
+#include <qfile.h>
+#include <qfileinfo.h>
+#include <qlabel.h>
+#include <qlineedit.h>
+#include <qregexp.h>
+#include <qstringlist.h>
+#include <qtextedit.h>
+
+//other includes
+#include <libxml/xmlmemory.h>
+#include <libxml/debugXML.h>
+#include <libxml/HTMLtree.h>
+#include <libxml/xmlIO.h>
+#include <libxml/DOCBparser.h>
+#include <libxml/xinclude.h>
+#include <libxml/catalog.h>
+#include <libxslt/xslt.h>
+#include <libxslt/xsltInternals.h>
+#include <libxslt/transform.h>
+#include <libxslt/xsltutils.h>
+
+//app includes
+#include "scripttreeview.h"
+#include "resource.h"
+#include "quantacommon.h"
+#include "tagmaildlg.h"
+
+extern int xmlLoadExtDtdDefaultValue;
+
+ScriptTreeView::ScriptTreeView(QWidget *parent, const char *name )
+ : BaseTreeView(parent,name)
+{
+ setSaveOpenFolder(true);
+ addColumn(i18n("Scripts"), -1);
+ addColumn("");
+
+ KURL url;
+ url.setPath(qConfig.globalDataDir + resourceDir + "scripts/");
+
+ BaseTreeBranch *m_globalDir;
+ m_globalDir = new BaseTreeBranch(this, url, i18n("Global Scripts"), SmallIcon("run"), true);
+ addBranch(m_globalDir);
+
+ url.setPath(locateLocal("data", resourceDir + "scripts/"));
+
+ BaseTreeBranch *m_localDir;
+ m_localDir = new BaseTreeBranch(this, url, i18n("Local Scripts"), SmallIcon("run"), true);
+ addBranch(m_localDir);
+
+ // here you define which files should not be visible for the users
+ const QString excludeString = ".*\\.info$|.*\\.css$|.*\\.xsl$";
+ m_globalDir->excludeFilterRx.setPattern(excludeString);
+ m_localDir->excludeFilterRx.setPattern(excludeString);
+
+ m_fileMenu = new KPopupMenu(this);
+ m_fileMenu->insertItem(SmallIcon("info"), i18n("&Description"), this, SLOT(slotProperties()));
+ m_fileMenu->insertItem(SmallIcon("run"), i18n("&Run Script"), this, SLOT(slotRun()));
+ m_fileMenu->insertSeparator();
+ m_fileMenu->insertItem(i18n("&Edit Script"), this, SLOT(slotEditScript()));
+ m_fileMenu->insertItem(i18n("Edit in &Quanta"), this, SLOT(slotEditInQuanta()));
+ m_fileMenu->insertItem(i18n("Edi&t Description"), this, SLOT(slotEditDescription()));
+ m_fileMenu->insertSeparator();
+ m_fileMenu->insertItem(UserIcon("ball"), i18n("&Assign Action"), this, SLOT(slotAssignAction()));
+ m_fileMenu->insertItem(SmallIcon("mail_send"), i18n("&Send in Email..."), this, SLOT(slotSendScriptInMail()));
+ m_fileMenu->insertItem(SmallIcon("network"), i18n("&Upload Script..."), this, SLOT(slotUploadScript()));
+
+ m_folderMenu = new KPopupMenu(this);
+ m_downloadMenuId = m_folderMenu->insertItem(SmallIcon("network"), i18n("&Download Script..."), this, SIGNAL(downloadScript()));
+
+
+ connect(this, SIGNAL(contextMenu(KListView*, QListViewItem*, const QPoint&)),
+ this, SLOT(slotMenu(KListView*, QListViewItem*, const QPoint&)));
+
+ restoreLayout( kapp->config(), className() );
+ // the restored size of the first column might be too large for the current content
+ // we set it to 10 and the listview will adjust it to the size of the largest entry
+ setColumnWidth(0, 10);
+}
+
+ScriptTreeView::~ScriptTreeView()
+{
+}
+
+void ScriptTreeView::slotMenu(KListView *, QListViewItem *item, const QPoint &point)
+{
+ if (!item)
+ {
+ m_folderMenu->setItemVisible(m_downloadMenuId, true);
+ m_folderMenu->popup(point);
+ return;
+ }
+ setSelected(item, true);
+
+ KFileTreeViewItem *curItem = currentKFileTreeViewItem();
+ if (!curItem->isDir())
+ {
+ m_fileMenu->popup(point);
+ } else
+ {
+ if (curItem == curItem->branch()->root())
+ {
+ m_folderMenu->setItemVisible(m_downloadMenuId, true);
+ } else
+ {
+ m_folderMenu->setItemVisible(m_downloadMenuId, false);
+ }
+ m_folderMenu->popup(point);
+ }
+}
+
+void ScriptTreeView::slotSelectFile(QListViewItem *item)
+{
+ if (item) {
+ if ( !currentKFileTreeViewItem()->isDir() )
+ {
+ KURL urlToOpen = infoFile(currentURL(), true);
+ emit openFileInPreview(urlToOpen);
+ }
+ }
+}
+
+void ScriptTreeView::slotEditDescription()
+{
+ if ( !currentKFileTreeViewItem()->isDir() )
+ {
+ KURL urlToOpen = infoFile(currentURL());
+ emit showPreviewWidget(false);
+ emit openFile(urlToOpen);
+ }
+}
+
+void ScriptTreeView::slotEditScript()
+{
+ if ( !currentKFileTreeViewItem()->isDir() )
+ {
+ emit showPreviewWidget(false);
+ KURL urlToOpen = currentURL();
+ KURL infoUrl = infoFile(urlToOpen);
+ QString editApp = infoOptionValue(infoUrl, "editor");
+ if (editApp.isEmpty())
+ emit openFile(urlToOpen);
+ else
+ {
+ KProcess *proc = new KProcess();
+ *proc << editApp << urlToOpen.path();
+ proc->start(KProcess::DontCare);
+ }
+ }
+}
+
+
+void ScriptTreeView::slotRun()
+{
+ if ( !currentKFileTreeViewItem()->isDir() )
+ {
+ KURL urlToOpen = currentURL();
+ KURL infoUrl = infoFile(urlToOpen);
+ QString execApp = infoOptionValue(infoUrl, "interpreter");
+ if (execApp.isEmpty())
+ {
+ KURL::List list;
+ list.append(urlToOpen);
+ KRun::displayOpenWithDialog(list);
+ }
+ else
+ {
+ KProcess *proc = new KProcess();
+ QStringList argsList = QStringList::split(' ', execApp);
+ *proc << argsList;
+ *proc << urlToOpen.path();
+ proc->start(KProcess::DontCare);
+ }
+ }
+}
+
+
+void ScriptTreeView::slotEditInQuanta()
+{
+ if ( !currentKFileTreeViewItem()->isDir() )
+ {
+ KURL urlToOpen = currentURL();
+ emit showPreviewWidget(false);
+ emit openFile(urlToOpen);
+ }
+}
+
+void ScriptTreeView::slotAssignAction()
+{
+ if ( !currentKFileTreeViewItem()->isDir() )
+ {
+ KURL url = currentURL();
+ KURL infoURL = infoFile(url);
+ QString execApp = infoOptionValue(infoURL, "interpreter");
+ if (execApp.isEmpty())
+ execApp = "sh";
+ url.setPath(url.path().replace(locateLocal("data", resourceDir + "scripts/"), "%scriptdir/"));
+ url.setPath(url.path().replace(qConfig.globalDataDir + resourceDir + "scripts/", "%scriptdir/"));
+ emit assignActionToScript(url, execApp);
+ }
+}
+
+QString ScriptTreeView::createScriptTarball()
+{
+ KURL url = currentURL();
+ KURL infoURL = infoFile(url);
+
+ KTempDir* tempDir = new KTempDir(tmpDir);
+ tempDir->setAutoDelete(true);
+ tempDirList.append(tempDir);
+ QString tempFileName=tempDir->name() + url.fileName() + ".tgz";
+
+ //pack the .tag files and the description.rc into a .tgz file
+ KTar tar(tempFileName, "application/x-gzip");
+ tar.open(IO_WriteOnly);
+
+ KURL::List files;
+ files.append(url);
+ files.append(infoURL);
+ files.append(KURL().fromPathOrURL(qConfig.globalDataDir + resourceDir + "scripts/info.xsl"));
+ for ( KURL::List::Iterator it_f = files.begin(); it_f != files.end(); ++it_f )
+ {
+ QFile file((*it_f).path());
+ file.open(IO_ReadOnly);
+ QByteArray bArray = file.readAll();
+ tar.writeFile((*it_f).fileName(), "user", "group", bArray.size(), bArray.data());
+ file.close();
+ }
+ tar.close();
+
+ return tempFileName;
+}
+
+void ScriptTreeView::slotSendScriptInMail()
+{
+ if ( !currentKFileTreeViewItem()->isDir() )
+ {
+
+ QStringList attachmentFile;
+ attachmentFile += createScriptTarball();
+
+ TagMailDlg *mailDlg = new TagMailDlg( this, i18n("Send script in email"));
+ QString toStr;
+ QString message = i18n("Hi,\n This is a Quanta Plus [http://quanta.kdewebdev.org] script tarball.\n\nHave fun.\n");
+ QString titleStr;
+ QString subjectStr;
+
+ mailDlg->TitleLabel->setText(i18n("Content:"));
+/* mailDlg->titleEdit->setFixedHeight(60);
+ mailDlg->titleEdit->setVScrollBarMode(QTextEdit::Auto);
+ mailDlg->titleEdit->setHScrollBarMode(QTextEdit::Auto);*/
+ if ( mailDlg->exec() )
+ {
+ if ( !mailDlg->lineEmail->text().isEmpty())
+ {
+ toStr = mailDlg->lineEmail->text();
+ subjectStr = (mailDlg->lineSubject->text().isEmpty())?i18n("Quanta Plus Script"):mailDlg->lineSubject->text();
+ if ( !mailDlg->titleEdit->text().isEmpty())
+ message = mailDlg->titleEdit->text();
+ } else
+ {
+ KMessageBox::error(this,i18n("No destination address was specified.\n Sending is aborted."),i18n("Error Sending Email"));
+ delete mailDlg;
+ return;
+ }
+ kapp->invokeMailer(toStr, QString::null, QString::null, subjectStr, message, QString::null, attachmentFile);
+ }
+ delete mailDlg;
+
+ }
+}
+
+void ScriptTreeView::slotUploadScript()
+{
+ if ( !currentKFileTreeViewItem()->isDir() )
+ {
+ QString fileName = createScriptTarball();
+ emit uploadScript(fileName);
+ }
+}
+
+KURL ScriptTreeView::infoFile(const KURL& url, bool htmlVersion)
+{
+ KURL returnUrl = url;
+ QString fileName = returnUrl.fileName();
+ //fileName.truncate(fileName.length() - QFileInfo(fileName).extension().length() - 1);
+ fileName.append(".info");
+ returnUrl.setFileName(fileName);
+ if (!QFileInfo(returnUrl.path()).exists())
+ {
+ QFile f(returnUrl.path());
+ if (f.open(IO_WriteOnly))
+ {
+ QTextStream str(&f);
+ str.setEncoding(QTextStream::UnicodeUTF8);
+ str << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" << endl;
+ str << "<?xml-stylesheet type=\"text/xsl\" href=\"info.xsl\" ?>" << endl;
+ str << "<!DOCTYPE QuantaScriptInfo>" << endl;
+ str << "<INFO>" << endl;
+ str << " <options editor=\"\" interpreter=\"\" />" << endl;
+ str << " <name>" << url.fileName() << "</name>" << endl;
+ str << " <author></author>" << endl;
+ str << " <email></email>" << endl;
+ str << " <website></website>" << endl;
+ str << " <version></version>" << endl;
+ str << " <license></license>" << endl;
+ str << " <about></about>" << endl;
+ str << "</INFO>" << endl;
+ f.close();
+ }
+ }
+
+ if (htmlVersion)
+ {
+ KTempFile *tempInfoFile = 0L;
+ if (!QFileInfo(returnUrl.path()).exists())
+ {
+ tempInfoFile = new KTempFile(tmpDir);
+ tempInfoFile->setAutoDelete(true);
+ returnUrl = KURL::fromPathOrURL(tempInfoFile->name());
+ QTextStream str(tempInfoFile->file());
+ str.setEncoding(QTextStream::UnicodeUTF8);
+ str << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" << endl;
+ str << "<?xml-stylesheet type=\"text/xsl\" href=\"info.xsl\" ?>" << endl;
+ str << "<!DOCTYPE QuantaScriptInfo>" << endl;
+ str << "<INFO>" << endl;
+ str << " <options editor=\"\" interpreter=\"\" />" << endl;
+ str << " <name>" << url.fileName() << "</name>" << endl;
+ str << " <author></author>" << endl;
+ str << " <email></email>" << endl;
+ str << " <website></website>" << endl;
+ str << " <version></version>" << endl;
+ str << " <license></license>" << endl;
+ str << " <about></about>" << endl;
+ str << "</INFO>" << endl;
+ tempInfoFile->close();
+ tempFileList.append(tempInfoFile);
+ }
+ KTempFile *tempFile = new KTempFile(tmpDir);
+ tempFile->setAutoDelete(true);
+ //apply the stylesheet
+ xsltStylesheetPtr cur = NULL;
+ xmlDocPtr doc, res;
+ xmlSubstituteEntitiesDefault(1);
+ xmlLoadExtDtdDefaultValue = 1;
+ QString xslFile = qConfig.globalDataDir + resourceDir + "scripts/info.xsl";
+ cur = xsltParseStylesheetFile(xmlCharStrndup(xslFile.utf8(), xslFile.utf8().length()));
+ doc = xmlParseFile(returnUrl.path().utf8());
+ res = xsltApplyStylesheet(cur, doc, 0);
+ xsltSaveResultToFile(tempFile->fstream(), res, cur);
+
+ xsltFreeStylesheet(cur);
+ xmlFreeDoc(res);
+ xmlFreeDoc(doc);
+
+ xsltCleanupGlobals();
+ xmlCleanupParser();
+ tempFile->close();
+
+ tempFileList.append(tempFile);
+ return KURL().fromPathOrURL(tempFile->name());
+ } else
+ return returnUrl;
+}
+
+QString ScriptTreeView::infoOptionValue(const KURL& infoURL, const QString& optionName)
+{
+ QString value;
+ QFile f(infoURL.path());
+ if (f.open(IO_ReadOnly))
+ {
+ QDomDocument doc;
+ doc.setContent(&f);
+ f.close();
+ QDomNodeList nodes = doc.elementsByTagName("options");
+ if (nodes.count() > 0)
+ {
+ QDomElement el = nodes.item(0).toElement();
+ value = el.attribute(optionName);
+ }
+ }
+ return value;
+}
+
+
+void ScriptTreeView::slotProperties()
+{
+ KFileTreeViewItem *item = currentKFileTreeViewItem();
+ if (item)
+ slotSelectFile(item);
+}
+
+
+#include "scripttreeview.moc"