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
14 #pragma implementation
19 #include "ControlDocument.h"
20 #include "QDocument.h"
21 #include "QDocumentDialog.h"
25 #include "helper_funcs.h" // getSecond()
26 #include "insets/insetquotes.h"
27 #include "frnt_lang.h"
28 #include "lyxrc.h" // defaultUnit
29 #include "tex-strings.h" // tex_graphics
30 #include "support/lstrings.h" // tostr()
31 #include "support/filetools.h" // LibFileSearch()
32 #include "lyxtextclasslist.h"
34 #include "bufferparams.h"
35 #include "qt_helpers.h"
37 #include <qpushbutton.h>
38 #include <qmultilineedit.h>
39 #include <qradiobutton.h>
40 #include <qcombobox.h>
41 #include <qcheckbox.h>
43 #include <qlineedit.h>
44 #include <qstringlist.h>
45 #include "lengthcombo.h"
47 #include "QBrowseBox.h"
53 typedef Qt2CB<ControlDocument, Qt2DB<QDocumentDialog> > base_class;
56 QDocument::QDocument()
57 : base_class(_("Document Settings"))
59 vector<frnt::LanguagePair> const langs = frnt::getLanguageData(false);
60 lang_ = getSecond(langs);
64 void QDocument::build_dialog()
66 dialog_.reset(new QDocumentDialog(this));
69 dialog_->biblioModule->citeStyleCO->insertItem(_("Author-year"));
70 dialog_->biblioModule->citeStyleCO->insertItem(_("Numerical"));
71 dialog_->biblioModule->citeStyleCO->setCurrentItem(0);
74 vector<frnt::LanguagePair> const langs = frnt::getLanguageData(false);
75 vector<frnt::LanguagePair>::const_iterator lit = langs.begin();
76 vector<frnt::LanguagePair>::const_iterator lend = langs.end();
77 for (; lit != lend; ++lit) {
78 dialog_->langModule->languageCO->insertItem(
82 dialog_->langModule->quoteStyleCO->insertItem(_("``text''"));
83 dialog_->langModule->quoteStyleCO->insertItem(_("''text''"));
84 dialog_->langModule->quoteStyleCO->insertItem(_(",,text``"));
85 dialog_->langModule->quoteStyleCO->insertItem(_(",,text''"));
86 dialog_->langModule->quoteStyleCO->insertItem(_("«text»"));
87 dialog_->langModule->quoteStyleCO->insertItem(_("»text«"));
90 char const * items[] = {"default", "auto", "latin1", "latin2",
91 "latin3", "latin4", "latin5", "latin9",
92 "koi8-r", "koi8-u", "cp866", "cp1251",
93 "iso88595", "pt154", 0};
94 dialog_->packagesModule->encodingCO->insertStrList(items);
96 dialog_->packagesModule->lspacingCO->insertItem(
97 _("Single"), Spacing::Single);
98 dialog_->packagesModule->lspacingCO->insertItem(
99 _("OneHalf"), Spacing::Onehalf);
100 dialog_->packagesModule->lspacingCO->insertItem(
101 _("Double"), Spacing::Double);
102 dialog_->packagesModule->lspacingCO->insertItem(
103 _("Custom"), Spacing::Other);
105 for (int n = 0; tex_graphics[n][0]; ++n) {
106 QString enc = tex_graphics[n];
107 dialog_->packagesModule->psdriverCO->insertItem(enc);
111 char const * sizes[] = {
112 _("Default") , _("Custom") , _("US letter") , _("US legal")
113 , _("US executive") , _("A3") , _("A4") , _("A5")
114 , _("B3") , _("B4") , _("B5"), 0 };
115 dialog_->paperModule->papersizeCO->insertStrList(sizes);
118 for (LyXTextClassList::const_iterator cit = textclasslist.begin();
119 cit != textclasslist.end(); ++cit) {
120 dialog_->layoutModule->classCO->insertItem(cit->description().c_str());
123 for (int n = 0; tex_fonts[n][0]; ++n) {
124 QString font = tex_fonts[n];
125 dialog_->layoutModule->fontsCO->insertItem(font);
128 dialog_->layoutModule->fontsizeCO->insertItem(_("default"));
129 dialog_->layoutModule->fontsizeCO->insertItem(_("10"));
130 dialog_->layoutModule->fontsizeCO->insertItem(_("11"));
131 dialog_->layoutModule->fontsizeCO->insertItem(_("12"));
133 dialog_->layoutModule->skipCO->insertItem(_("Smallskip"));
134 dialog_->layoutModule->skipCO->insertItem(_("Medskip"));
135 dialog_->layoutModule->skipCO->insertItem(_("Bigskip"));
136 dialog_->layoutModule->skipCO->insertItem(_("Length"));
138 dialog_->layoutModule->pagestyleCO->insertItem(_("default"));
139 dialog_->layoutModule->pagestyleCO->insertItem(_("empty"));
140 dialog_->layoutModule->pagestyleCO->insertItem(_("plain"));
141 dialog_->layoutModule->pagestyleCO->insertItem(_("headings"));
142 dialog_->layoutModule->pagestyleCO->insertItem(_("fancy"));
145 dialog_->setMargins(0);
147 // Manage the restore, ok, apply, restore and cancel/close buttons
148 bc().setOK(dialog_->okPB);
149 bc().setApply(dialog_->applyPB);
150 bc().setCancel(dialog_->closePB);
151 bc().setRestore(dialog_->restorePB);
155 void QDocument::apply()
157 BufferParams & params = controller().params();
161 dialog_->preambleModule->preambleMLE->text().latin1();
165 dialog_->biblioModule->natbibCB->isChecked();
166 params.use_numerical_citations =
167 dialog_->biblioModule->citeStyleCO->currentItem();
170 if (dialog_->langModule->singleQuoteRB->isChecked())
171 params.quotes_times = InsetQuotes::SingleQ;
173 params.quotes_times = InsetQuotes::DoubleQ;
176 InsetQuotes::quote_language lga = InsetQuotes::EnglishQ;
177 switch (dialog_->langModule->quoteStyleCO->currentItem()) {
179 lga = InsetQuotes::EnglishQ;
182 lga = InsetQuotes::SwedishQ;
185 lga = InsetQuotes::GermanQ;
188 lga = InsetQuotes::PolishQ;
191 lga = InsetQuotes::FrenchQ;
194 lga = InsetQuotes::DanishQ;
197 params.quotes_language = lga;
199 int const pos = dialog_->langModule->languageCO->currentItem();
200 params.language = languages.getLanguage(lang_[pos]);
204 dialog_->numberingModule->tocDepthSB->value();
206 dialog_->numberingModule->sectionnrDepthSB->value();
209 params.user_defined_bullets[0].setText(dialog_->bulletsModule->bullet1LE->text().latin1());
210 params.user_defined_bullets[1].setText(dialog_->bulletsModule->bullet2LE->text().latin1());
211 params.user_defined_bullets[2].setText(dialog_->bulletsModule->bullet3LE->text().latin1());
212 params.user_defined_bullets[3].setText(dialog_->bulletsModule->bullet4LE->text().latin1());
214 params.user_defined_bullets[0].setSize(dialog_->bulletsModule->bulletsize1CO->currentItem()-1);
215 params.user_defined_bullets[1].setSize(dialog_->bulletsModule->bulletsize2CO->currentItem()-1);
216 params.user_defined_bullets[2].setSize(dialog_->bulletsModule->bulletsize3CO->currentItem()-1);
217 params.user_defined_bullets[3].setSize(dialog_->bulletsModule->bulletsize4CO->currentItem()-1);
220 switch (dialog_->packagesModule->lspacingCO->currentItem()) {
222 params.spacing.set(Spacing::Single);
225 params.spacing.set(Spacing::Onehalf);
228 params.spacing.set(Spacing::Double);
231 params.spacing.set(Spacing::Other,
232 dialog_->packagesModule->
233 lspacingLE->text().toFloat()
238 params.graphicsDriver =
239 dialog_->packagesModule->psdriverCO->currentText().latin1();
242 dialog_->packagesModule->amsCB->isChecked();
245 dialog_->packagesModule->encodingCO->currentText().latin1();
249 dialog_->layoutModule->classCO->currentItem();
251 //bool succes = controller().classApply();
254 dialog_->layoutModule->fontsCO->currentText().latin1();
257 dialog_->layoutModule->fontsizeCO->currentText().latin1();
260 dialog_->layoutModule->pagestyleCO->currentText().latin1();
262 if (dialog_->layoutModule->indentRB->isChecked())
263 params.paragraph_separation = BufferParams::PARSEP_INDENT;
265 params.paragraph_separation = BufferParams::PARSEP_SKIP;
267 switch (dialog_->layoutModule->skipCO->currentItem()) {
269 params.setDefSkip(VSpace(VSpace::SMALLSKIP));
272 params.setDefSkip(VSpace(VSpace::MEDSKIP));
275 params.setDefSkip(VSpace(VSpace::BIGSKIP));
279 LyXLength::UNIT unit =
280 dialog_->layoutModule->skipLengthCO->
283 dialog_->layoutModule->skipLE->text().toDouble();
284 VSpace vs = VSpace(LyXGlueLength(LyXLength(length,unit)));
285 params.setDefSkip(vs);
289 // DocumentDefskipCB assures that this never happens
290 // so Assert then !!! - jbl
291 params.setDefSkip(VSpace(VSpace::MEDSKIP));
296 dialog_->layoutModule->optionsLE->text().latin1();
298 params.float_placement =
299 dialog_->layoutModule->floatPlacementLE->text().latin1();
303 dialog_->paperModule->papersizeCO->currentItem();
305 params.paperwidth = widgetsToLength(dialog_->paperModule->paperwidthLE,
306 dialog_->paperModule->paperwidthUnitCO);
308 params.paperheight = widgetsToLength(dialog_->paperModule->paperheightLE,
309 dialog_->paperModule->paperheightUnitCO);
311 if (dialog_->paperModule->twoColumnCB->isChecked())
316 if (dialog_->paperModule->facingPagesCB->isChecked())
317 params.sides = LyXTextClass::TwoSides;
319 params.sides = LyXTextClass::OneSide;
321 if (dialog_->paperModule->landscapeRB->isChecked())
322 params.orientation = BufferParams::ORIENTATION_LANDSCAPE;
324 params.orientation = BufferParams::ORIENTATION_PORTRAIT;
327 params.use_geometry =
328 (dialog_->marginsModule->marginCO->currentItem() == 1);
330 int margin = dialog_->marginsModule->marginCO->currentItem();
334 params.paperpackage = char(margin);
336 MarginsModuleBase const * m(dialog_->marginsModule);
338 params.leftmargin = widgetsToLength(m->innerLE, m->innerUnit);
340 params.topmargin = widgetsToLength(m->topLE, m->topUnit);
342 params.rightmargin = widgetsToLength(m->outerLE, m->outerUnit);
344 params.bottommargin = widgetsToLength(m->bottomLE, m->bottomUnit);
346 params.headheight = widgetsToLength(m->headheightLE, m->headheightUnit);
348 params.headsep = widgetsToLength(m->headsepLE, m->headsepUnit);
350 params.footskip = widgetsToLength(m->footskipLE, m->footskipUnit);
356 /** Return the position of val in the vector if found.
357 If not found, return 0.
360 typename std::vector<A>::size_type
361 findPos(std::vector<A> const & vec, A const & val)
363 typename std::vector<A>::const_iterator it =
364 std::find(vec.begin(), vec.end(), val);
367 return std::distance(vec.begin(), it);
373 void QDocument::update_contents()
378 BufferParams const & params = controller().params();
380 // set the default unit
381 // FIXME: move to controller
382 LyXLength::UNIT defaultUnit = LyXLength::CM;
383 switch (lyxrc.default_papersize) {
384 case BufferParams::PAPER_DEFAULT: break;
386 case BufferParams::PAPER_USLETTER:
387 case BufferParams::PAPER_LEGALPAPER:
388 case BufferParams::PAPER_EXECUTIVEPAPER:
389 defaultUnit = LyXLength::IN;
392 case BufferParams::PAPER_A3PAPER:
393 case BufferParams::PAPER_A4PAPER:
394 case BufferParams::PAPER_A5PAPER:
395 case BufferParams::PAPER_B5PAPER:
396 defaultUnit = LyXLength::CM;
401 QString preamble = params.preamble.c_str();
402 dialog_->preambleModule->preambleMLE->setText(preamble);
405 dialog_->biblioModule->natbibCB->setChecked(
407 dialog_->biblioModule->citeStyleCO->setCurrentItem(
408 params.use_numerical_citations ? 1 : 0);
411 dialog_->langModule->singleQuoteRB->setChecked(
412 params.quotes_times == InsetQuotes::SingleQ);
413 dialog_->langModule->doubleQuoteRB->setChecked(
414 params.quotes_times == InsetQuotes::DoubleQ);
416 int const pos = int(findPos(lang_,
417 params.language->lang()));
418 dialog_->langModule->languageCO->setCurrentItem(pos);
420 dialog_->langModule->quoteStyleCO->setCurrentItem(
421 params.quotes_language);
424 dialog_->numberingModule->tocDepthSB->setValue(
426 dialog_->numberingModule->sectionnrDepthSB->setValue(
431 s = params.user_defined_bullets[0].getText().c_str();
432 dialog_->bulletsModule->bullet1LE->setText(s);
433 s = params.user_defined_bullets[1].getText().c_str();
434 dialog_->bulletsModule->bullet2LE->setText(s);
435 s = params.user_defined_bullets[2].getText().c_str();
436 dialog_->bulletsModule->bullet3LE->setText(s);
437 s = params.user_defined_bullets[3].getText().c_str();
438 dialog_->bulletsModule->bullet4LE->setText(s);
440 dialog_->bulletsModule->bulletsize1CO->setCurrentItem(
441 params.user_defined_bullets[0].getSize() + 1);
442 dialog_->bulletsModule->bulletsize2CO->setCurrentItem(
443 params.user_defined_bullets[1].getSize() + 1);
444 dialog_->bulletsModule->bulletsize3CO->setCurrentItem(
445 params.user_defined_bullets[2].getSize() + 1);
446 dialog_->bulletsModule->bulletsize4CO->setCurrentItem(
447 params.user_defined_bullets[3].getSize() + 1);
450 char const * enc[] = {
451 "default" , "auto" , "latin1" , "latin2" , "latin3" ,
452 "latin4" , "latin5" , "latin9" , "koi8-r" , "koi8-u" ,
453 "cp866" , "cp1251" , "iso88595" , "pt154" };
454 for (size_t i = 0; i < sizeof(enc)/sizeof(char *); ++i) {
455 if (params.inputenc == enc[i])
456 dialog_->packagesModule->encodingCO->setCurrentItem(i);
459 QString text = params.graphicsDriver.c_str();
460 int nitem = dialog_->packagesModule->psdriverCO->count();
461 for (int n = 0; n < nitem ; ++n) {
462 QString enc = tex_graphics[n];
464 dialog_->packagesModule->psdriverCO->setCurrentItem(n);
469 dialog_->packagesModule->amsCB->setChecked(
472 switch (params.spacing.getSpace()) {
473 case Spacing::Other: nitem = 3; break;
474 case Spacing::Double: nitem = 2; break;
475 case Spacing::Onehalf: nitem = 1; break;
476 case Spacing::Default: case Spacing::Single: nitem = 0; break;
479 dialog_->packagesModule->lspacingCO->setCurrentItem(nitem);
480 if (params.spacing.getSpace() == Spacing::Other) {
481 dialog_->packagesModule->lspacingLE->setText(
482 tostr(params.spacing.getValue()).c_str());
483 dialog_->setLSpacing(3);
487 for (int n = 0; n<dialog_->layoutModule->classCO->count(); ++n) {
488 if (dialog_->layoutModule->classCO->text(n) ==
489 controller().textClass().description().c_str()) {
490 dialog_->layoutModule->classCO->setCurrentItem(n);
495 dialog_->updateFontsize(controller().textClass().opt_fontsize(),
498 dialog_->updatePagestyle(controller().textClass().opt_pagestyle(),
501 for (int n = 0; tex_fonts[n][0]; ++n) {
502 if (tex_fonts[n] == params.fonts) {
503 dialog_->layoutModule->fontsCO->setCurrentItem(n);
508 if (params.paragraph_separation
509 == BufferParams::PARSEP_INDENT) {
510 dialog_->layoutModule->indentRB->setChecked(true);
512 dialog_->layoutModule->skipRB->setChecked(true);
516 switch (params.getDefSkip().kind()) {
517 case VSpace::SMALLSKIP:
520 case VSpace::MEDSKIP:
523 case VSpace::BIGSKIP:
529 string const length = params.getDefSkip().asLyXCommand();
530 dialog_->layoutModule->skipLengthCO->setCurrentItem(LyXLength(length).unit());
531 dialog_->layoutModule->skipLE->setText(tostr(LyXLength(length).value()).c_str());
538 dialog_->layoutModule->skipCO->setCurrentItem(skip);
539 dialog_->setSkip(skip);
541 if (!params.options.empty()) {
542 dialog_->layoutModule->optionsLE->setText(
543 params.options.c_str());
545 dialog_->layoutModule->optionsLE->setText("");
549 int const psize = params.papersize2;
550 dialog_->paperModule->papersizeCO->setCurrentItem(psize);
551 dialog_->setMargins(psize);
552 dialog_->setCustomPapersize(psize);
554 bool const landscape =
555 params.orientation == BufferParams::ORIENTATION_LANDSCAPE;
556 dialog_->paperModule->landscapeRB->setChecked(landscape);
557 dialog_->paperModule->portraitRB->setChecked(!landscape);
559 dialog_->paperModule->facingPagesCB->setChecked(
560 params.sides == LyXTextClass::TwoSides);
562 dialog_->paperModule->twoColumnCB->setChecked(
563 params.columns == 2);
566 lengthToWidgets(dialog_->paperModule->paperwidthLE,
567 dialog_->paperModule->paperwidthUnitCO, params.paperwidth, defaultUnit);
569 lengthToWidgets(dialog_->paperModule->paperheightLE,
570 dialog_->paperModule->paperheightUnitCO, params.paperheight, defaultUnit);
574 MarginsModuleBase * m(dialog_->marginsModule);
576 int item = params.paperpackage;
577 if (params.use_geometry) {
579 } else if (item > 0) {
582 m->marginCO->setCurrentItem(item);
583 dialog_->setCustomMargins(item);
585 lengthToWidgets(m->topLE, m->topUnit,
586 params.topmargin, defaultUnit);
588 lengthToWidgets(m->bottomLE, m->bottomUnit,
589 params.bottommargin, defaultUnit);
591 lengthToWidgets(m->innerLE, m->innerUnit,
592 params.leftmargin, defaultUnit);
594 lengthToWidgets(m->outerLE, m->outerUnit,
595 params.rightmargin, defaultUnit);
597 lengthToWidgets(m->headheightLE, m->headheightUnit,
598 params.headheight, defaultUnit);
600 lengthToWidgets(m->headsepLE, m->headsepUnit,
601 params.headsep, defaultUnit);
603 lengthToWidgets(m->footskipLE, m->footskipUnit,
604 params.footskip, defaultUnit);
608 void QDocument::saveDocDefault()
610 // we have to apply the params first
612 controller().saveAsDefault();
616 void QDocument::useClassDefaults()
618 BufferParams & params = controller().params();
620 params.textclass = dialog_->layoutModule->classCO->currentItem();
621 params.useClassDefaults();