File indexing completed on 2024-05-05 11:56:09

0001 /*
0002     SPDX-License-Identifier: GPL-2.0-or-later
0003     SPDX-FileCopyrightText: 2009 Alexander Rieder <alexanderrieder@gmail.com>
0004 */
0005 
0006 #include "scripteditorwidget.h"
0007 
0008 #include <QTemporaryFile>
0009 
0010 #include <QUrl>
0011 
0012 #include <KLocalizedString>
0013 #include <QDebug>
0014 #include <KMessageBox>
0015 #include <QFileDialog>
0016 #include <KWindowConfig>
0017 #include <QAction>
0018 #include <KStandardAction>
0019 #include <KActionCollection>
0020 #include <KXMLGUIFactory>
0021 #include <KConfigGroup>
0022 #include <KSharedConfig>
0023 #include <KTextEditor/View>
0024 #include <KTextEditor/Editor>
0025 
0026 ScriptEditorWidget::ScriptEditorWidget(const QString& filter, const QString& highlightingMode, QWidget* parent) : KXmlGuiWindow(parent),
0027 m_filter(filter),
0028 m_editor(nullptr),
0029 m_script(nullptr),
0030 m_tmpFile(nullptr)
0031 {
0032     setObjectName(QStringLiteral("ScriptEditor"));
0033 
0034     KStandardAction::openNew(this, SLOT(newScript()), actionCollection());
0035     KStandardAction::open(this, SLOT(open()), actionCollection());
0036     KStandardAction::close(this, SLOT(close()), actionCollection());
0037     QAction * runAction = actionCollection()->addAction(QStringLiteral("file_execute"), this, SLOT(run()));
0038     runAction->setIcon(QIcon::fromTheme(QStringLiteral("system-run")));
0039     runAction->setText(i18n("Run Script"));
0040 
0041     KTextEditor::Editor* editor = KTextEditor::Editor::instance();
0042     if (!editor)
0043     {
0044         KMessageBox::error(this,  i18n("A KDE text-editor component could not be found;\n"
0045                                        "please check your KDE installation."));
0046     }
0047     else
0048     {
0049         m_script=editor->createDocument(nullptr);
0050         m_editor=qobject_cast<KTextEditor::View*>(m_script->createView(this));
0051 
0052         m_script->setHighlightingMode(highlightingMode);
0053 
0054         KConfigGroup cg(KSharedConfig::openConfig(), "ScriptEditor");
0055         setAutoSaveSettings(cg, true);
0056 
0057         setCentralWidget(m_editor);
0058         setupGUI(QSize(500,600), Default, QStringLiteral("cantor_scripteditor.rc"));
0059         guiFactory()->addClient(m_editor);
0060 
0061         KWindowConfig::restoreWindowSize(this->windowHandle(), cg);
0062 
0063         connect(m_script, &KTextEditor::Document::modifiedChanged, this, &ScriptEditorWidget::updateCaption);
0064         connect(m_script, &KTextEditor::Document::documentUrlChanged, this, &ScriptEditorWidget::updateCaption);
0065         updateCaption();
0066     }
0067 }
0068 
0069 ScriptEditorWidget::~ScriptEditorWidget()
0070 {
0071     if (m_script)
0072         delete m_script;
0073     if (m_tmpFile)
0074         delete m_tmpFile;
0075 }
0076 
0077 void ScriptEditorWidget::newScript()
0078 {
0079     QString highlightingMode = m_script->highlightingMode();
0080     m_script->closeUrl();
0081     m_script->setHighlightingMode(highlightingMode);
0082 }
0083 
0084 void ScriptEditorWidget::open()
0085 {
0086     QUrl url = QFileDialog::getOpenFileUrl(this, QString(), QUrl(), m_filter);
0087     m_script->openUrl(url);
0088 }
0089 
0090 void ScriptEditorWidget::open(const QUrl &url)
0091 {
0092     m_script->openUrl(url);
0093 }
0094 
0095 void ScriptEditorWidget::run()
0096 {
0097     QString filename;
0098     if(!m_script->url().isLocalFile())
0099     {
0100         // If the script is not in a local file, write it to a temporary file
0101         if(m_tmpFile==nullptr)
0102         {
0103             m_tmpFile=new QTemporaryFile();
0104         }
0105         else
0106         {
0107             m_tmpFile->resize(0);
0108         }
0109         m_tmpFile->open();
0110         QString text=m_script->text();
0111         m_tmpFile->write(text.toUtf8());
0112         m_tmpFile->close();
0113 
0114         filename=m_tmpFile->fileName();
0115     }else
0116     {
0117         m_script->save();
0118         filename=m_script->url().toLocalFile();
0119     }
0120 
0121     qDebug()<<"running "<<filename;
0122     emit runScript(filename);
0123 }
0124 
0125 bool ScriptEditorWidget::queryClose()
0126 {
0127     if(m_script)
0128         return m_script->queryClose();
0129     else
0130         return true;
0131 }
0132 
0133 void ScriptEditorWidget::updateCaption()
0134 {
0135     QString fileName = m_script->url().toLocalFile();
0136     bool modified = m_script->isModified();
0137     if (fileName.isEmpty())
0138     {
0139         setCaption(i18n("Script Editor"), modified);
0140     }else
0141     {
0142          setCaption(i18n("Script Editor - %1", fileName), modified);
0143     }
0144 }
0145 
0146