]> git.lyx.org Git - features.git/blob - src/frontends/qt4/GuiDocument.cpp
Move Color::color enum to ColorCode.h
[features.git] / src / frontends / qt4 / GuiDocument.cpp
1 /**
2  * \file GuiDocument.cpp
3  * This file is part of LyX, the document processor.
4  * Licence details can be found in the file COPYING.
5  *
6  * \author Edwin Leuven
7  * \author Richard Heck (modules)
8  *
9  * Full author contact details are available in file CREDITS.
10  */
11
12 #include <config.h>
13
14 #include "GuiDocument.h"
15
16 #include "BranchList.h"
17 #include "buffer_funcs.h"
18 #include "Buffer.h"
19 #include "BufferParams.h"
20 #include "BufferView.h"
21 #include "Encoding.h"
22 #include "FloatPlacement.h"
23 #include "frontend_helpers.h"
24 #include "FuncRequest.h"
25 #include "gettext.h"
26 #include "GuiBranches.h"
27 #include "Language.h"
28 #include "LaTeXFeatures.h"
29 #include "LaTeXHighlighter.h"
30 #include "Layout.h"
31 #include "LengthCombo.h"
32 #include "LyXRC.h" // defaultUnit
33 #include "ModuleList.h"
34 #include "OutputParams.h"
35 #include "PanelStack.h"
36 #include "PDFOptions.h"
37 #include "qt_helpers.h"
38 #include "Spacing.h"
39 #include "TextClassList.h"
40 #include "Validator.h"
41
42
43 // FIXME: those two headers are needed because of the
44 // WorkArea::redraw() call below.
45 #include "frontends/LyXView.h"
46 #include "frontends/WorkArea.h"
47
48 #include "insets/InsetListingsParams.h"
49
50 #include "support/lstrings.h"
51
52 #include <boost/bind.hpp>
53
54 #include <QCloseEvent>
55 #include <QScrollBar>
56 #include <QTextCursor>
57
58 #include <algorithm>
59 #include <sstream>
60
61 using std::distance;
62 using std::make_pair;
63 using std::pair;
64 using std::vector;
65 using std::string;
66 using std::ostringstream;
67 using std::sort;
68
69 ///
70 template<class Pair>
71 std::vector<typename Pair::second_type> const
72 getSecond(std::vector<Pair> const & pr)
73 {
74          std::vector<typename Pair::second_type> tmp(pr.size());
75          std::transform(pr.begin(), pr.end(), tmp.begin(),
76                                          boost::bind(&Pair::second, _1));
77          return tmp;
78 }
79
80 char const * const tex_graphics[] =
81 {
82         "default", "dvips", "dvitops", "emtex",
83         "ln", "oztex", "textures", "none", ""
84 };
85
86
87 char const * const tex_graphics_gui[] =
88 {
89         N_("Default"), "Dvips", "DVItoPS", "EmTeX",
90         "LN", "OzTeX", "Textures", N_("None"), ""
91 };
92
93
94 char const * const tex_fonts_roman[] =
95 {
96         "default", "cmr", "lmodern", "ae", "times", "palatino",
97         "charter", "newcent", "bookman", "utopia", "beraserif",
98         "ccfonts", "chancery", ""
99 };
100
101
102 char const * tex_fonts_roman_gui[] =
103 {
104         N_("Default"), N_("Computer Modern Roman"), N_("Latin Modern Roman"),
105         N_("AE (Almost European)"), N_("Times Roman"), N_("Palatino"),
106         N_("Bitstream Charter"), N_("New Century Schoolbook"), N_("Bookman"),
107         N_("Utopia"),  N_("Bera Serif"), N_("Concrete Roman"), N_("Zapf Chancery"),
108         ""
109 };
110
111
112 char const * const tex_fonts_sans[] =
113 {
114         "default", "cmss", "lmss", "helvet", "avant", "berasans", "cmbr", ""
115 };
116
117
118 char const * tex_fonts_sans_gui[] =
119 {
120         N_("Default"), N_("Computer Modern Sans"), N_("Latin Modern Sans"),
121         N_("Helvetica"), N_("Avant Garde"), N_("Bera Sans"), N_("CM Bright"), ""
122 };
123
124
125 char const * const tex_fonts_monospaced[] =
126 {
127         "default", "cmtt", "lmtt", "courier", "beramono", "luximono", "cmtl", ""
128 };
129
130
131 char const * tex_fonts_monospaced_gui[] =
132 {
133         N_("Default"), N_("Computer Modern Typewriter"),
134         N_("Latin Modern Typewriter"), N_("Courier"), N_("Bera Mono"),
135         N_("LuxiMono"), N_("CM Typewriter Light"), ""
136 };
137
138
139 vector<pair<string, lyx::docstring> > pagestyles;
140
141
142 namespace lyx {
143 namespace frontend {
144
145 using support::token;
146 using support::bformat;
147 using support::findToken;
148 using support::getVectorFromString;
149
150 /////////////////////////////////////////////////////////////////////
151 //
152 // PreambleModule
153 //
154 /////////////////////////////////////////////////////////////////////
155
156 PreambleModule::PreambleModule(): current_id_(0)
157 {
158         // This is not a memory leak. The object will be destroyed
159         // with this.
160         (void) new LaTeXHighlighter(preambleTE->document());
161         setFocusProxy(preambleTE);
162         connect(preambleTE, SIGNAL(textChanged()), this, SIGNAL(changed()));
163 }
164
165
166 void PreambleModule::update(BufferParams const & params, BufferId id)
167 {
168         QString preamble = toqstr(params.preamble);
169         // Nothing to do if the params and preamble are unchanged.
170         if (id == current_id_
171                 && preamble == preambleTE->document()->toPlainText())
172                 return;
173
174         QTextCursor cur = preambleTE->textCursor();
175         // Save the coords before switching to the new one.
176         preamble_coords_[current_id_] =
177                 make_pair(cur.position(), preambleTE->verticalScrollBar()->value());
178
179         // Save the params address for further use.
180         current_id_ = id;
181         preambleTE->document()->setPlainText(preamble);
182         Coords::const_iterator it = preamble_coords_.find(current_id_);
183         if (it == preamble_coords_.end())
184                 // First time we open this one.
185                 preamble_coords_[current_id_] = make_pair(0,0);
186         else {
187                 // Restore saved coords.
188                 QTextCursor cur = preambleTE->textCursor();
189                 cur.setPosition(it->second.first);
190                 preambleTE->setTextCursor(cur);
191                 preambleTE->verticalScrollBar()->setValue(it->second.second);
192         }
193 }
194
195
196 void PreambleModule::apply(BufferParams & params)
197 {
198         params.preamble = fromqstr(preambleTE->document()->toPlainText());
199 }
200
201
202 void PreambleModule::closeEvent(QCloseEvent * e)
203 {
204         // Save the coords before closing.
205         QTextCursor cur = preambleTE->textCursor();
206         preamble_coords_[current_id_] =
207                 make_pair(cur.position(), preambleTE->verticalScrollBar()->value());
208         e->accept();
209 }
210
211
212 /////////////////////////////////////////////////////////////////////
213 //
214 // DocumentDialog
215 //
216 /////////////////////////////////////////////////////////////////////
217
218
219
220 GuiDocument::GuiDocument(LyXView & lv)
221         : GuiDialog(lv, "document")
222 {
223         setupUi(this);
224         setViewTitle(_("Document Settings"));
225
226         lang_ = getSecond(getLanguageData(false));
227
228         connect(okPB, SIGNAL(clicked()), this, SLOT(slotOK()));
229         connect(applyPB, SIGNAL(clicked()), this, SLOT(slotApply()));
230         connect(closePB, SIGNAL(clicked()), this, SLOT(slotClose()));
231         connect(restorePB, SIGNAL(clicked()), this, SLOT(slotRestore()));
232
233         connect(savePB, SIGNAL(clicked()), this, SLOT(saveDefaultClicked()));
234         connect(defaultPB, SIGNAL(clicked()), this, SLOT(useDefaultsClicked()));
235
236         // Manage the restore, ok, apply, restore and cancel/close buttons
237         bc().setPolicy(ButtonPolicy::NoRepeatedApplyReadOnlyPolicy);
238         bc().setOK(okPB);
239         bc().setApply(applyPB);
240         bc().setCancel(closePB);
241         bc().setRestore(restorePB);
242
243         textLayoutModule = new UiWidget<Ui::TextLayoutUi>;
244         // text layout
245         connect(textLayoutModule->lspacingCO, SIGNAL(activated(int)),
246                 this, SLOT(change_adaptor()));
247         connect(textLayoutModule->lspacingCO, SIGNAL(activated(int)),
248                 this, SLOT(setLSpacing(int)));
249         connect(textLayoutModule->lspacingLE, SIGNAL(textChanged(const QString&)),
250                 this, SLOT(change_adaptor()));
251         connect(textLayoutModule->skipRB, SIGNAL(clicked()),
252                 this, SLOT(change_adaptor()));
253         connect(textLayoutModule->indentRB, SIGNAL(clicked()),
254                 this, SLOT(change_adaptor()));
255         connect(textLayoutModule->skipCO, SIGNAL(activated(int)),
256                 this, SLOT(change_adaptor()));
257         connect(textLayoutModule->skipLE, SIGNAL(textChanged(const QString &)),
258                 this, SLOT(change_adaptor()));
259         connect(textLayoutModule->skipLengthCO, SIGNAL(activated(int)),
260                 this, SLOT(change_adaptor()));
261         connect(textLayoutModule->skipCO, SIGNAL(activated(int)),
262                 this, SLOT(setSkip(int)));
263         connect(textLayoutModule->skipRB, SIGNAL(toggled(bool)),
264                 this, SLOT(enableSkip(bool)));
265         connect(textLayoutModule->twoColumnCB, SIGNAL(clicked()),
266                 this, SLOT(change_adaptor()));
267         connect(textLayoutModule->listingsED, SIGNAL(textChanged()),
268                 this, SLOT(change_adaptor()));
269         connect(textLayoutModule->bypassCB, SIGNAL(clicked()), 
270                 this, SLOT(change_adaptor()));
271         connect(textLayoutModule->bypassCB, SIGNAL(clicked()), 
272                 this, SLOT(set_listings_msg()));
273         connect(textLayoutModule->listingsED, SIGNAL(textChanged()),
274                 this, SLOT(set_listings_msg()));
275         textLayoutModule->listingsTB->setPlainText(
276                 qt_("Input listings parameters on the right. Enter ? for a list of parameters."));
277         textLayoutModule->lspacingLE->setValidator(new QDoubleValidator(
278                 textLayoutModule->lspacingLE));
279         textLayoutModule->skipLE->setValidator(unsignedLengthValidator(
280                 textLayoutModule->skipLE));
281
282         textLayoutModule->skipCO->addItem(qt_("SmallSkip"));
283         textLayoutModule->skipCO->addItem(qt_("MedSkip"));
284         textLayoutModule->skipCO->addItem(qt_("BigSkip"));
285         textLayoutModule->skipCO->addItem(qt_("Length"));
286         // remove the %-items from the unit choice
287         textLayoutModule->skipLengthCO->noPercents();
288         textLayoutModule->lspacingCO->insertItem(
289                 Spacing::Single, qt_("Single"));
290         textLayoutModule->lspacingCO->insertItem(
291                 Spacing::Onehalf, qt_("OneHalf"));
292         textLayoutModule->lspacingCO->insertItem(
293                 Spacing::Double, qt_("Double"));
294         textLayoutModule->lspacingCO->insertItem(
295                 Spacing::Other, qt_("Custom"));
296
297         // initialize the length validator
298         bc().addCheckedLineEdit(textLayoutModule->skipLE);
299
300         fontModule = new UiWidget<Ui::FontUi>;
301         // fonts
302         connect(fontModule->fontsRomanCO, SIGNAL(activated(int)),
303                 this, SLOT(change_adaptor()));
304         connect(fontModule->fontsRomanCO, SIGNAL(activated(int)),
305                 this, SLOT(romanChanged(int)));
306         connect(fontModule->fontsSansCO, SIGNAL(activated(int)),
307                 this, SLOT(change_adaptor()));
308         connect(fontModule->fontsSansCO, SIGNAL(activated(int)),
309                 this, SLOT(sansChanged(int)));
310         connect(fontModule->fontsTypewriterCO, SIGNAL(activated(int)),
311                 this, SLOT(change_adaptor()));
312         connect(fontModule->fontsTypewriterCO, SIGNAL(activated(int)),
313                 this, SLOT(ttChanged(int)));
314         connect(fontModule->fontsDefaultCO, SIGNAL(activated(int)),
315                 this, SLOT(change_adaptor()));
316         connect(fontModule->fontsizeCO, SIGNAL(activated(int)),
317                 this, SLOT(change_adaptor()));
318         connect(fontModule->scaleSansSB, SIGNAL(valueChanged(int)),
319                 this, SLOT(change_adaptor()));
320         connect(fontModule->scaleTypewriterSB, SIGNAL(valueChanged(int)),
321                 this, SLOT(change_adaptor()));
322         connect(fontModule->fontScCB, SIGNAL(clicked()),
323                 this, SLOT(change_adaptor()));
324         connect(fontModule->fontOsfCB, SIGNAL(clicked()),
325                 this, SLOT(change_adaptor()));
326
327         for (int n = 0; tex_fonts_roman[n][0]; ++n) {
328                 QString font = qt_(tex_fonts_roman_gui[n]);
329                 if (!isFontAvailable(tex_fonts_roman[n]))
330                         font += qt_(" (not installed)");
331                 fontModule->fontsRomanCO->addItem(font);
332         }
333         for (int n = 0; tex_fonts_sans[n][0]; ++n) {
334                 QString font = qt_(tex_fonts_sans_gui[n]);
335                 if (!isFontAvailable(tex_fonts_sans[n]))
336                         font += qt_(" (not installed)");
337                 fontModule->fontsSansCO->addItem(font);
338         }
339         for (int n = 0; tex_fonts_monospaced[n][0]; ++n) {
340                 QString font = qt_(tex_fonts_monospaced_gui[n]);
341                 if (!isFontAvailable(tex_fonts_monospaced[n]))
342                         font += qt_(" (not installed)");
343                 fontModule->fontsTypewriterCO->addItem(font);
344         }
345
346         fontModule->fontsizeCO->addItem(qt_("Default"));
347         fontModule->fontsizeCO->addItem(qt_("10"));
348         fontModule->fontsizeCO->addItem(qt_("11"));
349         fontModule->fontsizeCO->addItem(qt_("12"));
350
351         for (int n = 0; GuiDocument::fontfamilies_gui[n][0]; ++n)
352                 fontModule->fontsDefaultCO->addItem(
353                         qt_(GuiDocument::fontfamilies_gui[n]));
354
355
356         pageLayoutModule = new UiWidget<Ui::PageLayoutUi>;
357         // page layout
358         connect(pageLayoutModule->papersizeCO, SIGNAL(activated(int)),
359                 this, SLOT(setCustomPapersize(int)));
360         connect(pageLayoutModule->papersizeCO, SIGNAL(activated(int)),
361                 this, SLOT(setCustomPapersize(int)));
362         connect(pageLayoutModule->portraitRB, SIGNAL(clicked()),
363                 this, SLOT(portraitChanged()));
364         connect(pageLayoutModule->papersizeCO, SIGNAL(activated(int)),
365                 this, SLOT(change_adaptor()));
366         connect(pageLayoutModule->paperheightLE, SIGNAL(textChanged(const QString &)),
367                 this, SLOT(change_adaptor()));
368         connect(pageLayoutModule->paperwidthLE, SIGNAL(textChanged(const QString &)),
369                 this, SLOT(change_adaptor()));
370         connect(pageLayoutModule->paperwidthUnitCO, SIGNAL(activated(int)),
371                 this, SLOT(change_adaptor()));
372         connect(pageLayoutModule->paperheightUnitCO, SIGNAL(activated(int)),
373                 this, SLOT(change_adaptor()));
374         connect(pageLayoutModule->portraitRB, SIGNAL(clicked()),
375                 this, SLOT(change_adaptor()));
376         connect(pageLayoutModule->landscapeRB, SIGNAL(clicked()),
377                 this, SLOT(change_adaptor()));
378         connect(pageLayoutModule->facingPagesCB, SIGNAL(clicked()),
379                 this, SLOT(change_adaptor()));
380         connect(pageLayoutModule->pagestyleCO, SIGNAL(activated(int)),
381                 this, SLOT(change_adaptor()));
382
383         pageLayoutModule->pagestyleCO->addItem(qt_("Default"));
384         pageLayoutModule->pagestyleCO->addItem(qt_("empty"));
385         pageLayoutModule->pagestyleCO->addItem(qt_("plain"));
386         pageLayoutModule->pagestyleCO->addItem(qt_("headings"));
387         pageLayoutModule->pagestyleCO->addItem(qt_("fancy"));
388         bc().addCheckedLineEdit(pageLayoutModule->paperheightLE,
389                 pageLayoutModule->paperheightL);
390         bc().addCheckedLineEdit(pageLayoutModule->paperwidthLE,
391                 pageLayoutModule->paperwidthL);
392
393         // paper
394         QComboBox * cb = pageLayoutModule->papersizeCO;
395         cb->addItem(qt_("Default"));
396         cb->addItem(qt_("Custom"));
397         cb->addItem(qt_("US letter"));
398         cb->addItem(qt_("US legal"));
399         cb->addItem(qt_("US executive"));
400         cb->addItem(qt_("A3"));
401         cb->addItem(qt_("A4"));
402         cb->addItem(qt_("A5"));
403         cb->addItem(qt_("B3"));
404         cb->addItem(qt_("B4"));
405         cb->addItem(qt_("B5"));
406         // remove the %-items from the unit choice
407         pageLayoutModule->paperwidthUnitCO->noPercents();
408         pageLayoutModule->paperheightUnitCO->noPercents();
409         pageLayoutModule->paperheightLE->setValidator(unsignedLengthValidator(
410                 pageLayoutModule->paperheightLE));
411         pageLayoutModule->paperwidthLE->setValidator(unsignedLengthValidator(
412                 pageLayoutModule->paperwidthLE));
413
414
415         marginsModule = new UiWidget<Ui::MarginsUi>;
416         // margins
417         connect(marginsModule->marginCB, SIGNAL(toggled(bool)),
418                 this, SLOT(setCustomMargins(bool)));
419         connect(marginsModule->marginCB, SIGNAL(clicked()),
420                 this, SLOT(change_adaptor()));
421         connect(marginsModule->topLE, SIGNAL(textChanged(const QString &)),
422                 this, SLOT(change_adaptor()));
423         connect(marginsModule->topUnit, SIGNAL(activated(int)),
424                 this, SLOT(change_adaptor()));
425         connect(marginsModule->bottomLE, SIGNAL(textChanged(const QString &)),
426                 this, SLOT(change_adaptor()));
427         connect(marginsModule->bottomUnit, SIGNAL(activated(int)),
428                 this, SLOT(change_adaptor()));
429         connect(marginsModule->innerLE, SIGNAL(textChanged(const QString &)),
430                 this, SLOT(change_adaptor()));
431         connect(marginsModule->innerUnit, SIGNAL(activated(int)),
432                 this, SLOT(change_adaptor()));
433         connect(marginsModule->outerLE, SIGNAL(textChanged(const QString &)),
434                 this, SLOT(change_adaptor()));
435         connect(marginsModule->outerUnit, SIGNAL(activated(int)),
436                 this, SLOT(change_adaptor()));
437         connect(marginsModule->headheightLE, SIGNAL(textChanged(const QString &)),
438                 this, SLOT(change_adaptor()));
439         connect(marginsModule->headheightUnit, SIGNAL(activated(int)),
440                 this, SLOT(change_adaptor()));
441         connect(marginsModule->headsepLE, SIGNAL(textChanged(const QString &)),
442                 this, SLOT(change_adaptor()));
443         connect(marginsModule->headsepUnit, SIGNAL(activated(int)),
444                 this, SLOT(change_adaptor()));
445         connect(marginsModule->footskipLE, SIGNAL(textChanged(const QString&)),
446                 this, SLOT(change_adaptor()));
447         connect(marginsModule->footskipUnit, SIGNAL(activated(int)),
448                 this, SLOT(change_adaptor()));
449         marginsModule->topLE->setValidator(unsignedLengthValidator(
450                 marginsModule->topLE));
451         marginsModule->bottomLE->setValidator(unsignedLengthValidator(
452                 marginsModule->bottomLE));
453         marginsModule->innerLE->setValidator(unsignedLengthValidator(
454                 marginsModule->innerLE));
455         marginsModule->outerLE->setValidator(unsignedLengthValidator(
456                 marginsModule->outerLE));
457         marginsModule->headsepLE->setValidator(unsignedLengthValidator(
458                 marginsModule->headsepLE));
459         marginsModule->headheightLE->setValidator(unsignedLengthValidator(
460                 marginsModule->headheightLE));
461         marginsModule->footskipLE->setValidator(unsignedLengthValidator(
462                 marginsModule->footskipLE));
463
464         bc().addCheckedLineEdit(marginsModule->topLE,
465                 marginsModule->topL);
466         bc().addCheckedLineEdit(marginsModule->bottomLE,
467                 marginsModule->bottomL);
468         bc().addCheckedLineEdit(marginsModule->innerLE,
469                 marginsModule->innerL);
470         bc().addCheckedLineEdit(marginsModule->outerLE,
471                 marginsModule->outerL);
472         bc().addCheckedLineEdit(marginsModule->headsepLE,
473                 marginsModule->headsepL);
474         bc().addCheckedLineEdit(marginsModule->headheightLE,
475                 marginsModule->headheightL);
476         bc().addCheckedLineEdit(marginsModule->footskipLE,
477                 marginsModule->footskipL);
478
479
480         langModule = new UiWidget<Ui::LanguageUi>;
481         // language & quote
482         connect(langModule->languageCO, SIGNAL(activated(int)),
483                 this, SLOT(change_adaptor()));
484         connect(langModule->defaultencodingRB, SIGNAL(clicked()),
485                 this, SLOT(change_adaptor()));
486         connect(langModule->otherencodingRB, SIGNAL(clicked()),
487                 this, SLOT(change_adaptor()));
488         connect(langModule->encodingCO, SIGNAL(activated(int)),
489                 this, SLOT(change_adaptor()));
490         connect(langModule->quoteStyleCO, SIGNAL(activated(int)),
491                 this, SLOT(change_adaptor()));
492         // language & quotes
493         vector<LanguagePair> const langs = getLanguageData(false);
494         vector<LanguagePair>::const_iterator lit  = langs.begin();
495         vector<LanguagePair>::const_iterator lend = langs.end();
496         for (; lit != lend; ++lit) {
497                 langModule->languageCO->addItem(toqstr(lit->first));
498         }
499
500         // Always put the default encoding in the first position.
501         // It is special because the displayed text is translated.
502         langModule->encodingCO->addItem(qt_("LaTeX default"));
503         Encodings::const_iterator it = encodings.begin();
504         Encodings::const_iterator const end = encodings.end();
505         for (; it != end; ++it)
506                 langModule->encodingCO->addItem(toqstr(it->latexName()));
507
508         langModule->quoteStyleCO->addItem(qt_("``text''"));
509         langModule->quoteStyleCO->addItem(qt_("''text''"));
510         langModule->quoteStyleCO->addItem(qt_(",,text``"));
511         langModule->quoteStyleCO->addItem(qt_(",,text''"));
512         langModule->quoteStyleCO->addItem(qt_("<<text>>"));
513         langModule->quoteStyleCO->addItem(qt_(">>text<<"));
514
515
516
517         numberingModule = new UiWidget<Ui::NumberingUi>;
518         // numbering
519         connect(numberingModule->depthSL, SIGNAL(valueChanged(int)),
520                 this, SLOT(change_adaptor()));
521         connect(numberingModule->tocSL, SIGNAL(valueChanged(int)),
522                 this, SLOT(change_adaptor()));
523         connect(numberingModule->depthSL, SIGNAL(valueChanged(int)),
524                 this, SLOT(updateNumbering()));
525         connect(numberingModule->tocSL, SIGNAL(valueChanged(int)),
526                 this, SLOT(updateNumbering()));
527         numberingModule->tocTW->setColumnCount(3);
528         numberingModule->tocTW->headerItem()->setText(0, qt_("Example"));
529         numberingModule->tocTW->headerItem()->setText(1, qt_("Numbered"));
530         numberingModule->tocTW->headerItem()->setText(2, qt_("Appears in TOC"));
531
532
533         biblioModule = new UiWidget<Ui::BiblioUi>;
534         connect(biblioModule->citeNatbibRB, SIGNAL(toggled(bool)),
535                 biblioModule->citationStyleL, SLOT(setEnabled(bool)));
536         connect(biblioModule->citeNatbibRB, SIGNAL(toggled(bool)),
537                 biblioModule->citeStyleCO, SLOT(setEnabled(bool)));
538         // biblio
539         connect(biblioModule->citeDefaultRB, SIGNAL(clicked()),
540                 this, SLOT(change_adaptor()));
541         connect(biblioModule->citeNatbibRB, SIGNAL(clicked()),
542                 this, SLOT(change_adaptor()));
543         connect(biblioModule->citeStyleCO, SIGNAL(activated(int)),
544                 this, SLOT(change_adaptor()));
545         connect(biblioModule->citeJurabibRB, SIGNAL(clicked()),
546                 this, SLOT(change_adaptor()));
547         connect(biblioModule->bibtopicCB, SIGNAL(clicked()),
548                 this, SLOT(change_adaptor()));
549         // biblio
550         biblioModule->citeStyleCO->addItem(qt_("Author-year"));
551         biblioModule->citeStyleCO->addItem(qt_("Numerical"));
552         biblioModule->citeStyleCO->setCurrentIndex(0);
553
554
555         mathsModule = new UiWidget<Ui::MathsUi>;
556         connect(mathsModule->amsautoCB, SIGNAL(toggled(bool)),
557                 mathsModule->amsCB, SLOT(setDisabled(bool)));
558         connect(mathsModule->esintautoCB, SIGNAL(toggled(bool)),
559                 mathsModule->esintCB, SLOT(setDisabled(bool)));
560         // maths
561         connect(mathsModule->amsCB, SIGNAL(clicked()),
562                 this, SLOT(change_adaptor()));
563         connect(mathsModule->amsautoCB, SIGNAL(clicked()),
564                 this, SLOT(change_adaptor()));
565         connect(mathsModule->esintCB, SIGNAL(clicked()),
566                 this, SLOT(change_adaptor()));
567         connect(mathsModule->esintautoCB, SIGNAL(clicked()),
568                 this, SLOT(change_adaptor()));
569
570         latexModule = new UiWidget<Ui::LaTeXUi>;
571         // latex class
572         connect(latexModule->classCO, SIGNAL(activated(int)),
573                 this, SLOT(change_adaptor()));
574         connect(latexModule->optionsLE, SIGNAL(textChanged(const QString &)),
575                 this, SLOT(change_adaptor()));
576         connect(latexModule->psdriverCO, SIGNAL(activated(int)),
577                 this, SLOT(change_adaptor()));
578         connect(latexModule->classCO, SIGNAL(activated(int)),
579                 this, SLOT(classChanged()));
580         
581         selectionManager = 
582                 new GuiSelectionManager(latexModule->availableLV, latexModule->selectedLV, 
583                         latexModule->addPB, latexModule->deletePB, 
584                         latexModule->upPB, latexModule->downPB, 
585                         availableModel(), selectedModel());
586         connect(selectionManager, SIGNAL(updateHook()),
587                 this, SLOT(updateModuleInfo()));
588         connect(selectionManager, SIGNAL(updateHook()),
589                 this, SLOT(change_adaptor()));
590         
591         // postscript drivers
592         for (int n = 0; tex_graphics[n][0]; ++n) {
593                 QString enc = qt_(tex_graphics_gui[n]);
594                 latexModule->psdriverCO->addItem(enc);
595         }
596         // latex classes
597         //FIXME This seems too involved with the kernel. Some of this
598         //should be moved to the kernel---which should perhaps just
599         //give us a list of entries or something of the sort.
600         for (TextClassList::const_iterator cit = textclasslist.begin();
601              cit != textclasslist.end(); ++cit) {
602                 if (cit->isTeXClassAvailable()) {
603                         latexModule->classCO->addItem(toqstr(cit->description()));
604                 } else {
605                         docstring item =
606                                 bformat(_("Unavailable: %1$s"), from_utf8(cit->description()));
607                         latexModule->classCO->addItem(toqstr(item));
608                 }
609         }
610
611         // branches
612         branchesModule = new GuiBranches;
613         connect(branchesModule, SIGNAL(changed()),
614                 this, SLOT(change_adaptor()));
615
616         // preamble
617         preambleModule = new PreambleModule;
618         connect(preambleModule, SIGNAL(changed()),
619                 this, SLOT(change_adaptor()));
620
621         // bullets
622         bulletsModule = new BulletsModule;
623         connect(bulletsModule, SIGNAL(changed()),
624                 this, SLOT(change_adaptor()));
625
626         // PDF support
627         pdfSupportModule = new UiWidget<Ui::PDFSupportUi>;
628
629         connect(pdfSupportModule->use_hyperrefGB, SIGNAL(toggled(bool)),
630                 this, SLOT(change_adaptor()));
631         connect(pdfSupportModule->titleLE, SIGNAL(textChanged(const QString &)),
632                 this, SLOT(change_adaptor()));
633         connect(pdfSupportModule->authorLE, SIGNAL(textChanged(const QString &)),
634                 this, SLOT(change_adaptor()));
635         connect(pdfSupportModule->subjectLE, SIGNAL(textChanged(const QString &)),
636                 this, SLOT(change_adaptor()));
637         connect(pdfSupportModule->keywordsLE, SIGNAL(textChanged(const QString &)),
638                 this, SLOT(change_adaptor()));
639         connect(pdfSupportModule->bookmarksGB, SIGNAL(toggled(bool)),
640                 this, SLOT(change_adaptor()));
641         connect(pdfSupportModule->bookmarksnumberedCB, SIGNAL(toggled(bool)),
642                 this, SLOT(change_adaptor()));
643         connect(pdfSupportModule->bookmarksopenGB, SIGNAL(toggled(bool)),
644                 this, SLOT(change_adaptor()));
645         connect(pdfSupportModule->bookmarksopenlevelSB, SIGNAL(valueChanged(int)),
646                 this, SLOT(change_adaptor()));
647         connect(pdfSupportModule->breaklinksCB, SIGNAL(toggled(bool)),
648                 this, SLOT(change_adaptor()));
649         connect(pdfSupportModule->pdfborderCB, SIGNAL(toggled(bool)),
650                 this, SLOT(change_adaptor()));
651         connect(pdfSupportModule->colorlinksCB, SIGNAL(toggled(bool)),
652                 this, SLOT(change_adaptor()));
653         connect(pdfSupportModule->backrefCB, SIGNAL(toggled(bool)),
654                 this, SLOT(change_adaptor()));
655         connect(pdfSupportModule->pdfusetitleCB, SIGNAL(toggled(bool)),
656                 this, SLOT(change_adaptor()));
657         connect(pdfSupportModule->pagebackrefCB, SIGNAL(toggled(bool)),
658                 this, SLOT(change_adaptor()));
659         connect(pdfSupportModule->fullscreenCB, SIGNAL(toggled(bool)),
660                 this, SLOT(change_adaptor()));
661         connect(pdfSupportModule->optionsLE, SIGNAL(textChanged(const QString &)),
662                 this, SLOT(change_adaptor()));
663
664         // float
665         floatModule = new FloatPlacement;
666         connect(floatModule, SIGNAL(changed()),
667                 this, SLOT(change_adaptor()));
668
669         docPS->addPanel(latexModule, _("Document Class"));
670         docPS->addPanel(fontModule, _("Fonts"));
671         docPS->addPanel(textLayoutModule, _("Text Layout"));
672         docPS->addPanel(pageLayoutModule, _("Page Layout"));
673         docPS->addPanel(marginsModule, _("Page Margins"));
674         docPS->addPanel(langModule, _("Language"));
675         docPS->addPanel(numberingModule, _("Numbering & TOC"));
676         docPS->addPanel(biblioModule, _("Bibliography"));
677         docPS->addPanel(pdfSupportModule, _("PDF Properties"));
678         docPS->addPanel(mathsModule, _("Math Options"));
679         docPS->addPanel(floatModule, _("Float Placement"));
680         docPS->addPanel(bulletsModule, _("Bullets"));
681         docPS->addPanel(branchesModule, _("Branches"));
682         docPS->addPanel(preambleModule, _("LaTeX Preamble"));
683         docPS->setCurrentPanel(_("Document Class"));
684 // FIXME: hack to work around resizing bug in Qt >= 4.2
685 // bug verified with Qt 4.2.{0-3} (JSpitzm)
686 #if QT_VERSION >= 0x040200
687         docPS->updateGeometry();
688 #endif
689 }
690
691
692 void GuiDocument::showPreamble()
693 {
694         docPS->setCurrentPanel(_("LaTeX Preamble"));
695 }
696
697
698 void GuiDocument::saveDefaultClicked()
699 {
700         saveDocDefault();
701 }
702
703
704 void GuiDocument::useDefaultsClicked()
705 {
706         useClassDefaults();
707 }
708
709
710 void GuiDocument::change_adaptor()
711 {
712         changed();
713 }
714
715
716 docstring GuiDocument::validate_listings_params()
717 {
718         // use a cache here to avoid repeated validation
719         // of the same parameters
720         static string param_cache = string();
721         static docstring msg_cache = docstring();
722         
723         if (textLayoutModule->bypassCB->isChecked())
724                 return docstring();
725
726         string params = fromqstr(textLayoutModule->listingsED->toPlainText());
727         if (params != param_cache) {
728                 param_cache = params;
729                 msg_cache = InsetListingsParams(params).validate();
730         }
731         return msg_cache;
732 }
733
734
735 void GuiDocument::set_listings_msg()
736 {
737         static bool isOK = true;
738         docstring msg = validate_listings_params();
739         if (msg.empty()) {
740                 if (isOK)
741                         return;
742                 isOK = true;
743                 // listingsTB->setTextColor("black");
744                 textLayoutModule->listingsTB->setPlainText(
745                         qt_("Input listings parameters on the right. Enter ? for a list of parameters."));
746         } else {
747                 isOK = false;
748                 // listingsTB->setTextColor("red");
749                 textLayoutModule->listingsTB->setPlainText(toqstr(msg));
750         }
751 }
752
753
754 void GuiDocument::closeEvent(QCloseEvent * e)
755 {
756         slotClose();
757         e->accept();
758 }
759
760
761 void GuiDocument::setLSpacing(int item)
762 {
763         textLayoutModule->lspacingLE->setEnabled(item == 3);
764 }
765
766
767 void GuiDocument::setSkip(int item)
768 {
769         bool const enable = (item == 3);
770         textLayoutModule->skipLE->setEnabled(enable);
771         textLayoutModule->skipLengthCO->setEnabled(enable);
772 }
773
774
775 void GuiDocument::enableSkip(bool skip)
776 {
777         textLayoutModule->skipCO->setEnabled(skip);
778         textLayoutModule->skipLE->setEnabled(skip);
779         textLayoutModule->skipLengthCO->setEnabled(skip);
780         if (skip)
781                 setSkip(textLayoutModule->skipCO->currentIndex());
782 }
783
784 void GuiDocument::portraitChanged()
785 {
786         setMargins(pageLayoutModule->papersizeCO->currentIndex());
787 }
788
789 void GuiDocument::setMargins(bool custom)
790 {
791         marginsModule->marginCB->setChecked(custom);
792         setCustomMargins(custom);
793 }
794
795
796 void GuiDocument::setCustomPapersize(int papersize)
797 {
798         bool const custom = (papersize == 1);
799
800         pageLayoutModule->paperwidthL->setEnabled(custom);
801         pageLayoutModule->paperwidthLE->setEnabled(custom);
802         pageLayoutModule->paperwidthUnitCO->setEnabled(custom);
803         pageLayoutModule->paperheightL->setEnabled(custom);
804         pageLayoutModule->paperheightLE->setEnabled(custom);
805         pageLayoutModule->paperheightLE->setFocus();
806         pageLayoutModule->paperheightUnitCO->setEnabled(custom);
807 }
808
809
810 void GuiDocument::setCustomMargins(bool custom)
811 {
812         marginsModule->topL->setEnabled(!custom);
813         marginsModule->topLE->setEnabled(!custom);
814         marginsModule->topUnit->setEnabled(!custom);
815
816         marginsModule->bottomL->setEnabled(!custom);
817         marginsModule->bottomLE->setEnabled(!custom);
818         marginsModule->bottomUnit->setEnabled(!custom);
819
820         marginsModule->innerL->setEnabled(!custom);
821         marginsModule->innerLE->setEnabled(!custom);
822         marginsModule->innerUnit->setEnabled(!custom);
823
824         marginsModule->outerL->setEnabled(!custom);
825         marginsModule->outerLE->setEnabled(!custom);
826         marginsModule->outerUnit->setEnabled(!custom);
827
828         marginsModule->headheightL->setEnabled(!custom);
829         marginsModule->headheightLE->setEnabled(!custom);
830         marginsModule->headheightUnit->setEnabled(!custom);
831
832         marginsModule->headsepL->setEnabled(!custom);
833         marginsModule->headsepLE->setEnabled(!custom);
834         marginsModule->headsepUnit->setEnabled(!custom);
835
836         marginsModule->footskipL->setEnabled(!custom);
837         marginsModule->footskipLE->setEnabled(!custom);
838         marginsModule->footskipUnit->setEnabled(!custom);
839 }
840
841
842 void GuiDocument::updateFontsize(string const & items, string const & sel)
843 {
844         fontModule->fontsizeCO->clear();
845         fontModule->fontsizeCO->addItem(qt_("Default"));
846
847         for (int n = 0; !token(items,'|',n).empty(); ++n)
848                 fontModule->fontsizeCO->
849                         addItem(toqstr(token(items,'|',n)));
850
851         for (int n = 0; n < fontModule->fontsizeCO->count(); ++n) {
852                 if (fromqstr(fontModule->fontsizeCO->itemText(n)) == sel) {
853                         fontModule->fontsizeCO->setCurrentIndex(n);
854                         break;
855                 }
856         }
857 }
858
859
860 void GuiDocument::romanChanged(int item)
861 {
862         string const font = tex_fonts_roman[item];
863         fontModule->fontScCB->setEnabled(providesSC(font));
864         fontModule->fontOsfCB->setEnabled(providesOSF(font));
865 }
866
867
868 void GuiDocument::sansChanged(int item)
869 {
870         string const font = tex_fonts_sans[item];
871         bool scaleable = providesScale(font);
872         fontModule->scaleSansSB->setEnabled(scaleable);
873         fontModule->scaleSansLA->setEnabled(scaleable);
874 }
875
876
877 void GuiDocument::ttChanged(int item)
878 {
879         string const font = tex_fonts_monospaced[item];
880         bool scaleable = providesScale(font);
881         fontModule->scaleTypewriterSB->setEnabled(scaleable);
882         fontModule->scaleTypewriterLA->setEnabled(scaleable);
883 }
884
885
886 void GuiDocument::updatePagestyle(string const & items, string const & sel)
887 {
888         pagestyles.clear();
889         pageLayoutModule->pagestyleCO->clear();
890         pageLayoutModule->pagestyleCO->addItem(qt_("Default"));
891
892         for (int n = 0; !token(items,'|',n).empty(); ++n) {
893                 string style = token(items, '|', n);
894                 docstring style_gui = _(style);
895                 pagestyles.push_back(pair<string, docstring>(style, style_gui));
896                 pageLayoutModule->pagestyleCO->addItem(toqstr(style_gui));
897         }
898
899         if (sel == "default") {
900                 pageLayoutModule->pagestyleCO->setCurrentIndex(0);
901                 return;
902         }
903
904         int nn = 0;
905
906         for (size_t i = 0; i < pagestyles.size(); ++i)
907                 if (pagestyles[i].first == sel)
908                         nn = pageLayoutModule->pagestyleCO->findText(
909                                         toqstr(pagestyles[i].second));
910
911         if (nn > 0)
912                 pageLayoutModule->pagestyleCO->setCurrentIndex(nn);
913 }
914
915
916 void GuiDocument::classChanged()
917 {
918         textclass_type const tc = latexModule->classCO->currentIndex();
919         bp_.setJustBaseClass(tc);
920         if (lyxrc.auto_reset_options)
921                 bp_.useClassDefaults();
922         updateContents();
923 }
924
925
926 void GuiDocument::updateModuleInfo()
927 {
928         selectionManager->update();
929         //Module description
930         QListView const * const lv = selectionManager->selectedFocused() ?
931                                      latexModule->selectedLV :
932                         latexModule->availableLV;
933         if (lv->selectionModel()->selectedIndexes().isEmpty())
934                 latexModule->infoML->document()->clear();
935         else {
936                 QModelIndex const idx = lv->selectionModel()->currentIndex();
937                 string const modName = fromqstr(idx.data().toString());
938                 string desc = getModuleDescription(modName);
939                 vector<string> pkgList = getPackageList(modName);
940                 string pkgdesc;
941                 //this mess formats the package list as "pkg1, pkg2, and pkg3"
942                 int const pkgListSize = pkgList.size();
943                 for (int i = 0; i < pkgListSize; ++i) {
944                         if (i == 1) {
945                                 if (i == pkgListSize - 1) //last element
946                                         pkgdesc += " and ";
947                                 else
948                                         pkgdesc += ", ";
949                         } else if (i > 1) {
950                                 if (i == pkgListSize - 1) //last element
951                                         pkgdesc += ", and ";
952                                 else
953                                         pkgdesc += ", ";
954                         }
955                         pkgdesc += pkgList[i];
956                 }
957                 if (!pkgdesc.empty())
958                         desc += " Requires " + pkgdesc + ".";
959                 latexModule->infoML->document()->setPlainText(toqstr(desc));
960         }
961 }
962
963
964 void GuiDocument::updateNumbering()
965 {
966         TextClass const & tclass = bp_.getTextClass();
967
968         numberingModule->tocTW->setUpdatesEnabled(false);
969         numberingModule->tocTW->clear();
970
971         int const depth = numberingModule->depthSL->value();
972         int const toc = numberingModule->tocSL->value();
973         QString const no = qt_("No");
974         QString const yes = qt_("Yes");
975         TextClass::const_iterator end = tclass.end();
976         TextClass::const_iterator cit = tclass.begin();
977         QTreeWidgetItem * item = 0;
978         for ( ; cit != end ; ++cit) {
979                 int const toclevel = (*cit)->toclevel;
980                 if (toclevel != Layout::NOT_IN_TOC
981                     && (*cit)->labeltype == LABEL_COUNTER) {
982                         item = new QTreeWidgetItem(numberingModule->tocTW);
983                         item->setText(0, toqstr(translateIfPossible((*cit)->name())));
984                         item->setText(1, (toclevel <= depth) ? yes : no);
985                         item->setText(2, (toclevel <= toc) ? yes : no);
986                 }
987         }
988
989         numberingModule->tocTW->setUpdatesEnabled(true);
990         numberingModule->tocTW->update();
991 }
992
993
994 void GuiDocument::apply(BufferParams & params)
995 {
996         // preamble
997         preambleModule->apply(params);
998
999         // biblio
1000         params.setCiteEngine(biblio::ENGINE_BASIC);
1001
1002         if (biblioModule->citeNatbibRB->isChecked()) {
1003                 bool const use_numerical_citations =
1004                         biblioModule->citeStyleCO->currentIndex();
1005                 if (use_numerical_citations)
1006                         params.setCiteEngine(biblio::ENGINE_NATBIB_NUMERICAL);
1007                 else
1008                         params.setCiteEngine(biblio::ENGINE_NATBIB_AUTHORYEAR);
1009
1010         } else if (biblioModule->citeJurabibRB->isChecked())
1011                 params.setCiteEngine(biblio::ENGINE_JURABIB);
1012
1013         params.use_bibtopic =
1014                 biblioModule->bibtopicCB->isChecked();
1015
1016         // language & quotes
1017         if (langModule->defaultencodingRB->isChecked()) {
1018                 params.inputenc = "auto";
1019         } else {
1020                 int i = langModule->encodingCO->currentIndex();
1021                 if (i == 0)
1022                         params.inputenc = "default";
1023                 else
1024                         params.inputenc =
1025                                 fromqstr(langModule->encodingCO->currentText());
1026         }
1027
1028         InsetQuotes::quote_language lga = InsetQuotes::EnglishQ;
1029         switch (langModule->quoteStyleCO->currentIndex()) {
1030         case 0:
1031                 lga = InsetQuotes::EnglishQ;
1032                 break;
1033         case 1:
1034                 lga = InsetQuotes::SwedishQ;
1035                 break;
1036         case 2:
1037                 lga = InsetQuotes::GermanQ;
1038                 break;
1039         case 3:
1040                 lga = InsetQuotes::PolishQ;
1041                 break;
1042         case 4:
1043                 lga = InsetQuotes::FrenchQ;
1044                 break;
1045         case 5:
1046                 lga = InsetQuotes::DanishQ;
1047                 break;
1048         }
1049         params.quotes_language = lga;
1050
1051         int const pos = langModule->languageCO->currentIndex();
1052         params.language = lyx::languages.getLanguage(lang_[pos]);
1053
1054         // numbering
1055         if (params.getTextClass().hasTocLevels()) {
1056                 params.tocdepth = numberingModule->tocSL->value();
1057                 params.secnumdepth = numberingModule->depthSL->value();
1058         }
1059
1060         // bullets
1061         params.user_defined_bullet(0) = bulletsModule->getBullet(0);
1062         params.user_defined_bullet(1) = bulletsModule->getBullet(1);
1063         params.user_defined_bullet(2) = bulletsModule->getBullet(2);
1064         params.user_defined_bullet(3) = bulletsModule->getBullet(3);
1065
1066         // packages
1067         params.graphicsDriver =
1068                 tex_graphics[latexModule->psdriverCO->currentIndex()];
1069         
1070         // Modules
1071         params.clearLayoutModules();
1072         QStringList const selMods = selectedModel()->stringList();
1073         for (int i = 0; i != selMods.size(); ++i)
1074                 params.addLayoutModule(lyx::fromqstr(selMods[i]));
1075
1076
1077         if (mathsModule->amsautoCB->isChecked()) {
1078                 params.use_amsmath = BufferParams::package_auto;
1079         } else {
1080                 if (mathsModule->amsCB->isChecked())
1081                         params.use_amsmath = BufferParams::package_on;
1082                 else
1083                         params.use_amsmath = BufferParams::package_off;
1084         }
1085
1086         if (mathsModule->esintautoCB->isChecked())
1087                 params.use_esint = BufferParams::package_auto;
1088         else {
1089                 if (mathsModule->esintCB->isChecked())
1090                         params.use_esint = BufferParams::package_on;
1091                 else
1092                         params.use_esint = BufferParams::package_off;
1093         }
1094
1095         // text layout
1096         params.setJustBaseClass(latexModule->classCO->currentIndex());
1097
1098         if (pageLayoutModule->pagestyleCO->currentIndex() == 0)
1099                 params.pagestyle = "default";
1100         else {
1101                 docstring style_gui =
1102                         qstring_to_ucs4(pageLayoutModule->pagestyleCO->currentText());
1103                 for (size_t i = 0; i < pagestyles.size(); ++i)
1104                         if (pagestyles[i].second == style_gui)
1105                                 params.pagestyle = pagestyles[i].first;
1106         }
1107
1108         switch (textLayoutModule->lspacingCO->currentIndex()) {
1109         case 0:
1110                 params.spacing().set(Spacing::Single);
1111                 break;
1112         case 1:
1113                 params.spacing().set(Spacing::Onehalf);
1114                 break;
1115         case 2:
1116                 params.spacing().set(Spacing::Double);
1117                 break;
1118         case 3:
1119                 params.spacing().set(Spacing::Other,
1120                         fromqstr(textLayoutModule->lspacingLE->text()));
1121                 break;
1122         }
1123
1124         if (textLayoutModule->twoColumnCB->isChecked())
1125                 params.columns = 2;
1126         else
1127                 params.columns = 1;
1128
1129         // text should have passed validation
1130         params.listings_params =
1131                 InsetListingsParams(fromqstr(textLayoutModule->listingsED->toPlainText())).params();
1132
1133         if (textLayoutModule->indentRB->isChecked())
1134                 params.paragraph_separation = BufferParams::PARSEP_INDENT;
1135         else
1136                 params.paragraph_separation = BufferParams::PARSEP_SKIP;
1137
1138         switch (textLayoutModule->skipCO->currentIndex()) {
1139         case 0:
1140                 params.setDefSkip(VSpace(VSpace::SMALLSKIP));
1141                 break;
1142         case 1:
1143                 params.setDefSkip(VSpace(VSpace::MEDSKIP));
1144                 break;
1145         case 2:
1146                 params.setDefSkip(VSpace(VSpace::BIGSKIP));
1147                 break;
1148         case 3:
1149         {
1150                 VSpace vs = VSpace(
1151                         widgetsToLength(textLayoutModule->skipLE,
1152                                 textLayoutModule->skipLengthCO)
1153                         );
1154                 params.setDefSkip(vs);
1155                 break;
1156         }
1157         default:
1158                 // DocumentDefskipCB assures that this never happens
1159                 // so Assert then !!!  - jbl
1160                 params.setDefSkip(VSpace(VSpace::MEDSKIP));
1161                 break;
1162         }
1163
1164         params.options =
1165                 fromqstr(latexModule->optionsLE->text());
1166
1167         params.float_placement = floatModule->get();
1168
1169         // fonts
1170         params.fontsRoman =
1171                 tex_fonts_roman[fontModule->fontsRomanCO->currentIndex()];
1172
1173         params.fontsSans =
1174                 tex_fonts_sans[fontModule->fontsSansCO->currentIndex()];
1175
1176         params.fontsTypewriter =
1177                 tex_fonts_monospaced[fontModule->fontsTypewriterCO->currentIndex()];
1178
1179         params.fontsSansScale = fontModule->scaleSansSB->value();
1180
1181         params.fontsTypewriterScale = fontModule->scaleTypewriterSB->value();
1182
1183         params.fontsSC = fontModule->fontScCB->isChecked();
1184
1185         params.fontsOSF = fontModule->fontOsfCB->isChecked();
1186
1187         params.fontsDefaultFamily = GuiDocument::fontfamilies[
1188                 fontModule->fontsDefaultCO->currentIndex()];
1189
1190         if (fontModule->fontsizeCO->currentIndex() == 0)
1191                 params.fontsize = "default";
1192         else
1193                 params.fontsize =
1194                         fromqstr(fontModule->fontsizeCO->currentText());
1195
1196         // paper
1197         params.papersize = PAPER_SIZE(
1198                 pageLayoutModule->papersizeCO->currentIndex());
1199
1200         // custom, A3, B3 and B4 paper sizes need geometry
1201         int psize = pageLayoutModule->papersizeCO->currentIndex();
1202         bool geom_papersize = (psize == 1 || psize == 5 || psize == 8 || psize == 9);
1203
1204         params.paperwidth = widgetsToLength(pageLayoutModule->paperwidthLE,
1205                 pageLayoutModule->paperwidthUnitCO);
1206
1207         params.paperheight = widgetsToLength(pageLayoutModule->paperheightLE,
1208                 pageLayoutModule->paperheightUnitCO);
1209
1210         if (pageLayoutModule->facingPagesCB->isChecked())
1211                 params.sides = TextClass::TwoSides;
1212         else
1213                 params.sides = TextClass::OneSide;
1214
1215         if (pageLayoutModule->landscapeRB->isChecked())
1216                 params.orientation = ORIENTATION_LANDSCAPE;
1217         else
1218                 params.orientation = ORIENTATION_PORTRAIT;
1219
1220         // margins
1221         params.use_geometry =
1222                 (!marginsModule->marginCB->isChecked()
1223                 || geom_papersize);
1224
1225         Ui::MarginsUi const * m(marginsModule);
1226
1227         params.leftmargin = widgetsToLength(m->innerLE, m->innerUnit);
1228         params.topmargin = widgetsToLength(m->topLE, m->topUnit);
1229         params.rightmargin = widgetsToLength(m->outerLE, m->outerUnit);
1230         params.bottommargin = widgetsToLength(m->bottomLE, m->bottomUnit);
1231         params.headheight = widgetsToLength(m->headheightLE, m->headheightUnit);
1232         params.headsep = widgetsToLength(m->headsepLE, m->headsepUnit);
1233         params.footskip = widgetsToLength(m->footskipLE, m->footskipUnit);
1234
1235         branchesModule->apply(params);
1236
1237         // PDF support
1238         PDFOptions & pdf = params.pdfoptions();
1239         pdf.use_hyperref = pdfSupportModule->use_hyperrefGB->isChecked();
1240         pdf.title = fromqstr(pdfSupportModule->titleLE->text());
1241         pdf.author = fromqstr(pdfSupportModule->authorLE->text());
1242         pdf.subject = fromqstr(pdfSupportModule->subjectLE->text());
1243         pdf.keywords = fromqstr(pdfSupportModule->keywordsLE->text());
1244
1245         pdf.bookmarks = pdfSupportModule->bookmarksGB->isChecked();
1246         pdf.bookmarksnumbered = pdfSupportModule->bookmarksnumberedCB->isChecked();
1247         pdf.bookmarksopen = pdfSupportModule->bookmarksopenGB->isChecked();
1248         pdf.bookmarksopenlevel = pdfSupportModule->bookmarksopenlevelSB->value();
1249
1250         pdf.breaklinks = pdfSupportModule->breaklinksCB->isChecked();
1251         pdf.pdfborder = pdfSupportModule->pdfborderCB->isChecked();
1252         pdf.pdfusetitle = pdfSupportModule->pdfusetitleCB->isChecked();
1253         pdf.colorlinks = pdfSupportModule->colorlinksCB->isChecked();
1254         pdf.backref = pdfSupportModule->backrefCB->isChecked();
1255         pdf.pagebackref = pdfSupportModule->pagebackrefCB->isChecked();
1256         if (pdfSupportModule->fullscreenCB->isChecked())
1257                 pdf.pagemode = pdf.pagemode_fullscreen;
1258         else
1259                 pdf.pagemode.clear();
1260         pdf.quoted_options = fromqstr(pdfSupportModule->optionsLE->text());
1261 }
1262
1263
1264 /** Return the position of val in the vector if found.
1265     If not found, return 0.
1266  */
1267 template<class A>
1268 static size_t findPos(std::vector<A> const & vec, A const & val)
1269 {
1270         typename std::vector<A>::const_iterator it =
1271                 std::find(vec.begin(), vec.end(), val);
1272         if (it == vec.end())
1273                 return 0;
1274         return distance(vec.begin(), it);
1275 }
1276
1277
1278 void GuiDocument::updateParams()
1279 {
1280         updateParams(bp_);
1281 }
1282
1283
1284 void GuiDocument::updateParams(BufferParams const & params)
1285 {
1286         // set the default unit
1287         Length::UNIT defaultUnit = Length::CM;
1288         switch (lyxrc.default_papersize) {
1289                 case PAPER_DEFAULT: break;
1290
1291                 case PAPER_USLETTER:
1292                 case PAPER_USLEGAL:
1293                 case PAPER_USEXECUTIVE:
1294                         defaultUnit = Length::IN;
1295                         break;
1296
1297                 case PAPER_A3:
1298                 case PAPER_A4:
1299                 case PAPER_A5:
1300                 case PAPER_B3:
1301                 case PAPER_B4:
1302                 case PAPER_B5:
1303                         defaultUnit = Length::CM;
1304                         break;
1305                 case PAPER_CUSTOM:
1306                         break;
1307         }
1308
1309         // preamble
1310         preambleModule->update(params, id());
1311
1312         // biblio
1313         biblioModule->citeDefaultRB->setChecked(
1314                 params.getEngine() == biblio::ENGINE_BASIC);
1315
1316         biblioModule->citeNatbibRB->setChecked(
1317                 params.getEngine() == biblio::ENGINE_NATBIB_NUMERICAL ||
1318                 params.getEngine() == biblio::ENGINE_NATBIB_AUTHORYEAR);
1319
1320         biblioModule->citeStyleCO->setCurrentIndex(
1321                 params.getEngine() == biblio::ENGINE_NATBIB_NUMERICAL);
1322
1323         biblioModule->citeJurabibRB->setChecked(
1324                 params.getEngine() == biblio::ENGINE_JURABIB);
1325
1326         biblioModule->bibtopicCB->setChecked(
1327                 params.use_bibtopic);
1328
1329         // language & quotes
1330         int const pos = int(findPos(lang_,
1331                                     params.language->lang()));
1332         langModule->languageCO->setCurrentIndex(pos);
1333
1334         langModule->quoteStyleCO->setCurrentIndex(
1335                 params.quotes_language);
1336
1337         bool default_enc = true;
1338         if (params.inputenc != "auto") {
1339                 default_enc = false;
1340                 if (params.inputenc == "default") {
1341                         langModule->encodingCO->setCurrentIndex(0);
1342                 } else {
1343                         int const i = langModule->encodingCO->findText(
1344                                         toqstr(params.inputenc));
1345                         if (i >= 0)
1346                                 langModule->encodingCO->setCurrentIndex(i);
1347                         else
1348                                 // unknown encoding. Set to default.
1349                                 default_enc = true;
1350                 }
1351         }
1352         langModule->defaultencodingRB->setChecked(default_enc);
1353         langModule->otherencodingRB->setChecked(!default_enc);
1354
1355         // numbering
1356         int const min_toclevel = textClass().min_toclevel();
1357         int const max_toclevel = textClass().max_toclevel();
1358         if (textClass().hasTocLevels()) {
1359                 numberingModule->setEnabled(true);
1360                 numberingModule->depthSL->setMinimum(min_toclevel - 1);
1361                 numberingModule->depthSL->setMaximum(max_toclevel);
1362                 numberingModule->depthSL->setValue(params.secnumdepth);
1363                 numberingModule->tocSL->setMaximum(min_toclevel - 1);
1364                 numberingModule->tocSL->setMaximum(max_toclevel);
1365                 numberingModule->tocSL->setValue(params.tocdepth);
1366                 updateNumbering();
1367         } else {
1368                 numberingModule->setEnabled(false);
1369                 numberingModule->tocTW->clear();
1370         }
1371
1372         // bullets
1373         bulletsModule->setBullet(0, params.user_defined_bullet(0));
1374         bulletsModule->setBullet(1, params.user_defined_bullet(1));
1375         bulletsModule->setBullet(2, params.user_defined_bullet(2));
1376         bulletsModule->setBullet(3, params.user_defined_bullet(3));
1377         bulletsModule->init();
1378
1379         // packages
1380         int nitem = findToken(tex_graphics, params.graphicsDriver);
1381         if (nitem >= 0)
1382                 latexModule->psdriverCO->setCurrentIndex(nitem);
1383         updateModuleInfo();
1384         
1385         mathsModule->amsCB->setChecked(
1386                 params.use_amsmath == BufferParams::package_on);
1387         mathsModule->amsautoCB->setChecked(
1388                 params.use_amsmath == BufferParams::package_auto);
1389
1390         mathsModule->esintCB->setChecked(
1391                 params.use_esint == BufferParams::package_on);
1392         mathsModule->esintautoCB->setChecked(
1393                 params.use_esint == BufferParams::package_auto);
1394
1395         switch (params.spacing().getSpace()) {
1396                 case Spacing::Other: nitem = 3; break;
1397                 case Spacing::Double: nitem = 2; break;
1398                 case Spacing::Onehalf: nitem = 1; break;
1399                 case Spacing::Default: case Spacing::Single: nitem = 0; break;
1400         }
1401
1402         // text layout
1403         latexModule->classCO->setCurrentIndex(params.getBaseClass());
1404         
1405         updatePagestyle(textClass().opt_pagestyle(),
1406                                  params.pagestyle);
1407
1408         textLayoutModule->lspacingCO->setCurrentIndex(nitem);
1409         if (params.spacing().getSpace() == Spacing::Other) {
1410                 textLayoutModule->lspacingLE->setText(
1411                         toqstr(params.spacing().getValueAsString()));
1412         }
1413         setLSpacing(nitem);
1414
1415         if (params.paragraph_separation == BufferParams::PARSEP_INDENT)
1416                 textLayoutModule->indentRB->setChecked(true);
1417         else
1418                 textLayoutModule->skipRB->setChecked(true);
1419
1420         int skip = 0;
1421         switch (params.getDefSkip().kind()) {
1422         case VSpace::SMALLSKIP:
1423                 skip = 0;
1424                 break;
1425         case VSpace::MEDSKIP:
1426                 skip = 1;
1427                 break;
1428         case VSpace::BIGSKIP:
1429                 skip = 2;
1430                 break;
1431         case VSpace::LENGTH:
1432         {
1433                 skip = 3;
1434                 string const length = params.getDefSkip().asLyXCommand();
1435                 lengthToWidgets(textLayoutModule->skipLE,
1436                         textLayoutModule->skipLengthCO,
1437                         length, defaultUnit);
1438                 break;
1439         }
1440         default:
1441                 skip = 0;
1442                 break;
1443         }
1444         textLayoutModule->skipCO->setCurrentIndex(skip);
1445         setSkip(skip);
1446
1447         textLayoutModule->twoColumnCB->setChecked(
1448                 params.columns == 2);
1449
1450         // break listings_params to multiple lines
1451         string lstparams =
1452                 InsetListingsParams(params.listings_params).separatedParams();
1453         textLayoutModule->listingsED->setPlainText(toqstr(lstparams));
1454
1455         if (!params.options.empty()) {
1456                 latexModule->optionsLE->setText(
1457                         toqstr(params.options));
1458         } else {
1459                 latexModule->optionsLE->setText(QString());
1460         }
1461
1462         floatModule->set(params.float_placement);
1463
1464         // Fonts
1465         updateFontsize(textClass().opt_fontsize(),
1466                         params.fontsize);
1467
1468         int n = findToken(tex_fonts_roman, params.fontsRoman);
1469         if (n >= 0) {
1470                 fontModule->fontsRomanCO->setCurrentIndex(n);
1471                 romanChanged(n);
1472         }
1473
1474         n = findToken(tex_fonts_sans, params.fontsSans);
1475         if (n >= 0)     {
1476                 fontModule->fontsSansCO->setCurrentIndex(n);
1477                 sansChanged(n);
1478         }
1479
1480         n = findToken(tex_fonts_monospaced, params.fontsTypewriter);
1481         if (n >= 0) {
1482                 fontModule->fontsTypewriterCO->setCurrentIndex(n);
1483                 ttChanged(n);
1484         }
1485
1486         fontModule->fontScCB->setChecked(params.fontsSC);
1487         fontModule->fontOsfCB->setChecked(params.fontsOSF);
1488         fontModule->scaleSansSB->setValue(params.fontsSansScale);
1489         fontModule->scaleTypewriterSB->setValue(params.fontsTypewriterScale);
1490         n = findToken(GuiDocument::fontfamilies, params.fontsDefaultFamily);
1491         if (n >= 0)
1492                 fontModule->fontsDefaultCO->setCurrentIndex(n);
1493
1494         // paper
1495         int const psize = params.papersize;
1496         pageLayoutModule->papersizeCO->setCurrentIndex(psize);
1497         setCustomPapersize(psize);
1498
1499         bool const landscape =
1500                 params.orientation == ORIENTATION_LANDSCAPE;
1501         pageLayoutModule->landscapeRB->setChecked(landscape);
1502         pageLayoutModule->portraitRB->setChecked(!landscape);
1503
1504         pageLayoutModule->facingPagesCB->setChecked(
1505                 params.sides == TextClass::TwoSides);
1506
1507
1508         lengthToWidgets(pageLayoutModule->paperwidthLE,
1509                 pageLayoutModule->paperwidthUnitCO, params.paperwidth, defaultUnit);
1510
1511         lengthToWidgets(pageLayoutModule->paperheightLE,
1512                 pageLayoutModule->paperheightUnitCO, params.paperheight, defaultUnit);
1513
1514         // margins
1515         Ui::MarginsUi * m = marginsModule;
1516
1517         setMargins(!params.use_geometry);
1518
1519         lengthToWidgets(m->topLE, m->topUnit,
1520                 params.topmargin, defaultUnit);
1521
1522         lengthToWidgets(m->bottomLE, m->bottomUnit,
1523                 params.bottommargin, defaultUnit);
1524
1525         lengthToWidgets(m->innerLE, m->innerUnit,
1526                 params.leftmargin, defaultUnit);
1527
1528         lengthToWidgets(m->outerLE, m->outerUnit,
1529                 params.rightmargin, defaultUnit);
1530
1531         lengthToWidgets(m->headheightLE, m->headheightUnit,
1532                 params.headheight, defaultUnit);
1533
1534         lengthToWidgets(m->headsepLE, m->headsepUnit,
1535                 params.headsep, defaultUnit);
1536
1537         lengthToWidgets(m->footskipLE, m->footskipUnit,
1538                 params.footskip, defaultUnit);
1539
1540         branchesModule->update(params);
1541
1542         // PDF support
1543         PDFOptions const & pdf = params.pdfoptions();
1544         pdfSupportModule->use_hyperrefGB->setChecked(pdf.use_hyperref);
1545         pdfSupportModule->titleLE->setText(toqstr(pdf.title));
1546         pdfSupportModule->authorLE->setText(toqstr(pdf.author));
1547         pdfSupportModule->subjectLE->setText(toqstr(pdf.subject));
1548         pdfSupportModule->keywordsLE->setText(toqstr(pdf.keywords));
1549
1550         pdfSupportModule->bookmarksGB->setChecked(pdf.bookmarks);
1551         pdfSupportModule->bookmarksnumberedCB->setChecked(pdf.bookmarksnumbered);
1552         pdfSupportModule->bookmarksopenGB->setChecked(pdf.bookmarksopen);
1553
1554         pdfSupportModule->bookmarksopenlevelSB->setValue(pdf.bookmarksopenlevel);
1555
1556         pdfSupportModule->breaklinksCB->setChecked(pdf.breaklinks);
1557         pdfSupportModule->pdfborderCB->setChecked(pdf.pdfborder);
1558         pdfSupportModule->pdfusetitleCB->setChecked(pdf.pdfusetitle);
1559         pdfSupportModule->colorlinksCB->setChecked(pdf.colorlinks);
1560         pdfSupportModule->backrefCB->setChecked(pdf.backref);
1561         pdfSupportModule->pagebackrefCB->setChecked(pdf.pagebackref);
1562         pdfSupportModule->fullscreenCB->setChecked
1563                 (pdf.pagemode == pdf.pagemode_fullscreen);
1564
1565         pdfSupportModule->optionsLE->setText(
1566                 toqstr(pdf.quoted_options));
1567 }
1568
1569
1570 void GuiDocument::applyView()
1571 {
1572         apply(params());
1573 }
1574
1575
1576 void GuiDocument::saveDocDefault()
1577 {
1578         // we have to apply the params first
1579         applyView();
1580         saveAsDefault();
1581 }
1582
1583
1584 void GuiDocument::updateContents()
1585 {
1586         //update list of available modules
1587         QStringList strlist;
1588         vector<string> const modNames = getModuleNames();
1589         vector<string>::const_iterator it = modNames.begin();
1590         for (; it != modNames.end(); ++it)
1591                 strlist.push_back(toqstr(*it));
1592         available_model_.setStringList(strlist);
1593         //and selected ones, too
1594         QStringList strlist2;
1595         vector<string> const & selMods = getSelectedModules();
1596         it = selMods.begin();
1597         for (; it != selMods.end(); ++it)
1598                 strlist2.push_back(toqstr(*it));
1599         selected_model_.setStringList(strlist2);
1600
1601         updateParams(bp_);
1602 }
1603
1604 void GuiDocument::useClassDefaults()
1605 {
1606         bp_.setJustBaseClass(latexModule->classCO->currentIndex());
1607         bp_.useClassDefaults();
1608         updateContents();
1609 }
1610
1611
1612 bool GuiDocument::isValid()
1613 {
1614         return validate_listings_params().empty();
1615 }
1616
1617
1618 char const * const GuiDocument::fontfamilies[5] = {
1619         "default", "rmdefault", "sfdefault", "ttdefault", ""
1620 };
1621
1622
1623 char const * GuiDocument::fontfamilies_gui[5] = {
1624         N_("Default"), N_("Roman"), N_("Sans Serif"), N_("Typewriter"), ""
1625 };
1626
1627
1628 bool GuiDocument::initialiseParams(string const &)
1629 {
1630         bp_ = buffer().params();
1631         loadModuleNames();
1632         return true;
1633 }
1634
1635
1636 void GuiDocument::clearParams()
1637 {
1638         bp_ = BufferParams();
1639 }
1640
1641
1642 BufferId GuiDocument::id() const
1643 {
1644         return &buffer();
1645 }
1646
1647
1648 vector<string> GuiDocument::getModuleNames()
1649 {
1650         return moduleNames_;
1651 }
1652
1653
1654 vector<string> const & GuiDocument::getSelectedModules()
1655 {
1656         return params().getModules();
1657 }
1658
1659
1660 string GuiDocument::getModuleDescription(string const & modName) const
1661 {
1662         LyXModule const * const mod = moduleList[modName];
1663         if (!mod)
1664                 return string("Module unavailable!");
1665         return mod->description;
1666 }
1667
1668
1669 vector<string>
1670 GuiDocument::getPackageList(string const & modName) const
1671 {
1672         LyXModule const * const mod = moduleList[modName];
1673         if (!mod)
1674                 return vector<string>(); //empty such thing
1675         return mod->packageList;
1676 }
1677
1678
1679 TextClass const & GuiDocument::textClass() const
1680 {
1681         return textclasslist[bp_.getBaseClass()];
1682 }
1683
1684
1685 static void dispatch_bufferparams(Dialog const & dialog,
1686         BufferParams const & bp, kb_action lfun)
1687 {
1688         ostringstream ss;
1689         ss << "\\begin_header\n";
1690         bp.writeFile(ss);
1691         ss << "\\end_header\n";
1692         dialog.dispatch(FuncRequest(lfun, ss.str()));
1693 }
1694
1695
1696 void GuiDocument::dispatchParams()
1697 {
1698         // This must come first so that a language change is correctly noticed
1699         setLanguage();
1700
1701         // Apply the BufferParams. Note that this will set the base class
1702         // and then update the buffer's layout.
1703         //FIXME Could this be done last? Then, I think, we'd get the automatic
1704         //update mentioned in the next FIXME...
1705         dispatch_bufferparams(*this, params(), LFUN_BUFFER_PARAMS_APPLY);
1706
1707         // Generate the colours requested by each new branch.
1708         BranchList & branchlist = params().branchlist();
1709         if (!branchlist.empty()) {
1710                 BranchList::const_iterator it = branchlist.begin();
1711                 BranchList::const_iterator const end = branchlist.end();
1712                 for (; it != end; ++it) {
1713                         docstring const & current_branch = it->getBranch();
1714                         Branch const * branch = branchlist.find(current_branch);
1715                         string const x11hexname = X11hexname(branch->getColor());
1716                         // display the new color
1717                         docstring const str = current_branch + ' ' + from_ascii(x11hexname);
1718                         dispatch(FuncRequest(LFUN_SET_COLOR, str));
1719                 }
1720
1721                 // Open insets of selected branches, close deselected ones
1722                 dispatch(FuncRequest(LFUN_ALL_INSETS_TOGGLE,
1723                         "assign branch"));
1724         }
1725         // FIXME: If we used an LFUN, we would not need those two lines:
1726         bufferview()->processUpdateFlags(Update::Force | Update::FitCursor);
1727 }
1728
1729
1730 void GuiDocument::setLanguage() const
1731 {
1732         Language const * const newL = bp_.language;
1733         if (buffer().params().language == newL)
1734                 return;
1735
1736         string const & lang_name = newL->lang();
1737         dispatch(FuncRequest(LFUN_BUFFER_LANGUAGE, lang_name));
1738 }
1739
1740
1741 void GuiDocument::saveAsDefault() const
1742 {
1743         dispatch_bufferparams(*this, params(), LFUN_BUFFER_SAVE_AS_DEFAULT);
1744 }
1745
1746
1747 bool GuiDocument::isFontAvailable(string const & font) const
1748 {
1749         if (font == "default" || font == "cmr"
1750             || font == "cmss" || font == "cmtt")
1751                 // these are standard
1752                 return true;
1753         if (font == "lmodern" || font == "lmss" || font == "lmtt")
1754                 return LaTeXFeatures::isAvailable("lmodern");
1755         if (font == "times" || font == "palatino"
1756                  || font == "helvet" || font == "courier")
1757                 return LaTeXFeatures::isAvailable("psnfss");
1758         if (font == "cmbr" || font == "cmtl")
1759                 return LaTeXFeatures::isAvailable("cmbright");
1760         if (font == "utopia")
1761                 return LaTeXFeatures::isAvailable("utopia")
1762                         || LaTeXFeatures::isAvailable("fourier");
1763         if (font == "beraserif" || font == "berasans"
1764                 || font == "beramono")
1765                 return LaTeXFeatures::isAvailable("bera");
1766         return LaTeXFeatures::isAvailable(font);
1767 }
1768
1769
1770 bool GuiDocument::providesOSF(string const & font) const
1771 {
1772         if (font == "cmr")
1773                 return isFontAvailable("eco");
1774         if (font == "palatino")
1775                 return isFontAvailable("mathpazo");
1776         return false;
1777 }
1778
1779
1780 bool GuiDocument::providesSC(string const & font) const
1781 {
1782         if (font == "palatino")
1783                 return isFontAvailable("mathpazo");
1784         if (font == "utopia")
1785                 return isFontAvailable("fourier");
1786         return false;
1787 }
1788
1789
1790 bool GuiDocument::providesScale(string const & font) const
1791 {
1792         return font == "helvet" || font == "luximono"
1793                 || font == "berasans"  || font == "beramono";
1794 }
1795
1796
1797 void GuiDocument::loadModuleNames ()
1798 {
1799         moduleNames_.clear();
1800         LyXModuleList::const_iterator it = moduleList.begin();
1801         for (; it != moduleList.end(); ++it)
1802                 moduleNames_.push_back(it->name);
1803         if (!moduleNames_.empty())
1804                 sort(moduleNames_.begin(), moduleNames_.end());
1805 }
1806
1807
1808 Dialog * createGuiDocument(LyXView & lv) { return new GuiDocument(lv); }
1809
1810
1811 } // namespace frontend
1812 } // namespace lyx
1813
1814 #include "GuiDocument_moc.cpp"