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 §ion, 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