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