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