]> git.lyx.org Git - lyx.git/blob - src/frontends/qt2/QDocument.C
Get rid of the static_casts.
[lyx.git] / src / frontends / qt2 / QDocument.C
1 /**
2  * \file QDocument.C
3  * This file is part of LyX, the document processor.
4  * Licence details can be found in the file COPYING.
5  *
6  * \author Edwin Leuven
7  *
8  * Full author contact details are available in file CREDITS
9  */
10
11 #include <config.h>
12
13 #include "qt_helpers.h"
14
15 #include "ControlDocument.h"
16 #include "QDocument.h"
17 #include "QDocumentDialog.h"
18 #include "Qt2BC.h"
19
20 #include "language.h"
21 #include "helper_funcs.h" // getSecond()
22 #include "insets/insetquotes.h"
23 #include "frnt_lang.h"
24 #include "lyxrc.h" // defaultUnit
25 #include "tex-strings.h" // tex_graphics
26 #include "support/tostr.h"
27 #include "support/filetools.h" // LibFileSearch()
28 #include "support/BoostFormat.h"
29 #include "lyxtextclasslist.h"
30 #include "vspace.h"
31 #include "bufferparams.h"
32 #include "qt_helpers.h"
33 #include "floatplacement.h"
34
35 #include <qpushbutton.h>
36 #include <qmultilineedit.h>
37 #include <qradiobutton.h>
38 #include <qcombobox.h>
39 #include <qcheckbox.h>
40 #include <qslider.h>
41 #include <qlineedit.h>
42 #include <qstringlist.h>
43 #include "lengthcombo.h"
44
45 #include "QBrowseBox.h"
46
47 #include <vector>
48
49 using std::vector;
50
51 typedef Qt2CB<ControlDocument, Qt2DB<QDocumentDialog> > base_class;
52
53
54 QDocument::QDocument()
55         : base_class(_("LyX: Document Settings"))
56 {
57         vector<frnt::LanguagePair> const langs = frnt::getLanguageData(false);
58         lang_ = getSecond(langs);
59 }
60
61 namespace {
62
63 char const * encodings[] = { "LaTeX default", "latin1", "latin2",
64         "latin3", "latin4", "latin5", "latin9",
65         "koi8-r", "koi8-u", "cp866", "cp1251",
66         "iso88595", "pt154", 0
67 };
68
69 }
70
71
72 void QDocument::build_dialog()
73 {
74         dialog_.reset(new QDocumentDialog(this));
75
76         // biblio
77         dialog_->biblioModule->citeStyleCO->insertItem(qt_("Author-year"));
78         dialog_->biblioModule->citeStyleCO->insertItem(qt_("Numerical"));
79         dialog_->biblioModule->citeStyleCO->setCurrentItem(0);
80
81         // language & quotes
82         vector<frnt::LanguagePair> const langs = frnt::getLanguageData(false);
83         vector<frnt::LanguagePair>::const_iterator lit  = langs.begin();
84         vector<frnt::LanguagePair>::const_iterator lend = langs.end();
85         for (; lit != lend; ++lit) {
86                 dialog_->langModule->languageCO->insertItem(
87                         toqstr(lit->first));
88         }
89
90         int i = 0;
91         while (encodings[i]) {
92                 dialog_->langModule->encodingCO->insertItem(qt_(encodings[i++]));
93         }
94
95         dialog_->langModule->quoteStyleCO->insertItem(qt_("``text''"));
96         dialog_->langModule->quoteStyleCO->insertItem(qt_("''text''"));
97         dialog_->langModule->quoteStyleCO->insertItem(qt_(",,text``"));
98         dialog_->langModule->quoteStyleCO->insertItem(qt_(",,text''"));
99         dialog_->langModule->quoteStyleCO->insertItem(qt_("«text»"));
100         dialog_->langModule->quoteStyleCO->insertItem(qt_("»text«"));
101
102         // packages
103         for (int n = 0; tex_graphics[n][0]; ++n) {
104                 QString enc = tex_graphics[n];
105                 dialog_->latexModule->psdriverCO->insertItem(enc);
106         }
107
108         // paper
109         QComboBox * cb = dialog_->pageLayoutModule->papersizeCO;
110         cb->insertItem(qt_("Default"));
111         cb->insertItem(qt_("Custom"));
112         cb->insertItem(qt_("US letter"));
113         cb->insertItem(qt_("US legal"));
114         cb->insertItem(qt_("US executive"));
115         cb->insertItem(qt_("A3"));
116         cb->insertItem(qt_("A4"));
117         cb->insertItem(qt_("A5"));
118         cb->insertItem(qt_("B3"));
119         cb->insertItem(qt_("B4"));
120         cb->insertItem(qt_("B5"));
121
122         // layout
123         for (LyXTextClassList::const_iterator cit = textclasslist.begin();
124              cit != textclasslist.end(); ++cit) {
125                 if (cit->isTeXClassAvailable()) {
126                         dialog_->latexModule->classCO->insertItem(toqstr(cit->description()));
127                 } else {
128                         string item =
129 #if USE_BOOST_FORMAT
130                                 boost::io::str(boost::format(_("Unavailable: %1$s")) % cit->description());
131 #else
132                                 _("Unavailable: ") + cit->description();
133 #endif
134                         dialog_->latexModule->classCO->insertItem(toqstr(item));
135                 }
136         }
137
138         for (int n = 0; tex_fonts[n][0]; ++n) {
139                 QString font = tex_fonts[n];
140                 dialog_->textLayoutModule->fontsCO->insertItem(font);
141         }
142
143         dialog_->textLayoutModule->fontsizeCO->insertItem(qt_("default"));
144         dialog_->textLayoutModule->fontsizeCO->insertItem(qt_("10"));
145         dialog_->textLayoutModule->fontsizeCO->insertItem(qt_("11"));
146         dialog_->textLayoutModule->fontsizeCO->insertItem(qt_("12"));
147
148         dialog_->textLayoutModule->skipCO->insertItem(qt_("SmallSkip"));
149         dialog_->textLayoutModule->skipCO->insertItem(qt_("MedSkip"));
150         dialog_->textLayoutModule->skipCO->insertItem(qt_("BigSkip"));
151         dialog_->textLayoutModule->skipCO->insertItem(qt_("Length"));
152
153         dialog_->pageLayoutModule->pagestyleCO->insertItem(qt_("default"));
154         dialog_->pageLayoutModule->pagestyleCO->insertItem(qt_("empty"));
155         dialog_->pageLayoutModule->pagestyleCO->insertItem(qt_("plain"));
156         dialog_->pageLayoutModule->pagestyleCO->insertItem(qt_("headings"));
157         dialog_->pageLayoutModule->pagestyleCO->insertItem(qt_("fancy"));
158
159         dialog_->textLayoutModule->lspacingCO->insertItem(
160                 qt_("Single"), Spacing::Single);
161         dialog_->textLayoutModule->lspacingCO->insertItem(
162                 qt_("OneHalf"), Spacing::Onehalf);
163         dialog_->textLayoutModule->lspacingCO->insertItem(
164                 qt_("Double"), Spacing::Double);
165         dialog_->textLayoutModule->lspacingCO->insertItem(
166                 qt_("Custom"), Spacing::Other);
167
168         // margins
169         dialog_->setMargins(0);
170
171         // Manage the restore, ok, apply, restore and cancel/close buttons
172         bcview().setOK(dialog_->okPB);
173         bcview().setApply(dialog_->applyPB);
174         bcview().setCancel(dialog_->closePB);
175         bcview().setRestore(dialog_->restorePB);
176 }
177
178
179 void QDocument::showPreamble()
180 {
181         dialog_->showPreamble();
182 }
183
184
185 void QDocument::apply()
186 {
187         BufferParams & params = controller().params();
188
189         // preamble
190         params.preamble =
191                 fromqstr(dialog_->preambleModule->preambleMLE->text());
192
193         // biblio
194         params.use_natbib =
195                 dialog_->biblioModule->natbibCB->isChecked();
196         params.use_numerical_citations  =
197                 dialog_->biblioModule->citeStyleCO->currentItem();
198
199         // language & quotes
200         if (dialog_->langModule->singleQuoteRB->isChecked())
201                 params.quotes_times = InsetQuotes::SingleQ;
202         else
203                 params.quotes_times = InsetQuotes::DoubleQ;
204
205         if (dialog_->langModule->defaultencodingCB->isChecked()) {
206                 params.inputenc = "auto";
207         } else {
208                 int i = dialog_->langModule->encodingCO->currentItem();
209                 if (i == 0) {
210                         params.inputenc = "default";
211                 } else {
212                         params.inputenc = encodings[i];
213                 }
214         }
215
216         InsetQuotes::quote_language lga = InsetQuotes::EnglishQ;
217         switch (dialog_->langModule->quoteStyleCO->currentItem()) {
218         case 0:
219                 lga = InsetQuotes::EnglishQ;
220                 break;
221         case 1:
222                 lga = InsetQuotes::SwedishQ;
223                 break;
224         case 2:
225                 lga = InsetQuotes::GermanQ;
226                 break;
227         case 3:
228                 lga = InsetQuotes::PolishQ;
229                 break;
230         case 4:
231                 lga = InsetQuotes::FrenchQ;
232                 break;
233         case 5:
234                 lga = InsetQuotes::DanishQ;
235                 break;
236         }
237         params.quotes_language = lga;
238
239         int const pos = dialog_->langModule->languageCO->currentItem();
240         params.language = languages.getLanguage(lang_[pos]);
241
242         // numbering
243         params.tocdepth = dialog_->numberingModule->tocSL->value();
244         params.secnumdepth = dialog_->numberingModule->depthSL->value();
245
246         // bullets
247         params.user_defined_bullets[0] = dialog_->bulletsModule->getBullet(0);
248         params.user_defined_bullets[1] = dialog_->bulletsModule->getBullet(1);
249         params.user_defined_bullets[2] = dialog_->bulletsModule->getBullet(2);
250         params.user_defined_bullets[3] = dialog_->bulletsModule->getBullet(3);
251
252         // packages
253         params.graphicsDriver =
254                 fromqstr(dialog_->latexModule->psdriverCO->currentText());
255
256         if (dialog_->mathsModule->amsautoCB->isChecked()) {
257                 params.use_amsmath = BufferParams::AMS_AUTO;
258         } else {
259                 if (dialog_->mathsModule->amsCB->isChecked())
260                         params.use_amsmath = BufferParams::AMS_ON;
261                 else
262                         params.use_amsmath = BufferParams::AMS_OFF;
263         }
264
265         // layout
266         params.textclass =
267                 dialog_->latexModule->classCO->currentItem();
268
269         params.fonts =
270                 fromqstr(dialog_->textLayoutModule->fontsCO->currentText());
271
272         params.fontsize =
273                 fromqstr(dialog_->textLayoutModule->fontsizeCO->currentText());
274
275         params.pagestyle =
276                 fromqstr(dialog_->pageLayoutModule->pagestyleCO->currentText());
277
278         switch (dialog_->textLayoutModule->lspacingCO->currentItem()) {
279         case 0:
280                 params.spacing.set(Spacing::Single);
281                 break;
282         case 1:
283                 params.spacing.set(Spacing::Onehalf);
284                 break;
285         case 2:
286                 params.spacing.set(Spacing::Double);
287                 break;
288         case 3:
289                 params.spacing.set(Spacing::Other,
290                                    dialog_->textLayoutModule->
291                                    lspacingLE->text().toFloat()
292                                    );
293                 break;
294         }
295
296         if (dialog_->textLayoutModule->twoColumnCB->isChecked())
297                 params.columns = 2;
298         else
299                 params.columns = 1;
300
301         if (dialog_->textLayoutModule->indentRB->isChecked())
302                 params.paragraph_separation = BufferParams::PARSEP_INDENT;
303         else
304                 params.paragraph_separation = BufferParams::PARSEP_SKIP;
305
306         switch (dialog_->textLayoutModule->skipCO->currentItem()) {
307         case 0:
308                 params.setDefSkip(VSpace(VSpace::SMALLSKIP));
309                 break;
310         case 1:
311                 params.setDefSkip(VSpace(VSpace::MEDSKIP));
312                 break;
313         case 2:
314                 params.setDefSkip(VSpace(VSpace::BIGSKIP));
315                 break;
316         case 3:
317         {
318                 LyXLength::UNIT unit =
319                         dialog_->textLayoutModule->skipLengthCO->
320                         currentLengthItem();
321                 double length =
322                         dialog_->textLayoutModule->skipLE->text().toDouble();
323                 VSpace vs = VSpace(LyXGlueLength(LyXLength(length,unit)));
324                 params.setDefSkip(vs);
325                 break;
326         }
327         default:
328                 // DocumentDefskipCB assures that this never happens
329                 // so Assert then !!!  - jbl
330                 params.setDefSkip(VSpace(VSpace::MEDSKIP));
331                 break;
332         }
333
334         params.options =
335                 fromqstr(dialog_->latexModule->optionsLE->text());
336
337         params.float_placement = dialog_->floatModule->get();
338
339         // paper
340         params.papersize2 = BufferParams::VMARGIN_PAPER_TYPE(
341                 dialog_->pageLayoutModule->papersizeCO->currentItem());
342
343         params.paperwidth = widgetsToLength(dialog_->pageLayoutModule->paperwidthLE,
344                 dialog_->pageLayoutModule->paperwidthUnitCO);
345
346         params.paperheight = widgetsToLength(dialog_->pageLayoutModule->paperheightLE,
347                 dialog_->pageLayoutModule->paperheightUnitCO);
348
349         if (dialog_->pageLayoutModule->facingPagesCB->isChecked())
350                 params.sides = LyXTextClass::TwoSides;
351         else
352                 params.sides = LyXTextClass::OneSide;
353
354         if (dialog_->pageLayoutModule->landscapeRB->isChecked())
355                 params.orientation = BufferParams::ORIENTATION_LANDSCAPE;
356         else
357                 params.orientation = BufferParams::ORIENTATION_PORTRAIT;
358
359         // margins
360         params.use_geometry =
361                 (dialog_->marginsModule->marginCO->currentItem() == 1);
362
363         int margin = dialog_->marginsModule->marginCO->currentItem();
364         if (margin > 0) {
365                 margin = margin - 1;
366         }
367         params.paperpackage = BufferParams::PAPER_PACKAGES(margin);
368
369         // set params.papersize from params.papersize2
370         // and params.paperpackage
371         params.setPaperStuff();
372
373         MarginsModuleBase const * m(dialog_->marginsModule);
374
375         params.leftmargin = widgetsToLength(m->innerLE, m->innerUnit);
376
377         params.topmargin = widgetsToLength(m->topLE, m->topUnit);
378
379         params.rightmargin = widgetsToLength(m->outerLE, m->outerUnit);
380
381         params.bottommargin = widgetsToLength(m->bottomLE, m->bottomUnit);
382
383         params.headheight = widgetsToLength(m->headheightLE, m->headheightUnit);
384
385         params.headsep = widgetsToLength(m->headsepLE, m->headsepUnit);
386
387         params.footskip = widgetsToLength(m->footskipLE, m->footskipUnit);
388 }
389
390
391 namespace {
392
393 /** Return the position of val in the vector if found.
394     If not found, return 0.
395  */
396 template<class A>
397 typename std::vector<A>::size_type
398 findPos(std::vector<A> const & vec, A const & val)
399 {
400         typename std::vector<A>::const_iterator it =
401                 std::find(vec.begin(), vec.end(), val);
402         if (it == vec.end())
403                 return 0;
404         return std::distance(vec.begin(), it);
405 }
406
407 } // namespace anom
408
409
410 void QDocument::update_contents()
411 {
412         if (!dialog_.get())
413                 return;
414
415         BufferParams const & params = controller().params();
416
417         // set the default unit
418         // FIXME: move to controller
419         LyXLength::UNIT defaultUnit = LyXLength::CM;
420         switch (lyxrc.default_papersize) {
421                 case BufferParams::PAPER_DEFAULT: break;
422
423                 case BufferParams::PAPER_USLETTER:
424                 case BufferParams::PAPER_LEGALPAPER:
425                 case BufferParams::PAPER_EXECUTIVEPAPER:
426                         defaultUnit = LyXLength::IN;
427                         break;
428
429                 case BufferParams::PAPER_A3PAPER:
430                 case BufferParams::PAPER_A4PAPER:
431                 case BufferParams::PAPER_A5PAPER:
432                 case BufferParams::PAPER_B5PAPER:
433                         defaultUnit = LyXLength::CM;
434                         break;
435         }
436
437         // preamble
438         QString preamble = toqstr(params.preamble);
439         dialog_->preambleModule->preambleMLE->setText(preamble);
440
441         // biblio
442         dialog_->biblioModule->natbibCB->setChecked(
443                 params.use_natbib);
444         dialog_->biblioModule->citeStyleCO->setCurrentItem(
445                 params.use_numerical_citations ? 1 : 0);
446
447         // language & quotes
448         dialog_->langModule->singleQuoteRB->setChecked(
449                 params.quotes_times == InsetQuotes::SingleQ);
450         dialog_->langModule->doubleQuoteRB->setChecked(
451                 params.quotes_times == InsetQuotes::DoubleQ);
452
453         int const pos = int(findPos(lang_,
454                                     params.language->lang()));
455         dialog_->langModule->languageCO->setCurrentItem(pos);
456
457         dialog_->langModule->quoteStyleCO->setCurrentItem(
458                 params.quotes_language);
459
460         dialog_->langModule->defaultencodingCB->setChecked(true);
461
462         if (params.inputenc != "auto") {
463                 dialog_->langModule->defaultencodingCB->setChecked(false);
464                 if (params.inputenc == "default") {
465                         dialog_->langModule->encodingCO->setCurrentItem(0);
466                 } else {
467                         int i = 0;
468                         while (encodings[i]) {
469                                 if (encodings[i] == params.inputenc)
470                                         dialog_->langModule->encodingCO->setCurrentItem(i);
471                                 ++i;
472                         }
473                 }
474         }
475
476         // numbering
477         dialog_->numberingModule->tocSL->setValue(params.tocdepth);
478         dialog_->numberingModule->depthSL->setValue(params.secnumdepth);
479         dialog_->updateNumbering();
480
481         // bullets
482         dialog_->bulletsModule->setBullet(0,params.user_defined_bullets[0]);
483         dialog_->bulletsModule->setBullet(1,params.user_defined_bullets[1]);
484         dialog_->bulletsModule->setBullet(2,params.user_defined_bullets[2]);
485         dialog_->bulletsModule->setBullet(3,params.user_defined_bullets[3]);
486
487         // packages
488         QString text = toqstr(params.graphicsDriver);
489         int nitem = dialog_->latexModule->psdriverCO->count();
490         for (int n = 0; n < nitem ; ++n) {
491                 QString enc = tex_graphics[n];
492                 if (enc == text) {
493                         dialog_->latexModule->psdriverCO->setCurrentItem(n);
494                 }
495         }
496
497
498         dialog_->mathsModule->amsCB->setChecked(
499                 params.use_amsmath == BufferParams::AMS_ON);
500         dialog_->mathsModule->amsautoCB->setChecked(
501                 params.use_amsmath == BufferParams::AMS_AUTO);
502
503         switch (params.spacing.getSpace()) {
504                 case Spacing::Other: nitem = 3; break;
505                 case Spacing::Double: nitem = 2; break;
506                 case Spacing::Onehalf: nitem = 1; break;
507                 case Spacing::Default: case Spacing::Single: nitem = 0; break;
508         }
509
510
511         // layout
512         dialog_->latexModule->classCO->setCurrentItem(params.textclass);
513
514         dialog_->updateFontsize(controller().textClass().opt_fontsize(),
515                                 params.fontsize);
516
517         dialog_->updatePagestyle(controller().textClass().opt_pagestyle(),
518                                  params.pagestyle);
519
520         for (int n = 0; tex_fonts[n][0]; ++n) {
521                 if (tex_fonts[n] == params.fonts) {
522                         dialog_->textLayoutModule->fontsCO->setCurrentItem(n);
523                         break;
524                 }
525         }
526
527         dialog_->textLayoutModule->lspacingCO->setCurrentItem(nitem);
528         if (params.spacing.getSpace() == Spacing::Other) {
529                 dialog_->textLayoutModule->lspacingLE->setText(
530                         toqstr(tostr(params.spacing.getValue())));
531                 dialog_->setLSpacing(3);
532         }
533
534         if (params.paragraph_separation
535             == BufferParams::PARSEP_INDENT) {
536                 dialog_->textLayoutModule->indentRB->setChecked(true);
537         } else {
538                 dialog_->textLayoutModule->skipRB->setChecked(true);
539         }
540
541         int skip = 0;
542         switch (params.getDefSkip().kind()) {
543         case VSpace::SMALLSKIP:
544                 skip = 0;
545                 break;
546         case VSpace::MEDSKIP:
547                 skip = 1;
548                 break;
549         case VSpace::BIGSKIP:
550                 skip = 2;
551                 break;
552         case VSpace::LENGTH:
553         {
554                 skip = 3;
555                 string const length = params.getDefSkip().asLyXCommand();
556                 dialog_->textLayoutModule->skipLengthCO->setCurrentItem(LyXLength(length).unit());
557                 dialog_->textLayoutModule->skipLE->setText(toqstr(tostr(LyXLength(length).value())));
558                 break;
559         }
560         default:
561                 skip = 0;
562                 break;
563         }
564         dialog_->textLayoutModule->skipCO->setCurrentItem(skip);
565         dialog_->setSkip(skip);
566
567         dialog_->textLayoutModule->twoColumnCB->setChecked(
568                 params.columns == 2);
569
570         if (!params.options.empty()) {
571                 dialog_->latexModule->optionsLE->setText(
572                         toqstr(params.options));
573         } else {
574                 dialog_->latexModule->optionsLE->setText("");
575         }
576
577         dialog_->floatModule->set(params.float_placement);
578
579         // paper
580         int const psize = params.papersize2;
581         dialog_->pageLayoutModule->papersizeCO->setCurrentItem(psize);
582         dialog_->setMargins(psize);
583         dialog_->setCustomPapersize(psize);
584
585         bool const landscape =
586                 params.orientation == BufferParams::ORIENTATION_LANDSCAPE;
587         dialog_->pageLayoutModule->landscapeRB->setChecked(landscape);
588         dialog_->pageLayoutModule->portraitRB->setChecked(!landscape);
589
590         dialog_->pageLayoutModule->facingPagesCB->setChecked(
591                 params.sides == LyXTextClass::TwoSides);
592
593
594
595         lengthToWidgets(dialog_->pageLayoutModule->paperwidthLE,
596                 dialog_->pageLayoutModule->paperwidthUnitCO, params.paperwidth, defaultUnit);
597
598         lengthToWidgets(dialog_->pageLayoutModule->paperheightLE,
599                 dialog_->pageLayoutModule->paperheightUnitCO, params.paperheight, defaultUnit);
600
601         // margins
602
603         MarginsModuleBase * m(dialog_->marginsModule);
604
605         int item = params.paperpackage;
606         if (params.use_geometry) {
607                 item = 1;
608         } else if (item > 0) {
609                 item = item + 1;
610         }
611         m->marginCO->setCurrentItem(item);
612         dialog_->setCustomMargins(item);
613
614         lengthToWidgets(m->topLE, m->topUnit,
615                 params.topmargin, defaultUnit);
616
617         lengthToWidgets(m->bottomLE, m->bottomUnit,
618                 params.bottommargin, defaultUnit);
619
620         lengthToWidgets(m->innerLE, m->innerUnit,
621                 params.leftmargin, defaultUnit);
622
623         lengthToWidgets(m->outerLE, m->outerUnit,
624                 params.rightmargin, defaultUnit);
625
626         lengthToWidgets(m->headheightLE, m->headheightUnit,
627                 params.headheight, defaultUnit);
628
629         lengthToWidgets(m->headsepLE, m->headsepUnit,
630                 params.headsep, defaultUnit);
631
632         lengthToWidgets(m->footskipLE, m->footskipUnit,
633                 params.footskip, defaultUnit);
634 }
635
636
637 void QDocument::saveDocDefault()
638 {
639         // we have to apply the params first
640         apply();
641         controller().saveAsDefault();
642 }
643
644
645 void QDocument::useClassDefaults()
646 {
647         BufferParams & params = controller().params();
648
649         params.textclass = dialog_->latexModule->classCO->currentItem();
650         params.useClassDefaults();
651         update_contents();
652 }