1 /******************************************************************************
2   Copyright (C) 2011-2012 by Holger Danielsson (holger.danielsson@versanet.de)
3  ******************************************************************************/
4 
5 /**************************************************************************
6 *                                                                         *
7 *   This program is free software; you can redistribute it and/or modify  *
8 *   it under the terms of the GNU General Public License as published by  *
9 *   the Free Software Foundation; either version 2 of the License, or     *
10 *   (at your option) any later version.                                   *
11 *                                                                         *
12 ***************************************************************************/
13 
14 #include "scripting/kilescriptobject.h"
15 
16 #include <QFile>
17 #include <QFileDialog>
18 #include <QFileInfo>
19 #include <QInputDialog>
20 #include <QMap>
21 #include <QRegExpValidator>
22 #include <QVariant>
23 
24 #include <KMessageBox>
25 #include <KTextEditor/View>
26 
27 #include "kileviewmanager.h"
28 #include "dialogs/validatorinputdialog.h"
29 #include "kileinfo.h"
30 
31 namespace KileScript {
32 
33 ////////////////////////////////// KileAlert object //////////////////////////////////////
34 
KileAlert(QObject * parent,KParts::MainWindow * mainWindow)35 KileAlert::KileAlert(QObject *parent, KParts::MainWindow *mainWindow)
36     : QObject(parent), m_mainWindow(mainWindow)
37 {
38 }
39 
information(const QString & text,const QString & caption)40 void KileAlert::information(const QString &text, const QString &caption)
41 {
42     QString msgCaption = ( caption.isEmpty() ) ? i18n("Script: information") : caption;
43     KMessageBox::information(m_mainWindow,text,msgCaption);
44 }
45 
sorry(const QString & text,const QString & caption)46 void KileAlert::sorry(const QString &text, const QString &caption)
47 {
48     QString msgCaption = ( caption.isEmpty() ) ? i18n("Script: sorry") : caption;
49     KMessageBox::sorry(m_mainWindow,text,msgCaption);
50 }
51 
error(const QString & text,const QString & caption)52 void KileAlert::error(const QString &text, const QString &caption)
53 {
54     QString msgCaption = ( caption.isEmpty() ) ? i18n("Script: error") : caption;
55     KMessageBox::error(m_mainWindow,text,msgCaption);
56 }
57 
question(const QString & text,const QString & caption)58 QString KileAlert::question(const QString &text, const QString &caption)
59 {
60     QString msgCaption = ( caption.isEmpty() ) ? i18n("Script: question") : caption;
61     return ( KMessageBox::questionYesNo(m_mainWindow,text,msgCaption) == KMessageBox::No ) ? "no" : "yes";
62 }
63 
warning(const QString & text,const QString & caption)64 QString KileAlert::warning(const QString &text, const QString &caption)
65 {
66     QString msgCaption = ( caption.isEmpty() ) ? i18n("Script: warning") : caption;
67     return ( KMessageBox::warningContinueCancel(m_mainWindow,text,msgCaption) == KMessageBox::Continue ) ? "continue" : "cancel";
68 }
69 
70 ////////////////////////////////// KileInput object //////////////////////////////////////
71 
KileInput(QObject * parent)72 KileInput::KileInput(QObject *parent)
73     : QObject(parent)
74 {
75 }
76 
getListboxItem(const QString & caption,const QString & label,const QStringList & list)77 QString KileInput::getListboxItem(const QString &caption, const QString &label, const QStringList &list)
78 {
79     return getItem(caption,label,list);
80 }
81 
getText(const QString & caption,const QString & label)82 QString KileInput::getText(const QString &caption, const QString &label)
83 {
84     QStringList list = checkCaptionAndLabel(caption, label);
85     return QInputDialog::getText(Q_NULLPTR, list[0], list[1]);
86 }
87 
getLatexCommand(const QString & caption,const QString & label)88 QString KileInput::getLatexCommand(const QString &caption, const QString &label)
89 {
90     QRegExpValidator validator(QRegExp("[A-Za-z]+"),this);
91     QStringList list = checkCaptionAndLabel(caption, label);
92     return KileDialog::getText(list[0], list[1], QString(), Q_NULLPTR, &validator);
93 }
94 
getInteger(const QString & caption,const QString & label,int min,int max)95 int KileInput::getInteger(const QString &caption, const QString &label, int min, int max)
96 {
97     QStringList list = checkCaptionAndLabel(caption, label);
98     return QInputDialog::getInt(Q_NULLPTR, list[0], list[1], 0, min, max, 1);
99 }
100 
getPosInteger(const QString & caption,const QString & label,int min,int max)101 int KileInput::getPosInteger(const QString &caption, const QString &label, int min, int max)
102 {
103     return getInteger(caption,label,min,max);
104 }
105 
getItem(const QString & caption,const QString & label,const QStringList & itemlist)106 QString KileInput::getItem(const QString &caption, const QString &label, const QStringList &itemlist)
107 {
108     QStringList list = checkCaptionAndLabel(caption, label);
109     return QInputDialog::getItem(Q_NULLPTR, list[0], list[1], itemlist, 0);
110 }
111 
checkCaptionAndLabel(const QString & caption,const QString & label)112 QStringList KileInput::checkCaptionAndLabel(const QString &caption, const QString &label)
113 {
114     QString checkedCaption = caption, checkedLabel = label;
115     if(caption.isEmpty()) {
116         checkedCaption = i18n("Enter Value");
117     }
118     if(label.isEmpty()) {
119         checkedLabel = i18n("Please enter a value");
120     }
121 
122     return QStringList() << checkedCaption << checkedLabel;
123 }
124 
125 ////////////////////////////////// KileWizard object //////////////////////////////////////
126 
KileWizard(QObject * parent,KileInfo * kileInfo,const QMap<QString,QAction * > * scriptActions)127 KileWizard::KileWizard(QObject *parent, KileInfo *kileInfo, const QMap<QString,QAction *> *scriptActions)
128     : QObject(parent), m_kileInfo(kileInfo), m_scriptActions(scriptActions)
129 {
130 }
131 
tabular()132 void KileWizard::tabular()
133 {
134     triggerAction("wizard_tabular");
135 }
136 
array()137 void KileWizard::array()
138 {
139     triggerAction("wizard_array");
140 }
141 
tabbing()142 void KileWizard::tabbing()
143 {
144     triggerAction("wizard_tabbing");
145 }
146 
floatEnvironment()147 void KileWizard::floatEnvironment()
148 {
149     triggerAction("wizard_float");
150 }
151 
mathEnvironment()152 void KileWizard::mathEnvironment()
153 {
154     triggerAction("wizard_mathenv");
155 }
156 
postscript()157 void KileWizard::postscript()
158 {
159     triggerAction("wizard_postscript");
160 }
161 
pdf()162 void KileWizard::pdf()
163 {
164     triggerAction("wizard_pdf");
165 }
166 
triggerAction(const QString & name)167 bool KileWizard::triggerAction(const QString &name)
168 {
169     if ( name=="wizard_postscript" || name=="wizard_pdf" ) {
170         KTextEditor::View *view = m_kileInfo->viewManager()->currentTextView();
171         if ( !view ) {
172             return false;
173         }
174     }
175 
176     if ( m_scriptActions->contains(name) ) {
177         m_scriptActions->value(name)->trigger();
178         return true;
179     }
180     else {
181         return false;
182     }
183 }
184 
185 ////////////////////////////////// KileJavaScript object //////////////////////////////////////
186 
KileJavaScript(QObject * parent)187 KileJavaScript::KileJavaScript(QObject *parent)
188     : QObject(parent)
189 {
190 }
191 
caption()192 QString KileJavaScript::caption()
193 {
194     return i18n("Script '%1.js'", m_scriptname);
195 }
196 
197 ////////////////////////////////// KileFile object //////////////////////////////////////
198 
KileFile(QObject * parent,KileInfo * kileInfo)199 KileFile::KileFile(QObject *parent, KileInfo *kileInfo)
200     : QObject(parent),  m_kileInfo(kileInfo)
201 {
202 }
203 
read(const QString & filename) const204 QMap<QString, QVariant> KileFile::read(const QString& filename) const
205 {
206     QMap<QString,QVariant> result;
207 //	result["status"] = QVariant();
208     result["message"] = QString();
209     result["text"] = QString();
210 
211     QFile file(filename);
212     if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
213         result["message"] = i18n("File Handling Error: Unable to find the file '%1'", filename);
214         result["status"] = KileFile::ACCESS_FAILED;
215         return result;
216     }
217 
218     // read data
219     QTextStream stream(&file);
220     stream.setCodec("UTF-8");
221     result["text"] = stream.readAll();
222     file.close();
223 
224     result["status"] = KileFile::ACCESS_OK;
225 
226     return result;
227 }
228 
read() const229 QMap<QString, QVariant> KileFile::read() const
230 {
231     QString openedFile = m_kileInfo->getName();
232     const QString filepath = (!openedFile.isEmpty()) ? QFileInfo(m_kileInfo->getName()).absolutePath() : QString();
233     QString filename = QFileDialog::getOpenFileName(m_kileInfo->mainWindow(), i18n("Select File to Read"), filepath, QString());
234     if(!filename.isEmpty()) {
235         return read(filename);
236     }
237     else {
238         return actionCancelled();
239     }
240 }
241 
write(const QString & filename,const QString & text) const242 QMap<QString, QVariant> KileFile::write(const QString& filename, const QString& text) const
243 {
244     QMap<QString, QVariant> result;
245 
246     QFile file(filename);
247     if(!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
248         result["status"] = KileFile::ACCESS_FAILED;
249         result["message"] = i18n("File Handling Error: Unable to create the output file '%1'", filename);
250         return result;
251     }
252 
253     // write data
254     qint64 bytesWritten = 0;
255     const QByteArray dataToWrite = text.toUtf8();
256     while(bytesWritten < dataToWrite.size()) {
257         qint64 bytesWrittenNow = file.write(dataToWrite.constData() + bytesWritten, dataToWrite.size() - bytesWritten);
258         if(bytesWrittenNow < 0) {
259             result["status"] = KileFile::ACCESS_FAILED;
260             result["message"] = i18n("File Handling Error: Unable to write to the output file '%1'", filename);
261             file.close();
262             return result;
263         }
264         bytesWritten += bytesWrittenNow;
265     }
266     file.close();
267 
268     result["status"] = KileFile::ACCESS_OK;
269     result["message"] = QString();
270 
271     return result;
272 }
273 
write(const QString & text) const274 QMap<QString, QVariant> KileFile::write(const QString& text) const
275 {
276     QString openedFile = m_kileInfo->getName();
277     const QString filepath = (!openedFile.isEmpty()) ? QFileInfo(m_kileInfo->getName()).absolutePath() : QString();
278     QString filename = QFileDialog::getSaveFileName(m_kileInfo->mainWindow(), i18n("Save As"), filepath, QString());
279     if(!filename.isEmpty()) {
280         return write(filename, text);
281     }
282     else {
283         return actionCancelled();
284     }
285 }
286 
getOpenFileName(const QUrl & url,const QString & filter)287 QString KileFile::getOpenFileName(const QUrl &url, const QString& filter)
288 {
289     QUrl startdir = (url.isEmpty()) ? QUrl::fromLocalFile(QFileInfo(m_kileInfo->getName()).absolutePath()) : url;
290     return QFileDialog::getOpenFileName(m_kileInfo->mainWindow(), i18n("Select File to Read"), startdir.toLocalFile(), filter);
291 }
292 
getSaveFileName(const QUrl & url,const QString & filter)293 QString KileFile::getSaveFileName(const QUrl &url, const QString& filter)
294 {
295     QUrl startdir = (url.isEmpty()) ? QUrl::fromLocalFile(QFileInfo(m_kileInfo->getName()).absolutePath()) : url;
296     return QFileDialog::getSaveFileName(m_kileInfo->mainWindow(), i18n("Save As"), startdir.toLocalFile(), filter );
297 }
298 
actionCancelled() const299 QMap<QString,QVariant> KileFile::actionCancelled() const
300 {
301     QMap<QString,QVariant> result;
302     result["status"] = KileFile::ACCESS_FAILED;
303     result["message"] = i18n("This action was canceled by the user.");
304     result["text"] = QString();
305     return result;
306 }
307 
308 ////////////////////////////////// KileScript object //////////////////////////////////////
309 
KileScriptObject(QObject * parent,KileInfo * kileInfo,const QMap<QString,QAction * > * scriptActions)310 KileScriptObject::KileScriptObject(QObject *parent, KileInfo* kileInfo, const QMap<QString,QAction *> *scriptActions)
311     : QObject(parent), m_kileInfo(kileInfo)
312 {
313     m_kileAlert = new KileAlert(this,m_kileInfo->mainWindow());
314     m_kileInput = new KileInput(this);
315     m_kileWizard = new KileWizard(this,m_kileInfo,scriptActions);
316     m_kileScript = new KileJavaScript(this);
317     m_kileFile = new KileFile(this,m_kileInfo);
318 }
319 
setScriptname(const QString & name)320 void KileScriptObject::setScriptname(const QString &name)
321 {
322     m_kileScript->setScriptname(name);
323 
324 }
325 
326 
327 }
328 
329