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"