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
17 #include "qt_helpers.h"
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(qt_("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(qt_("Author-year"));
70 dialog_->biblioModule->citeStyleCO->insertItem(qt_("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(qt_("``text''"));
83 dialog_->langModule->quoteStyleCO->insertItem(qt_("''text''"));
84 dialog_->langModule->quoteStyleCO->insertItem(qt_(",,text``"));
85 dialog_->langModule->quoteStyleCO->insertItem(qt_(",,text''"));
86 dialog_->langModule->quoteStyleCO->insertItem(qt_("«text»"));
87 dialog_->langModule->quoteStyleCO->insertItem(qt_("»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 qt_("Single"), Spacing::Single);
98 dialog_->packagesModule->lspacingCO->insertItem(
99 qt_("OneHalf"), Spacing::Onehalf);
100 dialog_->packagesModule->lspacingCO->insertItem(
101 qt_("Double"), Spacing::Double);
102 dialog_->packagesModule->lspacingCO->insertItem(
103 qt_("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 QComboBox * cb = dialog_->paperModule->papersizeCO;
112 cb->insertItem(qt_("Default"));
113 cb->insertItem(qt_("Custom"));
114 cb->insertItem(qt_("US letter"));
115 cb->insertItem(qt_("US legal"));
116 cb->insertItem(qt_("US executive"));
117 cb->insertItem(qt_("A3"));
118 cb->insertItem(qt_("A4"));
119 cb->insertItem(qt_("A5"));
120 cb->insertItem(qt_("B3"));
121 cb->insertItem(qt_("B4"));
122 cb->insertItem(qt_("B5"));
125 for (LyXTextClassList::const_iterator cit = textclasslist.begin();
126 cit != textclasslist.end(); ++cit) {
127 dialog_->layoutModule->classCO->insertItem(toqstr(cit->description()));
130 for (int n = 0; tex_fonts[n][0]; ++n) {
131 QString font = tex_fonts[n];
132 dialog_->layoutModule->fontsCO->insertItem(font);
135 dialog_->layoutModule->fontsizeCO->insertItem(qt_("default"));
136 dialog_->layoutModule->fontsizeCO->insertItem(qt_("10"));
137 dialog_->layoutModule->fontsizeCO->insertItem(qt_("11"));
138 dialog_->layoutModule->fontsizeCO->insertItem(qt_("12"));
140 dialog_->layoutModule->skipCO->insertItem(qt_("Smallskip"));
141 dialog_->layoutModule->skipCO->insertItem(qt_("Medskip"));
142 dialog_->layoutModule->skipCO->insertItem(qt_("Bigskip"));
143 dialog_->layoutModule->skipCO->insertItem(qt_("Length"));
145 dialog_->layoutModule->pagestyleCO->insertItem(qt_("default"));
146 dialog_->layoutModule->pagestyleCO->insertItem(qt_("empty"));
147 dialog_->layoutModule->pagestyleCO->insertItem(qt_("plain"));
148 dialog_->layoutModule->pagestyleCO->insertItem(qt_("headings"));
149 dialog_->layoutModule->pagestyleCO->insertItem(qt_("fancy"));
152 dialog_->setMargins(0);
154 // Manage the restore, ok, apply, restore and cancel/close buttons
155 bc().setOK(dialog_->okPB);
156 bc().setApply(dialog_->applyPB);
157 bc().setCancel(dialog_->closePB);
158 bc().setRestore(dialog_->restorePB);
162 void QDocument::apply()
164 BufferParams & params = controller().params();
168 fromqstr(dialog_->preambleModule->preambleMLE->text());
172 dialog_->biblioModule->natbibCB->isChecked();
173 params.use_numerical_citations =
174 dialog_->biblioModule->citeStyleCO->currentItem();
177 if (dialog_->langModule->singleQuoteRB->isChecked())
178 params.quotes_times = InsetQuotes::SingleQ;
180 params.quotes_times = InsetQuotes::DoubleQ;
183 InsetQuotes::quote_language lga = InsetQuotes::EnglishQ;
184 switch (dialog_->langModule->quoteStyleCO->currentItem()) {
186 lga = InsetQuotes::EnglishQ;
189 lga = InsetQuotes::SwedishQ;
192 lga = InsetQuotes::GermanQ;
195 lga = InsetQuotes::PolishQ;
198 lga = InsetQuotes::FrenchQ;
201 lga = InsetQuotes::DanishQ;
204 params.quotes_language = lga;
206 int const pos = dialog_->langModule->languageCO->currentItem();
207 params.language = languages.getLanguage(lang_[pos]);
211 dialog_->numberingModule->tocDepthSB->value();
213 dialog_->numberingModule->sectionnrDepthSB->value();
216 params.user_defined_bullets[0] = dialog_->bulletsModule->getBullet(0);
217 params.user_defined_bullets[1] = dialog_->bulletsModule->getBullet(1);
218 params.user_defined_bullets[2] = dialog_->bulletsModule->getBullet(2);
219 params.user_defined_bullets[3] = dialog_->bulletsModule->getBullet(3);
222 switch (dialog_->packagesModule->lspacingCO->currentItem()) {
224 params.spacing.set(Spacing::Single);
227 params.spacing.set(Spacing::Onehalf);
230 params.spacing.set(Spacing::Double);
233 params.spacing.set(Spacing::Other,
234 dialog_->packagesModule->
235 lspacingLE->text().toFloat()
240 params.graphicsDriver =
241 fromqstr(dialog_->packagesModule->psdriverCO->currentText());
244 dialog_->packagesModule->amsCB->isChecked();
247 fromqstr(dialog_->packagesModule->encodingCO->currentText());
251 dialog_->layoutModule->classCO->currentItem();
253 //bool succes = controller().classApply();
256 fromqstr(dialog_->layoutModule->fontsCO->currentText());
259 fromqstr(dialog_->layoutModule->fontsizeCO->currentText());
262 fromqstr(dialog_->layoutModule->pagestyleCO->currentText());
264 if (dialog_->layoutModule->indentRB->isChecked())
265 params.paragraph_separation = BufferParams::PARSEP_INDENT;
267 params.paragraph_separation = BufferParams::PARSEP_SKIP;
269 switch (dialog_->layoutModule->skipCO->currentItem()) {
271 params.setDefSkip(VSpace(VSpace::SMALLSKIP));
274 params.setDefSkip(VSpace(VSpace::MEDSKIP));
277 params.setDefSkip(VSpace(VSpace::BIGSKIP));
281 LyXLength::UNIT unit =
282 dialog_->layoutModule->skipLengthCO->
285 dialog_->layoutModule->skipLE->text().toDouble();
286 VSpace vs = VSpace(LyXGlueLength(LyXLength(length,unit)));
287 params.setDefSkip(vs);
291 // DocumentDefskipCB assures that this never happens
292 // so Assert then !!! - jbl
293 params.setDefSkip(VSpace(VSpace::MEDSKIP));
298 fromqstr(dialog_->layoutModule->optionsLE->text());
300 params.float_placement =
301 fromqstr(dialog_->layoutModule->floatPlacementLE->text());
305 dialog_->paperModule->papersizeCO->currentItem();
307 params.paperwidth = widgetsToLength(dialog_->paperModule->paperwidthLE,
308 dialog_->paperModule->paperwidthUnitCO);
310 params.paperheight = widgetsToLength(dialog_->paperModule->paperheightLE,
311 dialog_->paperModule->paperheightUnitCO);
313 if (dialog_->paperModule->twoColumnCB->isChecked())
318 if (dialog_->paperModule->facingPagesCB->isChecked())
319 params.sides = LyXTextClass::TwoSides;
321 params.sides = LyXTextClass::OneSide;
323 if (dialog_->paperModule->landscapeRB->isChecked())
324 params.orientation = BufferParams::ORIENTATION_LANDSCAPE;
326 params.orientation = BufferParams::ORIENTATION_PORTRAIT;
329 params.use_geometry =
330 (dialog_->marginsModule->marginCO->currentItem() == 1);
332 int margin = dialog_->marginsModule->marginCO->currentItem();
336 params.paperpackage = char(margin);
338 MarginsModuleBase const * m(dialog_->marginsModule);
340 params.leftmargin = widgetsToLength(m->innerLE, m->innerUnit);
342 params.topmargin = widgetsToLength(m->topLE, m->topUnit);
344 params.rightmargin = widgetsToLength(m->outerLE, m->outerUnit);
346 params.bottommargin = widgetsToLength(m->bottomLE, m->bottomUnit);
348 params.headheight = widgetsToLength(m->headheightLE, m->headheightUnit);
350 params.headsep = widgetsToLength(m->headsepLE, m->headsepUnit);
352 params.footskip = widgetsToLength(m->footskipLE, m->footskipUnit);
358 /** Return the position of val in the vector if found.
359 If not found, return 0.
362 typename std::vector<A>::size_type
363 findPos(std::vector<A> const & vec, A const & val)
365 typename std::vector<A>::const_iterator it =
366 std::find(vec.begin(), vec.end(), val);
369 return std::distance(vec.begin(), it);
375 void QDocument::update_contents()
380 BufferParams const & params = controller().params();
382 // set the default unit
383 // FIXME: move to controller
384 LyXLength::UNIT defaultUnit = LyXLength::CM;
385 switch (lyxrc.default_papersize) {
386 case BufferParams::PAPER_DEFAULT: break;
388 case BufferParams::PAPER_USLETTER:
389 case BufferParams::PAPER_LEGALPAPER:
390 case BufferParams::PAPER_EXECUTIVEPAPER:
391 defaultUnit = LyXLength::IN;
394 case BufferParams::PAPER_A3PAPER:
395 case BufferParams::PAPER_A4PAPER:
396 case BufferParams::PAPER_A5PAPER:
397 case BufferParams::PAPER_B5PAPER:
398 defaultUnit = LyXLength::CM;
403 QString preamble = toqstr(params.preamble);
404 dialog_->preambleModule->preambleMLE->setText(preamble);
407 dialog_->biblioModule->natbibCB->setChecked(
409 dialog_->biblioModule->citeStyleCO->setCurrentItem(
410 params.use_numerical_citations ? 1 : 0);
413 dialog_->langModule->singleQuoteRB->setChecked(
414 params.quotes_times == InsetQuotes::SingleQ);
415 dialog_->langModule->doubleQuoteRB->setChecked(
416 params.quotes_times == InsetQuotes::DoubleQ);
418 int const pos = int(findPos(lang_,
419 params.language->lang()));
420 dialog_->langModule->languageCO->setCurrentItem(pos);
422 dialog_->langModule->quoteStyleCO->setCurrentItem(
423 params.quotes_language);
426 dialog_->numberingModule->tocDepthSB->setValue(
428 dialog_->numberingModule->sectionnrDepthSB->setValue(
432 dialog_->bulletsModule->setBullet(0,params.user_defined_bullets[0]);
433 dialog_->bulletsModule->setBullet(1,params.user_defined_bullets[1]);
434 dialog_->bulletsModule->setBullet(2,params.user_defined_bullets[2]);
435 dialog_->bulletsModule->setBullet(3,params.user_defined_bullets[3]);
438 char const * enc[] = {
439 "default" , "auto" , "latin1" , "latin2" , "latin3" ,
440 "latin4" , "latin5" , "latin9" , "koi8-r" , "koi8-u" ,
441 "cp866" , "cp1251" , "iso88595" , "pt154" };
442 for (size_t i = 0; i < sizeof(enc)/sizeof(char *); ++i) {
443 if (params.inputenc == enc[i])
444 dialog_->packagesModule->encodingCO->setCurrentItem(i);
447 QString text = toqstr(params.graphicsDriver);
448 int nitem = dialog_->packagesModule->psdriverCO->count();
449 for (int n = 0; n < nitem ; ++n) {
450 QString enc = tex_graphics[n];
452 dialog_->packagesModule->psdriverCO->setCurrentItem(n);
457 dialog_->packagesModule->amsCB->setChecked(
460 switch (params.spacing.getSpace()) {
461 case Spacing::Other: nitem = 3; break;
462 case Spacing::Double: nitem = 2; break;
463 case Spacing::Onehalf: nitem = 1; break;
464 case Spacing::Default: case Spacing::Single: nitem = 0; break;
467 dialog_->packagesModule->lspacingCO->setCurrentItem(nitem);
468 if (params.spacing.getSpace() == Spacing::Other) {
469 dialog_->packagesModule->lspacingLE->setText(
470 toqstr(tostr(params.spacing.getValue())));
471 dialog_->setLSpacing(3);
475 for (int n = 0; n<dialog_->layoutModule->classCO->count(); ++n) {
476 if (dialog_->layoutModule->classCO->text(n) ==
477 toqstr(controller().textClass().description())) {
478 dialog_->layoutModule->classCO->setCurrentItem(n);
483 dialog_->updateFontsize(controller().textClass().opt_fontsize(),
486 dialog_->updatePagestyle(controller().textClass().opt_pagestyle(),
489 for (int n = 0; tex_fonts[n][0]; ++n) {
490 if (tex_fonts[n] == params.fonts) {
491 dialog_->layoutModule->fontsCO->setCurrentItem(n);
496 if (params.paragraph_separation
497 == BufferParams::PARSEP_INDENT) {
498 dialog_->layoutModule->indentRB->setChecked(true);
500 dialog_->layoutModule->skipRB->setChecked(true);
504 switch (params.getDefSkip().kind()) {
505 case VSpace::SMALLSKIP:
508 case VSpace::MEDSKIP:
511 case VSpace::BIGSKIP:
517 string const length = params.getDefSkip().asLyXCommand();
518 dialog_->layoutModule->skipLengthCO->setCurrentItem(LyXLength(length).unit());
519 dialog_->layoutModule->skipLE->setText(toqstr(tostr(LyXLength(length).value())));
526 dialog_->layoutModule->skipCO->setCurrentItem(skip);
527 dialog_->setSkip(skip);
529 if (!params.options.empty()) {
530 dialog_->layoutModule->optionsLE->setText(
531 toqstr(params.options));
533 dialog_->layoutModule->optionsLE->setText("");
537 int const psize = params.papersize2;
538 dialog_->paperModule->papersizeCO->setCurrentItem(psize);
539 dialog_->setMargins(psize);
540 dialog_->setCustomPapersize(psize);
542 bool const landscape =
543 params.orientation == BufferParams::ORIENTATION_LANDSCAPE;
544 dialog_->paperModule->landscapeRB->setChecked(landscape);
545 dialog_->paperModule->portraitRB->setChecked(!landscape);
547 dialog_->paperModule->facingPagesCB->setChecked(
548 params.sides == LyXTextClass::TwoSides);
550 dialog_->paperModule->twoColumnCB->setChecked(
551 params.columns == 2);
554 lengthToWidgets(dialog_->paperModule->paperwidthLE,
555 dialog_->paperModule->paperwidthUnitCO, params.paperwidth, defaultUnit);
557 lengthToWidgets(dialog_->paperModule->paperheightLE,
558 dialog_->paperModule->paperheightUnitCO, params.paperheight, defaultUnit);
562 MarginsModuleBase * m(dialog_->marginsModule);
564 int item = params.paperpackage;
565 if (params.use_geometry) {
567 } else if (item > 0) {
570 m->marginCO->setCurrentItem(item);
571 dialog_->setCustomMargins(item);
573 lengthToWidgets(m->topLE, m->topUnit,
574 params.topmargin, defaultUnit);
576 lengthToWidgets(m->bottomLE, m->bottomUnit,
577 params.bottommargin, defaultUnit);
579 lengthToWidgets(m->innerLE, m->innerUnit,
580 params.leftmargin, defaultUnit);
582 lengthToWidgets(m->outerLE, m->outerUnit,
583 params.rightmargin, defaultUnit);
585 lengthToWidgets(m->headheightLE, m->headheightUnit,
586 params.headheight, defaultUnit);
588 lengthToWidgets(m->headsepLE, m->headsepUnit,
589 params.headsep, defaultUnit);
591 lengthToWidgets(m->footskipLE, m->footskipUnit,
592 params.footskip, defaultUnit);
596 void QDocument::saveDocDefault()
598 // we have to apply the params first
600 controller().saveAsDefault();
604 void QDocument::useClassDefaults()
606 BufferParams & params = controller().params();
608 params.textclass = dialog_->layoutModule->classCO->currentItem();
609 params.useClassDefaults();