File indexing completed on 2024-05-05 04:39:49

0001 /*
0002     SPDX-FileCopyrightText: 2012 Miha Čančula <miha@noughmad.eu>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include "templatepreviewtoolview.h"
0008 
0009 #include "ui_templatepreviewtoolview.h"
0010 
0011 #include "filetemplatesplugin.h"
0012 #include "templatepreview.h"
0013 
0014 #include <interfaces/icore.h>
0015 #include <interfaces/idocumentcontroller.h>
0016 #include <language/codegen/templaterenderer.h>
0017 
0018 #include <KTextEditor/Document>
0019 #include <KLocalizedString>
0020 
0021 using namespace KDevelop;
0022 
0023 TemplatePreviewToolView::TemplatePreviewToolView(FileTemplatesPlugin* plugin, QWidget* parent)
0024 : QWidget(parent)
0025 , ui(new Ui::TemplatePreviewToolView)
0026 , m_original(nullptr)
0027 , m_plugin(plugin)
0028 {
0029     ui->setupUi(this);
0030     setWindowIcon(QIcon::fromTheme(QStringLiteral("document-preview"), windowIcon()));
0031 
0032     ui->messageWidget->hide();
0033     ui->emptyLinesPolicyComboBox->setCurrentIndex(1);
0034 
0035     IDocumentController* dc = ICore::self()->documentController();
0036     if (dc->activeDocument())
0037     {
0038         m_original = dc->activeDocument()->textDocument();
0039     }
0040 
0041     if (m_original)
0042     {
0043         documentActivated(dc->activeDocument());
0044     }
0045 
0046     connect(ui->projectRadioButton, &QRadioButton::toggled,
0047             this, &TemplatePreviewToolView::selectedRendererChanged);
0048     connect(ui->emptyLinesPolicyComboBox, QOverload<int>::of(&QComboBox::currentIndexChanged),
0049             this, &TemplatePreviewToolView::selectedRendererChanged);
0050     selectedRendererChanged();
0051 
0052     connect(dc, &IDocumentController::documentActivated,
0053             this, &TemplatePreviewToolView::documentActivated);
0054     connect(dc, &IDocumentController::documentClosed,
0055             this, &TemplatePreviewToolView::documentClosed);
0056 }
0057 
0058 TemplatePreviewToolView::~TemplatePreviewToolView()
0059 {
0060     delete ui;
0061 }
0062 
0063 void TemplatePreviewToolView::documentActivated(KDevelop::IDocument* document)
0064 {
0065     documentChanged(document->textDocument());
0066 }
0067 
0068 void TemplatePreviewToolView::documentChanged(KTextEditor::Document* document)
0069 {
0070     if (!isVisible()) {
0071         return;
0072     }
0073 
0074 
0075     if (m_original) {
0076         disconnect(m_original, &KTextEditor::Document::textChanged,
0077                    this, &TemplatePreviewToolView::documentChanged);
0078     }
0079     m_original = document;
0080 
0081     FileTemplatesPlugin::TemplateType type = FileTemplatesPlugin::NoTemplate;
0082     if (m_original) {
0083         connect(m_original, &KTextEditor::Document::textChanged,
0084                 this, &TemplatePreviewToolView::documentChanged);
0085         type = m_plugin->determineTemplateType(document->url());
0086     }
0087 
0088     switch (type) {
0089         case FileTemplatesPlugin::NoTemplate:
0090             ui->messageWidget->setMessageType(KMessageWidget::Information);
0091             if (m_original) {
0092                 ui->messageWidget->setText(xi18n("The active text document is not a <application>KDevelop</application> template"));
0093             } else {
0094                 ui->messageWidget->setText(i18n("No active text document."));
0095             }
0096             ui->messageWidget->animatedShow();
0097             ui->preview->setText(QString());
0098             break;
0099 
0100         case FileTemplatesPlugin::FileTemplate:
0101             ui->classRadioButton->setChecked(true);
0102             sourceTextChanged(m_original->text());
0103             break;
0104 
0105         case FileTemplatesPlugin::ProjectTemplate:
0106             ui->projectRadioButton->setChecked(true);
0107             sourceTextChanged(m_original->text());
0108             break;
0109     }
0110 }
0111 
0112 void TemplatePreviewToolView::showEvent(QShowEvent*)
0113 {
0114     IDocument* doc = ICore::self()->documentController()->activeDocument();
0115     documentChanged(doc ? doc->textDocument() : nullptr);
0116 }
0117 
0118 void TemplatePreviewToolView::documentClosed(IDocument* document)
0119 {
0120     m_original = nullptr;
0121 
0122     if (document && document->textDocument() == m_original) {
0123         documentChanged(nullptr);
0124     }
0125 }
0126 
0127 void TemplatePreviewToolView::sourceTextChanged(const QString& text)
0128 {
0129     QString errorString = ui->preview->setText(text, ui->projectRadioButton->isChecked(), m_policy);
0130     if (!errorString.isEmpty()) {
0131         ui->messageWidget->setMessageType(KMessageWidget::Error);
0132         ui->messageWidget->setText(errorString);
0133         ui->messageWidget->animatedShow();
0134     } else {
0135         ui->messageWidget->animatedHide();
0136     }
0137 
0138     if (m_original) {
0139         ui->preview->document()->setMode(m_original->mode());
0140     }
0141 }
0142 
0143 void TemplatePreviewToolView::selectedRendererChanged()
0144 {
0145     if (ui->classRadioButton->isChecked())
0146     {
0147         TemplateRenderer::EmptyLinesPolicy policy = TemplateRenderer::KeepEmptyLines;
0148         switch (ui->emptyLinesPolicyComboBox->currentIndex())
0149         {
0150             case 0:
0151                 policy = TemplateRenderer::KeepEmptyLines;
0152                 break;
0153 
0154             case 1:
0155                 policy = TemplateRenderer::TrimEmptyLines;
0156                 break;
0157 
0158             case 2:
0159                 policy = TemplateRenderer::RemoveEmptyLines;
0160                 break;
0161         }
0162         m_policy = policy;
0163     }
0164     documentChanged(m_original);
0165 }
0166 
0167 #include "moc_templatepreviewtoolview.cpp"