]> git.lyx.org Git - lyx.git/blob - src/frontends/qt4/QPrefsDialog.C
Add lyxrc.use_lastfilepos and load_session to the qt4 preference dialog.
[lyx.git] / src / frontends / qt4 / 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  * \author Abdelrazak Younes
8  *
9  * Full author contact details are available in file CREDITS.
10  */
11
12 #include <config.h>
13 #include "debug.h"
14 #include "qt_helpers.h"
15
16 #include "lcolorcache.h"
17 #include "Qt2BC.h"
18 #include "qt_helpers.h"
19
20 #include "debug.h"
21 #include "session.h"
22 #include "LColor.h"
23 #include "lyxfont.h"
24
25 #include "support/lstrings.h"
26 #include "support/os.h"
27
28 #include "controllers/ControlPrefs.h"
29 #include "controllers/frnt_lang.h"
30 #include "controllers/helper_funcs.h"
31
32 #include "frontends/Alert.h"
33 #include "frontends/lyx_gui.h"
34
35 #include "QPrefsDialog.h"
36 #include "QPrefs.h"
37
38 #include "panelstack.h"
39 #include "qcoloritem.h"
40 #include "qfontexample.h"
41
42 #include "ui/QPrefAsciiUi.h"
43 #include "ui/QPrefDateUi.h"
44 #include "ui/QPrefKeyboardUi.h"
45 #include "ui/QPrefLatexUi.h"
46 #include "ui/QPrefScreenFontsUi.h"
47 #include "ui/QPrefColorsUi.h"
48 #if defined(__CYGWIN__) || defined(__CYGWIN32__)
49 #include "ui/QPrefCygwinPathUi.h"
50 #endif
51 #include "ui/QPrefDisplayUi.h"
52 #include "ui/QPrefPathsUi.h"
53 #include "ui/QPrefSpellcheckerUi.h"
54 #include "ui/QPrefConvertersUi.h"
55 #include "ui/QPrefCopiersUi.h"
56 #include "ui/QPrefFileformatsUi.h"
57 #include "ui/QPrefLanguageUi.h"
58 #include "ui/QPrefPrinterUi.h"
59 #include "ui/QPrefUi.h"
60 #include "ui/QPrefIdentityUi.h"
61
62 #include "gettext.h"
63 #include "LColor.h"
64 #include "lcolorcache.h"
65
66 #include "controllers/ControlPrefs.h"
67
68 #include <QCheckBox>
69 #include <QColorDialog>
70 #include <QFontDatabase>
71 #include <QLineEdit>
72 #include <QPushButton>
73 #include <QSpinBox>
74 #include <QString>
75 #include <QValidator>
76 #include <QCloseEvent>
77
78 #include <boost/tuple/tuple.hpp>
79 #include <iomanip>
80 #include <sstream>
81
82 using lyx::support::compare_no_case;
83
84 using std::distance;
85 using std::endl;
86 using std::setfill;
87 using std::setw;
88 using std::string;
89 using std::ostringstream;
90 using std::pair;
91 using std::vector;
92
93 namespace lyx {
94 namespace frontend {
95
96 QPrefsDialog::QPrefsDialog(QPrefs * form)
97         : form_(form)
98 {
99         setupUi(this);
100
101         connect(savePB, SIGNAL(clicked()),
102                 form, SLOT(slotOK()));
103         connect(applyPB, SIGNAL(clicked()),
104                 form, SLOT(slotApply()));
105         connect(closePB, SIGNAL(clicked()),
106                 form, SLOT(slotClose()));
107         connect(restorePB, SIGNAL(clicked()),
108                 form, SLOT(slotRestore()));
109
110
111
112         asciiModule = new UiWidget<Ui::QPrefAsciiUi>;
113         connect(asciiModule->asciiLinelengthSB, SIGNAL(valueChanged(int)), this, SLOT(change_adaptor()));
114         connect(asciiModule->asciiRoffED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
115
116
117         dateModule = new UiWidget<Ui::QPrefDateUi>;
118         connect(dateModule->DateED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
119
120
121
122         keyboardModule = new UiWidget<Ui::QPrefKeyboardUi>;
123         connect( keyboardModule->keymapCB, SIGNAL( toggled(bool) ),
124                  keyboardModule->firstKeymapLA, SLOT( setEnabled(bool) ) );
125         connect( keyboardModule->keymapCB, SIGNAL( toggled(bool) ),
126                 keyboardModule->secondKeymapLA, SLOT( setEnabled(bool) ) );
127         connect( keyboardModule->keymapCB, SIGNAL( toggled(bool) ),
128                 keyboardModule->firstKeymapED, SLOT( setEnabled(bool) ) );
129         connect( keyboardModule->keymapCB, SIGNAL( toggled(bool) ),
130                 keyboardModule->secondKeymapED, SLOT( setEnabled(bool) ) );
131         connect( keyboardModule->keymapCB, SIGNAL( toggled(bool) ),
132                 keyboardModule->firstKeymapPB, SLOT( setEnabled(bool) ) );
133         connect( keyboardModule->keymapCB, SIGNAL( toggled(bool) ),
134                 keyboardModule->secondKeymapPB, SLOT( setEnabled(bool) ) );
135         connect(keyboardModule->firstKeymapPB, SIGNAL(clicked()), this, SLOT(select_keymap1()));
136         connect(keyboardModule->secondKeymapPB, SIGNAL(clicked()), this, SLOT(select_keymap2()));
137         connect(keyboardModule->keymapCB, SIGNAL(toggled(bool)), this, SLOT(change_adaptor()));
138         connect(keyboardModule->firstKeymapED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
139         connect(keyboardModule->secondKeymapED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
140
141
142
143         latexModule = new UiWidget<Ui::QPrefLatexUi>;
144         connect(latexModule->latexEncodingED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
145         connect(latexModule->latexChecktexED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
146         connect(latexModule->latexBibtexED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
147         connect(latexModule->latexIndexED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
148         connect(latexModule->latexAutoresetCB, SIGNAL(toggled(bool)), this, SLOT(change_adaptor()));
149         connect(latexModule->latexDviPaperED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
150         connect(latexModule->latexPaperSizeCO, SIGNAL(activated(int)), this, SLOT(change_adaptor()));
151
152
153
154
155         screenfontsModule = new UiWidget<Ui::QPrefScreenFontsUi>;
156         connect(screenfontsModule->screenRomanCO, SIGNAL(activated(const QString&)), this, SLOT(select_roman(const QString&)));
157         connect(screenfontsModule->screenSansCO, SIGNAL(activated(const QString&)), this, SLOT(select_sans(const QString&)));
158         connect(screenfontsModule->screenTypewriterCO, SIGNAL(activated(const QString&)), this, SLOT(select_typewriter(const QString&)));
159
160         QFontDatabase fontdb;
161         QStringList families(fontdb.families());
162         for (QStringList::Iterator it = families.begin(); it != families.end(); ++it) {
163                 screenfontsModule->screenRomanCO->insertItem(*it);
164                 screenfontsModule->screenSansCO->insertItem(*it);
165                 screenfontsModule->screenTypewriterCO->insertItem(*it);
166         }
167         connect(screenfontsModule->screenRomanCO, SIGNAL(activated(const QString&)), this, SLOT(change_adaptor()));
168         connect(screenfontsModule->screenSansCO, SIGNAL(activated(const QString&)), this, SLOT(change_adaptor()));
169         connect(screenfontsModule->screenTypewriterCO, SIGNAL(activated(const QString&)), this, SLOT(change_adaptor()));
170         connect(screenfontsModule->screenZoomSB, SIGNAL(valueChanged(int)), this, SLOT(change_adaptor()));
171         connect(screenfontsModule->screenDpiSB, SIGNAL(valueChanged(int)), this, SLOT(change_adaptor()));
172         connect(screenfontsModule->screenTinyED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
173         connect(screenfontsModule->screenSmallestED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
174         connect(screenfontsModule->screenSmallerED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
175         connect(screenfontsModule->screenSmallED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
176         connect(screenfontsModule->screenNormalED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
177         connect(screenfontsModule->screenLargeED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
178         connect(screenfontsModule->screenLargerED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
179         connect(screenfontsModule->screenLargestED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
180         connect(screenfontsModule->screenHugeED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
181         connect(screenfontsModule->screenHugerED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
182
183         screenfontsModule->screenTinyED->setValidator(new QDoubleValidator(
184                 screenfontsModule->screenTinyED));
185         screenfontsModule->screenSmallestED->setValidator(new QDoubleValidator(
186                 screenfontsModule->screenSmallestED));
187         screenfontsModule->screenSmallerED->setValidator(new QDoubleValidator(
188                 screenfontsModule->screenSmallerED));
189         screenfontsModule->screenSmallED->setValidator(new QDoubleValidator(
190                 screenfontsModule->screenSmallED));
191         screenfontsModule->screenNormalED->setValidator(new QDoubleValidator(
192                 screenfontsModule->screenNormalED));
193         screenfontsModule->screenLargeED->setValidator(new QDoubleValidator(
194                 screenfontsModule->screenLargeED));
195         screenfontsModule->screenLargerED->setValidator(new QDoubleValidator(
196                 screenfontsModule->screenLargerED));
197         screenfontsModule->screenLargestED->setValidator(new QDoubleValidator(
198                 screenfontsModule->screenLargestED));
199         screenfontsModule->screenHugeED->setValidator(new QDoubleValidator(
200                 screenfontsModule->screenHugeED));
201         screenfontsModule->screenHugerED->setValidator(new QDoubleValidator(
202                 screenfontsModule->screenHugerED));
203
204
205
206
207         colorsModule = new UiWidget<Ui::QPrefColorsUi>;
208         // FIXME: put in controller
209         for (int i = 0; i < LColor::ignore; ++i) {
210                 LColor::color lc = static_cast<LColor::color>(i);
211                 if (lc == LColor::none
212                         || lc == LColor::black
213                         || lc == LColor::white
214                         || lc == LColor::red
215                         || lc == LColor::green
216                         || lc == LColor::blue
217                         || lc == LColor::cyan
218                         || lc == LColor::magenta
219                         || lc == LColor::yellow
220                         || lc == LColor::inherit
221                         || lc == LColor::ignore) continue;
222
223                 colors_.push_back(lc);
224                 string const guiname(lcolor.getGUIName(lc));
225                 QColorItem * ci(new QColorItem(lcolorcache.get(lc),
226                                 toqstr(guiname)));
227                 colorsModule->lyxObjectsLB->insertItem(ci);
228         }
229         connect(colorsModule->colorChangePB, SIGNAL(clicked()), this, SLOT(change_color()));
230         connect(colorsModule->lyxObjectsLB, SIGNAL(selected(int)), this, SLOT(change_color()));
231
232
233
234
235 #if defined(__CYGWIN__) || defined(__CYGWIN32__)
236         cygwinpathModule = new UiWidget<Ui::QPrefCygwinPathUi>;
237         connect(cygwinpathModule->pathCB, SIGNAL(toggled(bool)), this, SLOT(change_adaptor()));
238 #endif
239
240
241
242         displayModule = new UiWidget<Ui::QPrefDisplayUi>;
243         connect(displayModule->instantPreviewCO, SIGNAL(activated(int)), this, SLOT(change_adaptor()));
244         connect(displayModule->displayGraphicsCO, SIGNAL(activated(int)), this, SLOT(change_adaptor()));
245
246
247
248         pathsModule = new UiWidget<Ui::QPrefPathsUi>;
249         connect(pathsModule->templateDirPB, SIGNAL(clicked()), this, SLOT(select_templatedir()));
250         connect(pathsModule->tempDirPB, SIGNAL(clicked()), this, SLOT(select_tempdir()));
251         connect(pathsModule->backupDirPB, SIGNAL(clicked()), this, SLOT(select_backupdir()));
252         connect(pathsModule->workingDirPB, SIGNAL(clicked()), this, SLOT(select_workingdir()));
253         connect(pathsModule->lyxserverDirPB, SIGNAL(clicked()), this, SLOT(select_lyxpipe()));
254         connect(pathsModule->workingDirED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
255         connect(pathsModule->templateDirED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
256         connect(pathsModule->backupDirED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
257         connect(pathsModule->tempDirED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
258         connect(pathsModule->lyxserverDirED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
259         connect(pathsModule->pathPrefixED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
260
261
262
263         spellcheckerModule = new UiWidget<Ui::QPrefSpellcheckerUi>;
264         connect(spellcheckerModule->persDictionaryPB, SIGNAL(clicked()), this, SLOT(select_dict()));
265 #if defined (USE_ISPELL)
266         connect(spellcheckerModule->spellCommandCO, SIGNAL(activated(int)), this, SLOT(change_adaptor()));
267 #else
268         spellcheckerModule->spellCommandCO->setEnabled(false);
269 #endif
270         connect(spellcheckerModule->altLanguageED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
271         connect(spellcheckerModule->escapeCharactersED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
272         connect(spellcheckerModule->persDictionaryED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
273         connect(spellcheckerModule->compoundWordCB, SIGNAL(toggled(bool)), this, SLOT(change_adaptor()));
274         connect(spellcheckerModule->inputEncodingCB, SIGNAL(toggled(bool)), this, SLOT(change_adaptor()));
275         spellcheckerModule->spellCommandCO->insertItem(qt_("ispell"));
276         spellcheckerModule->spellCommandCO->insertItem(qt_("aspell"));
277         spellcheckerModule->spellCommandCO->insertItem(qt_("hspell"));
278 #ifdef USE_PSPELL
279         spellcheckerModule->spellCommandCO->insertItem(qt_("pspell (library)"));
280 #else
281 #ifdef USE_ASPELL
282         spellcheckerModule->spellCommandCO->insertItem(qt_("aspell (library)"));
283 #endif
284 #endif
285
286
287
288         convertersModule = new UiWidget<Ui::QPrefConvertersUi>;
289         connect(convertersModule->converterNewPB, SIGNAL(clicked()), this, SLOT(new_converter()));
290         connect(convertersModule->converterRemovePB, SIGNAL(clicked()), this, SLOT(remove_converter()));
291         connect(convertersModule->converterModifyPB, SIGNAL(clicked()), this, SLOT(modify_converter()));
292         connect(convertersModule->convertersLB, SIGNAL(highlighted(int)), this, SLOT(switch_converter(int)));
293         connect(convertersModule->converterFromCO, SIGNAL(activated(const QString&)), this, SLOT(converter_changed()));
294         connect(convertersModule->converterToCO, SIGNAL(activated(const QString&)), this, SLOT(converter_changed()));
295         connect(convertersModule->converterED, SIGNAL(textChanged(const QString&)), this, SLOT(converter_changed()));
296         connect(convertersModule->converterFlagED, SIGNAL(textChanged(const QString&)), this, SLOT(converter_changed()));
297         connect(convertersModule->converterNewPB, SIGNAL(clicked()), this, SLOT(change_adaptor()));
298         connect(convertersModule->converterRemovePB, SIGNAL(clicked()), this, SLOT(change_adaptor()));
299         connect(convertersModule->converterModifyPB, SIGNAL(clicked()), this, SLOT(change_adaptor()));
300
301
302
303         copiersModule = new UiWidget<Ui::QPrefCopiersUi>;
304         connect(copiersModule->copierNewPB, SIGNAL(clicked()), this, SLOT(new_copier()));
305         connect(copiersModule->copierRemovePB, SIGNAL(clicked()), this, SLOT(remove_copier()));
306         connect(copiersModule->copierModifyPB, SIGNAL(clicked()), this, SLOT(modify_copier()));
307         connect(copiersModule->AllCopiersLB, SIGNAL(highlighted(int)), this, SLOT(switch_copierLB(int)));
308         connect(copiersModule->copierFormatCO, SIGNAL(activated(int)), this, SLOT(switch_copierCO(int)));
309         connect(copiersModule->copierNewPB, SIGNAL(clicked()), this, SLOT(change_adaptor()));
310         connect(copiersModule->copierRemovePB, SIGNAL(clicked()), this, SLOT(change_adaptor()));
311         connect(copiersModule->copierModifyPB, SIGNAL(clicked()), this, SLOT(change_adaptor()));
312         connect(copiersModule->copierFormatCO, SIGNAL(activated(const QString&)), this, SLOT(copiers_changed()));
313         connect(copiersModule->copierED, SIGNAL(textChanged(const QString&)), this, SLOT(copiers_changed()));
314
315
316
317
318         fileformatsModule = new UiWidget<Ui::QPrefFileformatsUi>;
319         connect(fileformatsModule->formatNewPB, SIGNAL(clicked()), this, SLOT(new_format()));
320         connect(fileformatsModule->formatRemovePB, SIGNAL(clicked()), this, SLOT(remove_format()));
321         connect(fileformatsModule->formatModifyPB, SIGNAL(clicked()), this, SLOT(modify_format()));
322         connect(fileformatsModule->formatsLB, SIGNAL(highlighted(int)), this, SLOT(switch_format(int)));
323         connect(fileformatsModule->formatED, SIGNAL(textChanged(const QString&)), this, SLOT(fileformat_changed()));
324         connect(fileformatsModule->guiNameED, SIGNAL(textChanged(const QString&)), this, SLOT(fileformat_changed()));
325         connect(fileformatsModule->shortcutED, SIGNAL(textChanged(const QString&)), this, SLOT(fileformat_changed()));
326         connect(fileformatsModule->extensionED, SIGNAL(textChanged(const QString&)), this, SLOT(fileformat_changed()));
327         connect(fileformatsModule->viewerED, SIGNAL(textChanged(const QString&)), this, SLOT(fileformat_changed()));
328         connect(fileformatsModule->editorED, SIGNAL(textChanged(const QString&)), this, SLOT(fileformat_changed()));
329         connect(fileformatsModule->formatNewPB, SIGNAL(clicked()), this, SLOT(change_adaptor()));
330         connect(fileformatsModule->formatRemovePB, SIGNAL(clicked()), this, SLOT(change_adaptor()));
331         connect(fileformatsModule->formatModifyPB, SIGNAL(clicked()), this, SLOT(change_adaptor()));
332
333
334
335
336         languageModule = new UiWidget<Ui::QPrefLanguageUi>;
337         connect(languageModule->rtlCB, SIGNAL(toggled(bool)), this, SLOT(change_adaptor()));
338         connect(languageModule->markForeignCB, SIGNAL(toggled(bool)), this, SLOT(change_adaptor()));
339         connect(languageModule->autoBeginCB, SIGNAL(toggled(bool)), this, SLOT(change_adaptor()));
340         connect(languageModule->autoEndCB, SIGNAL(toggled(bool)), this, SLOT(change_adaptor()));
341         connect(languageModule->useBabelCB, SIGNAL(toggled(bool)), this, SLOT(change_adaptor()));
342         connect(languageModule->globalCB, SIGNAL(toggled(bool)), this, SLOT(change_adaptor()));
343         connect(languageModule->languagePackageED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
344         connect(languageModule->startCommandED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
345         connect(languageModule->endCommandED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
346         connect(languageModule->defaultLanguageCO, SIGNAL(activated(int)), this, SLOT(change_adaptor()));
347
348         languageModule->defaultLanguageCO->clear();
349
350         // store the lang identifiers for later
351         using lyx::frontend::LanguagePair;
352         std::vector<LanguagePair> const langs =
353                 lyx::frontend::getLanguageData(false);
354         lang_ = getSecond(langs);
355
356         std::vector<LanguagePair>::const_iterator lit  = langs.begin();
357         std::vector<LanguagePair>::const_iterator lend = langs.end();
358         for (; lit != lend; ++lit) {
359                 languageModule->defaultLanguageCO->insertItem(toqstr(lit->first));
360         }
361
362
363
364
365
366         printerModule = new UiWidget<Ui::QPrefPrinterUi>;
367         connect(printerModule->printerAdaptCB, SIGNAL(toggled(bool)), this, SLOT(change_adaptor()));
368         connect(printerModule->printerCommandED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
369         connect(printerModule->printerNameED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
370         connect(printerModule->printerPageRangeED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
371         connect(printerModule->printerCopiesED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
372         connect(printerModule->printerReverseED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
373         connect(printerModule->printerToPrinterED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
374         connect(printerModule->printerExtensionED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
375         connect(printerModule->printerSpoolCommandED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
376         connect(printerModule->printerPaperTypeED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
377         connect(printerModule->printerEvenED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
378         connect(printerModule->printerOddED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
379         connect(printerModule->printerCollatedED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
380         connect(printerModule->printerLandscapeED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
381         connect(printerModule->printerToFileED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
382         connect(printerModule->printerExtraED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
383         connect(printerModule->printerSpoolPrefixED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
384         connect(printerModule->printerPaperSizeED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
385
386
387
388
389         uiModule = new UiWidget<Ui::QPrefUi>;
390     connect( uiModule->autoSaveCB, SIGNAL( toggled(bool) ), uiModule->autoSaveLA, SLOT( setEnabled(bool) ) );
391     connect( uiModule->autoSaveCB, SIGNAL( toggled(bool) ), uiModule->autoSaveSB, SLOT( setEnabled(bool) ) );
392     connect( uiModule->autoSaveCB, SIGNAL( toggled(bool) ), uiModule->TextLabel1, SLOT( setEnabled(bool) ) );
393         connect(uiModule->uiFilePB, SIGNAL(clicked()), this, SLOT(select_ui()));
394         connect(uiModule->bindFilePB, SIGNAL(clicked()), this, SLOT(select_bind()));
395         connect(uiModule->uiFileED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
396         connect(uiModule->bindFileED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
397         connect(uiModule->restoreCursorCB, SIGNAL(toggled(bool)), this, SLOT(change_adaptor()));
398         connect(uiModule->loadSessionCB, SIGNAL(toggled(bool)), this, SLOT(change_adaptor()));
399         connect(uiModule->cursorFollowsCB, SIGNAL(toggled(bool)), this, SLOT(change_adaptor()));
400         connect(uiModule->autoSaveSB, SIGNAL(valueChanged(int)), this, SLOT(change_adaptor()));
401         connect(uiModule->autoSaveCB, SIGNAL(toggled(bool)), this, SLOT(change_adaptor()));
402         connect(uiModule->lastfilesSB, SIGNAL(valueChanged(int)), this, SLOT(change_adaptor()));
403         uiModule->lastfilesSB->setMaxValue(maxlastfiles);
404
405
406
407
408         identityModule = new UiWidget<Ui::QPrefIdentityUi>;
409         connect(identityModule->nameED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
410         connect(identityModule->emailED, SIGNAL(textChanged(const QString&)), this, SLOT(change_adaptor()));
411
412
413
414
415         string const laf = _("Look and feel");
416         prefsPS->addCategory(laf);
417         prefsPS->addPanel(uiModule, _("User interface"), laf);
418         prefsPS->addPanel(screenfontsModule, _("Screen fonts"), laf);
419         prefsPS->addPanel(colorsModule, _("Colors"), laf);
420         prefsPS->addPanel(displayModule, _("Graphics"), laf);
421         prefsPS->addPanel(keyboardModule, _("Keyboard"), laf);
422
423         string const ls = _("Language settings");
424         prefsPS->addCategory(ls);
425         prefsPS->addPanel(languageModule, _("Language"), ls);
426         prefsPS->addPanel(spellcheckerModule, _("Spellchecker"), ls);
427
428         string const op = _("Outputs");
429         prefsPS->addCategory(op);
430         prefsPS->addPanel(asciiModule, _("Plain text"), op);
431         prefsPS->addPanel(dateModule, _("Date format"), op);
432         prefsPS->addPanel(latexModule, _("LaTeX"), op);
433 #if defined(__CYGWIN__) || defined(__CYGWIN32__)
434         prefsPS->addPanel(cygwinpathModule, _("Paths"), op);
435 #endif
436         prefsPS->addPanel(printerModule, _("Printer"), op);
437
438         prefsPS->addPanel(identityModule, _("Identity"));
439         prefsPS->addPanel(pathsModule, _("Paths"));
440         prefsPS->addPanel(fileformatsModule, _("File formats"));
441         prefsPS->addPanel(convertersModule, _("Converters"));
442         prefsPS->addPanel(copiersModule, _("Copiers"));
443
444         prefsPS->setCurrentPanel(_("User interface"));
445
446
447         form_->bcview().setOK(savePB);
448         form_->bcview().setApply(applyPB);
449         form_->bcview().setCancel(closePB);
450         form_->bcview().setRestore(restorePB);
451 }
452
453
454
455
456 QPrefsDialog::~QPrefsDialog()
457 {
458 }
459
460
461 void QPrefsDialog::closeEvent(QCloseEvent * e)
462 {
463         form_->slotWMHide();
464         e->accept();
465 }
466
467
468 void QPrefsDialog::change_adaptor()
469 {
470         form_->changed();
471 }
472
473
474 void QPrefsDialog::updateConverters()
475 {
476         Ui::QPrefConvertersUi* convertmod(convertersModule);
477
478         // save current selection
479         QString current = convertmod->converterFromCO->currentText()
480                 + " -> " + convertmod->converterToCO->currentText();
481
482         convertmod->converterFromCO->clear();
483         convertmod->converterToCO->clear();
484
485         Formats::const_iterator cit = form_->formats().begin();
486         Formats::const_iterator end = form_->formats().end();
487         for (; cit != end; ++cit) {
488                 convertmod->converterFromCO->insertItem(toqstr(cit->prettyname()));
489                 convertmod->converterToCO->insertItem(toqstr(cit->prettyname()));
490         }
491
492         convertmod->convertersLB->clear();
493
494         Converters::const_iterator ccit = form_->converters().begin();
495         Converters::const_iterator cend = form_->converters().end();
496         for (; ccit != cend; ++ccit) {
497                 std::string const name = ccit->From->prettyname() + " -> "
498                         + ccit->To->prettyname();
499                 convertmod->convertersLB->insertItem(toqstr(name));
500         }
501
502         // restore selection
503         if (!current.isEmpty()) {
504                 Q3ListBoxItem * item = convertmod->convertersLB->findItem(current);
505                 convertmod->convertersLB->setCurrentItem(item);
506         }
507         // select first element if restoring failed
508         if (convertmod->convertersLB->currentItem() == -1)
509                 convertmod->convertersLB->setCurrentItem(0);
510
511         updateConverterButtons();
512 }
513
514
515 void QPrefsDialog::switch_converter(int nr)
516 {
517         Converter const & c(form_->converters().get(nr));
518         convertersModule->converterFromCO->setCurrentItem(form_->formats().getNumber(c.from));
519         convertersModule->converterToCO->setCurrentItem(form_->formats().getNumber(c.to));
520         convertersModule->converterED->setText(toqstr(c.command));
521         convertersModule->converterFlagED->setText(toqstr(c.flags));
522
523         updateConverterButtons();
524 }
525
526
527 void QPrefsDialog::converter_changed()
528 {
529         updateConverterButtons();
530 }
531
532
533 void QPrefsDialog::updateConverterButtons()
534 {
535         Format const & from(form_->formats().get(
536                 convertersModule->converterFromCO->currentItem()));
537         Format const & to(form_->formats().get(
538                 convertersModule->converterToCO->currentItem()));
539         int const sel = form_->converters().getNumber(from.name(), to.name());
540         bool const known = !(sel < 0);
541         bool const valid = !(convertersModule->converterED->text().isEmpty()
542                 || from.name() == to.name());
543
544         Converter const & c(form_->converters().get(
545                 convertersModule->convertersLB->currentItem()));
546         string const old_command = c.command;
547         string const old_flag = c.flags;
548         string const new_command(fromqstr(convertersModule->converterED->text()));
549         string const new_flag(fromqstr(convertersModule->converterFlagED->text()));
550
551         bool modified = ((old_command != new_command) || (old_flag != new_flag));
552
553         convertersModule->converterModifyPB->setEnabled(valid && known && modified);
554         convertersModule->converterNewPB->setEnabled(valid && !known);
555         convertersModule->converterRemovePB->setEnabled(known);
556 }
557
558
559 // FIXME: user must
560 // specify unique from/to or it doesn't appear. This is really bad UI
561 void QPrefsDialog::new_converter()
562 {
563         Format const & from(form_->formats().get(convertersModule->converterFromCO->currentItem()));
564         Format const & to(form_->formats().get(convertersModule->converterToCO->currentItem()));
565         string const command(fromqstr(convertersModule->converterED->text()));
566         string const flags(fromqstr(convertersModule->converterFlagED->text()));
567
568         Converter const * old = form_->converters().getConverter(from.name(), to.name());
569         form_->converters().add(from.name(), to.name(), command, flags);
570         if (!old) {
571                 form_->converters().updateLast(form_->formats());
572         }
573         updateConverters();
574         convertersModule->convertersLB->setCurrentItem(convertersModule->convertersLB->count() - 1);
575 }
576
577
578 void QPrefsDialog::modify_converter()
579 {
580         int const top_item = convertersModule->convertersLB->topItem();
581         QString const current_text =
582                 convertersModule->convertersLB->currentText();
583
584         Format const & from(form_->formats().get(convertersModule->converterFromCO->currentItem()));
585         Format const & to(form_->formats().get(convertersModule->converterToCO->currentItem()));
586         string flags(fromqstr(convertersModule->converterFlagED->text()));
587         string name(fromqstr(convertersModule->converterED->text()));
588
589         Converter const * old = form_->converters().getConverter(from.name(), to.name());
590         form_->converters().add(from.name(), to.name(), name, flags);
591         if (!old) {
592                 form_->converters().updateLast(form_->formats());
593         }
594         updateConverters();
595
596         Q3ListBoxItem * const item =
597                 convertersModule->convertersLB->findItem(current_text);
598         convertersModule->convertersLB->setCurrentItem(item);
599         convertersModule->convertersLB->setTopItem(top_item);
600 }
601
602
603 void QPrefsDialog::remove_converter()
604 {
605         Format const & from(form_->formats().get(convertersModule->converterFromCO->currentItem()));
606         Format const & to(form_->formats().get(convertersModule->converterToCO->currentItem()));
607         form_->converters().erase(from.name(), to.name());
608         updateConverters();
609 }
610
611
612 void QPrefsDialog::updateCopiers()
613 {
614         // The choice widget
615         // save current selection
616         QString current = copiersModule->copierFormatCO->currentText();
617         copiersModule->copierFormatCO->clear();
618
619         for (Formats::const_iterator it = form_->formats().begin(),
620                      end = form_->formats().end();
621              it != end; ++it) {
622                 copiersModule->copierFormatCO->insertItem(toqstr(it->prettyname()));
623         }
624
625         // The browser widget
626         copiersModule->AllCopiersLB->clear();
627
628         for (Movers::iterator it = form_->movers().begin(),
629                      end = form_->movers().end();
630              it != end; ++it) {
631                 std::string const & command = it->second.command();
632                 if (command.empty())
633                         continue;
634                 std::string const & fmt = it->first;
635                 std::string const & pretty = form_->formats().prettyName(fmt);
636
637                 copiersModule->AllCopiersLB->insertItem(toqstr(pretty));
638         }
639
640         // restore selection
641         if (!current.isEmpty()) {
642                 Q3ListBoxItem * item = copiersModule->AllCopiersLB->findItem(current);
643                 copiersModule->AllCopiersLB->setCurrentItem(item);
644         }
645         // select first element if restoring failed
646         if (copiersModule->AllCopiersLB->currentItem() == -1)
647                 copiersModule->AllCopiersLB->setCurrentItem(0);
648 }
649
650
651 namespace {
652
653 class SamePrettyName {
654 public:
655         SamePrettyName(string const & n) : pretty_name_(n) {}
656
657         bool operator()(::Format const & fmt) const {
658                 return fmt.prettyname() == pretty_name_;
659         }
660
661 private:
662         string const pretty_name_;
663 };
664
665
666 Format const * getFormat(std::string const & prettyname)
667 {
668         Formats::const_iterator it = ::formats.begin();
669         Formats::const_iterator const end = ::formats.end();
670         it = std::find_if(it, end, SamePrettyName(prettyname));
671         return it == end ? 0 : &*it;
672 }
673
674 } // namespace anon
675
676
677 void QPrefsDialog::switch_copierLB(int)
678 {
679         std::string const browser_text =
680                 fromqstr(copiersModule->AllCopiersLB->currentText());
681         Format const * fmt = getFormat(browser_text);
682         if (fmt == 0)
683                 return;
684
685         string const & fmt_name = fmt->name();
686         string const & gui_name = fmt->prettyname();
687         string const & command = form_->movers().command(fmt_name);
688
689         copiersModule->copierED->clear();
690         int const combo_size = copiersModule->copierFormatCO->count();
691         for (int i = 0; i < combo_size; ++i) {
692                 QString const qtext = copiersModule->copierFormatCO->text(i);
693                 std::string const text = fromqstr(qtext);
694                 if (text == gui_name) {
695                         copiersModule->copierFormatCO->setCurrentItem(i);
696                         copiersModule->copierED->setText(toqstr(command));
697                         break;
698                 }
699         }
700         updateCopierButtons();
701 }
702
703
704 void QPrefsDialog::switch_copierCO(int)
705 {
706         std::string const combo_text =
707                 fromqstr(copiersModule->copierFormatCO->currentText());
708         Format const * fmt = getFormat(combo_text);
709         if (fmt == 0)
710                 return;
711
712         string const & fmt_name = fmt->name();
713         string const & gui_name = fmt->prettyname();
714         string const & command = form_->movers().command(fmt_name);
715
716         copiersModule->copierED->setText(toqstr(command));
717
718         int const index = copiersModule->AllCopiersLB->currentItem();
719         if (index >= 0)
720                 copiersModule->AllCopiersLB->setSelected(index, false);
721
722         int const browser_size = copiersModule->AllCopiersLB->count();
723         for (int i = 0; i < browser_size; ++i) {
724                 QString const qtext = copiersModule->AllCopiersLB->text(i);
725                 std::string const text = fromqstr(qtext);
726                 if (text == gui_name) {
727                         copiersModule->AllCopiersLB->setSelected(i, true);
728                         int top = std::max(i - 5, 0);
729                         copiersModule->AllCopiersLB->setTopItem(top);
730                         break;
731                 }
732         }
733 }
734
735
736 void QPrefsDialog::copiers_changed()
737 {
738         updateCopierButtons();
739 }
740
741
742 void QPrefsDialog::updateCopierButtons()
743 {
744         QString selected = copiersModule->copierFormatCO->currentText();
745
746         bool known = false;
747         for (unsigned int i = 0; i != copiersModule->AllCopiersLB->count(); i++) {
748                 if (copiersModule->AllCopiersLB->text(i) == selected)
749                         known = true;
750         }
751
752         bool const valid = !copiersModule->copierED->text().isEmpty();
753
754         Format const * fmt = getFormat(fromqstr(selected));
755         string const old_command = form_->movers().command(fmt->name());
756         string const new_command(fromqstr(copiersModule->copierED->text()));
757
758         bool modified = (old_command != new_command);
759
760         copiersModule->copierModifyPB->setEnabled(valid && known && modified);
761         copiersModule->copierNewPB->setEnabled(valid && !known);
762         copiersModule->copierRemovePB->setEnabled(known);
763 }
764
765
766 void QPrefsDialog::new_copier()
767 {
768         std::string const combo_text =
769                 fromqstr(copiersModule->copierFormatCO->currentText());
770         Format const * fmt = getFormat(combo_text);
771         if (fmt == 0)
772                 return;
773
774         string const command = fromqstr(copiersModule->copierED->text());
775         if (command.empty())
776                 return;
777
778         form_->movers().set(fmt->name(), command);
779
780         updateCopiers();
781         int const last = copiersModule->AllCopiersLB->count() - 1;
782         copiersModule->AllCopiersLB->setCurrentItem(last);
783
784         updateCopierButtons();
785 }
786
787
788 void QPrefsDialog::modify_copier()
789 {
790         std::string const combo_text =
791                 fromqstr(copiersModule->copierFormatCO->currentText());
792         Format const * fmt = getFormat(combo_text);
793         if (fmt == 0)
794                 return;
795
796         string const command = fromqstr(copiersModule->copierED->text());
797         form_->movers().set(fmt->name(), command);
798
799         updateCopiers();
800         updateCopierButtons();
801 }
802
803
804 void QPrefsDialog::remove_copier()
805 {
806         std::string const combo_text =
807                 fromqstr(copiersModule->copierFormatCO->currentText());
808         Format const * fmt = getFormat(combo_text);
809         if (fmt == 0)
810                 return;
811
812         string const & fmt_name = fmt->name();
813         form_->movers().set(fmt_name, string());
814
815         updateCopiers();
816         updateCopierButtons();
817 }
818
819
820 void QPrefsDialog::updateFormats()
821 {
822         Ui::QPrefFileformatsUi * formatmod(fileformatsModule);
823
824         // save current selection
825         QString current = formatmod->guiNameED->text();
826
827         formatmod->formatsLB->clear();
828
829         Formats::const_iterator cit = form_->formats().begin();
830         Formats::const_iterator end = form_->formats().end();
831         for (; cit != end; ++cit) {
832                 formatmod->formatsLB->insertItem(toqstr(cit->prettyname()));
833         }
834
835         // restore selection
836         if (!current.isEmpty()) {
837                 Q3ListBoxItem * item = formatmod->formatsLB->findItem(current);
838                 formatmod->formatsLB->setCurrentItem(item);
839         }
840         // select first element if restoring failed
841         if (formatmod->formatsLB->currentItem() == -1)
842                 formatmod->formatsLB->setCurrentItem(0);
843 }
844
845
846 void QPrefsDialog::switch_format(int nr)
847 {
848         Format const & f(form_->formats().get(nr));
849         fileformatsModule->formatED->setText(toqstr(f.name()));
850         fileformatsModule->guiNameED->setText(toqstr(f.prettyname()));
851         fileformatsModule->extensionED->setText(toqstr(f.extension()));
852         fileformatsModule->shortcutED->setText(toqstr(f.shortcut()));
853         fileformatsModule->viewerED->setText(toqstr(f.viewer()));
854         fileformatsModule->editorED->setText(toqstr(f.editor()));
855         fileformatsModule->formatRemovePB->setEnabled(
856                 !form_->converters().formatIsUsed(f.name()));
857
858         updateFormatsButtons();
859 }
860
861
862 void QPrefsDialog::fileformat_changed()
863 {
864         updateFormatsButtons();
865 }
866
867
868 void QPrefsDialog::updateFormatsButtons()
869 {
870         QString const format = fileformatsModule->formatED->text();
871         QString const gui_name = fileformatsModule->guiNameED->text();
872         int const sel = form_->formats().getNumber(fromqstr(format));
873         bool gui_name_known = false;
874         int where = sel;
875         for (unsigned int i = 0; i != fileformatsModule->formatsLB->count(); i++) {
876                 if (fileformatsModule->formatsLB->text(i) == gui_name) {
877                         gui_name_known = true;
878                         where = i;
879                 }
880         }
881
882         // assure that a gui name cannot be chosen twice
883         bool const known_otherwise = gui_name_known && (where != sel);
884
885         bool const known = !(sel < 0);
886         bool const valid = (!fileformatsModule->formatED->text().isEmpty()
887                 && !fileformatsModule->guiNameED->text().isEmpty());
888
889         Format const & f(form_->formats().get(
890                 fileformatsModule->formatsLB->currentItem()));
891         string const old_pretty(f.prettyname());
892         string const old_shortcut(f.shortcut());
893         string const old_extension(f.extension());
894         string const old_viewer(f.viewer());
895         string const old_editor(f.editor());
896
897         string const new_pretty(fromqstr(gui_name));
898         string const new_shortcut(fromqstr(fileformatsModule->shortcutED->text()));
899         string const new_extension(fromqstr(fileformatsModule->extensionED->text()));
900         string const new_viewer(fromqstr(fileformatsModule->viewerED->text()));
901         string const new_editor(fromqstr(fileformatsModule->editorED->text()));
902
903         bool modified = ((old_pretty != new_pretty) || (old_shortcut != new_shortcut)
904                 || (old_extension != new_extension) || (old_viewer != new_viewer)
905                 || (old_editor != new_editor));
906
907         fileformatsModule->formatModifyPB->setEnabled(
908                 valid && known && modified && !known_otherwise);
909         fileformatsModule->formatNewPB->setEnabled(valid && !known && !gui_name_known);
910         fileformatsModule->formatRemovePB->setEnabled(known);
911 }
912
913
914 void QPrefsDialog::new_format()
915 {
916         string const name = fromqstr(fileformatsModule->formatED->text());
917         string const prettyname = fromqstr(fileformatsModule->guiNameED->text());
918         string const extension = fromqstr(fileformatsModule->extensionED->text());
919         string const shortcut = fromqstr(fileformatsModule->shortcutED->text());
920         string const viewer = fromqstr(fileformatsModule->viewerED->text());
921         string const editor = fromqstr(fileformatsModule->editorED->text());
922
923         form_->formats().add(name, extension, prettyname, shortcut, viewer, editor);
924         form_->formats().sort();
925         updateFormats();
926         fileformatsModule->formatsLB->setCurrentItem(form_->formats().getNumber(name));
927         form_->converters().update(form_->formats());
928
929         updateConverters();
930         updateFormatsButtons();
931 }
932
933
934 void QPrefsDialog::modify_format()
935 {
936         int const top_item = fileformatsModule->formatsLB->topItem();
937         int const current_item = fileformatsModule->formatsLB->currentItem();
938         QString const current_text =
939                 fileformatsModule->formatsLB->currentText();
940
941         Format const & oldformat(form_->formats().get(current_item));
942         string const oldpretty(oldformat.prettyname());
943         string const name(fromqstr(fileformatsModule->formatED->text()));
944         form_->formats().erase(oldformat.name());
945
946         string const prettyname = fromqstr(fileformatsModule->guiNameED->text());
947         string const extension = fromqstr(fileformatsModule->extensionED->text());
948         string const shortcut = fromqstr(fileformatsModule->shortcutED->text());
949         string const viewer = fromqstr(fileformatsModule->viewerED->text());
950         string const editor = fromqstr(fileformatsModule->editorED->text());
951
952         form_->formats().add(name, extension, prettyname, shortcut, viewer, editor);
953         form_->formats().sort();
954
955         fileformatsModule->formatsLB->setUpdatesEnabled(false);
956         updateFormats();
957         fileformatsModule->formatsLB->setUpdatesEnabled(true);
958         fileformatsModule->formatsLB->update();
959
960         updateConverters();
961         updateFormatsButtons();
962
963         Q3ListBoxItem * const item =
964                 fileformatsModule->formatsLB->findItem(current_text);
965         fileformatsModule->formatsLB->setCurrentItem(item);
966         fileformatsModule->formatsLB->setTopItem(top_item);
967 }
968
969
970 void QPrefsDialog::remove_format()
971 {
972         int const nr(fileformatsModule->formatsLB->currentItem());
973         if (nr < 0)
974                 return;
975         string const current_text = form_->formats().get(nr).name();
976         if (form_->converters().formatIsUsed(current_text)) {
977                 Alert::error(_("Format in use"),
978                                 _("Cannot remove a Format used by a Converter. "
979                                       "Remove the converter first."));
980                 return;
981         }
982         form_->formats().erase(current_text);
983         updateFormats();
984         form_->converters().update(form_->formats());
985
986         updateConverters();
987         updateFormatsButtons();
988 }
989
990
991 void QPrefsDialog::change_color()
992 {
993         Q3ListBox * lb(colorsModule->lyxObjectsLB);
994         if (lb->currentItem() < 0)
995                 return;
996         Q3ListBoxItem * ib(lb->item(lb->currentItem()));
997         QColorItem * ci(static_cast<QColorItem*>(ib));
998         QColor c(QColorDialog::getColor(ci->color(), qApp->focusWidget() ? qApp->focusWidget() : qApp->mainWidget()));
999         if (c.isValid()) {
1000                 ci->color(c);
1001                 lb->triggerUpdate(true);
1002                 change_adaptor();
1003         }
1004 }
1005
1006
1007 void QPrefsDialog::select_ui()
1008 {
1009         string file(form_->controller().browseUI(fromqstr(uiModule->uiFileED->text())));
1010         if (!file.empty())
1011                 uiModule->uiFileED->setText(toqstr(file));
1012 }
1013
1014
1015 void QPrefsDialog::select_bind()
1016 {
1017         string file(form_->controller().browsebind(fromqstr(uiModule->bindFileED->text())));
1018         if (!file.empty())
1019                 uiModule->bindFileED->setText(toqstr(file));
1020 }
1021
1022
1023 void QPrefsDialog::select_keymap1()
1024 {
1025         string file(form_->controller().browsekbmap(fromqstr(keyboardModule->firstKeymapED->text())));
1026         if (!file.empty())
1027                 keyboardModule->firstKeymapED->setText(toqstr(file));
1028 }
1029
1030
1031 void QPrefsDialog::select_keymap2()
1032 {
1033         string file(form_->controller().browsekbmap(fromqstr(keyboardModule->secondKeymapED->text())));
1034         if (!file.empty())
1035                 keyboardModule->secondKeymapED->setText(toqstr(file));
1036 }
1037
1038
1039 void QPrefsDialog::select_dict()
1040 {
1041         string file(form_->controller().browsedict(fromqstr(spellcheckerModule->persDictionaryED->text())));
1042         if (!file.empty())
1043                 spellcheckerModule->persDictionaryED->setText(toqstr(file));
1044 }
1045
1046
1047 // NB: the _() is OK here because it gets passed back and we toqstr() them
1048
1049 void QPrefsDialog::select_templatedir()
1050 {
1051         string file(form_->controller().browsedir(fromqstr(pathsModule->templateDirED->text()), _("Select a document templates directory")));
1052         if (!file.empty())
1053                 pathsModule->templateDirED->setText(toqstr(file));
1054 }
1055
1056
1057 void QPrefsDialog::select_tempdir()
1058 {
1059         string file(form_->controller().browsedir(fromqstr(pathsModule->tempDirED->text()), _("Select a temporary directory")));
1060         if (!file.empty())
1061                 pathsModule->tempDirED->setText(toqstr(file));
1062 }
1063
1064
1065 void QPrefsDialog::select_backupdir()
1066 {
1067         string file(form_->controller().browsedir(fromqstr(pathsModule->backupDirED->text()), _("Select a backups directory")));
1068         if (!file.empty())
1069                 pathsModule->backupDirED->setText(toqstr(file));
1070 }
1071
1072
1073 void QPrefsDialog::select_workingdir()
1074 {
1075         string file(form_->controller().browsedir(fromqstr(pathsModule->workingDirED->text()), _("Select a document directory")));
1076         if (!file.empty())
1077                 pathsModule->workingDirED->setText(toqstr(file));
1078 }
1079
1080
1081 void QPrefsDialog::select_lyxpipe()
1082 {
1083         string file(form_->controller().browse(fromqstr(pathsModule->lyxserverDirED->text()), _("Give a filename for the LyX server pipe")));
1084         if (!file.empty())
1085                 pathsModule->lyxserverDirED->setText(toqstr(file));
1086 }
1087
1088
1089 void QPrefsDialog::select_roman(const QString& name)
1090 {
1091         screenfontsModule->screenRomanFE->set(QFont(name), name);
1092 }
1093
1094
1095 void QPrefsDialog::select_sans(const QString& name)
1096 {
1097         screenfontsModule->screenSansFE->set(QFont(name), name);
1098 }
1099
1100
1101 void QPrefsDialog::select_typewriter(const QString& name)
1102 {
1103         screenfontsModule->screenTypewriterFE->set(QFont(name), name);
1104 }
1105
1106 namespace {
1107
1108 string const internal_path(QString const & input)
1109 {
1110         return lyx::support::os::internal_path(fromqstr(input));
1111 }
1112
1113 }
1114
1115 void QPrefsDialog::apply(LyXRC & rc) const
1116 {
1117         // FIXME: remove rtl_support bool
1118         rc.rtl_support = languageModule->rtlCB->isChecked();
1119         rc.mark_foreign_language = languageModule->markForeignCB->isChecked();
1120         rc.language_auto_begin = languageModule->autoBeginCB->isChecked();
1121         rc.language_auto_end = languageModule->autoEndCB->isChecked();
1122         rc.language_use_babel = languageModule->useBabelCB->isChecked();
1123         rc.language_global_options = languageModule->globalCB->isChecked();
1124         rc.language_package = fromqstr(languageModule->languagePackageED->text());
1125         rc.language_command_begin = fromqstr(languageModule->startCommandED->text());
1126         rc.language_command_end = fromqstr(languageModule->endCommandED->text());
1127         rc.default_language = lang_[languageModule->defaultLanguageCO->currentItem()];
1128
1129
1130         rc.ui_file = internal_path(uiModule->uiFileED->text());
1131         rc.bind_file = internal_path(uiModule->bindFileED->text());
1132         rc.use_lastfilepos = uiModule->restoreCursorCB->isChecked();
1133         rc.load_session = uiModule->loadSessionCB->isChecked();
1134         rc.cursor_follows_scrollbar = uiModule->cursorFollowsCB->isChecked();
1135         rc.autosave = uiModule->autoSaveSB->value() * 60;
1136         rc.make_backup = uiModule->autoSaveCB->isChecked();
1137         rc.num_lastfiles = uiModule->lastfilesSB->value();
1138
1139
1140         // FIXME: can derive CB from the two EDs
1141         rc.use_kbmap = keyboardModule->keymapCB->isChecked();
1142         rc.primary_kbmap = internal_path(keyboardModule->firstKeymapED->text());
1143         rc.secondary_kbmap = internal_path(keyboardModule->secondKeymapED->text());
1144
1145
1146         rc.ascii_linelen = asciiModule->asciiLinelengthSB->value();
1147         rc.ascii_roff_command = fromqstr(asciiModule->asciiRoffED->text());
1148
1149
1150         rc.date_insert_format = fromqstr(dateModule->DateED->text());
1151
1152
1153 #if defined(__CYGWIN__) || defined(__CYGWIN32__)
1154         rc.cygwin_path_fix = cygwinpathModule->pathCB->isChecked();
1155 #endif
1156
1157
1158         rc.fontenc = fromqstr(latexModule->latexEncodingED->text());
1159         rc.chktex_command = fromqstr(latexModule->latexChecktexED->text());
1160         rc.bibtex_command = fromqstr(latexModule->latexBibtexED->text());
1161         rc.index_command = fromqstr(latexModule->latexIndexED->text());
1162         rc.auto_reset_options = latexModule->latexAutoresetCB->isChecked();
1163         rc.view_dvi_paper_option = fromqstr(latexModule->latexDviPaperED->text());
1164         rc.default_papersize =
1165                 form_->controller().toPaperSize(latexModule->latexPaperSizeCO->currentItem());
1166
1167
1168         switch (displayModule->instantPreviewCO->currentItem()) {
1169         case 0: rc.preview = LyXRC::PREVIEW_OFF; break;
1170         case 1: rc.preview = LyXRC::PREVIEW_NO_MATH; break;
1171         case 2: rc.preview = LyXRC::PREVIEW_ON; break;
1172         }
1173
1174         lyx::graphics::DisplayType dtype;
1175         switch (displayModule->displayGraphicsCO->currentItem()) {
1176         case 3: dtype = lyx::graphics::NoDisplay; break;
1177         case 2: dtype = lyx::graphics::ColorDisplay; break;
1178         case 1: dtype = lyx::graphics::GrayscaleDisplay;        break;
1179         case 0: dtype = lyx::graphics::MonochromeDisplay; break;
1180         default: dtype = lyx::graphics::GrayscaleDisplay;
1181         }
1182         rc.display_graphics = dtype;
1183
1184 #ifdef WITH_WARNINGS
1185 #warning FIXME!! The graphics cache no longer has a changeDisplay method.
1186 #endif
1187 #if 0
1188         if (old_value != rc.display_graphics) {
1189                 lyx::graphics::GCache & gc = lyx::graphics::GCache::get();
1190                 gc.changeDisplay();
1191         }
1192 #endif
1193
1194
1195         rc.document_path = internal_path(pathsModule->workingDirED->text());
1196         rc.template_path = internal_path(pathsModule->templateDirED->text());
1197         rc.backupdir_path = internal_path(pathsModule->backupDirED->text());
1198         rc.tempdir_path = internal_path(pathsModule->tempDirED->text());
1199         rc.path_prefix = fromqstr(pathsModule->pathPrefixED->text());
1200         // FIXME: should be a checkbox only
1201         rc.lyxpipes = internal_path(pathsModule->lyxserverDirED->text());
1202
1203
1204         switch (spellcheckerModule->spellCommandCO->currentItem()) {
1205                 case 0:
1206                 case 1:
1207                 case 2:
1208                         rc.use_spell_lib = false;
1209                         rc.isp_command = fromqstr(spellcheckerModule->spellCommandCO->currentText());
1210                         break;
1211                 case 3:
1212                         rc.use_spell_lib = true;
1213                         break;
1214         }
1215
1216         // FIXME: remove isp_use_alt_lang
1217         rc.isp_alt_lang = fromqstr(spellcheckerModule->altLanguageED->text());
1218         rc.isp_use_alt_lang = !rc.isp_alt_lang.empty();
1219         // FIXME: remove isp_use_esc_chars
1220         rc.isp_esc_chars = fromqstr(spellcheckerModule->escapeCharactersED->text());
1221         rc.isp_use_esc_chars = !rc.isp_esc_chars.empty();
1222         // FIXME: remove isp_use_pers_dict
1223         rc.isp_pers_dict = internal_path(spellcheckerModule->persDictionaryED->text());
1224         rc.isp_use_pers_dict = !rc.isp_pers_dict.empty();
1225         rc.isp_accept_compound = spellcheckerModule->compoundWordCB->isChecked();
1226         rc.isp_use_input_encoding = spellcheckerModule->inputEncodingCB->isChecked();
1227
1228
1229
1230         rc.print_adapt_output = printerModule->printerAdaptCB->isChecked();
1231         rc.print_command = fromqstr(printerModule->printerCommandED->text());
1232         rc.printer = fromqstr(printerModule->printerNameED->text());
1233
1234         rc.print_pagerange_flag = fromqstr(printerModule->printerPageRangeED->text());
1235         rc.print_copies_flag = fromqstr(printerModule->printerCopiesED->text());
1236         rc.print_reverse_flag = fromqstr(printerModule->printerReverseED->text());
1237         rc.print_to_printer = fromqstr(printerModule->printerToPrinterED->text());
1238         rc.print_file_extension = fromqstr(printerModule->printerExtensionED->text());
1239         rc.print_spool_command = fromqstr(printerModule->printerSpoolCommandED->text());
1240         rc.print_paper_flag = fromqstr(printerModule->printerPaperTypeED->text());
1241         rc.print_evenpage_flag = fromqstr(printerModule->printerEvenED->text());
1242         rc.print_oddpage_flag = fromqstr(printerModule->printerOddED->text());
1243         rc.print_collcopies_flag = fromqstr(printerModule->printerCollatedED->text());
1244         rc.print_landscape_flag = fromqstr(printerModule->printerLandscapeED->text());
1245         rc.print_to_file = internal_path(printerModule->printerToFileED->text());
1246         rc.print_extra_options = fromqstr(printerModule->printerExtraED->text());
1247         rc.print_spool_printerprefix = fromqstr(printerModule->printerSpoolPrefixED->text());
1248         rc.print_paper_dimension_flag = fromqstr(printerModule->printerPaperSizeED->text());
1249
1250
1251
1252         rc.user_name = fromqstr(identityModule->nameED->text());
1253         rc.user_email = fromqstr(identityModule->emailED->text());
1254
1255
1256
1257         LyXRC const oldrc(rc);
1258
1259         boost::tie(rc.roman_font_name, rc.roman_font_foundry)
1260                 = parseFontName(fromqstr(screenfontsModule->screenRomanCO->currentText()));
1261         boost::tie(rc.sans_font_name, rc.sans_font_foundry) =
1262                 parseFontName(fromqstr(screenfontsModule->screenSansCO->currentText()));
1263         boost::tie(rc.typewriter_font_name, rc.typewriter_font_foundry) =
1264                 parseFontName(fromqstr(screenfontsModule->screenTypewriterCO->currentText()));
1265
1266         rc.zoom = screenfontsModule->screenZoomSB->value();
1267         rc.dpi = screenfontsModule->screenDpiSB->value();
1268         rc.font_sizes[LyXFont::SIZE_TINY] = fromqstr(screenfontsModule->screenTinyED->text());
1269         rc.font_sizes[LyXFont::SIZE_SCRIPT] = fromqstr(screenfontsModule->screenSmallestED->text());
1270         rc.font_sizes[LyXFont::SIZE_FOOTNOTE] = fromqstr(screenfontsModule->screenSmallerED->text());
1271         rc.font_sizes[LyXFont::SIZE_SMALL] = fromqstr(screenfontsModule->screenSmallED->text());
1272         rc.font_sizes[LyXFont::SIZE_NORMAL] = fromqstr(screenfontsModule->screenNormalED->text());
1273         rc.font_sizes[LyXFont::SIZE_LARGE] = fromqstr(screenfontsModule->screenLargeED->text());
1274         rc.font_sizes[LyXFont::SIZE_LARGER] = fromqstr(screenfontsModule->screenLargerED->text());
1275         rc.font_sizes[LyXFont::SIZE_LARGEST] = fromqstr(screenfontsModule->screenLargestED->text());
1276         rc.font_sizes[LyXFont::SIZE_HUGE] = fromqstr(screenfontsModule->screenHugeED->text());
1277         rc.font_sizes[LyXFont::SIZE_HUGER] = fromqstr(screenfontsModule->screenHugerED->text());
1278
1279         if (rc.font_sizes != oldrc.font_sizes
1280                 || rc.roman_font_name != oldrc.roman_font_name
1281                 || rc.sans_font_name != oldrc.sans_font_name
1282                 || rc.typewriter_font_name != oldrc.typewriter_font_name
1283                 || rc.zoom != oldrc.zoom || rc.dpi != oldrc.dpi) {
1284                 form_->controller().updateScreenFonts();
1285         }
1286
1287
1288
1289
1290         unsigned int i;
1291         for (i = 0; i < colorsModule->lyxObjectsLB->count(); ++i) {
1292                 Q3ListBoxItem * ib(colorsModule->lyxObjectsLB->item(i));
1293                 QColorItem * ci(static_cast<QColorItem*>(ib));
1294
1295                 LColor::color const col(colors_[i]);
1296                 QColor const & qcol(lcolorcache.get(col));
1297
1298                 // FIXME: dubious, but it's what xforms does
1299                 if (qcol != ci->color()) {
1300                         ostringstream ostr;
1301
1302                         ostr << '#' << std::setbase(16) << setfill('0')
1303                              << setw(2) << ci->color().red()
1304                              << setw(2) << ci->color().green()
1305                              << setw(2) << ci->color().blue();
1306
1307                         string newhex(ostr.str());
1308                         form_->controller().setColor(col, newhex);
1309                 }
1310         }
1311 }
1312
1313 // FIXME: move to helper_funcs.h
1314 namespace {
1315
1316 template<class A>
1317 typename std::vector<A>::size_type
1318 findPos(std::vector<A> const & vec, A const & val)
1319 {
1320         typedef typename std::vector<A>::const_iterator Cit;
1321
1322         Cit it = std::find(vec.begin(), vec.end(), val);
1323         if (it == vec.end())
1324                 return 0;
1325         return distance(vec.begin(), it);
1326 }
1327
1328 void setComboxFont(QComboBox * cb, string const & family, string const & foundry)
1329 {
1330         string const name = makeFontName(family, foundry);
1331         for (int i = 0; i < cb->count(); ++i) {
1332                 if (fromqstr(cb->text(i)) == name) {
1333                         cb->setCurrentItem(i);
1334                         return;
1335                 }
1336         }
1337
1338         // Try matching without foundry name
1339
1340         // We count in reverse in order to prefer the Xft foundry
1341         for (int i = cb->count() - 1; i >= 0; --i) {
1342                 pair<string, string> tmp = parseFontName(fromqstr(cb->text(i)));
1343                 if (compare_no_case(tmp.first, family) == 0) {
1344                         cb->setCurrentItem(i);
1345                         return;
1346                 }
1347         }
1348
1349         // family alone can contain e.g. "Helvetica [Adobe]"
1350         pair<string, string> tmpfam = parseFontName(family);
1351
1352         // We count in reverse in order to prefer the Xft foundry
1353         for (int i = cb->count() - 1; i >= 0; --i) {
1354                 pair<string, string> tmp = parseFontName(fromqstr(cb->text(i)));
1355                 if (compare_no_case(tmp.first, tmpfam.first) == 0) {
1356                         cb->setCurrentItem(i);
1357                         return;
1358                 }
1359         }
1360
1361         // Bleh, default fonts, and the names couldn't be found. Hack
1362         // for bug 1063. Qt makes baby Jesus cry.
1363
1364         QFont font;
1365
1366         if (family == lyx_gui::roman_font_name()) {
1367                 font.setStyleHint(QFont::Serif);
1368                 font.setFamily(family.c_str());
1369         } else if (family == lyx_gui::sans_font_name()) {
1370                 font.setStyleHint(QFont::SansSerif);
1371                 font.setFamily(family.c_str());
1372         } else if (family == lyx_gui::typewriter_font_name()) {
1373                 font.setStyleHint(QFont::TypeWriter);
1374                 font.setFamily(family.c_str());
1375         } else {
1376                 lyxerr << "FAILED to find the default font: '"
1377                        << foundry << "', '" << family << '\''<< endl;
1378                 return;
1379         }
1380
1381         QFontInfo info(font);
1382         pair<string, string> tmp = parseFontName(fromqstr(info.family()));
1383         string const & default_font_name = tmp.first;
1384         lyxerr << "Apparent font is " << default_font_name << endl;
1385
1386         for (int i = 0; i < cb->count(); ++i) {
1387                 lyxerr << "Looking at " << fromqstr(cb->text(i)) << endl;
1388                 if (compare_no_case(fromqstr(cb->text(i)),
1389                                     default_font_name) == 0) {
1390                         cb->setCurrentItem(i);
1391                         return;
1392                 }
1393         }
1394
1395         lyxerr << "FAILED to find the font: '"
1396                << foundry << "', '" << family << '\'' <<endl;
1397 }
1398
1399 } // end namespace anon
1400
1401 namespace {
1402
1403 QString const external_path(string const & input)
1404 {
1405         return toqstr(lyx::support::os::external_path(input));
1406 }
1407
1408 }
1409
1410 void QPrefsDialog::update(LyXRC const & rc)
1411 {
1412         // FIXME: remove rtl_support bool
1413         languageModule->rtlCB->setChecked(rc.rtl_support);
1414         languageModule->markForeignCB->setChecked(rc.mark_foreign_language);
1415         languageModule->autoBeginCB->setChecked(rc.language_auto_begin);
1416         languageModule->autoEndCB->setChecked(rc.language_auto_end);
1417         languageModule->useBabelCB->setChecked(rc.language_use_babel);
1418         languageModule->globalCB->setChecked(rc.language_global_options);
1419         languageModule->languagePackageED->setText(toqstr(rc.language_package));
1420         languageModule->startCommandED->setText(toqstr(rc.language_command_begin));
1421         languageModule->endCommandED->setText(toqstr(rc.language_command_end));
1422
1423         int const pos = int(findPos(lang_, rc.default_language));
1424         languageModule->defaultLanguageCO->setCurrentItem(pos);
1425
1426         uiModule->uiFileED->setText(external_path(rc.ui_file));
1427         uiModule->bindFileED->setText(external_path(rc.bind_file));
1428         uiModule->restoreCursorCB->setChecked(rc.use_lastfilepos);
1429         uiModule->loadSessionCB->setChecked(rc.load_session);
1430         uiModule->cursorFollowsCB->setChecked(rc.cursor_follows_scrollbar);
1431         // convert to minutes
1432         int mins(rc.autosave / 60);
1433         if (rc.autosave && !mins)
1434                 mins = 1;
1435         uiModule->autoSaveSB->setValue(mins);
1436         uiModule->autoSaveCB->setChecked(rc.make_backup);
1437         uiModule->lastfilesSB->setValue(rc.num_lastfiles);
1438
1439
1440         identityModule->nameED->setText(toqstr(rc.user_name));
1441         identityModule->emailED->setText(toqstr(rc.user_email));
1442
1443
1444         // FIXME: can derive CB from the two EDs
1445         keyboardModule->keymapCB->setChecked(rc.use_kbmap);
1446         // no idea why we need these. Fscking Qt.
1447         keyboardModule->firstKeymapED->setEnabled(rc.use_kbmap);
1448         keyboardModule->firstKeymapPB->setEnabled(rc.use_kbmap);
1449         keyboardModule->firstKeymapLA->setEnabled(rc.use_kbmap);
1450         keyboardModule->secondKeymapED->setEnabled(rc.use_kbmap);
1451         keyboardModule->secondKeymapPB->setEnabled(rc.use_kbmap);
1452         keyboardModule->secondKeymapLA->setEnabled(rc.use_kbmap);
1453         keyboardModule->firstKeymapED->setText(external_path(rc.primary_kbmap));
1454         keyboardModule->secondKeymapED->setText(external_path(rc.secondary_kbmap));
1455
1456
1457
1458         asciiModule->asciiLinelengthSB->setValue(rc.ascii_linelen);
1459         asciiModule->asciiRoffED->setText(toqstr(rc.ascii_roff_command));
1460
1461
1462
1463         dateModule->DateED->setText(toqstr(rc.date_insert_format));
1464
1465
1466
1467 #if defined(__CYGWIN__) || defined(__CYGWIN32__)
1468         cygwinpathModule->pathCB->setChecked(rc.cygwin_path_fix);
1469 #endif
1470
1471
1472
1473         latexModule->latexEncodingED->setText(toqstr(rc.fontenc));
1474         latexModule->latexChecktexED->setText(toqstr(rc.chktex_command));
1475         latexModule->latexBibtexED->setText(toqstr(rc.bibtex_command));
1476         latexModule->latexIndexED->setText(toqstr(rc.index_command));
1477         latexModule->latexAutoresetCB->setChecked(rc.auto_reset_options);
1478         latexModule->latexDviPaperED->setText(toqstr(rc.view_dvi_paper_option));
1479         latexModule->latexPaperSizeCO->setCurrentItem(
1480                 form_->controller().fromPaperSize(rc.default_papersize));
1481
1482
1483
1484         switch (rc.preview) {
1485         case LyXRC::PREVIEW_OFF:
1486                 displayModule->instantPreviewCO->setCurrentItem(0);
1487                 break;
1488         case LyXRC::PREVIEW_NO_MATH :
1489                 displayModule->instantPreviewCO->setCurrentItem(1);
1490                 break;
1491         case LyXRC::PREVIEW_ON :
1492                 displayModule->instantPreviewCO->setCurrentItem(2);
1493                 break;
1494         }
1495
1496         int item = 2;
1497         switch (rc.display_graphics) {
1498                 case lyx::graphics::NoDisplay:          item = 3; break;
1499                 case lyx::graphics::ColorDisplay:       item = 2; break;
1500                 case lyx::graphics::GrayscaleDisplay:   item = 1; break;
1501                 case lyx::graphics::MonochromeDisplay:  item = 0; break;
1502                 default: break;
1503         }
1504         displayModule->displayGraphicsCO->setCurrentItem(item);
1505
1506
1507
1508         pathsModule->workingDirED->setText(external_path(rc.document_path));
1509         pathsModule->templateDirED->setText(external_path(rc.template_path));
1510         pathsModule->backupDirED->setText(external_path(rc.backupdir_path));
1511         pathsModule->tempDirED->setText(external_path(rc.tempdir_path));
1512         pathsModule->pathPrefixED->setText(toqstr(rc.path_prefix));
1513         // FIXME: should be a checkbox only
1514         pathsModule->lyxserverDirED->setText(external_path(rc.lyxpipes));
1515
1516
1517
1518         spellcheckerModule->spellCommandCO->setCurrentItem(0);
1519
1520         if (rc.isp_command == "ispell") {
1521                 spellcheckerModule->spellCommandCO->setCurrentItem(0);
1522         } else if (rc.isp_command == "aspell") {
1523                 spellcheckerModule->spellCommandCO->setCurrentItem(1);
1524         } else if (rc.isp_command == "hspell") {
1525                 spellcheckerModule->spellCommandCO->setCurrentItem(2);
1526         }
1527
1528         if (rc.use_spell_lib) {
1529 #if defined(USE_ASPELL) || defined(USE_PSPELL)
1530                 spellcheckerModule->spellCommandCO->setCurrentItem(3);
1531 #endif
1532         }
1533
1534         // FIXME: remove isp_use_alt_lang
1535         spellcheckerModule->altLanguageED->setText(toqstr(rc.isp_alt_lang));
1536         // FIXME: remove isp_use_esc_chars
1537         spellcheckerModule->escapeCharactersED->setText(toqstr(rc.isp_esc_chars));
1538         // FIXME: remove isp_use_pers_dict
1539         spellcheckerModule->persDictionaryED->setText(external_path(rc.isp_pers_dict));
1540         spellcheckerModule->compoundWordCB->setChecked(rc.isp_accept_compound);
1541         spellcheckerModule->inputEncodingCB->setChecked(rc.isp_use_input_encoding);
1542
1543
1544
1545
1546         printerModule->printerAdaptCB->setChecked(rc.print_adapt_output);
1547         printerModule->printerCommandED->setText(toqstr(rc.print_command));
1548         printerModule->printerNameED->setText(toqstr(rc.printer));
1549
1550         printerModule->printerPageRangeED->setText(toqstr(rc.print_pagerange_flag));
1551         printerModule->printerCopiesED->setText(toqstr(rc.print_copies_flag));
1552         printerModule->printerReverseED->setText(toqstr(rc.print_reverse_flag));
1553         printerModule->printerToPrinterED->setText(toqstr(rc.print_to_printer));
1554         printerModule->printerExtensionED->setText(toqstr(rc.print_file_extension));
1555         printerModule->printerSpoolCommandED->setText(toqstr(rc.print_spool_command));
1556         printerModule->printerPaperTypeED->setText(toqstr(rc.print_paper_flag));
1557         printerModule->printerEvenED->setText(toqstr(rc.print_evenpage_flag));
1558         printerModule->printerOddED->setText(toqstr(rc.print_oddpage_flag));
1559         printerModule->printerCollatedED->setText(toqstr(rc.print_collcopies_flag));
1560         printerModule->printerLandscapeED->setText(toqstr(rc.print_landscape_flag));
1561         printerModule->printerToFileED->setText(external_path(rc.print_to_file));
1562         printerModule->printerExtraED->setText(toqstr(rc.print_extra_options));
1563         printerModule->printerSpoolPrefixED->setText(toqstr(rc.print_spool_printerprefix));
1564         printerModule->printerPaperSizeED->setText(toqstr(rc.print_paper_dimension_flag));
1565
1566
1567
1568
1569         setComboxFont(screenfontsModule->screenRomanCO, rc.roman_font_name,
1570                         rc.roman_font_foundry);
1571         setComboxFont(screenfontsModule->screenSansCO, rc.sans_font_name,
1572                         rc.sans_font_foundry);
1573         setComboxFont(screenfontsModule->screenTypewriterCO, rc.typewriter_font_name,
1574                         rc.typewriter_font_foundry);
1575
1576         select_roman(screenfontsModule->screenRomanCO->currentText());
1577         select_sans(screenfontsModule->screenSansCO->currentText());
1578         select_typewriter(screenfontsModule->screenTypewriterCO->currentText());
1579
1580         screenfontsModule->screenZoomSB->setValue(rc.zoom);
1581         screenfontsModule->screenDpiSB->setValue(rc.dpi);
1582         screenfontsModule->screenTinyED->setText(toqstr(rc.font_sizes[LyXFont::SIZE_TINY]));
1583         screenfontsModule->screenSmallestED->setText(toqstr(rc.font_sizes[LyXFont::SIZE_SCRIPT]));
1584         screenfontsModule->screenSmallerED->setText(toqstr(rc.font_sizes[LyXFont::SIZE_FOOTNOTE]));
1585         screenfontsModule->screenSmallED->setText(toqstr(rc.font_sizes[LyXFont::SIZE_SMALL]));
1586         screenfontsModule->screenNormalED->setText(toqstr(rc.font_sizes[LyXFont::SIZE_NORMAL]));
1587         screenfontsModule->screenLargeED->setText(toqstr(rc.font_sizes[LyXFont::SIZE_LARGE]));
1588         screenfontsModule->screenLargerED->setText(toqstr(rc.font_sizes[LyXFont::SIZE_LARGER]));
1589         screenfontsModule->screenLargestED->setText(toqstr(rc.font_sizes[LyXFont::SIZE_LARGEST]));
1590         screenfontsModule->screenHugeED->setText(toqstr(rc.font_sizes[LyXFont::SIZE_HUGE]));
1591         screenfontsModule->screenHugerED->setText(toqstr(rc.font_sizes[LyXFont::SIZE_HUGER]));
1592
1593         updateFormats();
1594         updateConverters();
1595         updateCopiers();
1596
1597 }
1598
1599
1600 } // namespace frontend
1601 } // namespace lyx