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