File indexing completed on 2024-05-05 05:52:18
0001 /* This file is part of the Kate project. 0002 * Based on the snippet plugin from KDevelop 4. 0003 * 0004 * SPDX-FileCopyrightText: 2009 Milian Wolff <mail@milianw.de> 0005 * SPDX-FileCopyrightText: 2012 Christoph Cullmann <cullmann@kde.org> 0006 * 0007 * SPDX-License-Identifier: LGPL-2.0-or-later 0008 */ 0009 0010 #include "snippetcompletionitem.h" 0011 0012 #include <KLocalizedString> 0013 #include <QModelIndex> 0014 #include <QTextEdit> 0015 #include <ktexteditor/document.h> 0016 0017 #include <ktexteditor/codecompletionmodel.h> 0018 #include <ktexteditor/view.h> 0019 0020 #include "snippet.h" 0021 #include "snippetrepository.h" 0022 0023 SnippetCompletionItem::SnippetCompletionItem(Snippet *snippet, SnippetRepository *repo) 0024 : m_name(snippet->text()) 0025 , m_snippet(snippet->snippet()) 0026 , m_repo(repo) 0027 { 0028 Q_ASSERT(m_repo); 0029 const auto &namespace_ = repo->completionNamespace(); 0030 if (!namespace_.isEmpty()) { 0031 m_name.prepend(QLatin1String(":")); 0032 m_name.prepend(repo->completionNamespace()); 0033 } 0034 } 0035 0036 SnippetCompletionItem::~SnippetCompletionItem() 0037 { 0038 } 0039 0040 QVariant SnippetCompletionItem::data(const QModelIndex &index, int role, const KTextEditor::CodeCompletionModel *model) const 0041 { 0042 // as long as the snippet completion model is not a kdevelop code completion model, 0043 // model will usually be 0. hence don't use it. 0044 Q_UNUSED(model); 0045 0046 switch (role) { 0047 case Qt::DisplayRole: 0048 switch (index.column()) { 0049 case KTextEditor::CodeCompletionModel::Name: 0050 return m_name; 0051 case KTextEditor::CodeCompletionModel::Prefix: 0052 return QString(); 0053 case KTextEditor::CodeCompletionModel::Postfix: 0054 return QString(); 0055 case KTextEditor::CodeCompletionModel::Arguments: 0056 return QString(); 0057 } 0058 break; 0059 case KTextEditor::CodeCompletionModel::IsExpandable: 0060 return QVariant(true); 0061 case KTextEditor::CodeCompletionModel::ExpandingWidget: { 0062 QTextEdit *textEdit = new QTextEdit(); 0063 /// TODO: somehow make it possible to scroll like in other expanding widgets 0064 // don't make it too large, only show a few lines 0065 textEdit->resize(textEdit->width(), 100); 0066 textEdit->setPlainText(m_snippet); 0067 textEdit->setReadOnly(true); 0068 textEdit->setLineWrapMode(QTextEdit::NoWrap); 0069 0070 QVariant v; 0071 v.setValue<QWidget *>(textEdit); 0072 return v; 0073 } 0074 } 0075 0076 return QVariant(); 0077 } 0078 0079 void SnippetCompletionItem::execute(KTextEditor::View *view, const KTextEditor::Range &word) 0080 { 0081 // insert snippet content 0082 view->insertTemplate(view->cursorPosition(), m_snippet, m_repo->script()); 0083 view->document()->removeText(word); 0084 }