3 * This file is part of LyX, the document processor.
4 * Licence details can be found in the file COPYING.
8 * Full author contact details are available in file CREDITS
14 #include "ControlPrefs.h"
18 #pragma implementation
21 #include "QPrefsDialog.h"
23 #include "ui/QPrefAsciiModule.h"
24 #include "ui/QPrefDateModule.h"
25 #include "ui/QPrefKeyboardModule.h"
26 #include "ui/QPrefLatexModule.h"
27 #include "ui/QPrefScreenFontsModule.h"
28 #include "ui/QPrefColorsModule.h"
29 #include "ui/QPrefDisplayModule.h"
30 #include "ui/QPrefPathsModule.h"
31 #include "ui/QPrefSpellcheckerModule.h"
32 #include "ui/QPrefConvertersModule.h"
33 #include "ui/QPrefFileformatsModule.h"
34 #include "ui/QPrefLanguageModule.h"
35 #include "ui/QPrefPrinterModule.h"
36 #include "ui/QPrefUIModule.h"
38 #include "support/lstrings.h"
42 #include <qwidgetstack.h>
43 #include <qpushbutton.h>
44 #include <qlistview.h>
47 #include <qlineedit.h>
48 #include <qcheckbox.h>
49 #include <qcombobox.h>
54 QPrefsDialog::QPrefsDialog(QPrefs * form)
55 : QPrefsDialogBase(0, 0, false, 0), form_(form)
57 connect(savePB, SIGNAL(clicked()),
58 form, SLOT(slotOK()));
59 connect(applyPB, SIGNAL(clicked()),
60 form, SLOT(slotApply()));
61 connect(closePB, SIGNAL(clicked()),
62 form, SLOT(slotClose()));
63 connect(restorePB, SIGNAL(clicked()),
64 form, SLOT(slotRestore()));
66 prefsLV->setSorting(-1);
68 // OK, Qt is REALLY broken. We have to hard
69 // code the menu structure here.
71 QListViewItem * lnf(new QListViewItem(prefsLV, _("Look and feel")));
72 lnf->setSelectable(false);
74 QListViewItem * lan(new QListViewItem(prefsLV, lnf, _("Language settings")));
75 lan->setSelectable(false);
76 QListViewItem * out(new QListViewItem(prefsLV, lan, _("Outputs")));
77 out->setSelectable(false);
79 asciiModule = new QPrefAsciiModule(prefsWS);
80 dateModule = new QPrefDateModule(prefsWS);
81 keyboardModule = new QPrefKeyboardModule(prefsWS);
82 latexModule = new QPrefLatexModule(prefsWS);
83 screenfontsModule = new QPrefScreenFontsModule(prefsWS);
84 colorsModule = new QPrefColorsModule(prefsWS);
85 displayModule = new QPrefDisplayModule(prefsWS);
86 pathsModule = new QPrefPathsModule(prefsWS);
87 spellcheckerModule = new QPrefSpellcheckerModule(prefsWS);
88 convertersModule = new QPrefConvertersModule(prefsWS);
89 fileformatsModule = new QPrefFileformatsModule(prefsWS);
90 languageModule = new QPrefLanguageModule(prefsWS);
91 printerModule = new QPrefPrinterModule(prefsWS);
92 uiModule = new QPrefUIModule(prefsWS);
94 prefsWS->addWidget(asciiModule, 0);
95 prefsWS->addWidget(dateModule, 1);
96 prefsWS->addWidget(keyboardModule, 2);
97 prefsWS->addWidget(latexModule, 3);
98 prefsWS->addWidget(screenfontsModule, 4);
99 prefsWS->addWidget(colorsModule, 5);
100 prefsWS->addWidget(displayModule, 6);
101 prefsWS->addWidget(pathsModule, 7);
102 prefsWS->addWidget(spellcheckerModule, 8);
103 prefsWS->addWidget(convertersModule, 9);
104 prefsWS->addWidget(fileformatsModule, 10);
105 prefsWS->addWidget(languageModule, 11);
106 prefsWS->addWidget(printerModule, 12);
107 prefsWS->addWidget(uiModule, 13);
113 i = new QListViewItem(lan, _("Language"));
114 pane_map_[i] = languageModule;
115 i = new QListViewItem(lan, i, _("Spellchecker"));
116 pane_map_[i] = spellcheckerModule;
120 i = new QListViewItem(lnf, _("User interface"));
121 pane_map_[i] = uiModule;
122 prefsLV->setCurrentItem(i);
124 i = new QListViewItem(lnf, i, _("Screen fonts"));
125 pane_map_[i] = screenfontsModule;
126 i = new QListViewItem(lnf, i, _("Colors"));
127 pane_map_[i] = colorsModule;
128 i = new QListViewItem(lnf, i, _("Graphics"));
129 pane_map_[i] = displayModule;
130 i = new QListViewItem(lnf, i, _("Keyboard"));
131 pane_map_[i] = keyboardModule;
135 i = new QListViewItem(out, _("Ascii"));
136 pane_map_[i] = asciiModule;
137 i = new QListViewItem(out, i, _("Date format"));
138 pane_map_[i] = dateModule;
139 i = new QListViewItem(out, i, _("LaTeX"));
140 pane_map_[i] = latexModule;
141 i = new QListViewItem(out, i, _("Printer"));
142 pane_map_[i] = printerModule;
144 i = new QListViewItem(prefsLV, out, _("Paths"));
145 pane_map_[i] = pathsModule;
146 i = new QListViewItem(prefsLV, i, _("Converters"));
147 pane_map_[i] = convertersModule;
148 i = new QListViewItem(prefsLV, i, _("File formats"));
149 pane_map_[i] = fileformatsModule;
151 prefsLV->setMinimumSize(prefsLV->sizeHint());
154 resize(minimumSize());
156 connect(fileformatsModule->formatNewPB, SIGNAL(clicked()), this, SLOT(new_format()));
157 connect(fileformatsModule->formatRemovePB, SIGNAL(clicked()), this, SLOT(remove_format()));
158 connect(fileformatsModule->formatModifyPB, SIGNAL(clicked()), this, SLOT(modify_format()));
159 connect(fileformatsModule->formatsLB, SIGNAL(highlighted(int)), this, SLOT(switch_format(int)));
161 connect(convertersModule->converterNewPB, SIGNAL(clicked()), this, SLOT(new_converter()));
162 connect(convertersModule->converterRemovePB, SIGNAL(clicked()), this, SLOT(remove_converter()));
163 connect(convertersModule->converterModifyPB, SIGNAL(clicked()), this, SLOT(modify_converter()));
164 connect(convertersModule->convertersLB, SIGNAL(highlighted(int)), this, SLOT(switch_converter(int)));
166 // Qt really sucks. This is as ugly as it looks, but the alternative
167 // means having to derive every module == bloat
169 // FIXME: connect colors objs
171 connect(convertersModule->converterNewPB, SIGNAL(clicked()), this, SLOT(change_adaptor()));
172 connect(convertersModule->converterRemovePB, SIGNAL(clicked()), this, SLOT(change_adaptor()));
173 connect(convertersModule->converterModifyPB, SIGNAL(clicked()), this, SLOT(change_adaptor()));
174 connect(fileformatsModule->formatNewPB, SIGNAL(clicked()), this, SLOT(change_adaptor()));
175 connect(fileformatsModule->formatRemovePB, SIGNAL(clicked()), this, SLOT(change_adaptor()));
176 connect(fileformatsModule->formatModifyPB, SIGNAL(clicked()), this, SLOT(change_adaptor()));
177 connect(languageModule->rtlCB, SIGNAL(toggled(bool)), this, SLOT(change_adaptor()));
178 connect(languageModule->markForeignCB, SIGNAL(toggled(bool)), this, SLOT(change_adaptor()));
179 connect(languageModule->autoBeginCB, SIGNAL(toggled(bool)), this, SLOT(change_adaptor()));
180 connect(languageModule->autoEndCB, SIGNAL(toggled(bool)), this, SLOT(change_adaptor()));
181 connect(languageModule->useBabelCB, SIGNAL(toggled(bool)), this, SLOT(change_adaptor()));
182 connect(languageModule->globalCB, SIGNAL(toggled(bool)), this, SLOT(change_adaptor()));
183 connect(languageModule->languagePackageED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
184 connect(languageModule->startCommandED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
185 connect(languageModule->endCommandED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
186 connect(languageModule->defaultLanguageCO, SIGNAL(activated(int)), this, SLOT(change_adaptor()));
187 connect(uiModule->uiFileED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
188 connect(uiModule->bindFileED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
189 connect(uiModule->cursorFollowsCB, SIGNAL(toggled(bool)), this, SLOT(change_adaptor()));
190 connect(uiModule->wheelMouseSB, SIGNAL(valueChanged(int)), this, SLOT(change_adaptor()));
191 connect(uiModule->autoSaveSB, SIGNAL(valueChanged(int)), this, SLOT(change_adaptor()));
192 connect(uiModule->autoSaveCB, SIGNAL(toggled(bool)), this, SLOT(change_adaptor()));
193 connect(uiModule->lastfilesSB, SIGNAL(valueChanged(int)), this, SLOT(change_adaptor()));
194 connect(keyboardModule->keymapCB, SIGNAL(toggled(bool)), this, SLOT(change_adaptor()));
195 connect(keyboardModule->firstKeymapED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
196 connect(keyboardModule->secondKeymapED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
197 connect(asciiModule->asciiLinelengthSB, SIGNAL(valueChanged(int)), this, SLOT(change_adaptor()));
198 connect(asciiModule->asciiRoffED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
199 connect(dateModule->DateED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
200 connect(latexModule->latexEncodingED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
201 connect(latexModule->latexChecktexED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
202 connect(latexModule->latexAutoresetCB, SIGNAL(toggled(bool)), this, SLOT(change_adaptor()));
203 connect(latexModule->latexDviPaperED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
204 connect(latexModule->latexPaperSizeCO, SIGNAL(activated(int)), this, SLOT(change_adaptor()));
205 connect(displayModule->previewCB, SIGNAL(toggled(bool)), this, SLOT(change_adaptor()));
206 connect(displayModule->displayGraphicsCO, SIGNAL(activated(int)), this, SLOT(change_adaptor()));
207 connect(pathsModule->workingDirED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
208 connect(pathsModule->templateDirED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
209 connect(pathsModule->backupDirED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
210 connect(pathsModule->tempDirCB, SIGNAL(toggled(bool)), this, SLOT(change_adaptor()));
211 connect(pathsModule->tempDirED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
212 connect(pathsModule->lyxserverDirED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
213 connect(spellcheckerModule->spellCommandCO, SIGNAL(activated(int)), this, SLOT(change_adaptor()));
214 connect(spellcheckerModule->altLanguageED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
215 connect(spellcheckerModule->escapeCharactersED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
216 connect(spellcheckerModule->persDictionaryED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
217 connect(spellcheckerModule->compoundWordCB, SIGNAL(toggled(bool)), this, SLOT(change_adaptor()));
218 connect(spellcheckerModule->inputEncodingCB, SIGNAL(toggled(bool)), this, SLOT(change_adaptor()));
219 connect(printerModule->printerAdaptCB, SIGNAL(toggled(bool)), this, SLOT(change_adaptor()));
220 connect(printerModule->printerCommandED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
221 connect(printerModule->printerNameED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
222 connect(printerModule->printerPageRangeED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
223 connect(printerModule->printerCopiesED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
224 connect(printerModule->printerReverseED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
225 connect(printerModule->printerToPrinterED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
226 connect(printerModule->printerExtensionED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
227 connect(printerModule->printerSpoolCommandED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
228 connect(printerModule->printerPaperTypeED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
229 connect(printerModule->printerEvenED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
230 connect(printerModule->printerOddED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
231 connect(printerModule->printerCollatedED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
232 connect(printerModule->printerLandscapeED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
233 connect(printerModule->printerToFileED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
234 connect(printerModule->printerExtraED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
235 connect(printerModule->printerSpoolPrefixED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
236 connect(printerModule->printerPaperSizeED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
237 connect(screenfontsModule->screenRomanED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
238 connect(screenfontsModule->screenSansED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
239 connect(screenfontsModule->screenTypewriterED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
240 connect(screenfontsModule->screenZoomSB, SIGNAL(valueChanged(int)), this, SLOT(change_adaptor()));
241 connect(screenfontsModule->screenDpiSB, SIGNAL(valueChanged(int)), this, SLOT(change_adaptor()));
242 connect(screenfontsModule->screenTinyED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
243 connect(screenfontsModule->screenSmallestED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
244 connect(screenfontsModule->screenSmallerED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
245 connect(screenfontsModule->screenSmallED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
246 connect(screenfontsModule->screenNormalED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
247 connect(screenfontsModule->screenLargeED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
248 connect(screenfontsModule->screenLargerED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
249 connect(screenfontsModule->screenLargestED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
250 connect(screenfontsModule->screenHugeED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
251 connect(screenfontsModule->screenHugerED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
255 QPrefsDialog::~QPrefsDialog()
260 void QPrefsDialog::closeEvent(QCloseEvent * e)
267 void QPrefsDialog::switchPane(QListViewItem * i)
269 prefsWS->raiseWidget(pane_map_[i]);
273 void QPrefsDialog::change_adaptor()
279 void QPrefsDialog::updateConverters()
281 QPrefConvertersModule * convertmod(convertersModule);
283 convertmod->converterFromCO->clear();
284 convertmod->converterToCO->clear();
286 Formats::const_iterator cit = form_->formats_.begin();
287 Formats::const_iterator end = form_->formats_.end();
288 for (; cit != end; ++cit) {
289 convertmod->converterFromCO->insertItem(cit->prettyname().c_str());
290 convertmod->converterToCO->insertItem(cit->prettyname().c_str());
293 convertmod->convertersLB->clear();
295 Converters::const_iterator ccit = form_->converters_.begin();
296 Converters::const_iterator cend = form_->converters_.end();
297 for (; ccit != cend; ++ccit) {
298 string const name(ccit->From->prettyname() + " -> " +
299 ccit->To->prettyname());
300 convertmod->convertersLB->insertItem(name.c_str());
305 void QPrefsDialog::switch_converter(int nr)
307 Converter const & c(form_->converters_.get(nr));
308 convertersModule->converterFromCO->setCurrentItem(form_->formats_.getNumber(c.from));
309 convertersModule->converterToCO->setCurrentItem(form_->formats_.getNumber(c.to));
310 convertersModule->converterED->setText(c.command.c_str());
311 convertersModule->converterFlagED->setText(c.flags.c_str());
315 // FIXME: we would like to highlight the new entry ... also user must
316 // specify unique from/to or it doesn't appear. This is really bad UI
317 void QPrefsDialog::new_converter()
319 Format const & from(form_->formats_.get(convertersModule->converterFromCO->currentItem()));
320 Format const & to(form_->formats_.get(convertersModule->converterToCO->currentItem()));
322 Converter const * old = form_->converters_.getConverter(from.name(), to.name());
323 form_->converters_.add(from.name(), to.name(), "", "");
325 form_->converters_.updateLast(form_->formats_);
331 void QPrefsDialog::modify_converter()
333 Format const & from(form_->formats_.get(convertersModule->converterFromCO->currentItem()));
334 Format const & to(form_->formats_.get(convertersModule->converterToCO->currentItem()));
335 string flags(convertersModule->converterFlagED->text().latin1());
336 string name(convertersModule->converterED->text().latin1());
338 Converter const * old = form_->converters_.getConverter(from.name(), to.name());
339 form_->converters_.add(from.name(), to.name(), name, flags);
341 form_->converters_.updateLast(form_->formats_);
347 void QPrefsDialog::remove_converter()
349 Format const & from(form_->formats_.get(convertersModule->converterFromCO->currentItem()));
350 Format const & to(form_->formats_.get(convertersModule->converterToCO->currentItem()));
351 form_->converters_.erase(from.name(), to.name());
356 void QPrefsDialog::updateFormats()
358 QPrefFileformatsModule * formatmod(fileformatsModule);
360 formatmod->formatsLB->clear();
362 Formats::const_iterator cit = form_->formats_.begin();
363 Formats::const_iterator end = form_->formats_.end();
364 for (; cit != end; ++cit) {
365 formatmod->formatsLB->insertItem(cit->prettyname().c_str());
370 void QPrefsDialog::switch_format(int nr)
372 Format const & f(form_->formats_.get(nr));
373 fileformatsModule->formatED->setText(f.name().c_str());
374 fileformatsModule->guiNameED->setText(f.prettyname().c_str());
375 fileformatsModule->extensionED->setText(f.extension().c_str());
376 fileformatsModule->shortcutED->setText(f.shortcut().c_str());
377 fileformatsModule->viewerED->setText(f.viewer().c_str());
378 fileformatsModule->formatRemovePB->setEnabled(
379 !form_->converters_.formatIsUsed(f.name()));
383 void QPrefsDialog::new_format()
385 form_->formats_.add(_("New"));
386 form_->formats_.sort();
388 fileformatsModule->formatsLB->setCurrentItem(form_->formats_.getNumber(_("New")));
393 void QPrefsDialog::modify_format()
395 Format const & oldformat(form_->formats_.get(fileformatsModule->formatsLB->currentItem()));
396 string const oldpretty(oldformat.prettyname());
397 string const name(fileformatsModule->formatED->text().latin1());
398 form_->formats_.erase(oldformat.name());
400 string const prettyname = fileformatsModule->guiNameED->text().latin1();
401 string const extension = fileformatsModule->extensionED->text().latin1();
402 string const shortcut = fileformatsModule->shortcutED->text().latin1();
403 string const viewer = fileformatsModule->viewerED->text().latin1();
405 form_->formats_.add(name, extension, prettyname, shortcut);
406 form_->formats_.sort();
407 form_->formats_.setViewer(name, viewer);
409 fileformatsModule->formatsLB->setUpdatesEnabled(false);
411 fileformatsModule->formatsLB->setUpdatesEnabled(true);
412 fileformatsModule->formatsLB->update();
418 void QPrefsDialog::remove_format()
420 int const nr(fileformatsModule->formatsLB->currentItem());
423 form_->formats_.erase(form_->formats_.get(nr).name());