]> git.lyx.org Git - features.git/blob - src/frontends/qt4/GuiDocument.cpp
all CheckedWidgets are line edits...
[features.git] / src / frontends / qt4 / GuiDocument.cpp
1 /**
2  * \file GuiDocument.cpp
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
13 #include "GuiDocument.h"
14
15 #include "FloatPlacement.h"
16 #include "LengthCombo.h"
17 #include "PanelStack.h"
18 #include "Qt2BC.h"
19 #include "qt_helpers.h"
20 #include "Validator.h"
21
22 // For the Branches module
23 #include "GuiBranches.h"
24
25 #include "GuiViewSource.h" // For latexHighlighter use in the preamble.
26
27 #include "BufferParams.h"
28 #include "Encoding.h"
29 #include "gettext.h"
30 #include "frontend_helpers.h" // getSecond()
31 #include "Language.h"
32 #include "LyXRC.h" // defaultUnit
33 #include "TextClassList.h"
34 #include "Spacing.h"
35
36 #include "insets/InsetListingsParams.h"
37
38 #include "support/lstrings.h"
39
40 #include <QCloseEvent>
41 #include <QScrollBar>
42 #include <QTextCursor>
43
44 #include <map>
45
46 using lyx::support::token;
47 using lyx::support::bformat;
48 using lyx::support::findToken;
49 using lyx::support::getVectorFromString;
50
51 using std::distance;
52 using std::make_pair;
53 using std::pair;
54 using std::vector;
55 using std::string;
56
57
58 char const * const tex_graphics[] = {"default", "dvips", "dvitops", "emtex",
59                       "ln", "oztex", "textures", "none", ""
60 };
61
62
63 char const * const tex_graphics_gui[] = {N_("Default"), "Dvips", "DVItoPS", "EmTeX",
64                       "LN", "OzTeX", "Textures", N_("None"), ""
65 };
66
67
68 char const * const tex_fonts_roman[] = {"default", "cmr", "lmodern", "ae", "times", "palatino",
69                             "charter", "newcent", "bookman", "utopia", "beraserif", "ccfonts", "chancery", ""
70 };
71
72
73 char const * tex_fonts_roman_gui[] = { N_("Default"), N_("Computer Modern Roman"), N_("Latin Modern Roman"),
74                             N_("AE (Almost European)"), N_("Times Roman"), N_("Palatino"), N_("Bitstream Charter"),
75                             N_("New Century Schoolbook"), N_("Bookman"), N_("Utopia"),  N_("Bera Serif"),
76                             N_("Concrete Roman"), N_("Zapf Chancery"), ""
77 };
78
79
80 char const * const tex_fonts_sans[] = {"default", "cmss", "lmss", "helvet", "avant", "berasans", "cmbr", ""
81 };
82
83
84 char const * tex_fonts_sans_gui[] = { N_("Default"), N_("Computer Modern Sans"), N_("Latin Modern Sans"),
85                             N_("Helvetica"), N_("Avant Garde"), N_("Bera Sans"), N_("CM Bright"), ""
86 };
87
88
89 char const * const tex_fonts_monospaced[] = {"default", "cmtt", "lmtt", "courier", "beramono",
90                             "luximono", "cmtl", ""
91 };
92
93
94 char const * tex_fonts_monospaced_gui[] = { N_("Default"), N_("Computer Modern Typewriter"),
95                             N_("Latin Modern Typewriter"), N_("Courier"), N_("Bera Mono"), N_("LuxiMono"),
96                             N_("CM Typewriter Light"), ""
97 };
98
99
100 vector<pair<string, lyx::docstring> > pagestyles;
101
102
103 namespace lyx {
104 namespace frontend {
105
106 /////////////////////////////////////////////////////////////////////
107 //
108 // PreambleModule
109 //
110 /////////////////////////////////////////////////////////////////////
111
112 PreambleModule::PreambleModule(): current_id_(0)
113 {
114         // This is not a memory leak. The object will be destroyed
115         // with this.
116         (void) new LaTeXHighlighter(preambleTE->document());
117         setFocusProxy(preambleTE);
118         connect(preambleTE, SIGNAL(textChanged()), this, SIGNAL(changed()));
119 }
120
121
122 void PreambleModule::update(BufferParams const & params, BufferId id)
123 {
124         QString preamble = toqstr(params.preamble);
125         // Nothing to do if the params and preamble are unchanged.
126         if (id == current_id_
127                 && preamble == preambleTE->document()->toPlainText())
128                 return;
129
130         QTextCursor cur = preambleTE->textCursor();
131         // Save the coords before switching to the new one.
132         preamble_coords_[current_id_] =
133                 make_pair(cur.position(), preambleTE->verticalScrollBar()->value());
134
135         // Save the params address for further use.
136         current_id_ = id;
137         preambleTE->document()->setPlainText(preamble);
138         Coords::const_iterator it = preamble_coords_.find(current_id_);
139         if (it == preamble_coords_.end())
140                 // First time we open this one.
141                 preamble_coords_[current_id_] = make_pair(0,0);
142         else {
143                 // Restore saved coords.
144                 QTextCursor cur = preambleTE->textCursor();
145                 cur.setPosition(it->second.first);
146                 preambleTE->setTextCursor(cur);
147                 preambleTE->verticalScrollBar()->setValue(it->second.second);
148         }
149 }
150
151
152 void PreambleModule::apply(BufferParams & params)
153 {
154         params.preamble = fromqstr(preambleTE->document()->toPlainText());
155 }
156
157
158 void PreambleModule::closeEvent(QCloseEvent * e)
159 {
160         // Save the coords before closing.
161         QTextCursor cur = preambleTE->textCursor();
162         preamble_coords_[current_id_] =
163                 make_pair(cur.position(), preambleTE->verticalScrollBar()->value());
164         e->accept();
165 }
166
167
168 /////////////////////////////////////////////////////////////////////
169 //
170 // DocumentDialog
171 //
172 /////////////////////////////////////////////////////////////////////
173
174 GuiDocumentDialog::GuiDocumentDialog(GuiDocument * form)
175         : form_(form),
176         lang_(getSecond(getLanguageData(false)))
177 {
178         setupUi(this);
179
180         connect(okPB, SIGNAL(clicked()), form, SLOT(slotOK()));
181         connect(applyPB, SIGNAL(clicked()), form, SLOT(slotApply()));
182         connect(closePB, SIGNAL(clicked()), form, SLOT(slotClose()));
183         connect(restorePB, SIGNAL(clicked()), form, SLOT(slotRestore()));
184
185         connect(savePB, SIGNAL(clicked()), this, SLOT(saveDefaultClicked()));
186         connect(defaultPB, SIGNAL(clicked()), this, SLOT(useDefaultsClicked()));
187
188         // Manage the restore, ok, apply, restore and cancel/close buttons
189         form_->bcview().setOK(okPB);
190         form_->bcview().setApply(applyPB);
191         form_->bcview().setCancel(closePB);
192         form_->bcview().setRestore(restorePB);
193
194
195         textLayoutModule = new UiWidget<Ui::TextLayoutUi>;
196         // text layout
197         connect(textLayoutModule->lspacingCO, SIGNAL(activated(int)),
198                 this, SLOT(change_adaptor()));
199         connect(textLayoutModule->lspacingCO, SIGNAL(activated(int)),
200                 this, SLOT(setLSpacing(int)));
201         connect(textLayoutModule->lspacingLE, SIGNAL(textChanged(const QString&)),
202                 this, SLOT(change_adaptor()));
203         connect(textLayoutModule->skipRB, SIGNAL(clicked()),
204                 this, SLOT(change_adaptor()));
205         connect(textLayoutModule->indentRB, SIGNAL(clicked()),
206                 this, SLOT(change_adaptor()));
207         connect(textLayoutModule->skipCO, SIGNAL(activated(int)),
208                 this, SLOT(change_adaptor()));
209         connect(textLayoutModule->skipLE, SIGNAL(textChanged(const QString &)),
210                 this, SLOT(change_adaptor()));
211         connect(textLayoutModule->skipLengthCO, SIGNAL(activated(int)),
212                 this, SLOT(change_adaptor()));
213         connect(textLayoutModule->skipCO, SIGNAL(activated(int)),
214                 this, SLOT(setSkip(int)));
215         connect(textLayoutModule->skipRB, SIGNAL(toggled(bool)),
216                 this, SLOT(enableSkip(bool)));
217         connect(textLayoutModule->twoColumnCB, SIGNAL(clicked()),
218                 this, SLOT(change_adaptor()));
219         connect(textLayoutModule->listingsED, SIGNAL(textChanged()),
220                 this, SLOT(change_adaptor()));
221         connect(textLayoutModule->bypassCB, SIGNAL(clicked()), 
222                 this, SLOT(change_adaptor()));
223         connect(textLayoutModule->bypassCB, SIGNAL(clicked()), 
224                 this, SLOT(set_listings_msg()));
225         connect(textLayoutModule->listingsED, SIGNAL(textChanged()),
226                 this, SLOT(set_listings_msg()));
227         textLayoutModule->listingsTB->setPlainText(
228                 qt_("Input listings parameters on the right. Enter ? for a list of parameters."));
229         textLayoutModule->lspacingLE->setValidator(new QDoubleValidator(
230                 textLayoutModule->lspacingLE));
231         textLayoutModule->skipLE->setValidator(unsignedLengthValidator(
232                 textLayoutModule->skipLE));
233
234         textLayoutModule->skipCO->addItem(qt_("SmallSkip"));
235         textLayoutModule->skipCO->addItem(qt_("MedSkip"));
236         textLayoutModule->skipCO->addItem(qt_("BigSkip"));
237         textLayoutModule->skipCO->addItem(qt_("Length"));
238         // remove the %-items from the unit choice
239         textLayoutModule->skipLengthCO->noPercents();
240         textLayoutModule->lspacingCO->insertItem(
241                 Spacing::Single, qt_("Single"));
242         textLayoutModule->lspacingCO->insertItem(
243                 Spacing::Onehalf, qt_("OneHalf"));
244         textLayoutModule->lspacingCO->insertItem(
245                 Spacing::Double, qt_("Double"));
246         textLayoutModule->lspacingCO->insertItem(
247                 Spacing::Other, qt_("Custom"));
248
249         // initialize the length validator
250         addCheckedLineEdit(form_->bcview(), textLayoutModule->skipLE);
251
252         fontModule = new UiWidget<Ui::FontUi>;
253         // fonts
254         connect(fontModule->fontsRomanCO, SIGNAL(activated(int)),
255                 this, SLOT(change_adaptor()));
256         connect(fontModule->fontsRomanCO, SIGNAL(activated(int)),
257                 this, SLOT(romanChanged(int)));
258         connect(fontModule->fontsSansCO, SIGNAL(activated(int)),
259                 this, SLOT(change_adaptor()));
260         connect(fontModule->fontsSansCO, SIGNAL(activated(int)),
261                 this, SLOT(sansChanged(int)));
262         connect(fontModule->fontsTypewriterCO, SIGNAL(activated(int)),
263                 this, SLOT(change_adaptor()));
264         connect(fontModule->fontsTypewriterCO, SIGNAL(activated(int)),
265                 this, SLOT(ttChanged(int)));
266         connect(fontModule->fontsDefaultCO, SIGNAL(activated(int)),
267                 this, SLOT(change_adaptor()));
268         connect(fontModule->fontsizeCO, SIGNAL(activated(int)),
269                 this, SLOT(change_adaptor()));
270         connect(fontModule->scaleSansSB, SIGNAL(valueChanged(int)),
271                 this, SLOT(change_adaptor()));
272         connect(fontModule->scaleTypewriterSB, SIGNAL(valueChanged(int)),
273                 this, SLOT(change_adaptor()));
274         connect(fontModule->fontScCB, SIGNAL(clicked()),
275                 this, SLOT(change_adaptor()));
276         connect(fontModule->fontOsfCB, SIGNAL(clicked()),
277                 this, SLOT(change_adaptor()));
278
279         for (int n = 0; tex_fonts_roman[n][0]; ++n) {
280                 QString font = qt_(tex_fonts_roman_gui[n]);
281                 if (!form_->controller().isFontAvailable(tex_fonts_roman[n]))
282                         font += qt_(" (not installed)");
283                 fontModule->fontsRomanCO->addItem(font);
284         }
285         for (int n = 0; tex_fonts_sans[n][0]; ++n) {
286                 QString font = qt_(tex_fonts_sans_gui[n]);
287                 if (!form_->controller().isFontAvailable(tex_fonts_sans[n]))
288                         font += qt_(" (not installed)");
289                 fontModule->fontsSansCO->addItem(font);
290         }
291         for (int n = 0; tex_fonts_monospaced[n][0]; ++n) {
292                 QString font = qt_(tex_fonts_monospaced_gui[n]);
293                 if (!form_->controller().isFontAvailable(tex_fonts_monospaced[n]))
294                         font += qt_(" (not installed)");
295                 fontModule->fontsTypewriterCO->addItem(font);
296         }
297
298         fontModule->fontsizeCO->addItem(qt_("Default"));
299         fontModule->fontsizeCO->addItem(qt_("10"));
300         fontModule->fontsizeCO->addItem(qt_("11"));
301         fontModule->fontsizeCO->addItem(qt_("12"));
302
303         for (int n = 0; ControlDocument::fontfamilies_gui[n][0]; ++n)
304                 fontModule->fontsDefaultCO->addItem(
305                         qt_(ControlDocument::fontfamilies_gui[n]));
306
307
308         pageLayoutModule = new UiWidget<Ui::PageLayoutUi>;
309         // page layout
310         connect(pageLayoutModule->papersizeCO, SIGNAL(activated(int)),
311                 this, SLOT(setCustomPapersize(int)));
312         connect(pageLayoutModule->papersizeCO, SIGNAL(activated(int)),
313                 this, SLOT(setCustomPapersize(int)));
314         connect(pageLayoutModule->portraitRB, SIGNAL(clicked()),
315                 this, SLOT(portraitChanged()));
316         connect(pageLayoutModule->papersizeCO, SIGNAL(activated(int)),
317                 this, SLOT(change_adaptor()));
318         connect(pageLayoutModule->paperheightLE, SIGNAL(textChanged(const QString &)),
319                 this, SLOT(change_adaptor()));
320         connect(pageLayoutModule->paperwidthLE, SIGNAL(textChanged(const QString &)),
321                 this, SLOT(change_adaptor()));
322         connect(pageLayoutModule->paperwidthUnitCO, SIGNAL(activated(int)),
323                 this, SLOT(change_adaptor()));
324         connect(pageLayoutModule->paperheightUnitCO, SIGNAL(activated(int)),
325                 this, SLOT(change_adaptor()));
326         connect(pageLayoutModule->portraitRB, SIGNAL(clicked()),
327                 this, SLOT(change_adaptor()));
328         connect(pageLayoutModule->landscapeRB, SIGNAL(clicked()),
329                 this, SLOT(change_adaptor()));
330         connect(pageLayoutModule->facingPagesCB, SIGNAL(clicked()),
331                 this, SLOT(change_adaptor()));
332         connect(pageLayoutModule->pagestyleCO, SIGNAL(activated(int)),
333                 this, SLOT(change_adaptor()));
334
335         pageLayoutModule->pagestyleCO->addItem(qt_("Default"));
336         pageLayoutModule->pagestyleCO->addItem(qt_("empty"));
337         pageLayoutModule->pagestyleCO->addItem(qt_("plain"));
338         pageLayoutModule->pagestyleCO->addItem(qt_("headings"));
339         pageLayoutModule->pagestyleCO->addItem(qt_("fancy"));
340         addCheckedLineEdit(form_->bcview(), pageLayoutModule->paperheightLE,
341                 pageLayoutModule->paperheightL);
342         addCheckedLineEdit(form_->bcview(), pageLayoutModule->paperwidthLE,
343                 pageLayoutModule->paperwidthL);
344
345         // paper
346         QComboBox * cb = pageLayoutModule->papersizeCO;
347         cb->addItem(qt_("Default"));
348         cb->addItem(qt_("Custom"));
349         cb->addItem(qt_("US letter"));
350         cb->addItem(qt_("US legal"));
351         cb->addItem(qt_("US executive"));
352         cb->addItem(qt_("A3"));
353         cb->addItem(qt_("A4"));
354         cb->addItem(qt_("A5"));
355         cb->addItem(qt_("B3"));
356         cb->addItem(qt_("B4"));
357         cb->addItem(qt_("B5"));
358         // remove the %-items from the unit choice
359         pageLayoutModule->paperwidthUnitCO->noPercents();
360         pageLayoutModule->paperheightUnitCO->noPercents();
361         pageLayoutModule->paperheightLE->setValidator(unsignedLengthValidator(
362                 pageLayoutModule->paperheightLE));
363         pageLayoutModule->paperwidthLE->setValidator(unsignedLengthValidator(
364                 pageLayoutModule->paperwidthLE));
365
366
367
368
369         marginsModule = new UiWidget<Ui::MarginsUi>;
370         // margins
371         connect(marginsModule->marginCB, SIGNAL(toggled(bool)),
372                 this, SLOT(setCustomMargins(bool)));
373         connect(marginsModule->marginCB, SIGNAL(clicked()),
374                 this, SLOT(change_adaptor()));
375         connect(marginsModule->topLE, SIGNAL(textChanged(const QString &)),
376                 this, SLOT(change_adaptor()));
377         connect(marginsModule->topUnit, SIGNAL(activated(int)),
378                 this, SLOT(change_adaptor()));
379         connect(marginsModule->bottomLE, SIGNAL(textChanged(const QString &)),
380                 this, SLOT(change_adaptor()));
381         connect(marginsModule->bottomUnit, SIGNAL(activated(int)),
382                 this, SLOT(change_adaptor()));
383         connect(marginsModule->innerLE, SIGNAL(textChanged(const QString &)),
384                 this, SLOT(change_adaptor()));
385         connect(marginsModule->innerUnit, SIGNAL(activated(int)),
386                 this, SLOT(change_adaptor()));
387         connect(marginsModule->outerLE, SIGNAL(textChanged(const QString &)),
388                 this, SLOT(change_adaptor()));
389         connect(marginsModule->outerUnit, SIGNAL(activated(int)),
390                 this, SLOT(change_adaptor()));
391         connect(marginsModule->headheightLE, SIGNAL(textChanged(const QString &)),
392                 this, SLOT(change_adaptor()));
393         connect(marginsModule->headheightUnit, SIGNAL(activated(int)),
394                 this, SLOT(change_adaptor()));
395         connect(marginsModule->headsepLE, SIGNAL(textChanged(const QString &)),
396                 this, SLOT(change_adaptor()));
397         connect(marginsModule->headsepUnit, SIGNAL(activated(int)),
398                 this, SLOT(change_adaptor()));
399         connect(marginsModule->footskipLE, SIGNAL(textChanged(const QString&)),
400                 this, SLOT(change_adaptor()));
401         connect(marginsModule->footskipUnit, SIGNAL(activated(int)),
402                 this, SLOT(change_adaptor()));
403         marginsModule->topLE->setValidator(unsignedLengthValidator(
404                 marginsModule->topLE));
405         marginsModule->bottomLE->setValidator(unsignedLengthValidator(
406                 marginsModule->bottomLE));
407         marginsModule->innerLE->setValidator(unsignedLengthValidator(
408                 marginsModule->innerLE));
409         marginsModule->outerLE->setValidator(unsignedLengthValidator(
410                 marginsModule->outerLE));
411         marginsModule->headsepLE->setValidator(unsignedLengthValidator(
412                 marginsModule->headsepLE));
413         marginsModule->headheightLE->setValidator(unsignedLengthValidator(
414                 marginsModule->headheightLE));
415         marginsModule->footskipLE->setValidator(unsignedLengthValidator(
416                 marginsModule->footskipLE));
417
418         addCheckedLineEdit(form_->bcview(), marginsModule->topLE,
419                 marginsModule->topL);
420         addCheckedLineEdit(form_->bcview(), marginsModule->bottomLE,
421                 marginsModule->bottomL);
422         addCheckedLineEdit(form_->bcview(), marginsModule->innerLE,
423                 marginsModule->innerL);
424         addCheckedLineEdit(form_->bcview(), marginsModule->outerLE,
425                 marginsModule->outerL);
426         addCheckedLineEdit(form_->bcview(), marginsModule->headsepLE,
427                 marginsModule->headsepL);
428         addCheckedLineEdit(form_->bcview(), marginsModule->headheightLE,
429                 marginsModule->headheightL);
430         addCheckedLineEdit(form_->bcview(), marginsModule->footskipLE,
431                 marginsModule->footskipL);
432
433
434         langModule = new UiWidget<Ui::LanguageUi>;
435         connect(langModule->defaultencodingCB, SIGNAL(toggled(bool)),
436                 langModule->encodingL, SLOT(setDisabled(bool)));
437         connect(langModule->defaultencodingCB, SIGNAL(toggled(bool)),
438                 langModule->encodingCO, SLOT(setDisabled(bool)));
439         // language & quote
440         connect(langModule->languageCO, SIGNAL(activated(int)),
441                 this, SLOT(change_adaptor()));
442         connect(langModule->defaultencodingCB, SIGNAL(clicked()),
443                 this, SLOT(change_adaptor()));
444         connect(langModule->encodingCO, SIGNAL(activated(int)),
445                 this, SLOT(change_adaptor()));
446         connect(langModule->quoteStyleCO, SIGNAL(activated(int)),
447                 this, SLOT(change_adaptor()));
448         // language & quotes
449         vector<LanguagePair> const langs = getLanguageData(false);
450         vector<LanguagePair>::const_iterator lit  = langs.begin();
451         vector<LanguagePair>::const_iterator lend = langs.end();
452         for (; lit != lend; ++lit) {
453                 langModule->languageCO->addItem(
454                         toqstr(lit->first));
455         }
456
457         // Always put the default encoding in the first position.
458         // It is special because the displayed text is translated.
459         langModule->encodingCO->addItem(qt_("LaTeX default"));
460         Encodings::const_iterator it = encodings.begin();
461         Encodings::const_iterator const end = encodings.end();
462         for (; it != end; ++it)
463                 langModule->encodingCO->addItem(toqstr(it->latexName()));
464
465         langModule->quoteStyleCO->addItem(qt_("``text''"));
466         langModule->quoteStyleCO->addItem(qt_("''text''"));
467         langModule->quoteStyleCO->addItem(qt_(",,text``"));
468         langModule->quoteStyleCO->addItem(qt_(",,text''"));
469         langModule->quoteStyleCO->addItem(qt_("<<text>>"));
470         langModule->quoteStyleCO->addItem(qt_(">>text<<"));
471
472
473
474         numberingModule = new UiWidget<Ui::NumberingUi>;
475         // numbering
476         connect(numberingModule->depthSL, SIGNAL(valueChanged(int)),
477                 this, SLOT(change_adaptor()));
478         connect(numberingModule->tocSL, SIGNAL(valueChanged(int)),
479                 this, SLOT(change_adaptor()));
480         connect(numberingModule->depthSL, SIGNAL(valueChanged(int)),
481                 this, SLOT(updateNumbering()));
482         connect(numberingModule->tocSL, SIGNAL(valueChanged(int)),
483                 this, SLOT(updateNumbering()));
484         numberingModule->tocTW->setColumnCount(3);
485         numberingModule->tocTW->headerItem()->setText(0, qt_("Example"));
486         numberingModule->tocTW->headerItem()->setText(1, qt_("Numbered"));
487         numberingModule->tocTW->headerItem()->setText(2, qt_("Appears in TOC"));
488
489
490         biblioModule = new UiWidget<Ui::BiblioUi>;
491         connect(biblioModule->citeNatbibRB, SIGNAL(toggled(bool)),
492                 biblioModule->citationStyleL, SLOT(setEnabled(bool)));
493         connect(biblioModule->citeNatbibRB, SIGNAL(toggled(bool)),
494                 biblioModule->citeStyleCO, SLOT(setEnabled(bool)));
495         // biblio
496         connect(biblioModule->citeDefaultRB, SIGNAL(clicked()),
497                 this, SLOT(change_adaptor()));
498         connect(biblioModule->citeNatbibRB, SIGNAL(clicked()),
499                 this, SLOT(change_adaptor()));
500         connect(biblioModule->citeStyleCO, SIGNAL(activated(int)),
501                 this, SLOT(change_adaptor()));
502         connect(biblioModule->citeJurabibRB, SIGNAL(clicked()),
503                 this, SLOT(change_adaptor()));
504         connect(biblioModule->bibtopicCB, SIGNAL(clicked()),
505                 this, SLOT(change_adaptor()));
506         // biblio
507         biblioModule->citeStyleCO->addItem(qt_("Author-year"));
508         biblioModule->citeStyleCO->addItem(qt_("Numerical"));
509         biblioModule->citeStyleCO->setCurrentIndex(0);
510
511
512
513         mathsModule = new UiWidget<Ui::MathsUi>;
514         connect(mathsModule->amsautoCB, SIGNAL(toggled(bool)),
515                 mathsModule->amsCB, SLOT(setDisabled(bool)));
516         connect(mathsModule->esintautoCB, SIGNAL(toggled(bool)),
517                 mathsModule->esintCB, SLOT(setDisabled(bool)));
518         // maths
519         connect(mathsModule->amsCB, SIGNAL(clicked()),
520                 this, SLOT(change_adaptor()));
521         connect(mathsModule->amsautoCB, SIGNAL(clicked()),
522                 this, SLOT(change_adaptor()));
523         connect(mathsModule->esintCB, SIGNAL(clicked()),
524                 this, SLOT(change_adaptor()));
525         connect(mathsModule->esintautoCB, SIGNAL(clicked()),
526                 this, SLOT(change_adaptor()));
527
528         latexModule = new UiWidget<Ui::LaTeXUi>;
529         // latex class
530         connect(latexModule->classCO, SIGNAL(activated(int)),
531                 this, SLOT(change_adaptor()));
532         connect(latexModule->optionsLE, SIGNAL(textChanged(const QString &)),
533                 this, SLOT(change_adaptor()));
534         connect(latexModule->psdriverCO, SIGNAL(activated(int)),
535                 this, SLOT(change_adaptor()));
536         connect(latexModule->classCO, SIGNAL(activated(int)),
537                 this, SLOT(classChanged()));
538         // packages
539         for (int n = 0; tex_graphics[n][0]; ++n) {
540                 QString enc = qt_(tex_graphics_gui[n]);
541                 latexModule->psdriverCO->addItem(enc);
542         }
543         // latex
544         for (TextClassList::const_iterator cit = textclasslist.begin();
545              cit != textclasslist.end(); ++cit) {
546                 if (cit->isTeXClassAvailable()) {
547                         latexModule->classCO->addItem(toqstr(cit->description()));
548                 } else {
549                         docstring item =
550                                 bformat(_("Unavailable: %1$s"), from_utf8(cit->description()));
551                         latexModule->classCO->addItem(toqstr(item));
552                 }
553         }
554
555         // branches
556         branchesModule = new GuiBranches;
557         connect(branchesModule, SIGNAL(changed()),
558                 this, SLOT(change_adaptor()));
559
560         // preamble
561         preambleModule = new PreambleModule;
562         connect(preambleModule, SIGNAL(changed()),
563                 this, SLOT(change_adaptor()));
564
565         // bullets
566         bulletsModule = new BulletsModule;
567         connect(bulletsModule, SIGNAL(changed()),
568                 this, SLOT(change_adaptor()));
569
570
571         // float
572         floatModule = new FloatPlacement;
573         connect(floatModule, SIGNAL(changed()),
574                 this, SLOT(change_adaptor()));
575
576         docPS->addPanel(latexModule, _("Document Class"));
577         docPS->addPanel(fontModule, _("Fonts"));
578         docPS->addPanel(textLayoutModule, _("Text Layout"));
579         docPS->addPanel(pageLayoutModule, _("Page Layout"));
580         docPS->addPanel(marginsModule, _("Page Margins"));
581         docPS->addPanel(langModule, _("Language"));
582         docPS->addPanel(numberingModule, _("Numbering & TOC"));
583         docPS->addPanel(biblioModule, _("Bibliography"));
584         docPS->addPanel(mathsModule, _("Math Options"));
585         docPS->addPanel(floatModule, _("Float Placement"));
586         docPS->addPanel(bulletsModule, _("Bullets"));
587         docPS->addPanel(branchesModule, _("Branches"));
588         docPS->addPanel(preambleModule, _("LaTeX Preamble"));
589         docPS->setCurrentPanel(_("Document Class"));
590 // FIXME: hack to work around resizing bug in Qt >= 4.2
591 // bug verified with Qt 4.2.{0-3} (JSpitzm)
592 #if QT_VERSION >= 0x040200
593         docPS->updateGeometry();
594 #endif
595 }
596
597
598 void GuiDocumentDialog::showPreamble()
599 {
600         docPS->setCurrentPanel(_("LaTeX Preamble"));
601 }
602
603
604 void GuiDocumentDialog::saveDefaultClicked()
605 {
606         form_->saveDocDefault();
607 }
608
609
610 void GuiDocumentDialog::useDefaultsClicked()
611 {
612         form_->useClassDefaults();
613 }
614
615
616 void GuiDocumentDialog::change_adaptor()
617 {
618         form_->changed();
619 }
620
621
622 docstring GuiDocumentDialog::validate_listings_params()
623 {
624         // use a cache here to avoid repeated validation
625         // of the same parameters
626         static string param_cache = string();
627         static docstring msg_cache = docstring();
628         
629         if (textLayoutModule->bypassCB->isChecked())
630                 return docstring();
631
632         string params = fromqstr(textLayoutModule->listingsED->toPlainText());
633         if (params != param_cache) {
634                 param_cache = params;
635                 msg_cache = InsetListingsParams(params).validate();
636         }
637         return msg_cache;
638 }
639
640
641 void GuiDocumentDialog::set_listings_msg()
642 {
643         static bool isOK = true;
644         docstring msg = validate_listings_params();
645         if (msg.empty()) {
646                 if (isOK)
647                         return;
648                 isOK = true;
649                 // listingsTB->setTextColor("black");
650                 textLayoutModule->listingsTB->setPlainText(
651                         qt_("Input listings parameters on the right. Enter ? for a list of parameters."));
652         } else {
653                 isOK = false;
654                 // listingsTB->setTextColor("red");
655                 textLayoutModule->listingsTB->setPlainText(toqstr(msg));
656         }
657 }
658
659
660 void GuiDocumentDialog::closeEvent(QCloseEvent * e)
661 {
662         form_->slotWMHide();
663         e->accept();
664 }
665
666
667 void GuiDocumentDialog::setLSpacing(int item)
668 {
669         textLayoutModule->lspacingLE->setEnabled(item == 3);
670 }
671
672
673 void GuiDocumentDialog::setSkip(int item)
674 {
675         bool const enable = (item == 3);
676         textLayoutModule->skipLE->setEnabled(enable);
677         textLayoutModule->skipLengthCO->setEnabled(enable);
678 }
679
680
681 void GuiDocumentDialog::enableSkip(bool skip)
682 {
683         textLayoutModule->skipCO->setEnabled(skip);
684         textLayoutModule->skipLE->setEnabled(skip);
685         textLayoutModule->skipLengthCO->setEnabled(skip);
686         if (skip)
687                 setSkip(textLayoutModule->skipCO->currentIndex());
688 }
689
690 void GuiDocumentDialog::portraitChanged()
691 {
692         setMargins(pageLayoutModule->papersizeCO->currentIndex());
693 }
694
695 void GuiDocumentDialog::setMargins(bool custom)
696 {
697         marginsModule->marginCB->setChecked(custom);
698         setCustomMargins(custom);
699 }
700
701
702 void GuiDocumentDialog::setCustomPapersize(int papersize)
703 {
704         bool const custom = (papersize == 1);
705
706         pageLayoutModule->paperwidthL->setEnabled(custom);
707         pageLayoutModule->paperwidthLE->setEnabled(custom);
708         pageLayoutModule->paperwidthUnitCO->setEnabled(custom);
709         pageLayoutModule->paperheightL->setEnabled(custom);
710         pageLayoutModule->paperheightLE->setEnabled(custom);
711         pageLayoutModule->paperheightLE->setFocus();
712         pageLayoutModule->paperheightUnitCO->setEnabled(custom);
713 }
714
715
716 void GuiDocumentDialog::setCustomMargins(bool custom)
717 {
718         marginsModule->topL->setEnabled(!custom);
719         marginsModule->topLE->setEnabled(!custom);
720         marginsModule->topUnit->setEnabled(!custom);
721
722         marginsModule->bottomL->setEnabled(!custom);
723         marginsModule->bottomLE->setEnabled(!custom);
724         marginsModule->bottomUnit->setEnabled(!custom);
725
726         marginsModule->innerL->setEnabled(!custom);
727         marginsModule->innerLE->setEnabled(!custom);
728         marginsModule->innerUnit->setEnabled(!custom);
729
730         marginsModule->outerL->setEnabled(!custom);
731         marginsModule->outerLE->setEnabled(!custom);
732         marginsModule->outerUnit->setEnabled(!custom);
733
734         marginsModule->headheightL->setEnabled(!custom);
735         marginsModule->headheightLE->setEnabled(!custom);
736         marginsModule->headheightUnit->setEnabled(!custom);
737
738         marginsModule->headsepL->setEnabled(!custom);
739         marginsModule->headsepLE->setEnabled(!custom);
740         marginsModule->headsepUnit->setEnabled(!custom);
741
742         marginsModule->footskipL->setEnabled(!custom);
743         marginsModule->footskipLE->setEnabled(!custom);
744         marginsModule->footskipUnit->setEnabled(!custom);
745 }
746
747
748 void GuiDocumentDialog::updateFontsize(string const & items, string const & sel)
749 {
750         fontModule->fontsizeCO->clear();
751         fontModule->fontsizeCO->addItem(qt_("Default"));
752
753         for (int n = 0; !token(items,'|',n).empty(); ++n)
754                 fontModule->fontsizeCO->
755                         addItem(toqstr(token(items,'|',n)));
756
757         for (int n = 0; n < fontModule->fontsizeCO->count(); ++n) {
758                 if (fromqstr(fontModule->fontsizeCO->itemText(n)) == sel) {
759                         fontModule->fontsizeCO->setCurrentIndex(n);
760                         break;
761                 }
762         }
763 }
764
765
766 void GuiDocumentDialog::romanChanged(int item)
767 {
768         string const font = tex_fonts_roman[item];
769
770         fontModule->fontScCB->setEnabled(
771                 form_->controller().providesSC(font));
772         fontModule->fontOsfCB->setEnabled(
773                 form_->controller().providesOSF(font));
774 }
775
776
777 void GuiDocumentDialog::sansChanged(int item)
778 {
779         string const font = tex_fonts_sans[item];
780         bool scaleable = form_->controller().providesScale(font);
781         fontModule->scaleSansSB->setEnabled(scaleable);
782         fontModule->scaleSansLA->setEnabled(scaleable);
783 }
784
785
786 void GuiDocumentDialog::ttChanged(int item)
787 {
788         string const font = tex_fonts_monospaced[item];
789         bool scaleable = form_->controller().providesScale(font);
790         fontModule->scaleTypewriterSB->setEnabled(scaleable);
791         fontModule->scaleTypewriterLA->setEnabled(scaleable);
792 }
793
794
795 void GuiDocumentDialog::updatePagestyle(string const & items, string const & sel)
796 {
797         pagestyles.clear();
798         pageLayoutModule->pagestyleCO->clear();
799         pageLayoutModule->pagestyleCO->addItem(qt_("Default"));
800
801         for (int n = 0; !token(items,'|',n).empty(); ++n) {
802                 string style = token(items, '|', n);
803                 docstring style_gui = _(style);
804                 pagestyles.push_back(pair<string, docstring>(style, style_gui));
805                 pageLayoutModule->pagestyleCO->addItem(toqstr(style_gui));
806         }
807
808         if (sel == "default") {
809                 pageLayoutModule->pagestyleCO->setCurrentIndex(0);
810                 return;
811         }
812
813         int n = 0;
814
815         for (size_t i = 0; i < pagestyles.size(); ++i)
816                 if (pagestyles[i].first == sel)
817                         n = pageLayoutModule->pagestyleCO->findText(
818                                         toqstr(pagestyles[i].second));
819
820         if (n > 0)
821                 pageLayoutModule->pagestyleCO->setCurrentIndex(n);
822 }
823
824
825 void GuiDocumentDialog::classChanged()
826 {
827         BufferParams & params = form_->controller().params();
828         textclass_type const tc = latexModule->classCO->currentIndex();
829         params.setJustBaseClass(tc);
830         if (lyxrc.auto_reset_options)
831                 params.useClassDefaults();
832         form_->update_contents();
833 }
834
835
836 void GuiDocumentDialog::updateNumbering()
837 {
838         TextClass const & tclass =
839                 form_->controller().params().getTextClass();
840
841         numberingModule->tocTW->setUpdatesEnabled(false);
842         numberingModule->tocTW->clear();
843
844         int const depth = numberingModule->depthSL->value();
845         int const toc = numberingModule->tocSL->value();
846         QString const no = qt_("No");
847         QString const yes = qt_("Yes");
848         TextClass::const_iterator end = tclass.end();
849         TextClass::const_iterator cit = tclass.begin();
850         QTreeWidgetItem * item = 0;
851         for ( ; cit != end ; ++cit) {
852                 int const toclevel = (*cit)->toclevel;
853                 if (toclevel != Layout::NOT_IN_TOC
854                     && (*cit)->labeltype == LABEL_COUNTER) {
855                         item = new QTreeWidgetItem(numberingModule->tocTW);
856                         item->setText(0, toqstr(translateIfPossible((*cit)->name())));
857                         item->setText(1, (toclevel <= depth) ? yes : no);
858                         item->setText(2, (toclevel <= toc) ? yes : no);
859                 }
860         }
861
862         numberingModule->tocTW->setUpdatesEnabled(true);
863         numberingModule->tocTW->update();
864 }
865
866 void GuiDocumentDialog::apply(BufferParams & params)
867 {
868         // preamble
869         preambleModule->apply(params);
870
871         // biblio
872         params.setCiteEngine(biblio::ENGINE_BASIC);
873
874         if (biblioModule->citeNatbibRB->isChecked()) {
875                 bool const use_numerical_citations =
876                         biblioModule->citeStyleCO->currentIndex();
877                 if (use_numerical_citations)
878                         params.setCiteEngine(biblio::ENGINE_NATBIB_NUMERICAL);
879                 else
880                         params.setCiteEngine(biblio::ENGINE_NATBIB_AUTHORYEAR);
881
882         } else if (biblioModule->citeJurabibRB->isChecked())
883                 params.setCiteEngine(biblio::ENGINE_JURABIB);
884
885         params.use_bibtopic =
886                 biblioModule->bibtopicCB->isChecked();
887
888         // language & quotes
889         if (langModule->defaultencodingCB->isChecked()) {
890                 params.inputenc = "auto";
891         } else {
892                 int i = langModule->encodingCO->currentIndex();
893                 if (i == 0)
894                         params.inputenc = "default";
895                 else
896                         params.inputenc =
897                                 fromqstr(langModule->encodingCO->currentText());
898         }
899
900         InsetQuotes::quote_language lga = InsetQuotes::EnglishQ;
901         switch (langModule->quoteStyleCO->currentIndex()) {
902         case 0:
903                 lga = InsetQuotes::EnglishQ;
904                 break;
905         case 1:
906                 lga = InsetQuotes::SwedishQ;
907                 break;
908         case 2:
909                 lga = InsetQuotes::GermanQ;
910                 break;
911         case 3:
912                 lga = InsetQuotes::PolishQ;
913                 break;
914         case 4:
915                 lga = InsetQuotes::FrenchQ;
916                 break;
917         case 5:
918                 lga = InsetQuotes::DanishQ;
919                 break;
920         }
921         params.quotes_language = lga;
922
923         int const pos = langModule->languageCO->currentIndex();
924         params.language = lyx::languages.getLanguage(lang_[pos]);
925
926         // numbering
927         if (params.getTextClass().hasTocLevels()) {
928                 params.tocdepth = numberingModule->tocSL->value();
929                 params.secnumdepth = numberingModule->depthSL->value();
930         }
931
932         // bullets
933         params.user_defined_bullet(0) = bulletsModule->getBullet(0);
934         params.user_defined_bullet(1) = bulletsModule->getBullet(1);
935         params.user_defined_bullet(2) = bulletsModule->getBullet(2);
936         params.user_defined_bullet(3) = bulletsModule->getBullet(3);
937
938         // packages
939         params.graphicsDriver =
940                 tex_graphics[latexModule->psdriverCO->currentIndex()];
941
942         if (mathsModule->amsautoCB->isChecked()) {
943                 params.use_amsmath = BufferParams::package_auto;
944         } else {
945                 if (mathsModule->amsCB->isChecked())
946                         params.use_amsmath = BufferParams::package_on;
947                 else
948                         params.use_amsmath = BufferParams::package_off;
949         }
950
951         if (mathsModule->esintautoCB->isChecked())
952                 params.use_esint = BufferParams::package_auto;
953         else {
954                 if (mathsModule->esintCB->isChecked())
955                         params.use_esint = BufferParams::package_on;
956                 else
957                         params.use_esint = BufferParams::package_off;
958         }
959
960         // text layout
961         params.setJustBaseClass(latexModule->classCO->currentIndex());
962
963         if (pageLayoutModule->pagestyleCO->currentIndex() == 0)
964                 params.pagestyle = "default";
965         else {
966                 docstring style_gui =
967                         qstring_to_ucs4(pageLayoutModule->pagestyleCO->currentText());
968                 for (size_t i = 0; i < pagestyles.size(); ++i)
969                         if (pagestyles[i].second == style_gui)
970                                 params.pagestyle = pagestyles[i].first;
971         }
972
973         switch (textLayoutModule->lspacingCO->currentIndex()) {
974         case 0:
975                 params.spacing().set(Spacing::Single);
976                 break;
977         case 1:
978                 params.spacing().set(Spacing::Onehalf);
979                 break;
980         case 2:
981                 params.spacing().set(Spacing::Double);
982                 break;
983         case 3:
984                 params.spacing().set(Spacing::Other,
985                         fromqstr(textLayoutModule->lspacingLE->text()));
986                 break;
987         }
988
989         if (textLayoutModule->twoColumnCB->isChecked())
990                 params.columns = 2;
991         else
992                 params.columns = 1;
993
994         // text should have passed validation
995         params.listings_params =
996                 InsetListingsParams(fromqstr(textLayoutModule->listingsED->toPlainText())).params();
997
998         if (textLayoutModule->indentRB->isChecked())
999                 params.paragraph_separation = BufferParams::PARSEP_INDENT;
1000         else
1001                 params.paragraph_separation = BufferParams::PARSEP_SKIP;
1002
1003         switch (textLayoutModule->skipCO->currentIndex()) {
1004         case 0:
1005                 params.setDefSkip(VSpace(VSpace::SMALLSKIP));
1006                 break;
1007         case 1:
1008                 params.setDefSkip(VSpace(VSpace::MEDSKIP));
1009                 break;
1010         case 2:
1011                 params.setDefSkip(VSpace(VSpace::BIGSKIP));
1012                 break;
1013         case 3:
1014         {
1015                 VSpace vs = VSpace(
1016                         widgetsToLength(textLayoutModule->skipLE,
1017                                 textLayoutModule->skipLengthCO)
1018                         );
1019                 params.setDefSkip(vs);
1020                 break;
1021         }
1022         default:
1023                 // DocumentDefskipCB assures that this never happens
1024                 // so Assert then !!!  - jbl
1025                 params.setDefSkip(VSpace(VSpace::MEDSKIP));
1026                 break;
1027         }
1028
1029         params.options =
1030                 fromqstr(latexModule->optionsLE->text());
1031
1032         params.float_placement = floatModule->get();
1033
1034         // fonts
1035         params.fontsRoman =
1036                 tex_fonts_roman[fontModule->fontsRomanCO->currentIndex()];
1037
1038         params.fontsSans =
1039                 tex_fonts_sans[fontModule->fontsSansCO->currentIndex()];
1040
1041         params.fontsTypewriter =
1042                 tex_fonts_monospaced[fontModule->fontsTypewriterCO->currentIndex()];
1043
1044         params.fontsSansScale = fontModule->scaleSansSB->value();
1045
1046         params.fontsTypewriterScale = fontModule->scaleTypewriterSB->value();
1047
1048         params.fontsSC = fontModule->fontScCB->isChecked();
1049
1050         params.fontsOSF = fontModule->fontOsfCB->isChecked();
1051
1052         params.fontsDefaultFamily = ControlDocument::fontfamilies[
1053                 fontModule->fontsDefaultCO->currentIndex()];
1054
1055         if (fontModule->fontsizeCO->currentIndex() == 0)
1056                 params.fontsize = "default";
1057         else
1058                 params.fontsize =
1059                         fromqstr(fontModule->fontsizeCO->currentText());
1060
1061         // paper
1062         params.papersize = PAPER_SIZE(
1063                 pageLayoutModule->papersizeCO->currentIndex());
1064
1065         // custom, A3, B3 and B4 paper sizes need geometry
1066         int psize = pageLayoutModule->papersizeCO->currentIndex();
1067         bool geom_papersize = (psize == 1 || psize == 5 || psize == 8 || psize == 9);
1068
1069         params.paperwidth = widgetsToLength(pageLayoutModule->paperwidthLE,
1070                 pageLayoutModule->paperwidthUnitCO);
1071
1072         params.paperheight = widgetsToLength(pageLayoutModule->paperheightLE,
1073                 pageLayoutModule->paperheightUnitCO);
1074
1075         if (pageLayoutModule->facingPagesCB->isChecked())
1076                 params.sides = TextClass::TwoSides;
1077         else
1078                 params.sides = TextClass::OneSide;
1079
1080         if (pageLayoutModule->landscapeRB->isChecked())
1081                 params.orientation = ORIENTATION_LANDSCAPE;
1082         else
1083                 params.orientation = ORIENTATION_PORTRAIT;
1084
1085         // margins
1086         params.use_geometry =
1087                 (!marginsModule->marginCB->isChecked()
1088                 || geom_papersize);
1089
1090         Ui::MarginsUi const * m(marginsModule);
1091
1092         params.leftmargin = widgetsToLength(m->innerLE, m->innerUnit);
1093
1094         params.topmargin = widgetsToLength(m->topLE, m->topUnit);
1095
1096         params.rightmargin = widgetsToLength(m->outerLE, m->outerUnit);
1097
1098         params.bottommargin = widgetsToLength(m->bottomLE, m->bottomUnit);
1099
1100         params.headheight = widgetsToLength(m->headheightLE, m->headheightUnit);
1101
1102         params.headsep = widgetsToLength(m->headsepLE, m->headsepUnit);
1103
1104         params.footskip = widgetsToLength(m->footskipLE, m->footskipUnit);
1105
1106         branchesModule->apply(params);
1107 }
1108
1109 namespace {
1110
1111 /** Return the position of val in the vector if found.
1112     If not found, return 0.
1113  */
1114 template<class A>
1115 typename std::vector<A>::size_type
1116 findPos(std::vector<A> const & vec, A const & val)
1117 {
1118         typename std::vector<A>::const_iterator it =
1119                 std::find(vec.begin(), vec.end(), val);
1120         if (it == vec.end())
1121                 return 0;
1122         return distance(vec.begin(), it);
1123 }
1124
1125 } // namespace anom
1126
1127
1128 void GuiDocumentDialog::updateParams(BufferParams const & params)
1129 {
1130         // set the default unit
1131         // FIXME: move to controller
1132         Length::UNIT defaultUnit = Length::CM;
1133         switch (lyxrc.default_papersize) {
1134                 case PAPER_DEFAULT: break;
1135
1136                 case PAPER_USLETTER:
1137                 case PAPER_USLEGAL:
1138                 case PAPER_USEXECUTIVE:
1139                         defaultUnit = Length::IN;
1140                         break;
1141
1142                 case PAPER_A3:
1143                 case PAPER_A4:
1144                 case PAPER_A5:
1145                 case PAPER_B3:
1146                 case PAPER_B4:
1147                 case PAPER_B5:
1148                         defaultUnit = Length::CM;
1149                         break;
1150                 case PAPER_CUSTOM:
1151                         break;
1152         }
1153
1154         // preamble
1155         preambleModule->update(params, form_->controller().id());
1156
1157         // biblio
1158         biblioModule->citeDefaultRB->setChecked(
1159                 params.getEngine() == biblio::ENGINE_BASIC);
1160
1161         biblioModule->citeNatbibRB->setChecked(
1162                 params.getEngine() == biblio::ENGINE_NATBIB_NUMERICAL ||
1163                 params.getEngine() == biblio::ENGINE_NATBIB_AUTHORYEAR);
1164
1165         biblioModule->citeStyleCO->setCurrentIndex(
1166                 params.getEngine() == biblio::ENGINE_NATBIB_NUMERICAL);
1167
1168         biblioModule->citeJurabibRB->setChecked(
1169                 params.getEngine() == biblio::ENGINE_JURABIB);
1170
1171         biblioModule->bibtopicCB->setChecked(
1172                 params.use_bibtopic);
1173
1174         // language & quotes
1175         int const pos = int(findPos(lang_,
1176                                     params.language->lang()));
1177         langModule->languageCO->setCurrentIndex(pos);
1178
1179         langModule->quoteStyleCO->setCurrentIndex(
1180                 params.quotes_language);
1181
1182         langModule->defaultencodingCB->setChecked(true);
1183
1184         if (params.inputenc != "auto") {
1185                 langModule->defaultencodingCB->setChecked(false);
1186                 if (params.inputenc == "default") {
1187                         langModule->encodingCO->setCurrentIndex(0);
1188                 } else {
1189                         int const i = langModule->encodingCO->findText(
1190                                         toqstr(params.inputenc));
1191                         if (i >= 0)
1192                                 langModule->encodingCO->setCurrentIndex(i);
1193                         else
1194                                 // unknown encoding. Set to default.
1195                                 langModule->defaultencodingCB->setChecked(true);
1196                 }
1197         }
1198
1199         // numbering
1200         int const min_toclevel = form_->controller().textClass().min_toclevel();
1201         int const max_toclevel = form_->controller().textClass().max_toclevel();
1202         if (form_->controller().textClass().hasTocLevels()) {
1203                 numberingModule->setEnabled(true);
1204                 numberingModule->depthSL->setMinimum(min_toclevel - 1);
1205                 numberingModule->depthSL->setMaximum(max_toclevel);
1206                 numberingModule->depthSL->setValue(params.secnumdepth);
1207                 numberingModule->tocSL->setMaximum(min_toclevel - 1);
1208                 numberingModule->tocSL->setMaximum(max_toclevel);
1209                 numberingModule->tocSL->setValue(params.tocdepth);
1210                 updateNumbering();
1211         } else {
1212                 numberingModule->setEnabled(false);
1213                 numberingModule->tocTW->clear();
1214         }
1215
1216         // bullets
1217         bulletsModule->setBullet(0, params.user_defined_bullet(0));
1218         bulletsModule->setBullet(1, params.user_defined_bullet(1));
1219         bulletsModule->setBullet(2, params.user_defined_bullet(2));
1220         bulletsModule->setBullet(3, params.user_defined_bullet(3));
1221         bulletsModule->init();
1222
1223         // packages
1224         int nitem = findToken(tex_graphics, params.graphicsDriver);
1225         if (nitem >= 0)
1226                 latexModule->psdriverCO->setCurrentIndex(nitem);
1227
1228         mathsModule->amsCB->setChecked(
1229                 params.use_amsmath == BufferParams::package_on);
1230         mathsModule->amsautoCB->setChecked(
1231                 params.use_amsmath == BufferParams::package_auto);
1232
1233         mathsModule->esintCB->setChecked(
1234                 params.use_esint == BufferParams::package_on);
1235         mathsModule->esintautoCB->setChecked(
1236                 params.use_esint == BufferParams::package_auto);
1237
1238         switch (params.spacing().getSpace()) {
1239                 case Spacing::Other: nitem = 3; break;
1240                 case Spacing::Double: nitem = 2; break;
1241                 case Spacing::Onehalf: nitem = 1; break;
1242                 case Spacing::Default: case Spacing::Single: nitem = 0; break;
1243         }
1244
1245         // text layout
1246         latexModule->classCO->setCurrentIndex(params.getBaseClass());
1247
1248         updatePagestyle(form_->controller().textClass().opt_pagestyle(),
1249                                  params.pagestyle);
1250
1251         textLayoutModule->lspacingCO->setCurrentIndex(nitem);
1252         if (params.spacing().getSpace() == Spacing::Other) {
1253                 textLayoutModule->lspacingLE->setText(
1254                         toqstr(params.spacing().getValueAsString()));
1255         }
1256         setLSpacing(nitem);
1257
1258         if (params.paragraph_separation
1259             == BufferParams::PARSEP_INDENT) {
1260                 textLayoutModule->indentRB->setChecked(true);
1261         } else {
1262                 textLayoutModule->skipRB->setChecked(true);
1263         }
1264
1265         int skip = 0;
1266         switch (params.getDefSkip().kind()) {
1267         case VSpace::SMALLSKIP:
1268                 skip = 0;
1269                 break;
1270         case VSpace::MEDSKIP:
1271                 skip = 1;
1272                 break;
1273         case VSpace::BIGSKIP:
1274                 skip = 2;
1275                 break;
1276         case VSpace::LENGTH:
1277         {
1278                 skip = 3;
1279                 string const length = params.getDefSkip().asLyXCommand();
1280                 lengthToWidgets(textLayoutModule->skipLE,
1281                         textLayoutModule->skipLengthCO,
1282                         length, defaultUnit);
1283                 break;
1284         }
1285         default:
1286                 skip = 0;
1287                 break;
1288         }
1289         textLayoutModule->skipCO->setCurrentIndex(skip);
1290         setSkip(skip);
1291
1292         textLayoutModule->twoColumnCB->setChecked(
1293                 params.columns == 2);
1294
1295         // break listings_params to multiple lines
1296         string lstparams =
1297                 InsetListingsParams(params.listings_params).separatedParams();
1298         textLayoutModule->listingsED->setPlainText(toqstr(lstparams));
1299
1300         if (!params.options.empty()) {
1301                 latexModule->optionsLE->setText(
1302                         toqstr(params.options));
1303         } else {
1304                 latexModule->optionsLE->setText("");
1305         }
1306
1307         floatModule->set(params.float_placement);
1308
1309         //fonts
1310         updateFontsize(form_->controller().textClass().opt_fontsize(),
1311                         params.fontsize);
1312
1313         int n = findToken(tex_fonts_roman, params.fontsRoman);
1314         if (n >= 0) {
1315                 fontModule->fontsRomanCO->setCurrentIndex(n);
1316                 romanChanged(n);
1317         }
1318
1319         n = findToken(tex_fonts_sans, params.fontsSans);
1320         if (n >= 0)     {
1321                 fontModule->fontsSansCO->setCurrentIndex(n);
1322                 sansChanged(n);
1323         }
1324
1325         n = findToken(tex_fonts_monospaced, params.fontsTypewriter);
1326         if (n >= 0) {
1327                 fontModule->fontsTypewriterCO->setCurrentIndex(n);
1328                 ttChanged(n);
1329         }
1330
1331         fontModule->fontScCB->setChecked(params.fontsSC);
1332         fontModule->fontOsfCB->setChecked(params.fontsOSF);
1333         fontModule->scaleSansSB->setValue(params.fontsSansScale);
1334         fontModule->scaleTypewriterSB->setValue(params.fontsTypewriterScale);
1335         n = findToken(ControlDocument::fontfamilies, params.fontsDefaultFamily);
1336         if (n >= 0)
1337                 fontModule->fontsDefaultCO->setCurrentIndex(n);
1338
1339         // paper
1340         int const psize = params.papersize;
1341         pageLayoutModule->papersizeCO->setCurrentIndex(psize);
1342         setCustomPapersize(psize);
1343
1344         bool const landscape =
1345                 params.orientation == ORIENTATION_LANDSCAPE;
1346         pageLayoutModule->landscapeRB->setChecked(landscape);
1347         pageLayoutModule->portraitRB->setChecked(!landscape);
1348
1349         pageLayoutModule->facingPagesCB->setChecked(
1350                 params.sides == TextClass::TwoSides);
1351
1352
1353         lengthToWidgets(pageLayoutModule->paperwidthLE,
1354                 pageLayoutModule->paperwidthUnitCO, params.paperwidth, defaultUnit);
1355
1356         lengthToWidgets(pageLayoutModule->paperheightLE,
1357                 pageLayoutModule->paperheightUnitCO, params.paperheight, defaultUnit);
1358
1359         // margins
1360         Ui::MarginsUi * m = marginsModule;
1361
1362         setMargins(!params.use_geometry);
1363
1364         lengthToWidgets(m->topLE, m->topUnit,
1365                 params.topmargin, defaultUnit);
1366
1367         lengthToWidgets(m->bottomLE, m->bottomUnit,
1368                 params.bottommargin, defaultUnit);
1369
1370         lengthToWidgets(m->innerLE, m->innerUnit,
1371                 params.leftmargin, defaultUnit);
1372
1373         lengthToWidgets(m->outerLE, m->outerUnit,
1374                 params.rightmargin, defaultUnit);
1375
1376         lengthToWidgets(m->headheightLE, m->headheightUnit,
1377                 params.headheight, defaultUnit);
1378
1379         lengthToWidgets(m->headsepLE, m->headsepUnit,
1380                 params.headsep, defaultUnit);
1381
1382         lengthToWidgets(m->footskipLE, m->footskipUnit,
1383                 params.footskip, defaultUnit);
1384
1385         branchesModule->update(params);
1386 }
1387
1388
1389 /////////////////////////////////////////////////////////////////////
1390 //
1391 // GuiDocument
1392 //
1393 /////////////////////////////////////////////////////////////////////
1394
1395
1396 GuiDocument::GuiDocument(Dialog & parent)
1397         : GuiView<GuiDocumentDialog>(parent, _("Document Settings"))
1398 {}
1399
1400
1401 void GuiDocument::build_dialog()
1402 {
1403         dialog_.reset(new GuiDocumentDialog(this));
1404 }
1405
1406
1407 void GuiDocument::showPreamble()
1408 {
1409         dialog_->showPreamble();
1410 }
1411
1412
1413 void GuiDocument::apply()
1414 {
1415         if (!dialog_.get())
1416                 return;
1417
1418         dialog_->apply(controller().params());
1419 }
1420
1421
1422 void GuiDocument::update_contents()
1423 {
1424         if (!dialog_.get())
1425                 return;
1426
1427         dialog_->updateParams(controller().params());
1428 }
1429
1430 void GuiDocument::saveDocDefault()
1431 {
1432         // we have to apply the params first
1433         apply();
1434         controller().saveAsDefault();
1435 }
1436
1437
1438 void GuiDocument::useClassDefaults()
1439 {
1440         BufferParams & params = controller().params();
1441
1442         params.setJustBaseClass(dialog_->latexModule->classCO->currentIndex());
1443
1444         params.useClassDefaults();
1445         update_contents();
1446 }
1447
1448
1449 bool GuiDocument::isValid()
1450 {
1451         return dialog_->validate_listings_params().empty();
1452 }
1453
1454
1455 } // namespace frontend
1456 } // namespace lyx
1457
1458 #include "GuiDocument_moc.cpp"