File indexing completed on 2024-05-05 13:39:45
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