3 * Copyright 2001 the LyX Team
4 * Read the file COPYING
15 #include "support/lstrings.h"
18 #include "tex-strings.h"
19 #include "bufferparams.h"
21 #include "dlg/helpers.h"
26 #ifdef CXX_WORKING_NAMESPACES
27 using kde_helpers::setSizeHint;
28 using kde_helpers::setComboFromStr;
33 DocDialog::DocDialog(FormDocument * form, QWidget * parent, char const * name, bool, WFlags)
34 : DocDialogData(parent,name), form_(form)
38 setUpdatesEnabled(false);
40 settings = new DocSettingsDialogData(this, "settings");
41 extra = new DocExtraDialogData(this, "extra");
42 geometry = new DocGeometryDialogData(this, "geometry");
43 language = new DocLanguageDialogData(this, "language");
44 bullets = new DocBulletsDialogData(this, "bullets");
46 tabstack->addTabPage(settings, _("&Settings"));
47 tabstack->addTabPage(extra, _("&Extra"));
48 tabstack->addTabPage(geometry, _("&Geometry"));
49 tabstack->addTabPage(language, _("&Language"));
50 tabstack->addTabPage(bullets, _("&Bullets"));
53 for (LyXTextClassList::const_iterator cit = textclasslist.begin();
54 cit != textclasslist.end(); ++cit)
55 settings->docclass->insertItem((*cit).description().c_str());
56 setSizeHint(settings->docclass);
58 settings->pagestyle->insertItem(_("default"));
59 settings->pagestyle->insertItem(_("empty"));
60 settings->pagestyle->insertItem(_("plain"));
61 settings->pagestyle->insertItem(_("headings"));
62 settings->pagestyle->insertItem(_("fancy"));
63 setSizeHint(settings->pagestyle);
66 for (int i=0; tex_fonts[i][0]; i++)
67 settings->font->insertItem(tex_fonts[i]);
68 setSizeHint(settings->font);
70 settings->fontsize->insertItem(_("default"));
71 settings->fontsize->insertItem(_("10 point"));
72 settings->fontsize->insertItem(_("11 point"));
73 settings->fontsize->insertItem(_("12 point"));
74 setSizeHint(settings->fontsize);
76 settings->linespacing->insertItem(_("single"));
77 settings->linespacing->insertItem(_("1 1/2 spacing"));
78 settings->linespacing->insertItem(_("double"));
79 settings->linespacing->insertItem(_("custom"));
80 setSizeHint(settings->linespacing);
82 connect(settings->linespacing, SIGNAL(highlighted(const char *)),
83 this, SLOT(linespacingChanged(const char *)));
85 settings->paraspacing->insertItem(_("small"));
86 settings->paraspacing->insertItem(_("medium"));
87 settings->paraspacing->insertItem(_("big"));
88 settings->paraspacing->insertItem(_("custom"));
89 setSizeHint(settings->paraspacing);
91 connect(settings->paraspacing, SIGNAL(highlighted(const char *)),
92 this, SLOT(paraspacingChanged(const char *)));
94 connect(settings->addspace, SIGNAL(toggled(bool)),
95 this, SLOT(addspaceChanged(bool)));
97 extra->first->insertItem(_("Here"));
98 extra->first->insertItem(_("Bottom of page"));
99 extra->first->insertItem(_("Top of page"));
100 extra->first->insertItem(_("Separate page"));
101 extra->first->insertItem(_("Not set"));
102 extra->second->insertItem(_("Here"));
103 extra->second->insertItem(_("Bottom of page"));
104 extra->second->insertItem(_("Top of page"));
105 extra->second->insertItem(_("Separate page"));
106 extra->second->insertItem(_("Not set"));
107 extra->third->insertItem(_("Here"));
108 extra->third->insertItem(_("Bottom of page"));
109 extra->third->insertItem(_("Top of page"));
110 extra->third->insertItem(_("Separate page"));
111 extra->third->insertItem(_("Not set"));
112 extra->fourth->insertItem(_("Here"));
113 extra->fourth->insertItem(_("Bottom of page"));
114 extra->fourth->insertItem(_("Top of page"));
115 extra->fourth->insertItem(_("Separate page"));
116 extra->fourth->insertItem(_("Not set"));
119 for (int i = 0; tex_graphics[i][0]; i++)
120 extra->psdriver->insertItem(tex_graphics[i]);
121 setSizeHint(extra->psdriver);
123 geometry->papersize->insertItem(_("default"));
124 geometry->papersize->insertItem(_("US letter"));
125 geometry->papersize->insertItem(_("US legal"));
126 geometry->papersize->insertItem(_("US executive"));
127 geometry->papersize->insertItem("A3");
128 geometry->papersize->insertItem("A4");
129 geometry->papersize->insertItem("A5");
130 geometry->papersize->insertItem("B3");
131 geometry->papersize->insertItem("B4");
132 geometry->papersize->insertItem("B5");
133 setSizeHint(geometry->papersize);
135 geometry->margins->insertItem(_("default"));
136 geometry->margins->insertItem(_("A4 small margins"));
137 geometry->margins->insertItem(_("A4 very small margins"));
138 geometry->margins->insertItem(_("A4 very wide margins"));
139 setSizeHint(geometry->margins);
141 #ifdef DO_USE_DEFAULT_LANGUAGE
142 language->language->insertItem(_("default"));
144 for (Languages::const_iterator cit = languages.begin();
145 cit != languages.end(); ++cit)
146 language->language->insertItem((*cit).second.lang().c_str());
147 setSizeHint(language->language);
149 language->encoding->insertItem(_("default"));
150 language->encoding->insertItem(_("auto"));
151 language->encoding->insertItem(_("latin1"));
152 language->encoding->insertItem(_("latin2"));
153 language->encoding->insertItem(_("latin5"));
154 language->encoding->insertItem(_("koi8-r"));
155 language->encoding->insertItem(_("koi8-u"));
156 language->encoding->insertItem(_("cp866"));
157 language->encoding->insertItem(_("cp1251"));
158 language->encoding->insertItem(_("iso88595"));
159 setSizeHint(language->encoding);
161 language->quotes->insertItem(_("`text'"));
162 language->quotes->insertItem(_("``text''"));
163 language->quotes->insertItem(_("'text'"));
164 language->quotes->insertItem(_("''text''"));
165 language->quotes->insertItem(_(",text`"));
166 language->quotes->insertItem(_(",,text``"));
167 language->quotes->insertItem(_(",text'"));
168 language->quotes->insertItem(_(",,text''"));
169 language->quotes->insertItem(_("<text>"));
170 language->quotes->insertItem(_("«text»"));
171 language->quotes->insertItem(_(">text<"));
172 language->quotes->insertItem(_("»text«"));
173 setSizeHint(language->quotes);
177 QToolTip::add(settings->pagestyle, _("Specify header + footer style etc"));
178 QToolTip::add(settings->addspace, _("Add spacing between paragraphs rather\n than indenting"));
179 QToolTip::add(settings->linespacingVal, _("Custom line spacing in line units"));
180 QToolTip::add(settings->extraoptions, _("Additional LaTeX options"));
181 QToolTip::add(extra->first, _("Specify preferred order for\nplacing floats"));
182 QToolTip::add(extra->second, _("Specify preferred order for\nplacing floats"));
183 QToolTip::add(extra->third, _("Specify preferred order for\nplacing floats"));
184 QToolTip::add(extra->fourth, _("Specify preferred order for\nplacing floats"));
185 QToolTip::add(extra->ignore, _("Tell LaTeX to ignore usual rules\n for float placement"));
186 QToolTip::add(extra->sectiondepth, _("How far in the (sub)sections are numbered"));
187 QToolTip::add(extra->tocdepth, _("How detailed the Table of Contents is"));
188 QToolTip::add(extra->psdriver, _("Program to produce PostScript output"));
189 QToolTip::add(extra->amsmath, _("FIXME please !"));
190 QToolTip::add(geometry->headheight, _("FIXME please !"));
191 QToolTip::add(geometry->headsep, _("FIXME please !"));
192 QToolTip::add(geometry->footskip, _("FIXME please !"));
194 setUpdatesEnabled(true);
199 DocDialog::~DocDialog()
204 void DocDialog::closeEvent(QCloseEvent * e)
211 void DocDialog::setReadOnly(bool readonly)
214 cancel->setText(readonly ? _("&Close") : _("&Cancel"));
218 void DocDialog::setFromParams(BufferParams const & params)
220 setUpdatesEnabled(false);
222 if (!setComboFromStr(settings->docclass, textclasslist.DescOfClass(params.textclass)))
223 lyxerr[Debug::GUI] << "Couldn't set docclass " << textclasslist.DescOfClass(params.textclass) << endl;
225 if (!setComboFromStr(settings->font, params.fonts))
226 lyxerr[Debug::GUI] << "Couldn't set font " << params.fonts << endl;
228 LyXTextClass const & tclass = textclasslist.TextClass(params.textclass);
230 // opt_fontsize is a string like "10|11|12"
231 settings->fontsize->setCurrentItem(tokenPos(tclass.opt_fontsize(), '|', params.fontsize) + 1);
233 // "empty|plain|headings|fancy"
234 settings->pagestyle->setCurrentItem(tokenPos(tclass.opt_pagestyle(), '|', params.pagestyle) + 1);
236 settings->addspace->setChecked(params.paragraph_separation == BufferParams::PARSEP_SKIP);
238 bool const isskip = (params.paragraph_separation == BufferParams::PARSEP_SKIP);
240 settings->paraspacing->setEnabled(isskip);
241 settings->paraspacingValue->setEnabled(isskip);
242 settings->paraspacingStretch->setEnabled(isskip);
243 settings->paraspacingShrink->setEnabled(isskip);
247 switch (params.getDefSkip().kind()) {
248 case VSpace::SMALLSKIP: item = 0; break;
249 case VSpace::MEDSKIP: item = 1; break;
250 case VSpace::BIGSKIP: item = 2; break;
251 case VSpace::LENGTH: item = 3; break;
253 lyxerr[Debug::GUI] << "Unknown defskip " << int(params.getDefSkip().kind()) << endl;
256 settings->paraspacing->setCurrentItem(item);
258 settings->paraspacingValue->setEnabled(item == 3);
259 settings->paraspacingStretch->setEnabled(item == 3);
260 settings->paraspacingShrink->setEnabled(item == 3);
263 LyXGlueLength const len = params.getDefSkip().length();
264 settings->paraspacingValue->setValue(len.value());
265 settings->paraspacingValue->setUnits(len.unit());
266 settings->paraspacingStretch->setValue(len.plusValue());
267 settings->paraspacingStretch->setUnits(len.plusUnit());
268 settings->paraspacingShrink->setValue(len.minusValue());
269 settings->paraspacingShrink->setUnits(len.minusUnit());
270 lyxerr[Debug::GUI] << params.getDefSkip().asLyXCommand() << endl;;
272 settings->paraspacingValue->setFromLengthStr("0cm");
273 settings->paraspacingStretch->setFromLengthStr("0cm");
274 settings->paraspacingShrink->setFromLengthStr("0cm");
277 settings->sides->setChecked(params.sides == LyXTextClass::TwoSides);
278 settings->columns->setChecked(params.columns == 2);
280 switch (params.spacing.getSpace()) {
281 case Spacing::Default:
282 case Spacing::Single: item = 0; break;
283 case Spacing::Onehalf: item = 1; break;
284 case Spacing::Double: item = 2; break;
285 case Spacing::Other: item = 3; break;
287 lyxerr[Debug::GUI] << "Unknown line spacing " << int(params.spacing.getSpace()) << endl;
290 settings->linespacing->setCurrentItem(item);
291 settings->linespacingVal->setEnabled(item == 3);
294 settings->linespacingVal->setText(tostr(params.spacing.getValue()).c_str());
296 settings->linespacingVal->setText("");
298 if (params.options.empty())
299 settings->extraoptions->setText("");
301 settings->extraoptions->setText(params.options.c_str());
305 geometry->papersize->setCurrentItem(params.papersize2);
307 geometry->margins->setCurrentItem(params.paperpackage);
309 geometry->portrait->setChecked(params.orientation == BufferParams::ORIENTATION_PORTRAIT);
310 geometry->landscape->setChecked(params.orientation != BufferParams::ORIENTATION_PORTRAIT);
312 geometry->width->setFromLengthStr(params.paperwidth);
313 geometry->height->setFromLengthStr(params.paperheight);
314 geometry->left->setFromLengthStr(params.leftmargin);
315 geometry->right->setFromLengthStr(params.rightmargin);
316 geometry->top->setFromLengthStr(params.topmargin);
317 geometry->bottom->setFromLengthStr(params.bottommargin);
318 geometry->headheight->setFromLengthStr(params.headheight);
319 geometry->headsep->setFromLengthStr(params.headsep);
320 geometry->footskip->setFromLengthStr(params.footskip);
324 if (!setComboFromStr(language->language, params.language->lang()))
325 lyxerr[Debug::GUI] << "Couldn't set language " << params.language->lang() << endl;
327 if (!setComboFromStr(language->encoding, params.inputenc))
328 lyxerr[Debug::GUI] << "Couldn't set encoding " << params.inputenc << endl;
330 switch (params.quotes_language) {
331 case InsetQuotes::EnglishQ: item = 0; break;
332 case InsetQuotes::SwedishQ: item = 2; break;
333 case InsetQuotes::GermanQ: item = 4; break;
334 case InsetQuotes::PolishQ: item = 6; break;
335 case InsetQuotes::FrenchQ: item = 8; break;
336 case InsetQuotes::DanishQ: item = 10; break;
338 lyxerr[Debug::GUI] << "Unknown quote style " << int(params.quotes_language) << endl;
341 if (params.quotes_times == InsetQuotes::DoubleQ)
344 language->quotes->setCurrentItem(item);
348 if (!setComboFromStr(extra->psdriver, params.graphicsDriver))
349 lyxerr[Debug::GUI] << "Couldn't set psdriver " << params.graphicsDriver << endl;
351 extra->amsmath->setChecked(params.use_amsmath);
352 extra->sectiondepth->setValue(params.secnumdepth);
353 extra->tocdepth->setValue(params.tocdepth);
355 string const place = params.float_placement;
359 extra->ignore->setChecked(false);
360 setComboFromStr(extra->first, _("Not set"));
361 setComboFromStr(extra->second, _("Not set"));
362 setComboFromStr(extra->third, _("Not set"));
363 setComboFromStr(extra->fourth, _("Not set"));
365 for (string::const_iterator iter = place.begin(); iter != place.end(); ++count, ++iter) {
367 case 0: box = extra->first; break;
368 case 1: box = extra->second; break;
369 case 2: box = extra->third; break;
370 default: box = extra->fourth; break;
374 extra->ignore->setChecked(true);
379 case 'h': setComboFromStr(box, _("Here")); break;
380 case 'b': setComboFromStr(box, _("Bottom of page")); break;
381 case 't': setComboFromStr(box, _("Top of page")); break;
382 case 'p': setComboFromStr(box, _("Separate page")); break;
384 lyxerr[Debug::GUI] << "Unknown float placement \'" << *iter << endl;
388 /* FIXME: bullets ! */
390 setUpdatesEnabled(true);
395 bool DocDialog::updateParams(BufferParams & params)
399 params.fonts = string(settings->font->currentText());
400 LyXTextClass const & tclass = textclasslist.TextClass(params.textclass);
401 params.fontsize = token(tclass.opt_fontsize(), '|', settings->fontsize->currentItem() - 1);
402 params.pagestyle = token(tclass.opt_pagestyle(), '|', settings->pagestyle->currentItem() - 1);
404 // set and update class
406 unsigned int const new_class = settings->docclass->currentItem();
408 if (new_class != params.textclass) {
409 if (!form_->changeClass(params, new_class)) {
412 if (!setComboFromStr(settings->docclass, textclasslist.DescOfClass(params.textclass)))
413 lyxerr[Debug::GUI] << "Couldn't set docclass " << textclasslist.DescOfClass(params.textclass) << endl;
418 BufferParams::PARSEP tmpsep = params.paragraph_separation;
420 (settings->addspace->isChecked())
421 ? params.paragraph_separation = BufferParams::PARSEP_SKIP
422 : params.paragraph_separation = BufferParams::PARSEP_INDENT;
424 redo = (tmpsep != params.paragraph_separation) || redo;
430 switch (settings->paraspacing->currentItem()) {
431 case 0: tmpskip = VSpace(VSpace::SMALLSKIP); break;
432 case 1: tmpskip = VSpace(VSpace::MEDSKIP); break;
433 case 2: tmpskip = VSpace(VSpace::BIGSKIP); break;
435 lyxerr[Debug::GUI] << "Unknown skip spacing " <<
436 settings->paraspacing->currentItem() << endl;
439 string const val = settings->paraspacingValue->getLengthStr()
440 + "+" + settings->paraspacingStretch->getLengthStr()
441 + "-" + settings->paraspacingShrink->getLengthStr();
442 lyxerr[Debug::GUI] << "Read para spacing of \"" << val << "\"" << endl;
443 LyXGlueLength length(0.0, LyXLength::PT);
444 isValidGlueLength(val, &length);
445 tmpskip = VSpace(length);
449 if (tmpskip != params.getDefSkip()) {
451 params.setDefSkip(tmpskip);
456 (settings->sides->isChecked())
457 ? params.sides = LyXTextClass::TwoSides
458 : params.sides = LyXTextClass::OneSide;
460 (settings->columns->isChecked())
462 : params.columns = 1;
466 Spacing tmpspacing = params.spacing;
468 switch (settings->linespacing->currentItem()) {
469 case 0: params.spacing.set(Spacing::Single); break;
470 case 1: params.spacing.set(Spacing::Onehalf); break;
471 case 2: params.spacing.set(Spacing::Double); break;
473 params.spacing.set(Spacing::Other, settings->linespacingVal->text());
476 lyxerr[Debug::GUI] << "Unknown line spacing " <<
477 settings->linespacing->currentItem();
480 if (tmpspacing != params.spacing)
485 params.options = settings->extraoptions->text();
488 // paper package and margin package
489 params.papersize2 = static_cast<char>(geometry->papersize->currentItem());
490 params.paperpackage = static_cast<char>(geometry->margins->currentItem());
491 if (geometry->landscape->isChecked())
492 params.orientation = BufferParams::ORIENTATION_LANDSCAPE;
494 params.orientation = BufferParams::ORIENTATION_PORTRAIT;
496 params.paperwidth = geometry->width->getLengthStr();
497 params.paperheight = geometry->height->getLengthStr();
498 params.leftmargin = geometry->left->getLengthStr();
499 params.rightmargin = geometry->right->getLengthStr();
500 params.topmargin = geometry->top->getLengthStr();
501 params.bottommargin = geometry->bottom->getLengthStr();
502 params.headheight = geometry->headheight->getLengthStr();
503 params.headsep = geometry->headsep->getLengthStr();
504 params.footskip = geometry->footskip->getLengthStr();
506 /* FIXME: is geometry required for headheight,sep,footskip ? */
507 params.use_geometry =
508 (params.paperwidth != "" ||
509 params.paperheight != "" ||
510 params.leftmargin != "" ||
511 params.rightmargin != "" ||
512 params.topmargin != "" ||
513 params.bottommargin != "");
518 InsetQuotes::quote_language lga = InsetQuotes::EnglishQ;
520 switch (language->quotes->currentItem()) {
521 case 0: case 2: case 4: case 6: case 8: case 10:
522 params.quotes_times = InsetQuotes::SingleQ;
525 params.quotes_times = InsetQuotes::DoubleQ;
528 switch (language->quotes->currentItem()) {
529 case 0: case 1: lga = InsetQuotes::EnglishQ; break;
530 case 2: case 3: lga = InsetQuotes::SwedishQ; break;
531 case 4: case 5: lga = InsetQuotes::GermanQ; break;
532 case 6: case 7: lga = InsetQuotes::PolishQ; break;
533 case 8: case 9: lga = InsetQuotes::FrenchQ; break;
534 case 10: case 11: lga = InsetQuotes::DanishQ; break;
536 lyxerr[Debug::GUI] << "unknown quotes style" <<
537 language->quotes->currentItem() << endl;
540 params.quotes_language = lga;
542 /* wow, tongue twister */
543 Language const * old_language = params.language;
544 Language const * new_language = languages.getLanguage(language->language->currentText());
547 if (old_language != new_language
548 && old_language->RightToLeft() == new_language->RightToLeft()
549 /*&& !lv_->buffer()->isMultiLingual()*/) {
550 //lv_->buffer()->ChangeLanguage(old_language, new_language);
553 redo = (old_language != new_language) || redo;
554 params.language = new_language;
556 params.inputenc = language->encoding->currentText();
560 params.graphicsDriver = extra->psdriver->currentText();
561 params.use_amsmath = extra->amsmath->isChecked();
563 if (extra->sectiondepth->value() != params.secnumdepth) {
565 params.secnumdepth = extra->sectiondepth->value();
568 params.tocdepth = extra->tocdepth->value();
572 place += placementString(extra->first);
573 place += placementString(extra->second);
574 place += placementString(extra->third);
575 place += placementString(extra->fourth);
576 params.float_placement = place;
583 string DocDialog::placementString(QComboBox * box) const
585 if (!compare(box->currentText(), _("Here")))
587 if (!compare(box->currentText(), _("Bottom of page")))
589 if (!compare(box->currentText(), _("Top of page")))
591 if (!compare(box->currentText(), _("Separate page")))
596 void DocDialog::linespacingChanged(const char * sel)
598 bool const custom = !compare(sel, _("custom"));
600 settings->linespacingVal->setEnabled(custom);
604 void DocDialog::paraspacingChanged(const char * sel)
606 bool const custom = !compare(sel, _("custom"));
607 settings->paraspacingValue->setEnabled(custom);
608 settings->paraspacingStretch->setEnabled(custom);
609 settings->paraspacingShrink->setEnabled(custom);
612 void DocDialog::addspaceChanged(bool on)
614 settings->paraspacing->setEnabled(on);
615 on = (on && !compare(settings->paraspacing->currentText(),
617 settings->paraspacingValue->setEnabled(on);
618 settings->paraspacingStretch->setEnabled(on);
619 settings->paraspacingShrink->setEnabled(on);