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"