File indexing completed on 2024-05-05 17:15:09

0001 /***************************************************************************************************
0002     begin                : Wed Jun 6 2001
0003     copyright            : (C) 2003 by Jeroen Wijnhout (Jeroen.Wijnhout@kdemail.net)
0004                            (C) 2005-2007  by Holger Danielsson (holger.danielsson@versanet.de)
0005                            (C) 2007-2016 by Michel Ludwig (michel.ludwig@kdemail.net)
0006  ***************************************************************************************************/
0007 
0008 /***************************************************************************
0009  *                                                                         *
0010  *   This program is free software; you can redistribute it and/or modify  *
0011  *   it under the terms of the GNU General Public License as published by  *
0012  *   the Free Software Foundation; either version 2 of the License, or     *
0013  *   (at your option) any later version.                                   *
0014  *                                                                         *
0015  ***************************************************************************/
0016 
0017 #include "dialogs/configurationdialog.h"
0018 
0019 #include <QDialogButtonBox>
0020 #include <QPushButton>
0021 #include <QScreen>
0022 #include <QTextCodec>
0023 #include <QTimer>
0024 #include <QVBoxLayout>
0025 #include <QWindow>
0026 
0027 #include <KConfigGroup>
0028 #include <KLocalizedString>
0029 #include <KWindowConfig>
0030 #include <KTextEditor/ConfigPage>
0031 
0032 #include "editorextension.h"
0033 #include "errorhandler.h"
0034 #include "kileconfig.h"
0035 #include "kiledebug.h"
0036 #include "kiledocmanager.h"
0037 #include "kileinfo.h"
0038 #include "kiletoolmanager.h"
0039 #include "kileviewmanager.h"
0040 
0041 #include "widgets/appearanceconfigwidget.h"
0042 #include "widgets/generalconfigwidget.h"
0043 #include "widgets/helpconfigwidget.h"
0044 #include "widgets/latexconfigwidget.h"
0045 #include "widgets/livepreviewconfigwidget.h"
0046 #include "widgets/previewconfigwidget.h"
0047 #include "widgets/scriptingconfigwidget.h"
0048 #include "widgets/scrollwidget.h"
0049 #include "widgets/toolconfigwidget.h"
0050 #include "widgets/usermenuconfigwidget.h"
0051 
0052 namespace KileDialog
0053 {
0054 Config::Config(KConfig *config, KileInfo *ki, QWidget* parent)
0055     : KPageDialog(parent),
0056       m_config(config),
0057       m_ki(ki)
0058 {
0059     setWindowTitle(i18n("Configure"));
0060     setModal(true);
0061     setObjectName("kileconfiguration");
0062     setFaceType(Tree);
0063 
0064     m_config->sync();
0065 
0066     // we need a dialog manager
0067     m_manager = new KConfigDialogManager(this,KileConfig::self());
0068 
0069     KPageWidgetItem* kilePageWidgetItem = addConfigFolder(i18n("Kile"), "kile");
0070     KPageWidgetItem* latexPageWidgetItem = addConfigFolder(i18n("LaTeX"), "latex-config");
0071     KPageWidgetItem* toolsPageWidgetItem = addConfigFolder(i18n("Tools"), "system-run");
0072     KPageWidgetItem* editorPageWidgetItem = addConfigFolder(i18n("Editor"), "accessories-text-editor");
0073 
0074     // setup all configuration pages
0075     setupGeneralOptions(kilePageWidgetItem);
0076     setupAppearance(kilePageWidgetItem);
0077     setupCodeCompletion(kilePageWidgetItem);   // complete configuration (dani)
0078     setupHelp(kilePageWidgetItem);
0079     setupScripting(kilePageWidgetItem);
0080     setupUsermenu(kilePageWidgetItem);
0081     setupLivePreview(kilePageWidgetItem);
0082 
0083     setupLatex(latexPageWidgetItem);
0084     setupEnvironment(latexPageWidgetItem);
0085     setupGraphics(latexPageWidgetItem);
0086     setupStructure(latexPageWidgetItem);
0087     setupSymbolView(latexPageWidgetItem);
0088 
0089     setupTools(toolsPageWidgetItem);
0090     setupQuickPreview(toolsPageWidgetItem);     // QuickPreview (dani)
0091 
0092     setupEditor(editorPageWidgetItem);
0093 
0094     {
0095         // every config page is added to a KileWidget::ScrollWidget, but all the scroll widgets should have
0096         // the same size; first we find the maximal page size
0097         QSize maximumSizeHint;
0098         for(KPageWidgetItem *item : const_cast<const QList<KPageWidgetItem*>&>(m_pageWidgetItemList)) { // use 'qAsConst' later
0099             QScrollArea *scrollArea = dynamic_cast<QScrollArea*>(item->widget());
0100             if(!scrollArea) {
0101                 qWarning() << "One scroll area not a KileWidget::ScrollWidget!";
0102                 continue;
0103             }
0104             maximumSizeHint = maximumSizeHint.expandedTo(scrollArea->widget()->sizeHint());
0105         }
0106         // and then we set the size of all the scroll widgets to the maximal page size
0107         for(KPageWidgetItem *item : const_cast<const QList<KPageWidgetItem*>&>(m_pageWidgetItemList)) { // use 'qAsConst' later
0108             KileWidget::ScrollWidget *scrollWidget = dynamic_cast<KileWidget::ScrollWidget*>(item->widget());
0109             if(!scrollWidget) {
0110                 continue;
0111             }
0112             scrollWidget->setPreferredSize(maximumSizeHint);
0113         }
0114     }
0115 
0116     m_configDialogSize = m_config->group("KileConfigDialog");
0117 
0118     resize(sizeHint());
0119     // as of October 2016, 'restoreWindowSize' has no effect when called directly from here
0120     QTimer::singleShot(0, this, [=] () {
0121         KWindowConfig::restoreWindowSize(windowHandle(), m_configDialogSize);
0122     });
0123     // setup connections
0124     //connect(m_manager, SIGNAL(widgetModified()), this, SLOT(slotWidgetModified()));
0125     connect(this, &KPageDialog::accepted, this, &Config::slotAcceptChanges);
0126     connect(this, &KPageDialog::accepted, m_manager, &KConfigDialogManager::updateSettings);
0127     connect(this, &KPageDialog::rejected, this, [=] () {
0128         m_config->markAsClean();
0129     });
0130 }
0131 
0132 Config::~Config()
0133 {
0134     KWindowConfig::saveWindowSize(windowHandle(), m_configDialogSize);
0135 
0136     delete m_manager;
0137 }
0138 
0139 void Config::show()
0140 {
0141     m_manager->updateWidgets();
0142     QDialog::show();
0143 }
0144 
0145 //////////////////// add a new folder ////////////////////
0146 
0147 KPageWidgetItem* Config::addConfigFolder(const QString &section, const QString &icon)
0148 {
0149     KPageWidgetItem *toReturn = addPage(new QWidget(this), section);
0150     toReturn->setIcon(QIcon::fromTheme(icon));
0151 
0152     return toReturn;
0153 }
0154 
0155 //////////////////// add a new page ////////////////////
0156 
0157 KPageWidgetItem* Config::addConfigPage(KPageWidgetItem* parent, QWidget *page, const QString &itemName,
0158                                        const QString &pixmapName, const QString &header)
0159 {
0160     return addConfigPage(parent, page, itemName, QIcon::fromTheme(pixmapName), header);
0161 }
0162 
0163 KPageWidgetItem* Config::addConfigPage(KPageWidgetItem* parent, QWidget *page,
0164                                        const QString &itemName, const QIcon& icon,
0165                                        const QString &header)
0166 {
0167     KILE_DEBUG_MAIN << "slot: add config page item=" << itemName;
0168 
0169     // Create scroll widget for the page
0170     KileWidget::ScrollWidget *scrollWidget = new KileWidget::ScrollWidget(this);
0171     scrollWidget->setFrameShape(QFrame::NoFrame);
0172     scrollWidget->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);
0173     scrollWidget->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
0174     scrollWidget->setWidget(page);
0175     scrollWidget->setWidgetResizable(true);
0176     page->setMinimumSize(page->sizeHint());
0177     page->resize(page->sizeHint());
0178 
0179     // add page
0180     KPageWidgetItem *pageWidgetItem = new KPageWidgetItem(scrollWidget, itemName);
0181     pageWidgetItem->setIcon(icon);
0182     pageWidgetItem->setHeader(header);
0183 
0184     addSubPage(parent, pageWidgetItem);
0185 
0186     // add to the dialog manager
0187     m_manager->addWidget(page);
0188 
0189     m_pageWidgetItemList << pageWidgetItem;
0190 
0191     return pageWidgetItem;
0192 }
0193 
0194 //////////////////// General Options ////////////////////
0195 
0196 void Config::setupGeneralOptions(KPageWidgetItem* parent)
0197 {
0198     generalPage = new KileWidgetGeneralConfig(this);
0199     generalPage->setObjectName("LaTeX");
0200     KPageWidgetItem *item = addConfigPage(parent, generalPage, i18n("General"), "configure", i18n("General Settings"));
0201     setCurrentPage(item);
0202 }
0203 
0204 //////////////////// Tools Configuration ////////////////////
0205 
0206 void Config::setupTools(KPageWidgetItem* parent)
0207 {
0208     toolPage = new KileWidget::ToolConfig(m_ki->toolManager(), this);
0209     addConfigPage(parent, toolPage, i18n("Build"), "application-x-executable", i18n("Build"));
0210 }
0211 
0212 //////////////////// Scripting  ////////////////////
0213 
0214 void Config::setupScripting(KPageWidgetItem* parent)
0215 {
0216     scriptingPage = new KileWidgetScriptingConfig(this);
0217     scriptingPage->setObjectName("Scripting");
0218     // we hide this now as the feature is not implemented currently
0219     scriptingPage->executionTimeLimitGroupBox->setHidden(true);
0220     addConfigPage(parent, scriptingPage, i18n("Scripting"), "application-x-executable-script", i18n("Scripting Support"));
0221 }
0222 
0223 //////////////////// Usermenu  ////////////////////
0224 
0225 void Config::setupUsermenu(KPageWidgetItem *parent)
0226 {
0227     usermenuPage = new KileWidgetUsermenuConfig(m_ki->userMenu(), this);
0228     usermenuPage->setObjectName("Usermenu");
0229     addConfigPage(parent, usermenuPage, i18n("User Menu"), "usermenu-install", i18n("User Menu"));
0230 }
0231 
0232 //////////////////// LaTeX specific editing options ////////////////////
0233 
0234 //////////////////// Complete configuration (dani) ////////////////////
0235 
0236 void Config::setupCodeCompletion(KPageWidgetItem* parent)
0237 {
0238     completePage = new CodeCompletionConfigWidget(m_config, m_ki->errorHandler());
0239     completePage->readConfig();
0240 
0241     addConfigPage(parent, completePage, i18n("Complete"), "text-x-tex", i18n("Code Completion"));
0242 }
0243 
0244 //////////////////// QuickPreview (dani) ////////////////////
0245 
0246 void Config::setupQuickPreview(KPageWidgetItem* parent)
0247 {
0248     previewPage = new KileWidgetPreviewConfig(m_config,m_ki->quickPreview(),this);
0249     previewPage->readConfig();
0250 
0251     addConfigPage(parent, previewPage, i18n("Preview"), "preview", i18n("Quick Preview"));
0252 }
0253 
0254 void Config::setupHelp(KPageWidgetItem* parent)
0255 {
0256     helpPage = new KileWidgetHelpConfig(this);
0257     helpPage->setHelp(m_ki->help());
0258 
0259     addConfigPage(parent, helpPage, i18n("Help"),"help-browser");
0260 }
0261 
0262 void Config::setupLivePreview(KPageWidgetItem* parent)
0263 {
0264     livePreviewPage = new KileWidgetLivePreviewConfig(m_config, this);
0265     livePreviewPage->readConfig();
0266 
0267     addConfigPage(parent, livePreviewPage, i18n("Live Preview"), "preview", i18n("Live Preview"));
0268 }
0269 
0270 void Config::setupAppearance(KPageWidgetItem* parent)
0271 {
0272     appearancePage = new KileWidgetAppearanceConfig(m_config, this);
0273     appearancePage->readConfig();
0274 
0275     addConfigPage(parent, appearancePage, i18n("Appearance"), "preview", i18n("Appearance"));
0276 }
0277 
0278 //////////////////// LaTeX environments ////////////////////
0279 
0280 void Config::setupLatex(KPageWidgetItem* parent)
0281 {
0282     latexPage = new KileWidgetLatexConfig(this);
0283     latexPage->setObjectName("LaTeX");
0284     latexPage->kcfg_DoubleQuotes->addItems(m_ki->editorExtension()->doubleQuotesListI18N());
0285     latexPage->setLatexCommands(m_config,m_ki->latexCommands());
0286 
0287     addConfigPage(parent, latexPage, i18n("General"), "configure");
0288 }
0289 
0290 void Config::setupEnvironment(KPageWidgetItem* parent)
0291 {
0292     envPage = new KileWidgetEnvironmentConfig(this);
0293     envPage->setObjectName("LaTeX");
0294     addConfigPage(parent, envPage, i18n("Environments"), "environment");
0295 }
0296 
0297 void Config::setupGraphics(KPageWidgetItem* parent)
0298 {
0299     graphicsPage = new KileWidgetGraphicsConfig(this);
0300     graphicsPage->setObjectName("Graphics");
0301     graphicsPage->m_lbImagemagick->setText( ( KileConfig::imagemagick() ) ? i18n("installed") : i18n("not installed") );
0302     addConfigPage(parent, graphicsPage, i18n("Graphics"), "graphicspage");
0303 }
0304 
0305 void Config::setupStructure(KPageWidgetItem* parent)
0306 {
0307     structurePage = new KileWidgetStructureViewConfig(this);
0308     structurePage->setObjectName("StructureView");
0309     addConfigPage(parent, structurePage, i18n("Structure View"), "view-list-tree");
0310 }
0311 
0312 void Config::setupSymbolView(KPageWidgetItem* parent)
0313 {
0314     symbolViewPage = new KileWidgetSymbolViewConfig(this);
0315     symbolViewPage->setObjectName("SymbolView");
0316     addConfigPage(parent, symbolViewPage, i18n("Symbol View"), "math0");
0317 }
0318 
0319 //////////////////// Editor ////////////////////
0320 
0321 void Config::setupEditor(KPageWidgetItem* parent)
0322 {
0323     m_editorSettingsChanged = false;
0324     m_editorPages.clear();
0325 
0326     KTextEditor::Editor* editor = m_ki->docManager()->getEditor();
0327     if(!editor) {
0328         return;
0329     }
0330     for(int i = 0; i < editor->configPages(); ++i) {
0331         KTextEditor::ConfigPage *configPage = editor->configPage(i, parent->widget());
0332         KPageWidgetItem *pageWidgetItem = addConfigPage(parent, configPage, configPage->name(),
0333                                           configPage->icon(),
0334                                           configPage->fullName());
0335         connect(configPage, &KTextEditor::ConfigPage::changed, this, [=] {
0336             m_editorSettingsChanged = true;
0337         });
0338         m_editorPages.insert(pageWidgetItem, configPage);
0339     }
0340 }
0341 
0342 //////////////////// slots ////////////////////
0343 
0344 void Config::slotAcceptChanges()
0345 {
0346     KILE_DEBUG_MAIN << "   slot acceptChanges (" << m_manager->hasChanged() << ","  << m_editorSettingsChanged << ")";
0347 
0348     // editor settings are only available, when at least one document is opened
0349     if(m_editorSettingsChanged) {
0350         QMapIterator<KPageWidgetItem*, KTextEditor::ConfigPage*> i(m_editorPages);
0351         while (i.hasNext()) {
0352             i.next();
0353             i.value()->apply();
0354         }
0355     }
0356 
0357     // Kile settings
0358     toolPage->writeConfig();      // config all tools
0359     completePage->writeConfig();  // Complete configuration (dani)
0360     previewPage->writeConfig();   // Quick Preview (dani)
0361     usermenuPage->writeConfig();
0362     livePreviewPage->writeConfig();
0363 
0364     m_config->sync();
0365 }
0366 }
0367