File indexing completed on 2024-04-21 15:55:23

0001 /******************************************************************************
0002   Copyright (C) 2011-2012 by Holger Danielsson (holger.danielsson@versanet.de)
0003  ******************************************************************************/
0004 
0005 /**************************************************************************
0006 *                                                                         *
0007 *   This program is free software; you can redistribute it and/or modify  *
0008 *   it under the terms of the GNU General Public License as published by  *
0009 *   the Free Software Foundation; either version 2 of the License, or     *
0010 *   (at your option) any later version.                                   *
0011 *                                                                         *
0012 ***************************************************************************/
0013 
0014 #include "scripting/kilescriptobject.h"
0015 
0016 #include <QFile>
0017 #include <QFileDialog>
0018 #include <QFileInfo>
0019 #include <QInputDialog>
0020 #include <QMap>
0021 #include <QRegExpValidator>
0022 #include <QVariant>
0023 
0024 #include <KMessageBox>
0025 #include <KTextEditor/View>
0026 
0027 #include "kileviewmanager.h"
0028 #include "dialogs/validatorinputdialog.h"
0029 #include "kileinfo.h"
0030 
0031 namespace KileScript {
0032 
0033 ////////////////////////////////// KileAlert object //////////////////////////////////////
0034 
0035 KileAlert::KileAlert(QObject *parent, KParts::MainWindow *mainWindow)
0036     : QObject(parent), m_mainWindow(mainWindow)
0037 {
0038 }
0039 
0040 void KileAlert::information(const QString &text, const QString &caption)
0041 {
0042     QString msgCaption = ( caption.isEmpty() ) ? i18n("Script: information") : caption;
0043     KMessageBox::information(m_mainWindow,text,msgCaption);
0044 }
0045 
0046 void KileAlert::sorry(const QString &text, const QString &caption)
0047 {
0048     QString msgCaption = ( caption.isEmpty() ) ? i18n("Script: sorry") : caption;
0049     KMessageBox::error(m_mainWindow,text,msgCaption);
0050 }
0051 
0052 void KileAlert::error(const QString &text, const QString &caption)
0053 {
0054     QString msgCaption = ( caption.isEmpty() ) ? i18n("Script: error") : caption;
0055     KMessageBox::error(m_mainWindow,text,msgCaption);
0056 }
0057 
0058 QString KileAlert::question(const QString &text, const QString &caption)
0059 {
0060     QString msgCaption = ( caption.isEmpty() ) ? i18n("Script: question") : caption;
0061     return ( KMessageBox::questionTwoActions(m_mainWindow, text, msgCaption, KStandardGuiItem::ok(), KStandardGuiItem::cancel())
0062              == KMessageBox::PrimaryAction ) ? "yes" : "no";
0063 }
0064 
0065 QString KileAlert::warning(const QString &text, const QString &caption)
0066 {
0067     QString msgCaption = ( caption.isEmpty() ) ? i18n("Script: warning") : caption;
0068     return ( KMessageBox::warningContinueCancel(m_mainWindow,text,msgCaption) == KMessageBox::Continue ) ? "continue" : "cancel";
0069 }
0070 
0071 ////////////////////////////////// KileInput object //////////////////////////////////////
0072 
0073 KileInput::KileInput(QObject *parent)
0074     : QObject(parent)
0075 {
0076 }
0077 
0078 QString KileInput::getListboxItem(const QString &caption, const QString &label, const QStringList &list)
0079 {
0080     return getItem(caption,label,list);
0081 }
0082 
0083 QString KileInput::getText(const QString &caption, const QString &label)
0084 {
0085     QStringList list = checkCaptionAndLabel(caption, label);
0086     return QInputDialog::getText(Q_NULLPTR, list[0], list[1]);
0087 }
0088 
0089 QString KileInput::getLatexCommand(const QString &caption, const QString &label)
0090 {
0091     QRegExpValidator validator(QRegExp("[A-Za-z]+"),this);
0092     QStringList list = checkCaptionAndLabel(caption, label);
0093     return KileDialog::getText(list[0], list[1], QString(), Q_NULLPTR, &validator);
0094 }
0095 
0096 int KileInput::getInteger(const QString &caption, const QString &label, int min, int max)
0097 {
0098     QStringList list = checkCaptionAndLabel(caption, label);
0099     return QInputDialog::getInt(Q_NULLPTR, list[0], list[1], 0, min, max, 1);
0100 }
0101 
0102 int KileInput::getPosInteger(const QString &caption, const QString &label, int min, int max)
0103 {
0104     return getInteger(caption,label,min,max);
0105 }
0106 
0107 QString KileInput::getItem(const QString &caption, const QString &label, const QStringList &itemlist)
0108 {
0109     QStringList list = checkCaptionAndLabel(caption, label);
0110     return QInputDialog::getItem(Q_NULLPTR, list[0], list[1], itemlist, 0);
0111 }
0112 
0113 QStringList KileInput::checkCaptionAndLabel(const QString &caption, const QString &label)
0114 {
0115     QString checkedCaption = caption, checkedLabel = label;
0116     if(caption.isEmpty()) {
0117         checkedCaption = i18n("Enter Value");
0118     }
0119     if(label.isEmpty()) {
0120         checkedLabel = i18n("Please enter a value");
0121     }
0122 
0123     return QStringList() << checkedCaption << checkedLabel;
0124 }
0125 
0126 ////////////////////////////////// KileWizard object //////////////////////////////////////
0127 
0128 KileWizard::KileWizard(QObject *parent, KileInfo *kileInfo, const QMap<QString,QAction *> *scriptActions)
0129     : QObject(parent), m_kileInfo(kileInfo), m_scriptActions(scriptActions)
0130 {
0131 }
0132 
0133 void KileWizard::tabular()
0134 {
0135     triggerAction("wizard_tabular");
0136 }
0137 
0138 void KileWizard::array()
0139 {
0140     triggerAction("wizard_array");
0141 }
0142 
0143 void KileWizard::tabbing()
0144 {
0145     triggerAction("wizard_tabbing");
0146 }
0147 
0148 void KileWizard::floatEnvironment()
0149 {
0150     triggerAction("wizard_float");
0151 }
0152 
0153 void KileWizard::mathEnvironment()
0154 {
0155     triggerAction("wizard_mathenv");
0156 }
0157 
0158 void KileWizard::postscript()
0159 {
0160     triggerAction("wizard_postscript");
0161 }
0162 
0163 void KileWizard::pdf()
0164 {
0165     triggerAction("wizard_pdf");
0166 }
0167 
0168 bool KileWizard::triggerAction(const QString &name)
0169 {
0170     if ( name=="wizard_postscript" || name=="wizard_pdf" ) {
0171         KTextEditor::View *view = m_kileInfo->viewManager()->currentTextView();
0172         if ( !view ) {
0173             return false;
0174         }
0175     }
0176 
0177     if ( m_scriptActions->contains(name) ) {
0178         m_scriptActions->value(name)->trigger();
0179         return true;
0180     }
0181     else {
0182         return false;
0183     }
0184 }
0185 
0186 ////////////////////////////////// KileJavaScript object //////////////////////////////////////
0187 
0188 KileJavaScript::KileJavaScript(QObject *parent)
0189     : QObject(parent)
0190 {
0191 }
0192 
0193 QString KileJavaScript::caption()
0194 {
0195     return i18n("Script '%1.js'", m_scriptname);
0196 }
0197 
0198 ////////////////////////////////// KileFile object //////////////////////////////////////
0199 
0200 KileFile::KileFile(QObject *parent, KileInfo *kileInfo)
0201     : QObject(parent),  m_kileInfo(kileInfo)
0202 {
0203 }
0204 
0205 QMap<QString, QVariant> KileFile::read(const QString& filename) const
0206 {
0207     QMap<QString,QVariant> result;
0208 //  result["status"] = QVariant();
0209     result["message"] = QString();
0210     result["text"] = QString();
0211 
0212     QFile file(filename);
0213     if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
0214         result["message"] = i18n("File Handling Error: Unable to find the file '%1'", filename);
0215         result["status"] = KileFile::ACCESS_FAILED;
0216         return result;
0217     }
0218 
0219     // read data
0220     QTextStream stream(&file);
0221     stream.setCodec("UTF-8");
0222     result["text"] = stream.readAll();
0223     file.close();
0224 
0225     result["status"] = KileFile::ACCESS_OK;
0226 
0227     return result;
0228 }
0229 
0230 QMap<QString, QVariant> KileFile::read() const
0231 {
0232     QString openedFile = m_kileInfo->getName();
0233     const QString filepath = (!openedFile.isEmpty()) ? QFileInfo(m_kileInfo->getName()).absolutePath() : QString();
0234     QString filename = QFileDialog::getOpenFileName(m_kileInfo->mainWindow(), i18n("Select File to Read"), filepath, QString());
0235     if(!filename.isEmpty()) {
0236         return read(filename);
0237     }
0238     else {
0239         return actionCancelled();
0240     }
0241 }
0242 
0243 QMap<QString, QVariant> KileFile::write(const QString& filename, const QString& text) const
0244 {
0245     QMap<QString, QVariant> result;
0246 
0247     QFile file(filename);
0248     if(!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
0249         result["status"] = KileFile::ACCESS_FAILED;
0250         result["message"] = i18n("File Handling Error: Unable to create the output file '%1'", filename);
0251         return result;
0252     }
0253 
0254     // write data
0255     qint64 bytesWritten = 0;
0256     const QByteArray dataToWrite = text.toUtf8();
0257     while(bytesWritten < dataToWrite.size()) {
0258         qint64 bytesWrittenNow = file.write(dataToWrite.constData() + bytesWritten, dataToWrite.size() - bytesWritten);
0259         if(bytesWrittenNow < 0) {
0260             result["status"] = KileFile::ACCESS_FAILED;
0261             result["message"] = i18n("File Handling Error: Unable to write to the output file '%1'", filename);
0262             file.close();
0263             return result;
0264         }
0265         bytesWritten += bytesWrittenNow;
0266     }
0267     file.close();
0268 
0269     result["status"] = KileFile::ACCESS_OK;
0270     result["message"] = QString();
0271 
0272     return result;
0273 }
0274 
0275 QMap<QString, QVariant> KileFile::write(const QString& text) const
0276 {
0277     QString openedFile = m_kileInfo->getName();
0278     const QString filepath = (!openedFile.isEmpty()) ? QFileInfo(m_kileInfo->getName()).absolutePath() : QString();
0279     QString filename = QFileDialog::getSaveFileName(m_kileInfo->mainWindow(), i18n("Save As"), filepath, QString());
0280     if(!filename.isEmpty()) {
0281         return write(filename, text);
0282     }
0283     else {
0284         return actionCancelled();
0285     }
0286 }
0287 
0288 QString KileFile::getOpenFileName(const QUrl &url, const QString& filter)
0289 {
0290     QUrl startdir = (url.isEmpty()) ? QUrl::fromLocalFile(QFileInfo(m_kileInfo->getName()).absolutePath()) : url;
0291     return QFileDialog::getOpenFileName(m_kileInfo->mainWindow(), i18n("Select File to Read"), startdir.toLocalFile(), filter);
0292 }
0293 
0294 QString KileFile::getSaveFileName(const QUrl &url, const QString& filter)
0295 {
0296     QUrl startdir = (url.isEmpty()) ? QUrl::fromLocalFile(QFileInfo(m_kileInfo->getName()).absolutePath()) : url;
0297     return QFileDialog::getSaveFileName(m_kileInfo->mainWindow(), i18n("Save As"), startdir.toLocalFile(), filter );
0298 }
0299 
0300 QMap<QString,QVariant> KileFile::actionCancelled() const
0301 {
0302     QMap<QString,QVariant> result;
0303     result["status"] = KileFile::ACCESS_FAILED;
0304     result["message"] = i18n("This action was canceled by the user.");
0305     result["text"] = QString();
0306     return result;
0307 }
0308 
0309 ////////////////////////////////// KileScript object //////////////////////////////////////
0310 
0311 KileScriptObject::KileScriptObject(QObject *parent, KileInfo* kileInfo, const QMap<QString,QAction *> *scriptActions)
0312     : QObject(parent), m_kileInfo(kileInfo)
0313 {
0314     m_kileAlert = new KileAlert(this,m_kileInfo->mainWindow());
0315     m_kileInput = new KileInput(this);
0316     m_kileWizard = new KileWizard(this,m_kileInfo,scriptActions);
0317     m_kileScript = new KileJavaScript(this);
0318     m_kileFile = new KileFile(this,m_kileInfo);
0319 }
0320 
0321 void KileScriptObject::setScriptname(const QString &name)
0322 {
0323     m_kileScript->setScriptname(name);
0324 
0325 }
0326 
0327 
0328 }
0329