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"