File indexing completed on 2024-05-05 05:52:18

0001 /*  This file is part of the Kate project.
0002  *
0003  *  SPDX-FileCopyrightText: 2010 Christoph Cullmann <cullmann@kde.org>
0004  *
0005  *  SPDX-License-Identifier: LGPL-2.0-or-later
0006  */
0007 
0008 #include "katesnippets.h"
0009 #include "snippetcompletionmodel.h"
0010 #include "snippetview.h"
0011 
0012 #include <QAction>
0013 
0014 #include <KActionCollection>
0015 #include <KLocalizedString>
0016 #include <KPluginFactory>
0017 #include <KXMLGUIFactory>
0018 
0019 K_PLUGIN_FACTORY_WITH_JSON(KateSnippetsPluginFactory, "katesnippetsplugin.json", registerPlugin<KateSnippetsPlugin>();)
0020 
0021 KateSnippetsPlugin::KateSnippetsPlugin(QObject *parent, const QVariantList &)
0022     : KTextEditor::Plugin(parent)
0023     , m_snippetGlobal(new KateSnippetGlobal(this))
0024 {
0025 }
0026 
0027 KateSnippetsPlugin::~KateSnippetsPlugin()
0028 {
0029 }
0030 
0031 QObject *KateSnippetsPlugin::createView(KTextEditor::MainWindow *mainWindow)
0032 {
0033     KateSnippetsPluginView *view = new KateSnippetsPluginView(this, mainWindow);
0034     return view;
0035 }
0036 
0037 KateSnippetsPluginView::KateSnippetsPluginView(KateSnippetsPlugin *plugin, KTextEditor::MainWindow *mainWindow)
0038     : QObject(mainWindow)
0039     , m_plugin(plugin)
0040     , m_mainWindow(mainWindow)
0041     , m_toolView(nullptr)
0042     , m_snippets(nullptr)
0043 {
0044     KXMLGUIClient::setComponentName(QStringLiteral("katesnippets"), i18n("Snippets"));
0045     setXMLFile(QStringLiteral("ui.rc"));
0046 
0047     // Toolview for snippets
0048     m_toolView = mainWindow->createToolView(plugin,
0049                                             QStringLiteral("kate_private_plugin_katesnippetsplugin"),
0050                                             KTextEditor::MainWindow::Right,
0051                                             QIcon::fromTheme(QStringLiteral("document-new")),
0052                                             i18n("Snippets"));
0053 
0054     // add snippets widget
0055     m_snippets = new SnippetView(KateSnippetGlobal::self(), mainWindow, m_toolView.data());
0056     m_toolView->layout()->addWidget(m_snippets);
0057     m_snippets->setupActionsForWindow(mainWindow->window());
0058     m_toolView->addActions(m_snippets->actions());
0059 
0060     // create actions
0061     QAction *a = actionCollection()->addAction(QStringLiteral("tools_create_snippet"));
0062     a->setIcon(QIcon::fromTheme(QStringLiteral("document-new")));
0063     a->setText(i18n("Create Snippet"));
0064     connect(a, &QAction::triggered, this, &KateSnippetsPluginView::createSnippet);
0065 
0066     connect(mainWindow, &KTextEditor::MainWindow::viewCreated, this, &KateSnippetsPluginView::slotViewCreated);
0067 
0068     /**
0069      * connect for all already existing views
0070      */
0071     const auto views = mainWindow->views();
0072     for (KTextEditor::View *view : views) {
0073         slotViewCreated(view);
0074     }
0075 
0076     // register if factory around
0077     if (auto factory = m_mainWindow->guiFactory()) {
0078         factory->addClient(this);
0079     }
0080 }
0081 
0082 KateSnippetsPluginView::~KateSnippetsPluginView()
0083 {
0084     // cleanup for all views
0085     for (auto view : qAsConst(m_textViews)) {
0086         if (!view) {
0087             continue;
0088         }
0089         view->unregisterCompletionModel(KateSnippetGlobal::self()->completionModel());
0090     }
0091 
0092     // unregister if factory around
0093     if (auto factory = m_mainWindow->guiFactory()) {
0094         factory->removeClient(this);
0095     }
0096 
0097     if (m_toolView) {
0098         delete m_toolView;
0099     }
0100 }
0101 
0102 void KateSnippetsPluginView::slotViewCreated(KTextEditor::View *view)
0103 {
0104     m_textViews.append(QPointer<KTextEditor::View>(view));
0105 
0106     // add snippet completion
0107     auto model = KateSnippetGlobal::self()->completionModel();
0108     view->unregisterCompletionModel(model);
0109     view->registerCompletionModel(model);
0110 }
0111 
0112 void KateSnippetsPluginView::createSnippet()
0113 {
0114     KateSnippetGlobal::self()->createSnippet(m_mainWindow->activeView());
0115 }
0116 
0117 #include "katesnippets.moc"
0118 #include "moc_katesnippets.cpp"