3 * This file is part of LyX, the document processor.
4 * Licence details can be found in the file COPYING.
8 * Full author contact details are available in file CREDITS.
13 #include "QDocument.h"
15 #include "qt_helpers.h"
16 #include "QBranches.h"
18 #include <QCloseEvent>
20 #include "FloatPlacement.h"
21 #include "LengthCombo.h"
22 #include "Validator.h"
23 #include "PanelStack.h"
25 #include "CheckedLineEdit.h"
27 // For latexHighlighter use in the preamble.
28 #include "QViewSource.h"
30 #include "BufferParams.h"
33 #include "frontend_helpers.h" // getSecond()
35 #include "LyXRC.h" // defaultUnit
36 #include "TextClassList.h"
39 #include "controllers/ControlDocument.h"
41 #include "support/lstrings.h"
43 #include "controllers/ControlDocument.h"
46 using lyx::support::token;
47 using lyx::support::bformat;
48 using lyx::support::findToken;
49 using lyx::support::getVectorFromString;
56 char const * const tex_graphics[] = {"default", "dvips", "dvitops", "emtex",
57 "ln", "oztex", "textures", "none", ""
61 char const * const tex_fonts_roman[] = {"default", "cmr", "lmodern", "ae", "times", "palatino",
62 "charter", "newcent", "bookman", "utopia", "beraserif", "ccfonts", "chancery", ""
66 char const * tex_fonts_roman_gui[] = { N_("Default"), N_("Computer Modern Roman"), N_("Latin Modern Roman"),
67 N_("AE (Almost European)"), N_("Times Roman"), N_("Palatino"), N_("Bitstream Charter"),
68 N_("New Century Schoolbook"), N_("Bookman"), N_("Utopia"), N_("Bera Serif"),
69 N_("Concrete Roman"), N_("Zapf Chancery"), ""
73 char const * const tex_fonts_sans[] = {"default", "cmss", "lmss", "helvet", "avant", "berasans", "cmbr", ""
77 char const * tex_fonts_sans_gui[] = { N_("Default"), N_("Computer Modern Sans"), N_("Latin Modern Sans"),
78 N_("Helvetica"), N_("Avant Garde"), N_("Bera Sans"), N_("CM Bright"), ""
82 char const * const tex_fonts_monospaced[] = {"default", "cmtt", "lmtt", "courier", "beramono",
83 "luximono", "cmtl", ""
87 char const * tex_fonts_monospaced_gui[] = { N_("Default"), N_("Computer Modern Typewriter"),
88 N_("Latin Modern Typewriter"), N_("Courier"), N_("Bera Mono"), N_("LuxiMono"),
89 N_("CM Typewriter Light"), ""
95 /////////////////////////////////////////////////////////////////////
99 /////////////////////////////////////////////////////////////////////
101 QDocumentDialog::QDocumentDialog(QDocument * form)
103 lang_(getSecond(getLanguageData(false)))
107 connect(okPB, SIGNAL(clicked()), form, SLOT(slotOK()));
108 connect(applyPB, SIGNAL(clicked()), form, SLOT(slotApply()));
109 connect(closePB, SIGNAL(clicked()), form, SLOT(slotClose()));
110 connect(restorePB, SIGNAL(clicked()), form, SLOT(slotRestore()));
112 connect(savePB, SIGNAL(clicked()), this, SLOT(saveDefaultClicked()));
113 connect(defaultPB, SIGNAL(clicked()), this, SLOT(useDefaultsClicked()));
115 // Manage the restore, ok, apply, restore and cancel/close buttons
116 form_->bcview().setOK(okPB);
117 form_->bcview().setApply(applyPB);
118 form_->bcview().setCancel(closePB);
119 form_->bcview().setRestore(restorePB);
122 textLayoutModule = new UiWidget<Ui::TextLayoutUi>;
124 connect(textLayoutModule->lspacingCO, SIGNAL(activated(int)),
125 this, SLOT(change_adaptor()));
126 connect(textLayoutModule->lspacingCO, SIGNAL(activated(int)),
127 this, SLOT(setLSpacing(int)));
128 connect(textLayoutModule->lspacingLE, SIGNAL(textChanged(const QString&)),
129 this, SLOT(change_adaptor()));
130 connect(textLayoutModule->skipRB, SIGNAL(clicked()),
131 this, SLOT(change_adaptor()));
132 connect(textLayoutModule->indentRB, SIGNAL(clicked()),
133 this, SLOT(change_adaptor()));
134 connect(textLayoutModule->skipCO, SIGNAL(activated(int)),
135 this, SLOT(change_adaptor()));
136 connect(textLayoutModule->skipLE, SIGNAL(textChanged(const QString &)),
137 this, SLOT(change_adaptor()));
138 connect(textLayoutModule->skipLengthCO, SIGNAL(activated(int)),
139 this, SLOT(change_adaptor()));
140 connect(textLayoutModule->skipCO, SIGNAL(activated(int)),
141 this, SLOT(setSkip(int)));
142 connect(textLayoutModule->skipRB, SIGNAL(toggled(bool)),
143 this, SLOT(enableSkip(bool)));
144 connect(textLayoutModule->twoColumnCB, SIGNAL(clicked()),
145 this, SLOT(change_adaptor()));
146 textLayoutModule->lspacingLE->setValidator(new QDoubleValidator(
147 textLayoutModule->lspacingLE));
148 textLayoutModule->skipLE->setValidator(unsignedLengthValidator(
149 textLayoutModule->skipLE));
151 textLayoutModule->skipCO->addItem(qt_("SmallSkip"));
152 textLayoutModule->skipCO->addItem(qt_("MedSkip"));
153 textLayoutModule->skipCO->addItem(qt_("BigSkip"));
154 textLayoutModule->skipCO->addItem(qt_("Length"));
155 // remove the %-items from the unit choice
156 textLayoutModule->skipLengthCO->noPercents();
157 textLayoutModule->lspacingCO->insertItem(
158 Spacing::Single, qt_("Single"));
159 textLayoutModule->lspacingCO->insertItem(
160 Spacing::Onehalf, qt_("OneHalf"));
161 textLayoutModule->lspacingCO->insertItem(
162 Spacing::Double, qt_("Double"));
163 textLayoutModule->lspacingCO->insertItem(
164 Spacing::Other, qt_("Custom"));
166 // initialize the length validator
167 addCheckedLineEdit(form_->bcview(), textLayoutModule->skipLE);
169 fontModule = new UiWidget<Ui::FontUi>;
171 connect(fontModule->fontsRomanCO, SIGNAL(activated(int)),
172 this, SLOT(change_adaptor()));
173 connect(fontModule->fontsRomanCO, SIGNAL(activated(int)),
174 this, SLOT(romanChanged(int)));
175 connect(fontModule->fontsSansCO, SIGNAL(activated(int)),
176 this, SLOT(change_adaptor()));
177 connect(fontModule->fontsSansCO, SIGNAL(activated(int)),
178 this, SLOT(sansChanged(int)));
179 connect(fontModule->fontsTypewriterCO, SIGNAL(activated(int)),
180 this, SLOT(change_adaptor()));
181 connect(fontModule->fontsTypewriterCO, SIGNAL(activated(int)),
182 this, SLOT(ttChanged(int)));
183 connect(fontModule->fontsDefaultCO, SIGNAL(activated(int)),
184 this, SLOT(change_adaptor()));
185 connect(fontModule->fontsizeCO, SIGNAL(activated(int)),
186 this, SLOT(change_adaptor()));
187 connect(fontModule->scaleSansSB, SIGNAL(valueChanged(int)),
188 this, SLOT(change_adaptor()));
189 connect(fontModule->scaleTypewriterSB, SIGNAL(valueChanged(int)),
190 this, SLOT(change_adaptor()));
191 connect(fontModule->fontScCB, SIGNAL(clicked()),
192 this, SLOT(change_adaptor()));
193 connect(fontModule->fontOsfCB, SIGNAL(clicked()),
194 this, SLOT(change_adaptor()));
196 for (int n = 0; tex_fonts_roman[n][0]; ++n) {
197 QString font = toqstr(tex_fonts_roman_gui[n]);
198 if (!form_->controller().isFontAvailable(tex_fonts_roman[n]))
199 font += qt_(" (not installed)");
200 fontModule->fontsRomanCO->addItem(font);
202 for (int n = 0; tex_fonts_sans[n][0]; ++n) {
203 QString font = toqstr(tex_fonts_sans_gui[n]);
204 if (!form_->controller().isFontAvailable(tex_fonts_sans[n]))
205 font += qt_(" (not installed)");
206 fontModule->fontsSansCO->addItem(font);
208 for (int n = 0; tex_fonts_monospaced[n][0]; ++n) {
209 QString font = toqstr(tex_fonts_monospaced_gui[n]);
210 if (!form_->controller().isFontAvailable(tex_fonts_monospaced[n]))
211 font += qt_(" (not installed)");
212 fontModule->fontsTypewriterCO->addItem(font);
215 fontModule->fontsizeCO->addItem(qt_("default"));
216 fontModule->fontsizeCO->addItem(qt_("10"));
217 fontModule->fontsizeCO->addItem(qt_("11"));
218 fontModule->fontsizeCO->addItem(qt_("12"));
220 for (int n = 0; ControlDocument::fontfamilies_gui[n][0]; ++n)
221 fontModule->fontsDefaultCO->addItem(
222 qt_(ControlDocument::fontfamilies_gui[n]));
225 pageLayoutModule = new UiWidget<Ui::PageLayoutUi>;
227 connect(pageLayoutModule->papersizeCO, SIGNAL(activated(int)),
228 this, SLOT(setCustomPapersize(int)));
229 connect(pageLayoutModule->papersizeCO, SIGNAL(activated(int)),
230 this, SLOT(setCustomPapersize(int)));
231 connect(pageLayoutModule->portraitRB, SIGNAL(clicked()),
232 this, SLOT(portraitChanged()));
233 connect(pageLayoutModule->papersizeCO, SIGNAL(activated(int)),
234 this, SLOT(change_adaptor()));
235 connect(pageLayoutModule->paperheightLE, SIGNAL(textChanged(const QString &)),
236 this, SLOT(change_adaptor()));
237 connect(pageLayoutModule->paperwidthLE, SIGNAL(textChanged(const QString &)),
238 this, SLOT(change_adaptor()));
239 connect(pageLayoutModule->paperwidthUnitCO, SIGNAL(activated(int)),
240 this, SLOT(change_adaptor()));
241 connect(pageLayoutModule->paperheightUnitCO, SIGNAL(activated(int)),
242 this, SLOT(change_adaptor()));
243 connect(pageLayoutModule->portraitRB, SIGNAL(clicked()),
244 this, SLOT(change_adaptor()));
245 connect(pageLayoutModule->landscapeRB, SIGNAL(clicked()),
246 this, SLOT(change_adaptor()));
247 connect(pageLayoutModule->facingPagesCB, SIGNAL(clicked()),
248 this, SLOT(change_adaptor()));
249 connect(pageLayoutModule->pagestyleCO, SIGNAL(activated(int)),
250 this, SLOT(change_adaptor()));
252 pageLayoutModule->pagestyleCO->addItem(qt_("default"));
253 pageLayoutModule->pagestyleCO->addItem(qt_("empty"));
254 pageLayoutModule->pagestyleCO->addItem(qt_("plain"));
255 pageLayoutModule->pagestyleCO->addItem(qt_("headings"));
256 pageLayoutModule->pagestyleCO->addItem(qt_("fancy"));
257 addCheckedLineEdit(form_->bcview(), pageLayoutModule->paperheightLE,
258 pageLayoutModule->paperheightL);
259 addCheckedLineEdit(form_->bcview(), pageLayoutModule->paperwidthLE,
260 pageLayoutModule->paperwidthL);
263 QComboBox * cb = pageLayoutModule->papersizeCO;
264 cb->addItem(qt_("Default"));
265 cb->addItem(qt_("Custom"));
266 cb->addItem(qt_("US letter"));
267 cb->addItem(qt_("US legal"));
268 cb->addItem(qt_("US executive"));
269 cb->addItem(qt_("A3"));
270 cb->addItem(qt_("A4"));
271 cb->addItem(qt_("A5"));
272 cb->addItem(qt_("B3"));
273 cb->addItem(qt_("B4"));
274 cb->addItem(qt_("B5"));
275 // remove the %-items from the unit choice
276 pageLayoutModule->paperwidthUnitCO->noPercents();
277 pageLayoutModule->paperheightUnitCO->noPercents();
278 pageLayoutModule->paperheightLE->setValidator(unsignedLengthValidator(
279 pageLayoutModule->paperheightLE));
280 pageLayoutModule->paperwidthLE->setValidator(unsignedLengthValidator(
281 pageLayoutModule->paperwidthLE));
286 marginsModule = new UiWidget<Ui::MarginsUi>;
288 connect(marginsModule->marginCB, SIGNAL(toggled(bool)),
289 this, SLOT(setCustomMargins(bool)));
290 connect(marginsModule->marginCB, SIGNAL(clicked()),
291 this, SLOT(change_adaptor()));
292 connect(marginsModule->topLE, SIGNAL(textChanged(const QString &)),
293 this, SLOT(change_adaptor()));
294 connect(marginsModule->topUnit, SIGNAL(activated(int)),
295 this, SLOT(change_adaptor()));
296 connect(marginsModule->bottomLE, SIGNAL(textChanged(const QString &)),
297 this, SLOT(change_adaptor()));
298 connect(marginsModule->bottomUnit, SIGNAL(activated(int)),
299 this, SLOT(change_adaptor()));
300 connect(marginsModule->innerLE, SIGNAL(textChanged(const QString &)),
301 this, SLOT(change_adaptor()));
302 connect(marginsModule->innerUnit, SIGNAL(activated(int)),
303 this, SLOT(change_adaptor()));
304 connect(marginsModule->outerLE, SIGNAL(textChanged(const QString &)),
305 this, SLOT(change_adaptor()));
306 connect(marginsModule->outerUnit, SIGNAL(activated(int)),
307 this, SLOT(change_adaptor()));
308 connect(marginsModule->headheightLE, SIGNAL(textChanged(const QString &)),
309 this, SLOT(change_adaptor()));
310 connect(marginsModule->headheightUnit, SIGNAL(activated(int)),
311 this, SLOT(change_adaptor()));
312 connect(marginsModule->headsepLE, SIGNAL(textChanged(const QString &)),
313 this, SLOT(change_adaptor()));
314 connect(marginsModule->headsepUnit, SIGNAL(activated(int)),
315 this, SLOT(change_adaptor()));
316 connect(marginsModule->footskipLE, SIGNAL(textChanged(const QString&)),
317 this, SLOT(change_adaptor()));
318 connect(marginsModule->footskipUnit, SIGNAL(activated(int)),
319 this, SLOT(change_adaptor()));
320 marginsModule->topLE->setValidator(unsignedLengthValidator(
321 marginsModule->topLE));
322 marginsModule->bottomLE->setValidator(unsignedLengthValidator(
323 marginsModule->bottomLE));
324 marginsModule->innerLE->setValidator(unsignedLengthValidator(
325 marginsModule->innerLE));
326 marginsModule->outerLE->setValidator(unsignedLengthValidator(
327 marginsModule->outerLE));
328 marginsModule->headsepLE->setValidator(unsignedLengthValidator(
329 marginsModule->headsepLE));
330 marginsModule->headheightLE->setValidator(unsignedLengthValidator(
331 marginsModule->headheightLE));
332 marginsModule->footskipLE->setValidator(unsignedLengthValidator(
333 marginsModule->footskipLE));
335 addCheckedLineEdit(form_->bcview(), marginsModule->topLE,
336 marginsModule->topL);
337 addCheckedLineEdit(form_->bcview(), marginsModule->bottomLE,
338 marginsModule->bottomL);
339 addCheckedLineEdit(form_->bcview(), marginsModule->innerLE,
340 marginsModule->innerL);
341 addCheckedLineEdit(form_->bcview(), marginsModule->outerLE,
342 marginsModule->outerL);
343 addCheckedLineEdit(form_->bcview(), marginsModule->headsepLE,
344 marginsModule->headsepL);
345 addCheckedLineEdit(form_->bcview(), marginsModule->headheightLE,
346 marginsModule->headheightL);
347 addCheckedLineEdit(form_->bcview(), marginsModule->footskipLE,
348 marginsModule->footskipL);
351 langModule = new UiWidget<Ui::LanguageUi>;
352 connect(langModule->defaultencodingCB, SIGNAL(toggled(bool)),
353 langModule->encodingL, SLOT(setDisabled(bool)));
354 connect(langModule->defaultencodingCB, SIGNAL(toggled(bool)),
355 langModule->encodingCO, SLOT(setDisabled(bool)));
357 connect(langModule->languageCO, SIGNAL(activated(int)),
358 this, SLOT(change_adaptor()));
359 connect(langModule->defaultencodingCB, SIGNAL(clicked()),
360 this, SLOT(change_adaptor()));
361 connect(langModule->encodingCO, SIGNAL(activated(int)),
362 this, SLOT(change_adaptor()));
363 connect(langModule->quoteStyleCO, SIGNAL(activated(int)),
364 this, SLOT(change_adaptor()));
366 vector<LanguagePair> const langs = getLanguageData(false);
367 vector<LanguagePair>::const_iterator lit = langs.begin();
368 vector<LanguagePair>::const_iterator lend = langs.end();
369 for (; lit != lend; ++lit) {
370 langModule->languageCO->addItem(
374 // Always put the default encoding in the first position.
375 // It is special because the displayed text is translated.
376 langModule->encodingCO->addItem(qt_("LaTeX default"));
377 Encodings::const_iterator it = encodings.begin();
378 Encodings::const_iterator const end = encodings.end();
379 for (; it != end; ++it)
380 langModule->encodingCO->addItem(toqstr(it->latexName()));
382 langModule->quoteStyleCO->addItem(qt_("``text''"));
383 langModule->quoteStyleCO->addItem(qt_("''text''"));
384 langModule->quoteStyleCO->addItem(qt_(",,text``"));
385 langModule->quoteStyleCO->addItem(qt_(",,text''"));
386 langModule->quoteStyleCO->addItem(qt_("<<text>>"));
387 langModule->quoteStyleCO->addItem(qt_(">>text<<"));
391 numberingModule = new UiWidget<Ui::NumberingUi>;
393 connect(numberingModule->depthSL, SIGNAL(valueChanged(int)),
394 this, SLOT(change_adaptor()));
395 connect(numberingModule->tocSL, SIGNAL(valueChanged(int)),
396 this, SLOT(change_adaptor()));
397 connect(numberingModule->depthSL, SIGNAL(valueChanged(int)),
398 this, SLOT(updateNumbering()));
399 connect(numberingModule->tocSL, SIGNAL(valueChanged(int)),
400 this, SLOT(updateNumbering()));
401 numberingModule->tocTW->setColumnCount(3);
402 numberingModule->tocTW->headerItem()->setText(0, qt_("Example"));
403 numberingModule->tocTW->headerItem()->setText(1, qt_("Numbered"));
404 numberingModule->tocTW->headerItem()->setText(2, qt_("Appears in TOC"));
407 biblioModule = new UiWidget<Ui::BiblioUi>;
408 connect(biblioModule->citeNatbibRB, SIGNAL(toggled(bool)),
409 biblioModule->citationStyleL, SLOT(setEnabled(bool)));
410 connect(biblioModule->citeNatbibRB, SIGNAL(toggled(bool)),
411 biblioModule->citeStyleCO, SLOT(setEnabled(bool)));
413 connect(biblioModule->citeDefaultRB, SIGNAL(clicked()),
414 this, SLOT(change_adaptor()));
415 connect(biblioModule->citeNatbibRB, SIGNAL(clicked()),
416 this, SLOT(change_adaptor()));
417 connect(biblioModule->citeStyleCO, SIGNAL(activated(int)),
418 this, SLOT(change_adaptor()));
419 connect(biblioModule->citeJurabibRB, SIGNAL(clicked()),
420 this, SLOT(change_adaptor()));
421 connect(biblioModule->bibtopicCB, SIGNAL(clicked()),
422 this, SLOT(change_adaptor()));
424 biblioModule->citeStyleCO->addItem(qt_("Author-year"));
425 biblioModule->citeStyleCO->addItem(qt_("Numerical"));
426 biblioModule->citeStyleCO->setCurrentIndex(0);
430 mathsModule = new UiWidget<Ui::MathsUi>;
431 connect(mathsModule->amsautoCB, SIGNAL(toggled(bool)),
432 mathsModule->amsCB, SLOT(setDisabled(bool)));
433 connect(mathsModule->esintautoCB, SIGNAL(toggled(bool)),
434 mathsModule->esintCB, SLOT(setDisabled(bool)));
436 connect(mathsModule->amsCB, SIGNAL(clicked()),
437 this, SLOT(change_adaptor()));
438 connect(mathsModule->amsautoCB, SIGNAL(clicked()),
439 this, SLOT(change_adaptor()));
440 connect(mathsModule->esintCB, SIGNAL(clicked()),
441 this, SLOT(change_adaptor()));
442 connect(mathsModule->esintautoCB, SIGNAL(clicked()),
443 this, SLOT(change_adaptor()));
445 latexModule = new UiWidget<Ui::LaTeXUi>;
447 connect(latexModule->classCO, SIGNAL(activated(int)),
448 this, SLOT(change_adaptor()));
449 connect(latexModule->optionsLE, SIGNAL(textChanged(const QString &)),
450 this, SLOT(change_adaptor()));
451 connect(latexModule->psdriverCO, SIGNAL(activated(int)),
452 this, SLOT(change_adaptor()));
453 connect(latexModule->classCO, SIGNAL(activated(int)),
454 this, SLOT(classChanged()));
456 for (int n = 0; tex_graphics[n][0]; ++n) {
457 QString enc = tex_graphics[n];
458 latexModule->psdriverCO->addItem(enc);
461 for (TextClassList::const_iterator cit = textclasslist.begin();
462 cit != textclasslist.end(); ++cit) {
463 if (cit->isTeXClassAvailable()) {
464 latexModule->classCO->addItem(toqstr(cit->description()));
467 bformat(_("Unavailable: %1$s"), from_utf8(cit->description()));
468 latexModule->classCO->addItem(toqstr(item));
473 branchesModule = new QBranches;
474 connect(branchesModule, SIGNAL(changed()),
475 this, SLOT(change_adaptor()));
478 preambleModule = new UiWidget<Ui::PreambleUi>;
479 connect(preambleModule->preambleTE, SIGNAL(textChanged()),
480 this, SLOT(change_adaptor()));
481 // This is not a memory leak. The object will be destroyed
482 // with preambleModule.
483 (void) new LaTeXHighlighter(preambleModule->preambleTE->document());
487 bulletsModule = new BulletsModule;
488 connect(bulletsModule, SIGNAL(changed()),
489 this, SLOT(change_adaptor()));
493 floatModule = new FloatPlacement;
494 connect(floatModule, SIGNAL(changed()),
495 this, SLOT(change_adaptor()));
497 docPS->addPanel(latexModule, _("Document Class"));
498 docPS->addPanel(fontModule, _("Fonts"));
499 docPS->addPanel(textLayoutModule, _("Text Layout"));
500 docPS->addPanel(pageLayoutModule, _("Page Layout"));
501 docPS->addPanel(marginsModule, _("Page Margins"));
502 docPS->addPanel(langModule, _("Language"));
503 docPS->addPanel(numberingModule, _("Numbering & TOC"));
504 docPS->addPanel(biblioModule, _("Bibliography"));
505 docPS->addPanel(mathsModule, _("Math Options"));
506 docPS->addPanel(floatModule, _("Float Placement"));
507 docPS->addPanel(bulletsModule, _("Bullets"));
508 docPS->addPanel(branchesModule, _("Branches"));
509 docPS->addPanel(preambleModule, _("LaTeX Preamble"));
510 docPS->setCurrentPanel(_("Document Class"));
511 // FIXME: hack to work around resizing bug in Qt >= 4.2
512 // bug verified with Qt 4.2.{0-3} (JSpitzm)
513 #if QT_VERSION >= 0x040200
514 docPS->updateGeometry();
519 void QDocumentDialog::showPreamble()
521 docPS->setCurrentPanel(_("LaTeX Preamble"));
525 void QDocumentDialog::saveDefaultClicked()
527 form_->saveDocDefault();
531 void QDocumentDialog::useDefaultsClicked()
533 form_->useClassDefaults();
537 void QDocumentDialog::change_adaptor()
543 void QDocumentDialog::closeEvent(QCloseEvent * e)
550 void QDocumentDialog::setLSpacing(int item)
552 textLayoutModule->lspacingLE->setEnabled(item == 3);
556 void QDocumentDialog::setSkip(int item)
558 bool const enable = (item == 3);
559 textLayoutModule->skipLE->setEnabled(enable);
560 textLayoutModule->skipLengthCO->setEnabled(enable);
564 void QDocumentDialog::enableSkip(bool skip)
566 textLayoutModule->skipCO->setEnabled(skip);
567 textLayoutModule->skipLE->setEnabled(skip);
568 textLayoutModule->skipLengthCO->setEnabled(skip);
570 setSkip(textLayoutModule->skipCO->currentIndex());
573 void QDocumentDialog::portraitChanged()
575 setMargins(pageLayoutModule->papersizeCO->currentIndex());
578 void QDocumentDialog::setMargins(bool custom)
580 marginsModule->marginCB->setChecked(custom);
581 setCustomMargins(custom);
585 void QDocumentDialog::setCustomPapersize(int papersize)
587 bool const custom = (papersize == 1);
589 pageLayoutModule->paperwidthL->setEnabled(custom);
590 pageLayoutModule->paperwidthLE->setEnabled(custom);
591 pageLayoutModule->paperwidthUnitCO->setEnabled(custom);
592 pageLayoutModule->paperheightL->setEnabled(custom);
593 pageLayoutModule->paperheightLE->setEnabled(custom);
594 pageLayoutModule->paperheightLE->setFocus();
595 pageLayoutModule->paperheightUnitCO->setEnabled(custom);
599 void QDocumentDialog::setCustomMargins(bool custom)
601 marginsModule->topL->setEnabled(!custom);
602 marginsModule->topLE->setEnabled(!custom);
603 marginsModule->topUnit->setEnabled(!custom);
605 marginsModule->bottomL->setEnabled(!custom);
606 marginsModule->bottomLE->setEnabled(!custom);
607 marginsModule->bottomUnit->setEnabled(!custom);
609 marginsModule->innerL->setEnabled(!custom);
610 marginsModule->innerLE->setEnabled(!custom);
611 marginsModule->innerUnit->setEnabled(!custom);
613 marginsModule->outerL->setEnabled(!custom);
614 marginsModule->outerLE->setEnabled(!custom);
615 marginsModule->outerUnit->setEnabled(!custom);
617 marginsModule->headheightL->setEnabled(!custom);
618 marginsModule->headheightLE->setEnabled(!custom);
619 marginsModule->headheightUnit->setEnabled(!custom);
621 marginsModule->headsepL->setEnabled(!custom);
622 marginsModule->headsepLE->setEnabled(!custom);
623 marginsModule->headsepUnit->setEnabled(!custom);
625 marginsModule->footskipL->setEnabled(!custom);
626 marginsModule->footskipLE->setEnabled(!custom);
627 marginsModule->footskipUnit->setEnabled(!custom);
631 void QDocumentDialog::updateFontsize(string const & items, string const & sel)
633 fontModule->fontsizeCO->clear();
634 fontModule->fontsizeCO->addItem(qt_("default"));
636 for (int n = 0; !token(items,'|',n).empty(); ++n)
637 fontModule->fontsizeCO->
638 addItem(toqstr(token(items,'|',n)));
640 for (int n = 0; n < fontModule->fontsizeCO->count(); ++n) {
641 if (fromqstr(fontModule->fontsizeCO->itemText(n)) == sel) {
642 fontModule->fontsizeCO->setCurrentIndex(n);
649 void QDocumentDialog::romanChanged(int item)
651 string const font = tex_fonts_roman[item];
653 fontModule->fontScCB->setEnabled(
654 form_->controller().providesSC(font));
655 fontModule->fontOsfCB->setEnabled(
656 form_->controller().providesOSF(font));
660 void QDocumentDialog::sansChanged(int item)
662 string const font = tex_fonts_sans[item];
663 bool scaleable = form_->controller().providesScale(font);
664 fontModule->scaleSansSB->setEnabled(scaleable);
665 fontModule->scaleSansLA->setEnabled(scaleable);
669 void QDocumentDialog::ttChanged(int item)
671 string const font = tex_fonts_monospaced[item];
672 bool scaleable = form_->controller().providesScale(font);
673 fontModule->scaleTypewriterSB->setEnabled(scaleable);
674 fontModule->scaleTypewriterLA->setEnabled(scaleable);
678 void QDocumentDialog::updatePagestyle(string const & items, string const & sel)
680 pageLayoutModule->pagestyleCO->clear();
681 pageLayoutModule->pagestyleCO->addItem("default");
683 for (int n=0; !token(items,'|',n).empty(); ++n)
684 pageLayoutModule->pagestyleCO->
685 addItem(toqstr(token(items,'|',n)));
687 for (int n = 0; n<pageLayoutModule->pagestyleCO->count(); ++n) {
688 if (fromqstr(pageLayoutModule->pagestyleCO->itemText(n))==sel) {
689 pageLayoutModule->pagestyleCO->setCurrentIndex(n);
696 void QDocumentDialog::classChanged()
698 ControlDocument & cntrl = form_->controller();
699 BufferParams & params = cntrl.params();
701 textclass_type const tc = latexModule->classCO->currentIndex();
703 if (form_->controller().loadTextclass(tc)) {
704 params.textclass = tc;
705 if (lyxrc.auto_reset_options)
706 params.useClassDefaults();
707 form_->update_contents();
709 latexModule->classCO->setCurrentIndex(params.textclass);
714 void QDocumentDialog::updateNumbering()
716 TextClass const & tclass =
717 form_->controller().params().getTextClass();
719 numberingModule->tocTW->setUpdatesEnabled(false);
720 numberingModule->tocTW->clear();
722 int const depth = numberingModule->depthSL->value();
723 int const toc = numberingModule->tocSL->value();
724 QString const no = qt_("No");
725 QString const yes = qt_("Yes");
726 TextClass::const_iterator end = tclass.end();
727 TextClass::const_iterator cit = tclass.begin();
728 QTreeWidgetItem * item = 0;
729 for ( ; cit != end ; ++cit) {
730 int const toclevel = (*cit)->toclevel;
731 if (toclevel != Layout::NOT_IN_TOC
732 && (*cit)->labeltype == LABEL_COUNTER) {
733 item = new QTreeWidgetItem(numberingModule->tocTW);
734 item->setText(0, qt_((*cit)->name()));
735 item->setText(1, (toclevel <= depth) ? yes : no);
736 item->setText(2, (toclevel <= toc) ? yes : no);
740 numberingModule->tocTW->setUpdatesEnabled(true);
741 numberingModule->tocTW->update();
744 void QDocumentDialog::apply(BufferParams & params)
748 fromqstr(preambleModule->preambleTE->document()->toPlainText());
751 params.setCiteEngine(biblio::ENGINE_BASIC);
753 if (biblioModule->citeNatbibRB->isChecked()) {
754 bool const use_numerical_citations =
755 biblioModule->citeStyleCO->currentIndex();
756 if (use_numerical_citations)
757 params.setCiteEngine(biblio::ENGINE_NATBIB_NUMERICAL);
759 params.setCiteEngine(biblio::ENGINE_NATBIB_AUTHORYEAR);
761 } else if (biblioModule->citeJurabibRB->isChecked())
762 params.setCiteEngine(biblio::ENGINE_JURABIB);
764 params.use_bibtopic =
765 biblioModule->bibtopicCB->isChecked();
768 if (langModule->defaultencodingCB->isChecked()) {
769 params.inputenc = "auto";
771 int i = langModule->encodingCO->currentIndex();
773 params.inputenc = "default";
776 fromqstr(langModule->encodingCO->currentText());
779 InsetQuotes::quote_language lga = InsetQuotes::EnglishQ;
780 switch (langModule->quoteStyleCO->currentIndex()) {
782 lga = InsetQuotes::EnglishQ;
785 lga = InsetQuotes::SwedishQ;
788 lga = InsetQuotes::GermanQ;
791 lga = InsetQuotes::PolishQ;
794 lga = InsetQuotes::FrenchQ;
797 lga = InsetQuotes::DanishQ;
800 params.quotes_language = lga;
802 int const pos = langModule->languageCO->currentIndex();
803 params.language = languages.getLanguage(lang_[pos]);
806 if (params.getTextClass().hasTocLevels()) {
807 params.tocdepth = numberingModule->tocSL->value();
808 params.secnumdepth = numberingModule->depthSL->value();
812 params.user_defined_bullet(0) = bulletsModule->getBullet(0);
813 params.user_defined_bullet(1) = bulletsModule->getBullet(1);
814 params.user_defined_bullet(2) = bulletsModule->getBullet(2);
815 params.user_defined_bullet(3) = bulletsModule->getBullet(3);
818 params.graphicsDriver =
819 fromqstr(latexModule->psdriverCO->currentText());
821 if (mathsModule->amsautoCB->isChecked()) {
822 params.use_amsmath = BufferParams::package_auto;
824 if (mathsModule->amsCB->isChecked())
825 params.use_amsmath = BufferParams::package_on;
827 params.use_amsmath = BufferParams::package_off;
830 if (mathsModule->esintautoCB->isChecked())
831 params.use_esint = BufferParams::package_auto;
833 if (mathsModule->esintCB->isChecked())
834 params.use_esint = BufferParams::package_on;
836 params.use_esint = BufferParams::package_off;
841 latexModule->classCO->currentIndex();
844 fromqstr(pageLayoutModule->pagestyleCO->currentText());
846 switch (textLayoutModule->lspacingCO->currentIndex()) {
848 params.spacing().set(Spacing::Single);
851 params.spacing().set(Spacing::Onehalf);
854 params.spacing().set(Spacing::Double);
857 params.spacing().set(Spacing::Other,
858 fromqstr(textLayoutModule->lspacingLE->text()));
862 if (textLayoutModule->twoColumnCB->isChecked())
867 if (textLayoutModule->indentRB->isChecked())
868 params.paragraph_separation = BufferParams::PARSEP_INDENT;
870 params.paragraph_separation = BufferParams::PARSEP_SKIP;
872 switch (textLayoutModule->skipCO->currentIndex()) {
874 params.setDefSkip(VSpace(VSpace::SMALLSKIP));
877 params.setDefSkip(VSpace(VSpace::MEDSKIP));
880 params.setDefSkip(VSpace(VSpace::BIGSKIP));
885 widgetsToLength(textLayoutModule->skipLE,
886 textLayoutModule->skipLengthCO)
888 params.setDefSkip(vs);
892 // DocumentDefskipCB assures that this never happens
893 // so Assert then !!! - jbl
894 params.setDefSkip(VSpace(VSpace::MEDSKIP));
899 fromqstr(latexModule->optionsLE->text());
901 params.float_placement = floatModule->get();
905 tex_fonts_roman[fontModule->fontsRomanCO->currentIndex()];
908 tex_fonts_sans[fontModule->fontsSansCO->currentIndex()];
910 params.fontsTypewriter =
911 tex_fonts_monospaced[fontModule->fontsTypewriterCO->currentIndex()];
913 params.fontsSansScale = fontModule->scaleSansSB->value();
915 params.fontsTypewriterScale = fontModule->scaleTypewriterSB->value();
917 params.fontsSC = fontModule->fontScCB->isChecked();
919 params.fontsOSF = fontModule->fontOsfCB->isChecked();
921 params.fontsDefaultFamily = ControlDocument::fontfamilies[
922 fontModule->fontsDefaultCO->currentIndex()];
924 if (fontModule->fontsizeCO->currentIndex() == 0)
925 params.fontsize = "default";
928 fromqstr(fontModule->fontsizeCO->currentText());
931 params.papersize = PAPER_SIZE(
932 pageLayoutModule->papersizeCO->currentIndex());
934 // custom, A3, B3 and B4 paper sizes need geometry
935 int psize = pageLayoutModule->papersizeCO->currentIndex();
936 bool geom_papersize = (psize == 1 || psize == 5 || psize == 8 || psize == 9);
938 params.paperwidth = widgetsToLength(pageLayoutModule->paperwidthLE,
939 pageLayoutModule->paperwidthUnitCO);
941 params.paperheight = widgetsToLength(pageLayoutModule->paperheightLE,
942 pageLayoutModule->paperheightUnitCO);
944 if (pageLayoutModule->facingPagesCB->isChecked())
945 params.sides = TextClass::TwoSides;
947 params.sides = TextClass::OneSide;
949 if (pageLayoutModule->landscapeRB->isChecked())
950 params.orientation = ORIENTATION_LANDSCAPE;
952 params.orientation = ORIENTATION_PORTRAIT;
955 params.use_geometry =
956 (!marginsModule->marginCB->isChecked()
959 Ui::MarginsUi const * m(marginsModule);
961 params.leftmargin = widgetsToLength(m->innerLE, m->innerUnit);
963 params.topmargin = widgetsToLength(m->topLE, m->topUnit);
965 params.rightmargin = widgetsToLength(m->outerLE, m->outerUnit);
967 params.bottommargin = widgetsToLength(m->bottomLE, m->bottomUnit);
969 params.headheight = widgetsToLength(m->headheightLE, m->headheightUnit);
971 params.headsep = widgetsToLength(m->headsepLE, m->headsepUnit);
973 params.footskip = widgetsToLength(m->footskipLE, m->footskipUnit);
975 branchesModule->apply(params);
980 /** Return the position of val in the vector if found.
981 If not found, return 0.
984 typename std::vector<A>::size_type
985 findPos(std::vector<A> const & vec, A const & val)
987 typename std::vector<A>::const_iterator it =
988 std::find(vec.begin(), vec.end(), val);
991 return distance(vec.begin(), it);
997 void QDocumentDialog::updateParams(BufferParams const & params)
999 // set the default unit
1000 // FIXME: move to controller
1001 Length::UNIT defaultUnit = Length::CM;
1002 switch (lyxrc.default_papersize) {
1003 case PAPER_DEFAULT: break;
1005 case PAPER_USLETTER:
1007 case PAPER_USEXECUTIVE:
1008 defaultUnit = Length::IN;
1017 defaultUnit = Length::CM;
1024 QString preamble = toqstr(params.preamble);
1025 if (preamble != preambleModule->preambleTE->document()->toPlainText())
1026 preambleModule->preambleTE->document()->setPlainText(preamble);
1029 biblioModule->citeDefaultRB->setChecked(
1030 params.getEngine() == biblio::ENGINE_BASIC);
1032 biblioModule->citeNatbibRB->setChecked(
1033 params.getEngine() == biblio::ENGINE_NATBIB_NUMERICAL ||
1034 params.getEngine() == biblio::ENGINE_NATBIB_AUTHORYEAR);
1036 biblioModule->citeStyleCO->setCurrentIndex(
1037 params.getEngine() == biblio::ENGINE_NATBIB_NUMERICAL);
1039 biblioModule->citeJurabibRB->setChecked(
1040 params.getEngine() == biblio::ENGINE_JURABIB);
1042 biblioModule->bibtopicCB->setChecked(
1043 params.use_bibtopic);
1045 // language & quotes
1046 int const pos = int(findPos(lang_,
1047 params.language->lang()));
1048 langModule->languageCO->setCurrentIndex(pos);
1050 langModule->quoteStyleCO->setCurrentIndex(
1051 params.quotes_language);
1053 langModule->defaultencodingCB->setChecked(true);
1055 if (params.inputenc != "auto") {
1056 langModule->defaultencodingCB->setChecked(false);
1057 if (params.inputenc == "default") {
1058 langModule->encodingCO->setCurrentIndex(0);
1060 int const i = langModule->encodingCO->findText(
1061 toqstr(params.inputenc));
1063 langModule->encodingCO->setCurrentIndex(i);
1065 // unknown encoding. Set to default.
1066 langModule->defaultencodingCB->setChecked(true);
1071 int const min_toclevel = form_->controller().textClass().min_toclevel();
1072 int const max_toclevel = form_->controller().textClass().max_toclevel();
1073 if (form_->controller().textClass().hasTocLevels()) {
1074 numberingModule->setEnabled(true);
1075 numberingModule->depthSL->setMinimum(min_toclevel - 1);
1076 numberingModule->depthSL->setMaximum(max_toclevel);
1077 numberingModule->depthSL->setValue(params.secnumdepth);
1078 numberingModule->tocSL->setMaximum(min_toclevel - 1);
1079 numberingModule->tocSL->setMaximum(max_toclevel);
1080 numberingModule->tocSL->setValue(params.tocdepth);
1083 numberingModule->setEnabled(false);
1084 numberingModule->tocTW->clear();
1088 bulletsModule->setBullet(0, params.user_defined_bullet(0));
1089 bulletsModule->setBullet(1, params.user_defined_bullet(1));
1090 bulletsModule->setBullet(2, params.user_defined_bullet(2));
1091 bulletsModule->setBullet(3, params.user_defined_bullet(3));
1092 bulletsModule->init();
1095 QString text = toqstr(params.graphicsDriver);
1096 int nitem = latexModule->psdriverCO->count();
1097 for (int n = 0; n < nitem ; ++n) {
1098 QString enc = tex_graphics[n];
1100 latexModule->psdriverCO->setCurrentIndex(n);
1105 mathsModule->amsCB->setChecked(
1106 params.use_amsmath == BufferParams::package_on);
1107 mathsModule->amsautoCB->setChecked(
1108 params.use_amsmath == BufferParams::package_auto);
1110 mathsModule->esintCB->setChecked(
1111 params.use_esint == BufferParams::package_on);
1112 mathsModule->esintautoCB->setChecked(
1113 params.use_esint == BufferParams::package_auto);
1115 switch (params.spacing().getSpace()) {
1116 case Spacing::Other: nitem = 3; break;
1117 case Spacing::Double: nitem = 2; break;
1118 case Spacing::Onehalf: nitem = 1; break;
1119 case Spacing::Default: case Spacing::Single: nitem = 0; break;
1123 latexModule->classCO->setCurrentIndex(params.textclass);
1125 updatePagestyle(form_->controller().textClass().opt_pagestyle(),
1128 textLayoutModule->lspacingCO->setCurrentIndex(nitem);
1129 if (params.spacing().getSpace() == Spacing::Other) {
1130 textLayoutModule->lspacingLE->setText(
1131 toqstr(params.spacing().getValueAsString()));
1135 if (params.paragraph_separation
1136 == BufferParams::PARSEP_INDENT) {
1137 textLayoutModule->indentRB->setChecked(true);
1139 textLayoutModule->skipRB->setChecked(true);
1143 switch (params.getDefSkip().kind()) {
1144 case VSpace::SMALLSKIP:
1147 case VSpace::MEDSKIP:
1150 case VSpace::BIGSKIP:
1153 case VSpace::LENGTH:
1156 string const length = params.getDefSkip().asLyXCommand();
1157 lengthToWidgets(textLayoutModule->skipLE,
1158 textLayoutModule->skipLengthCO,
1159 length, defaultUnit);
1166 textLayoutModule->skipCO->setCurrentIndex(skip);
1169 textLayoutModule->twoColumnCB->setChecked(
1170 params.columns == 2);
1172 if (!params.options.empty()) {
1173 latexModule->optionsLE->setText(
1174 toqstr(params.options));
1176 latexModule->optionsLE->setText("");
1179 floatModule->set(params.float_placement);
1182 updateFontsize(form_->controller().textClass().opt_fontsize(),
1185 int n = findToken(tex_fonts_roman, params.fontsRoman);
1187 fontModule->fontsRomanCO->setCurrentIndex(n);
1191 n = findToken(tex_fonts_sans, params.fontsSans);
1193 fontModule->fontsSansCO->setCurrentIndex(n);
1197 n = findToken(tex_fonts_monospaced, params.fontsTypewriter);
1199 fontModule->fontsTypewriterCO->setCurrentIndex(n);
1203 fontModule->fontScCB->setChecked(params.fontsSC);
1204 fontModule->fontOsfCB->setChecked(params.fontsOSF);
1205 fontModule->scaleSansSB->setValue(params.fontsSansScale);
1206 fontModule->scaleTypewriterSB->setValue(params.fontsTypewriterScale);
1207 n = findToken(ControlDocument::fontfamilies, params.fontsDefaultFamily);
1209 fontModule->fontsDefaultCO->setCurrentIndex(n);
1212 int const psize = params.papersize;
1213 pageLayoutModule->papersizeCO->setCurrentIndex(psize);
1214 setCustomPapersize(psize);
1216 bool const landscape =
1217 params.orientation == ORIENTATION_LANDSCAPE;
1218 pageLayoutModule->landscapeRB->setChecked(landscape);
1219 pageLayoutModule->portraitRB->setChecked(!landscape);
1221 pageLayoutModule->facingPagesCB->setChecked(
1222 params.sides == TextClass::TwoSides);
1225 lengthToWidgets(pageLayoutModule->paperwidthLE,
1226 pageLayoutModule->paperwidthUnitCO, params.paperwidth, defaultUnit);
1228 lengthToWidgets(pageLayoutModule->paperheightLE,
1229 pageLayoutModule->paperheightUnitCO, params.paperheight, defaultUnit);
1232 Ui::MarginsUi * m = marginsModule;
1234 setMargins(!params.use_geometry);
1236 lengthToWidgets(m->topLE, m->topUnit,
1237 params.topmargin, defaultUnit);
1239 lengthToWidgets(m->bottomLE, m->bottomUnit,
1240 params.bottommargin, defaultUnit);
1242 lengthToWidgets(m->innerLE, m->innerUnit,
1243 params.leftmargin, defaultUnit);
1245 lengthToWidgets(m->outerLE, m->outerUnit,
1246 params.rightmargin, defaultUnit);
1248 lengthToWidgets(m->headheightLE, m->headheightUnit,
1249 params.headheight, defaultUnit);
1251 lengthToWidgets(m->headsepLE, m->headsepUnit,
1252 params.headsep, defaultUnit);
1254 lengthToWidgets(m->footskipLE, m->footskipUnit,
1255 params.footskip, defaultUnit);
1257 branchesModule->update(params);
1262 /////////////////////////////////////////////////////////////////////
1266 /////////////////////////////////////////////////////////////////////
1268 typedef QController<ControlDocument, QView<QDocumentDialog> >
1272 QDocument::QDocument(Dialog & parent)
1273 : DocumentBase(parent, _("Document Settings"))
1277 void QDocument::build_dialog()
1279 dialog_.reset(new QDocumentDialog(this));
1283 void QDocument::showPreamble()
1285 dialog_->showPreamble();
1289 void QDocument::apply()
1294 dialog_->apply(controller().params());
1298 void QDocument::update_contents()
1303 dialog_->updateParams(controller().params());
1306 void QDocument::saveDocDefault()
1308 // we have to apply the params first
1310 controller().saveAsDefault();
1314 void QDocument::useClassDefaults()
1316 BufferParams & params = controller().params();
1318 ///\todo verify the use of below with lyx-devel:
1319 params.textclass = dialog_->latexModule->classCO->currentIndex();
1321 params.useClassDefaults();
1325 } // namespace frontend
1328 #include "QDocument_moc.cpp"