File indexing completed on 2024-04-21 03:57:39

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