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"