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