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