File indexing completed on 2024-04-28 15:30:42

0001 /*
0002     SPDX-FileCopyrightText: 2008 Paul Giannaros <paul@giannaros.org>
0003     SPDX-FileCopyrightText: 2008 Christoph Cullmann <cullmann@kde.org>
0004 
0005     SPDX-License-Identifier: LGPL-2.0-or-later
0006 */
0007 
0008 #include "katescriptview.h"
0009 
0010 #include "katedocument.h"
0011 #include "kateglobal.h"
0012 #include "katerenderer.h"
0013 #include "katescript.h"
0014 #include "kateview.h"
0015 #include "scriptcursor.h"
0016 #include "scriptrange.h"
0017 
0018 #include <KLocalizedString>
0019 #include <KTextEditor/Command>
0020 
0021 #include <QJSEngine>
0022 
0023 KateScriptView::KateScriptView(QJSEngine *engine, QObject *parent)
0024     : QObject(parent)
0025     , m_view(nullptr)
0026     , m_engine(engine)
0027 {
0028 }
0029 
0030 void KateScriptView::setView(KTextEditor::ViewPrivate *view)
0031 {
0032     m_view = view;
0033 }
0034 
0035 KTextEditor::ViewPrivate *KateScriptView::view()
0036 {
0037     return m_view;
0038 }
0039 
0040 void KateScriptView::copy()
0041 {
0042     m_view->copy();
0043 }
0044 
0045 void KateScriptView::cut()
0046 {
0047     m_view->cut();
0048 }
0049 
0050 void KateScriptView::paste()
0051 {
0052     m_view->paste();
0053 }
0054 
0055 QJSValue KateScriptView::cursorPosition()
0056 {
0057     return cursorToScriptValue(m_engine, m_view->cursorPosition());
0058 }
0059 
0060 QJSValue KateScriptView::cursorPositions()
0061 {
0062     // pack our stuff into js array
0063     const auto cursors = m_view->cursorPositions();
0064     QJSValue jsArray = m_engine->newArray(cursors.size());
0065     for (int i = 0; i < cursors.size(); ++i) {
0066         jsArray.setProperty(i, cursorToScriptValue(m_engine, cursors[i]));
0067     }
0068     return jsArray;
0069 }
0070 
0071 void KateScriptView::setCursorPosition(int line, int column)
0072 {
0073     const KTextEditor::Cursor cursor(line, column);
0074     m_view->setCursorPosition(cursor);
0075 }
0076 
0077 void KateScriptView::setCursorPosition(const QJSValue &jscursor)
0078 {
0079     const auto cursor = cursorFromScriptValue(jscursor);
0080     m_view->setCursorPosition(cursor);
0081 }
0082 
0083 void KateScriptView::setCursorPositions(const QJSValue &cursors)
0084 {
0085     // unpack the array of cursors
0086     QVector<KTextEditor::Cursor> unboxedCursors;
0087     const int length = cursors.property(QStringLiteral("length")).toInt();
0088     for (int i = 0; i < length; ++i) {
0089         unboxedCursors.append(cursorFromScriptValue(cursors.property(i)));
0090     }
0091     m_view->setCursorPositions(unboxedCursors);
0092 }
0093 
0094 QJSValue KateScriptView::virtualCursorPosition()
0095 {
0096     return cursorToScriptValue(m_engine, m_view->cursorPositionVirtual());
0097 }
0098 
0099 void KateScriptView::setVirtualCursorPosition(int line, int column)
0100 {
0101     const KTextEditor::Cursor cursor(line, column);
0102     m_view->setCursorPositionVisual(cursor);
0103 }
0104 
0105 void KateScriptView::setVirtualCursorPosition(const QJSValue &jscursor)
0106 {
0107     const auto cursor = cursorFromScriptValue(jscursor);
0108     setVirtualCursorPosition(cursor.line(), cursor.column());
0109 }
0110 
0111 QString KateScriptView::selectedText()
0112 {
0113     return m_view->selectionText();
0114 }
0115 
0116 bool KateScriptView::hasSelection()
0117 {
0118     return m_view->selection();
0119 }
0120 
0121 QJSValue KateScriptView::selection()
0122 {
0123     return rangeToScriptValue(m_engine, m_view->selectionRange());
0124 }
0125 
0126 QJSValue KateScriptView::selections()
0127 {
0128     // pack our stuff into js array
0129     const auto ranges = m_view->selectionRanges();
0130     QJSValue jsArray = m_engine->newArray(ranges.size());
0131     for (int i = 0; i < ranges.size(); ++i) {
0132         jsArray.setProperty(i, rangeToScriptValue(m_engine, ranges[i]));
0133     }
0134     return jsArray;
0135 }
0136 
0137 void KateScriptView::setSelection(const QJSValue &jsrange)
0138 {
0139     m_view->setSelection(rangeFromScriptValue(jsrange));
0140 }
0141 
0142 void KateScriptView::setSelections(const QJSValue &ranges)
0143 {
0144     // unpack the array of ranges
0145     QVector<KTextEditor::Range> unboxedRanges;
0146     const int length = ranges.property(QStringLiteral("length")).toInt();
0147     for (int i = 0; i < length; ++i) {
0148         unboxedRanges.append(rangeFromScriptValue(ranges.property(i)));
0149     }
0150     m_view->setSelections(unboxedRanges);
0151 }
0152 
0153 void KateScriptView::removeSelectedText()
0154 {
0155     m_view->removeSelectedText();
0156 }
0157 
0158 void KateScriptView::selectAll()
0159 {
0160     m_view->selectAll();
0161 }
0162 
0163 void KateScriptView::clearSelection()
0164 {
0165     m_view->clearSelection();
0166 }
0167 
0168 void KateScriptView::setBlockSelection(bool on)
0169 {
0170     m_view->setBlockSelection(on);
0171 }
0172 
0173 bool KateScriptView::blockSelection()
0174 {
0175     return m_view->blockSelection();
0176 }
0177 
0178 void KateScriptView::align(const QJSValue &jsrange)
0179 {
0180     const auto range = rangeFromScriptValue(jsrange);
0181     m_view->doc()->align(m_view, range);
0182 }
0183 
0184 void KateScriptView::alignOn(const QJSValue &jsrange, const QJSValue &pattern)
0185 {
0186     if (!pattern.isString()) {
0187         return;
0188     }
0189     const auto range = rangeFromScriptValue(jsrange);
0190     m_view->doc()->alignOn(range, pattern.toString(), m_view->blockSelection());
0191 }
0192 
0193 QJSValue KateScriptView::searchText(const QJSValue &range, const QString &pattern, bool backwards)
0194 {
0195     KTextEditor::SearchOptions option = backwards ? KTextEditor::Backwards : KTextEditor::Default;
0196     KTextEditor::Range match = m_view->doc()->searchText(rangeFromScriptValue(range), pattern, option).first();
0197     return rangeToScriptValue(m_engine, match);
0198 }
0199 
0200 QJSValue KateScriptView::executeCommand(const QString &command, const QString &args, const QJSValue &jsrange)
0201 {
0202     QString message;
0203     bool ok = false;
0204 
0205     const auto range = rangeFromScriptValue(jsrange);
0206     const auto cmd = KTextEditor::EditorPrivate::self()->queryCommand(command);
0207     if (!cmd) {
0208         ok = false;
0209         message = i18n("Command not found: %1", command);
0210     } else {
0211         const auto cmdLine = args.isEmpty() ? (command) : (command + QLatin1Char(' ') + args);
0212         ok = cmd->exec(m_view, cmdLine, message, range);
0213     }
0214 
0215     QJSValue object;
0216     object.setProperty(QStringLiteral("ok"), ok);
0217     object.setProperty(QStringLiteral("status"), message);
0218     return object;
0219 }
0220 
0221 #include "moc_katescriptview.cpp"