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