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 }