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