File indexing completed on 2024-05-12 04:38:18

0001 /*
0002     SPDX-FileCopyrightText: 2008 Cédric Pasteur <cedric.pasteur@free.fr>
0003 
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include "editstyledialog.h"
0008 
0009 #include <interfaces/isourceformatter.h>
0010 
0011 #include <KTextEditor/Document>
0012 #include <KTextEditor/View>
0013 #include <KTextEditor/Editor>
0014 #include <KTextEditor/ConfigInterface>
0015 #include <KLocalizedString>
0016 
0017 #include <QPushButton>
0018 #include <QVBoxLayout>
0019 #include <QUrl>
0020 #include <QDialogButtonBox>
0021 
0022 
0023 using namespace KDevelop;
0024 
0025 EditStyleDialog::EditStyleDialog(const ISourceFormatter& formatter, const QMimeType& mime,
0026                                  const SourceFormatterStyle& style, QWidget* parent)
0027     : QDialog(parent)
0028     , m_sourceFormatter(formatter)
0029     , m_mimeType(mime)
0030     , m_style(style)
0031 {
0032     Q_ASSERT_X(formatter.hasEditStyleWidget(), Q_FUNC_INFO, "Precondition");
0033 
0034     auto* const mainWidget = new QWidget();
0035     m_ui.setupUi(mainWidget);
0036 
0037     auto* mainLayout = new QVBoxLayout(this);
0038     mainLayout->addWidget(mainWidget);
0039 
0040     auto buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel);
0041     auto okButton = buttonBox->button(QDialogButtonBox::Ok);
0042     okButton->setDefault(true);
0043     connect(buttonBox, &QDialogButtonBox::accepted, this, &EditStyleDialog::accept);
0044     connect(buttonBox, &QDialogButtonBox::rejected, this, &EditStyleDialog::reject);
0045     mainLayout->addWidget(buttonBox);
0046 
0047     init();
0048 
0049     m_settingsWidget->load(style);
0050 }
0051 
0052 EditStyleDialog::~EditStyleDialog()
0053 {
0054 }
0055 
0056 void EditStyleDialog::init()
0057 {
0058     // add plugin settings widget
0059     auto* layout = new QVBoxLayout(m_ui.settingsWidgetParent);
0060     layout->setContentsMargins(0, 0, 0, 0);
0061 
0062     m_settingsWidget = m_sourceFormatter.editStyleWidget(m_mimeType).release();
0063     Q_ASSERT_X(m_settingsWidget, Q_FUNC_INFO, "hasEditStyleWidget() is inconsistent with editStyleWidget().");
0064     layout->addWidget(m_settingsWidget);
0065     Q_ASSERT_X(m_settingsWidget->parent(), Q_FUNC_INFO, "QBoxLayout::addWidget must reparent its argument.");
0066 
0067     m_ui.settingsWidgetParent->setLayout(layout);
0068 
0069     connect(m_settingsWidget, &SettingsWidget::previewTextChanged,
0070             this, &EditStyleDialog::updatePreviewText);
0071 
0072     m_ui.showPreviewCheckBox->setChecked(m_style.usePreview());
0073     connect(m_ui.showPreviewCheckBox, &QCheckBox::toggled, this, [this](bool show) {
0074         m_style.setUsePreview(show);
0075         previewVisibilityChanged(show);
0076     });
0077 
0078     previewVisibilityChanged(m_style.usePreview());
0079 }
0080 
0081 void EditStyleDialog::initPreview()
0082 {
0083     m_document = KTextEditor::Editor::instance()->createDocument(this);
0084     m_document->setReadWrite(false);
0085     m_document->setHighlightingMode(m_style.modeForMimetype(m_mimeType));
0086 
0087     m_view = m_document->createView(m_ui.textEditor);
0088     auto* layout2 = new QVBoxLayout(m_ui.textEditor);
0089     layout2->setContentsMargins(0, 0, 0, 0);
0090     layout2->addWidget(m_view);
0091     m_ui.textEditor->setLayout(layout2);
0092     m_view->setStatusBarEnabled(false);
0093     m_view->show();
0094 
0095     KTextEditor::ConfigInterface* iface =
0096         qobject_cast<KTextEditor::ConfigInterface*>(m_view);
0097     if (iface) {
0098         iface->setConfigValue(QStringLiteral("dynamic-word-wrap"), false);
0099         iface->setConfigValue(QStringLiteral("icon-bar"), false);
0100         iface->setConfigValue(QStringLiteral("scrollbar-minimap"), false);
0101     }
0102 }
0103 
0104 void EditStyleDialog::updatePreviewText(const QString &text)
0105 {
0106     Q_ASSERT_X(!text.isEmpty(), Q_FUNC_INFO, "Empty m_pendingPreviewText has a special meaning.");
0107     if (m_style.usePreview()) {
0108         showPreview(text);
0109     } else {
0110         m_pendingPreviewText = text;
0111     }
0112 }
0113 
0114 void EditStyleDialog::showPreview(const QString& text)
0115 {
0116     m_document->setReadWrite(true);
0117     m_style.setContent(content());
0118     m_document->setText(m_sourceFormatter.formatSourceWithStyle(m_style, text, QUrl(), m_mimeType));
0119 
0120     m_view->setCursorPosition(KTextEditor::Cursor(0, 0));
0121     m_document->setReadWrite(false);
0122 }
0123 
0124 void EditStyleDialog::previewVisibilityChanged(bool visible)
0125 {
0126     Q_ASSERT(m_style.usePreview() == visible);
0127     if (visible) {
0128         if (!m_document) {
0129             initPreview();
0130         }
0131         if (!m_pendingPreviewText.isEmpty()) {
0132             showPreview(m_pendingPreviewText);
0133             m_pendingPreviewText = QString{};
0134         }
0135     }
0136     m_ui.previewArea->setVisible(visible);
0137 }
0138 
0139 QString EditStyleDialog::content() const
0140 {
0141     return m_settingsWidget->save();
0142 }
0143 
0144 bool EditStyleDialog::usePreview() const
0145 {
0146     return m_style.usePreview();
0147 }
0148 
0149 #include "moc_editstyledialog.cpp"