]> git.lyx.org Git - lyx.git/blob - src/frontends/qt2/QPrefsDialog.C
another compile fix from herbert
[lyx.git] / src / frontends / qt2 / QPrefsDialog.C
1 /**
2  * \file QPrefsDialog.C
3  * This file is part of LyX, the document processor.
4  * Licence details can be found in the file COPYING.
5  *
6  * \author Edwin Leuven
7  *
8  * Full author contact details are available in file CREDITS
9  */
10
11 #include <config.h>
12 #include "gettext.h"
13
14 #include "ControlPrefs.h"
15 #include "QPrefs.h"
16
17 #ifdef __GNUG__
18 #pragma implementation
19 #endif
20
21 #include "QPrefsDialog.h"
22
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"
37
38 #include "support/lstrings.h"
39 #include "lyxrc.h"
40 #include "debug.h"
41
42 #include <qwidgetstack.h>
43 #include <qpushbutton.h>
44 #include <qlistview.h>
45 #include <qlistbox.h>
46 #include <qspinbox.h>
47 #include <qlineedit.h>
48 #include <qcheckbox.h>
49 #include <qcombobox.h>
50
51 using std::map;
52 using std::endl;
53
54 QPrefsDialog::QPrefsDialog(QPrefs * form)
55         : QPrefsDialogBase(0, 0, false, 0), form_(form)
56 {
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()));
65
66         prefsLV->setSorting(-1);
67
68         // OK, Qt is REALLY broken. We have to hard
69         // code the menu structure here.
70
71         QListViewItem * lnf(new QListViewItem(prefsLV, _("Look and feel")));
72         lnf->setSelectable(false);
73         lnf->setOpen(true);
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);
78
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);
93
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);
108
109         QListViewItem * i;
110
111         // language settings
112
113         i = new QListViewItem(lan, _("Language"));
114         pane_map_[i] = languageModule;
115         i = new QListViewItem(lan, i, _("Spellchecker"));
116         pane_map_[i] = spellcheckerModule;
117
118         // UI
119
120         i = new QListViewItem(lnf, _("User interface"));
121         pane_map_[i] = uiModule;
122         prefsLV->setCurrentItem(i);
123
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;
132
133         // output
134  
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;
143
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;
150  
151         prefsLV->setMinimumSize(prefsLV->sizeHint());
152
153         // Qt sucks
154         resize(minimumSize());
155
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)));
160
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)));
165  
166         // Qt really sucks. This is as ugly as it looks, but the alternative
167         // means having to derive every module == bloat
168  
169         // FIXME: connect colors objs
170  
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()));
252 }
253
254
255 QPrefsDialog::~QPrefsDialog()
256 {
257 }
258
259
260 void QPrefsDialog::closeEvent(QCloseEvent * e)
261 {
262         form_->slotWMHide();
263         e->accept();
264 }
265
266
267 void QPrefsDialog::switchPane(QListViewItem * i)
268 {
269         prefsWS->raiseWidget(pane_map_[i]);
270 }
271
272
273 void QPrefsDialog::change_adaptor()
274 {
275         form_->changed();
276 }
277
278
279 void QPrefsDialog::updateConverters()
280
281         QPrefConvertersModule * convertmod(convertersModule);
282  
283         convertmod->converterFromCO->clear();
284         convertmod->converterToCO->clear();
285  
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());
291         }
292  
293         convertmod->convertersLB->clear(); 
294
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());
301         }
302 }
303
304  
305 void QPrefsDialog::switch_converter(int nr)
306 {
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());
312 }
313
314  
315 // FIXME: user must
316 // specify unique from/to or it doesn't appear. This is really bad UI
317 void QPrefsDialog::new_converter()
318
319         Format const & from(form_->formats_.get(convertersModule->converterFromCO->currentItem())); 
320         Format const & to(form_->formats_.get(convertersModule->converterToCO->currentItem())); 
321  
322         Converter const * old = form_->converters_.getConverter(from.name(), to.name());
323         form_->converters_.add(from.name(), to.name(), "", "");
324         if (!old) {
325                 form_->converters_.updateLast(form_->formats_);
326         }
327         updateConverters();
328         convertersModule->convertersLB->setCurrentItem(convertersModule->convertersLB->count() - 1); 
329 }
330
331
332 void QPrefsDialog::modify_converter()
333 {
334         Format const & from(form_->formats_.get(convertersModule->converterFromCO->currentItem())); 
335         Format const & to(form_->formats_.get(convertersModule->converterToCO->currentItem())); 
336         string flags(convertersModule->converterFlagED->text().latin1());
337         string name(convertersModule->converterED->text().latin1());
338  
339         Converter const * old = form_->converters_.getConverter(from.name(), to.name());
340         form_->converters_.add(from.name(), to.name(), name, flags);
341         if (!old) {
342                 form_->converters_.updateLast(form_->formats_);
343         }
344         updateConverters();
345 }
346
347
348 void QPrefsDialog::remove_converter()
349 {
350         Format const & from(form_->formats_.get(convertersModule->converterFromCO->currentItem())); 
351         Format const & to(form_->formats_.get(convertersModule->converterToCO->currentItem())); 
352         form_->converters_.erase(from.name(), to.name());
353         updateConverters();
354 }
355
356  
357 void QPrefsDialog::updateFormats()
358 {
359         QPrefFileformatsModule * formatmod(fileformatsModule);
360
361         formatmod->formatsLB->clear();
362  
363         Formats::const_iterator cit = form_->formats_.begin();
364         Formats::const_iterator end = form_->formats_.end();
365         for (; cit != end; ++cit) {
366                 formatmod->formatsLB->insertItem(cit->prettyname().c_str());
367         }
368 }
369
370
371 void QPrefsDialog::switch_format(int nr)
372 {
373         Format const & f(form_->formats_.get(nr));
374         fileformatsModule->formatED->setText(f.name().c_str());
375         fileformatsModule->guiNameED->setText(f.prettyname().c_str());
376         fileformatsModule->extensionED->setText(f.extension().c_str());
377         fileformatsModule->shortcutED->setText(f.shortcut().c_str());
378         fileformatsModule->viewerED->setText(f.viewer().c_str());
379         fileformatsModule->formatRemovePB->setEnabled(
380                 !form_->converters_.formatIsUsed(f.name()));
381 }
382
383  
384 void QPrefsDialog::new_format()
385 {
386         form_->formats_.add(_("New"));
387         form_->formats_.sort(); 
388         updateFormats();
389         fileformatsModule->formatsLB->setCurrentItem(form_->formats_.getNumber(_("New")));
390         updateConverters();
391 }
392
393
394 void QPrefsDialog::modify_format()
395 {
396         Format const & oldformat(form_->formats_.get(fileformatsModule->formatsLB->currentItem()));
397         string const oldpretty(oldformat.prettyname());
398         string const name(fileformatsModule->formatED->text().latin1());
399         form_->formats_.erase(oldformat.name());
400  
401         string const prettyname = fileformatsModule->guiNameED->text().latin1();
402         string const extension = fileformatsModule->extensionED->text().latin1();
403         string const shortcut = fileformatsModule->shortcutED->text().latin1();
404         string const viewer = fileformatsModule->viewerED->text().latin1();
405  
406         form_->formats_.add(name, extension, prettyname, shortcut);
407         form_->formats_.sort();
408         form_->formats_.setViewer(name, viewer);
409
410         fileformatsModule->formatsLB->setUpdatesEnabled(false);
411         updateFormats(); 
412         fileformatsModule->formatsLB->setUpdatesEnabled(true);
413         fileformatsModule->formatsLB->update();
414  
415         updateConverters();
416 }
417
418
419 void QPrefsDialog::remove_format()
420 {
421         int const nr(fileformatsModule->formatsLB->currentItem());
422         if (nr < 0)
423                 return;
424         form_->formats_.erase(form_->formats_.get(nr).name());
425         updateFormats();
426         updateConverters();
427 }