File indexing completed on 2024-05-26 05:51:57

0001 /*
0002     SPDX-FileCopyrightText: 2022 Waqar Ahmed <waqar.17a@gmail.com>
0003     SPDX-License-Identifier: LGPL-2.0-or-later
0004 */
0005 #pragma once
0006 
0007 #include "FormattersEnum.h"
0008 
0009 #include <KTextEditor/Cursor>
0010 #include <KTextEditor/Editor>
0011 #include <KTextEditor/MainWindow>
0012 #include <KTextEditor/Plugin>
0013 #include <KXMLGUIClient>
0014 #include <QJsonDocument>
0015 #include <QJsonObject>
0016 #include <QPointer>
0017 #include <QVariant>
0018 
0019 struct PatchLine;
0020 
0021 class FormatPlugin final : public KTextEditor::Plugin
0022 {
0023     Q_OBJECT
0024 public:
0025     explicit FormatPlugin(QObject *parent = nullptr, const QVariantList & = QVariantList());
0026 
0027     QObject *createView(KTextEditor::MainWindow *mainWindow) override;
0028 
0029     int configPages() const override
0030     {
0031         return 1;
0032     }
0033 
0034     KTextEditor::ConfigPage *configPage(int number, QWidget *parent) override;
0035     void readConfig();
0036 
0037     QJsonObject formatterConfig() const;
0038     QString userConfigPath() const;
0039 
0040     bool formatOnSave = false;
0041 
0042     Q_SIGNAL void configChanged();
0043 
0044 private:
0045     void readJsonConfig();
0046     const QJsonDocument m_defaultConfig;
0047     QJsonObject m_formatterConfig;
0048 };
0049 
0050 class FormatPluginView final : public QObject, public KXMLGUIClient
0051 {
0052     Q_OBJECT
0053 
0054 public:
0055     explicit FormatPluginView(FormatPlugin *plugin, KTextEditor::MainWindow *mainwindow);
0056     ~FormatPluginView();
0057 
0058 private:
0059     void format();
0060     void runFormatOnSave();
0061     void onActiveViewChanged(KTextEditor::View *);
0062     void onFormattedTextReceived(class AbstractFormatter *, KTextEditor::Document *doc, const QByteArray &, int offset);
0063     void onFormattedPatchReceived(KTextEditor::Document *doc, const std::vector<PatchLine> &, bool setCursor = false);
0064     void saveDocument(KTextEditor::Document *doc);
0065     bool formatOnSave() const
0066     {
0067         return m_plugin->formatOnSave;
0068     }
0069     void onConfigChanged();
0070 
0071     QPointer<KTextEditor::Document> m_activeDoc;
0072     QByteArray m_lastChecksum;
0073     FormatPlugin *const m_plugin;
0074     KTextEditor::MainWindow *m_mainWindow;
0075     bool m_triggeredOnSave = false;
0076     QVariant m_lastProjectConfig;
0077     QJsonObject m_lastMergedConfig;
0078 };