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 for (Languages::const_iterator cit = languages.begin();
142 cit != languages.end(); ++cit)
143 language->language->insertItem((*cit).second.lang().c_str());
144 setSizeHint(language->language);
146 language->encoding->insertItem(_("default"));
147 language->encoding->insertItem(_("auto"));
148 language->encoding->insertItem(_("latin1"));
149 language->encoding->insertItem(_("latin2"));
150 language->encoding->insertItem(_("latin5"));
151 language->encoding->insertItem(_("koi8-r"));
152 language->encoding->insertItem(_("koi8-u"));
153 language->encoding->insertItem(_("cp866"));
154 language->encoding->insertItem(_("cp1251"));
155 language->encoding->insertItem(_("iso88595"));
156 setSizeHint(language->encoding);
158 language->quotes->insertItem(_("`text'"));
159 language->quotes->insertItem(_("``text''"));
160 language->quotes->insertItem(_("'text'"));
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 setSizeHint(language->quotes);
174 QToolTip::add(settings->pagestyle, _("Specify header + footer style etc"));
175 QToolTip::add(settings->addspace, _("Add spacing between paragraphs rather\n than indenting"));
176 QToolTip::add(settings->linespacingVal, _("Custom line spacing in line units"));
177 QToolTip::add(settings->extraoptions, _("Additional LaTeX options"));
178 QToolTip::add(extra->first, _("Specify preferred order for\nplacing floats"));
179 QToolTip::add(extra->second, _("Specify preferred order for\nplacing floats"));
180 QToolTip::add(extra->third, _("Specify preferred order for\nplacing floats"));
181 QToolTip::add(extra->fourth, _("Specify preferred order for\nplacing floats"));
182 QToolTip::add(extra->ignore, _("Tell LaTeX to ignore usual rules\n for float placement"));
183 QToolTip::add(extra->sectiondepth, _("How far in the (sub)sections are numbered"));
184 QToolTip::add(extra->tocdepth, _("How detailed the Table of Contents is"));
185 QToolTip::add(extra->psdriver, _("Program to produce PostScript output"));
186 QToolTip::add(extra->amsmath, _("FIXME please !"));
187 QToolTip::add(geometry->headheight, _("FIXME please !"));
188 QToolTip::add(geometry->headsep, _("FIXME please !"));
189 QToolTip::add(geometry->footskip, _("FIXME please !"));
191 setUpdatesEnabled(true);
196 DocDialog::~DocDialog()
201 void DocDialog::closeEvent(QCloseEvent * e)
208 void DocDialog::setReadOnly(bool readonly)
211 cancel->setText(readonly ? _("&Close") : _("&Cancel"));
215 void DocDialog::setFromParams(BufferParams const & params)
217 setUpdatesEnabled(false);
219 if (!setComboFromStr(settings->docclass, textclasslist.DescOfClass(params.textclass)))
220 lyxerr[Debug::GUI] << "Couldn't set docclass " << textclasslist.DescOfClass(params.textclass) << endl;
222 if (!setComboFromStr(settings->font, params.fonts))
223 lyxerr[Debug::GUI] << "Couldn't set font " << params.fonts << endl;
225 LyXTextClass const & tclass = textclasslist.TextClass(params.textclass);
227 // opt_fontsize is a string like "10|11|12"
228 settings->fontsize->setCurrentItem(tokenPos(tclass.opt_fontsize(), '|', params.fontsize) + 1);
230 // "empty|plain|headings|fancy"
231 settings->pagestyle->setCurrentItem(tokenPos(tclass.opt_pagestyle(), '|', params.pagestyle) + 1);
233 settings->addspace->setChecked(params.paragraph_separation == BufferParams::PARSEP_SKIP);
235 bool const isskip = (params.paragraph_separation == BufferParams::PARSEP_SKIP);
237 settings->paraspacing->setEnabled(isskip);
238 settings->paraspacingValue->setEnabled(isskip);
239 settings->paraspacingStretch->setEnabled(isskip);
240 settings->paraspacingShrink->setEnabled(isskip);
244 switch (params.getDefSkip().kind()) {
245 case VSpace::SMALLSKIP: item = 0; break;
246 case VSpace::MEDSKIP: item = 1; break;
247 case VSpace::BIGSKIP: item = 2; break;
248 case VSpace::LENGTH: item = 3; break;
250 lyxerr[Debug::GUI] << "Unknown defskip " << int(params.getDefSkip().kind()) << endl;
253 settings->paraspacing->setCurrentItem(item);
255 settings->paraspacingValue->setEnabled(item == 3);
256 settings->paraspacingStretch->setEnabled(item == 3);
257 settings->paraspacingShrink->setEnabled(item == 3);
260 LyXGlueLength const len = params.getDefSkip().length();
261 settings->paraspacingValue->setValue(len.value());
262 settings->paraspacingValue->setUnits(len.unit());
263 settings->paraspacingStretch->setValue(len.plusValue());
264 settings->paraspacingStretch->setUnits(len.plusUnit());
265 settings->paraspacingShrink->setValue(len.minusValue());
266 settings->paraspacingShrink->setUnits(len.minusUnit());
267 lyxerr[Debug::GUI] << params.getDefSkip().asLyXCommand() << endl;;
269 settings->paraspacingValue->setFromLengthStr("0cm");
270 settings->paraspacingStretch->setFromLengthStr("0cm");
271 settings->paraspacingShrink->setFromLengthStr("0cm");
274 settings->sides->setChecked(params.sides == LyXTextClass::TwoSides);
275 settings->columns->setChecked(params.columns == 2);
277 switch (params.spacing.getSpace()) {
278 case Spacing::Default:
279 case Spacing::Single: item = 0; break;
280 case Spacing::Onehalf: item = 1; break;
281 case Spacing::Double: item = 2; break;
282 case Spacing::Other: item = 3; break;
284 lyxerr[Debug::GUI] << "Unknown line spacing " << int(params.spacing.getSpace()) << endl;
287 settings->linespacing->setCurrentItem(item);
288 settings->linespacingVal->setEnabled(item == 3);
291 settings->linespacingVal->setText(tostr(params.spacing.getValue()).c_str());
293 settings->linespacingVal->setText("");
295 if (params.options.empty())
296 settings->extraoptions->setText("");
298 settings->extraoptions->setText(params.options.c_str());
302 geometry->papersize->setCurrentItem(params.papersize2);
304 geometry->margins->setCurrentItem(params.paperpackage);
306 geometry->portrait->setChecked(params.orientation == BufferParams::ORIENTATION_PORTRAIT);
307 geometry->landscape->setChecked(params.orientation != BufferParams::ORIENTATION_PORTRAIT);
309 geometry->width->setFromLengthStr(params.paperwidth);
310 geometry->height->setFromLengthStr(params.paperheight);
311 geometry->left->setFromLengthStr(params.leftmargin);
312 geometry->right->setFromLengthStr(params.rightmargin);
313 geometry->top->setFromLengthStr(params.topmargin);
314 geometry->bottom->setFromLengthStr(params.bottommargin);
315 geometry->headheight->setFromLengthStr(params.headheight);
316 geometry->headsep->setFromLengthStr(params.headsep);
317 geometry->footskip->setFromLengthStr(params.footskip);
321 if (!setComboFromStr(language->language, params.language->lang()))
322 lyxerr[Debug::GUI] << "Couldn't set language " << params.language->lang() << endl;
324 if (!setComboFromStr(language->encoding, params.inputenc))
325 lyxerr[Debug::GUI] << "Couldn't set encoding " << params.inputenc << endl;
327 switch (params.quotes_language) {
328 case InsetQuotes::EnglishQ: item = 0; break;
329 case InsetQuotes::SwedishQ: item = 2; break;
330 case InsetQuotes::GermanQ: item = 4; break;
331 case InsetQuotes::PolishQ: item = 6; break;
332 case InsetQuotes::FrenchQ: item = 8; break;
333 case InsetQuotes::DanishQ: item = 10; break;
335 lyxerr[Debug::GUI] << "Unknown quote style " << int(params.quotes_language) << endl;
338 if (params.quotes_times == InsetQuotes::DoubleQ)
341 language->quotes->setCurrentItem(item);
345 if (!setComboFromStr(extra->psdriver, params.graphicsDriver))
346 lyxerr[Debug::GUI] << "Couldn't set psdriver " << params.graphicsDriver << endl;
348 extra->amsmath->setChecked(params.use_amsmath);
349 extra->sectiondepth->setValue(params.secnumdepth);
350 extra->tocdepth->setValue(params.tocdepth);
352 string const place = params.float_placement;
356 extra->ignore->setChecked(false);
357 setComboFromStr(extra->first, _("Not set"));
358 setComboFromStr(extra->second, _("Not set"));
359 setComboFromStr(extra->third, _("Not set"));
360 setComboFromStr(extra->fourth, _("Not set"));
362 for (string::const_iterator iter = place.begin(); iter != place.end(); ++count, ++iter) {
364 case 0: box = extra->first; break;
365 case 1: box = extra->second; break;
366 case 2: box = extra->third; break;
367 default: box = extra->fourth; break;
371 extra->ignore->setChecked(true);
376 case 'h': setComboFromStr(box, _("Here")); break;
377 case 'b': setComboFromStr(box, _("Bottom of page")); break;
378 case 't': setComboFromStr(box, _("Top of page")); break;
379 case 'p': setComboFromStr(box, _("Separate page")); break;
381 lyxerr[Debug::GUI] << "Unknown float placement \'" << *iter << endl;
385 /* FIXME: bullets ! */
387 setUpdatesEnabled(true);
392 bool DocDialog::updateParams(BufferParams & params)
396 params.fonts = string(settings->font->currentText());
397 LyXTextClass const & tclass = textclasslist.TextClass(params.textclass);
398 params.fontsize = token(tclass.opt_fontsize(), '|', settings->fontsize->currentItem() - 1);
399 params.pagestyle = token(tclass.opt_pagestyle(), '|', settings->pagestyle->currentItem() - 1);
401 // set and update class
403 unsigned int const new_class = settings->docclass->currentItem();
405 if (new_class != params.textclass) {
406 if (!form_->changeClass(params, new_class)) {
409 if (!setComboFromStr(settings->docclass, textclasslist.DescOfClass(params.textclass)))
410 lyxerr[Debug::GUI] << "Couldn't set docclass " << textclasslist.DescOfClass(params.textclass) << endl;
415 BufferParams::PARSEP tmpsep = params.paragraph_separation;
417 (settings->addspace->isChecked())
418 ? params.paragraph_separation = BufferParams::PARSEP_SKIP
419 : params.paragraph_separation = BufferParams::PARSEP_INDENT;
421 redo = (tmpsep != params.paragraph_separation) || redo;
427 switch (settings->paraspacing->currentItem()) {
428 case 0: tmpskip = VSpace(VSpace::SMALLSKIP); break;
429 case 1: tmpskip = VSpace(VSpace::MEDSKIP); break;
430 case 2: tmpskip = VSpace(VSpace::BIGSKIP); break;
432 lyxerr[Debug::GUI] << "Unknown skip spacing " <<
433 settings->paraspacing->currentItem() << endl;
436 string const val = settings->paraspacingValue->getLengthStr()
437 + "+" + settings->paraspacingStretch->getLengthStr()
438 + "-" + settings->paraspacingShrink->getLengthStr();
439 lyxerr[Debug::GUI] << "Read para spacing of \"" << val << "\"" << endl;
440 LyXGlueLength length(0.0, LyXLength::PT);
441 isValidGlueLength(val, &length);
442 tmpskip = VSpace(length);
446 if (!(tmpskip == params.getDefSkip())) {
448 params.setDefSkip(tmpskip);
453 (settings->sides->isChecked())
454 ? params.sides = LyXTextClass::TwoSides
455 : params.sides = LyXTextClass::OneSide;
457 (settings->columns->isChecked())
459 : params.columns = 1;
463 Spacing tmpspacing = params.spacing;
465 switch (settings->linespacing->currentItem()) {
466 case 0: params.spacing.set(Spacing::Single); break;
467 case 1: params.spacing.set(Spacing::Onehalf); break;
468 case 2: params.spacing.set(Spacing::Double); break;
470 params.spacing.set(Spacing::Other, settings->linespacingVal->text());
473 lyxerr[Debug::GUI] << "Unknown line spacing " <<
474 settings->linespacing->currentItem();
477 if (tmpspacing != params.spacing)
482 params.options = settings->extraoptions->text();
485 // paper package and margin package
486 params.papersize2 = static_cast<char>(geometry->papersize->currentItem());
487 params.paperpackage = static_cast<char>(geometry->margins->currentItem());
488 if (geometry->landscape->isChecked())
489 params.orientation = BufferParams::ORIENTATION_LANDSCAPE;
491 params.orientation = BufferParams::ORIENTATION_PORTRAIT;
493 params.paperwidth = geometry->width->getLengthStr();
494 params.paperheight = geometry->height->getLengthStr();
495 params.leftmargin = geometry->left->getLengthStr();
496 params.rightmargin = geometry->right->getLengthStr();
497 params.topmargin = geometry->top->getLengthStr();
498 params.bottommargin = geometry->bottom->getLengthStr();
499 params.headheight = geometry->headheight->getLengthStr();
500 params.headsep = geometry->headsep->getLengthStr();
501 params.footskip = geometry->footskip->getLengthStr();
503 /* FIXME: is geometry required for headheight,sep,footskip ? */
504 params.use_geometry =
505 (params.paperwidth != "" ||
506 params.paperheight != "" ||
507 params.leftmargin != "" ||
508 params.rightmargin != "" ||
509 params.topmargin != "" ||
510 params.bottommargin != "");
515 InsetQuotes::quote_language lga = InsetQuotes::EnglishQ;
517 switch (language->quotes->currentItem()) {
518 case 0: case 2: case 4: case 6: case 8: case 10:
519 params.quotes_times = InsetQuotes::SingleQ;
522 params.quotes_times = InsetQuotes::DoubleQ;
525 switch (language->quotes->currentItem()) {
526 case 0: case 1: lga = InsetQuotes::EnglishQ; break;
527 case 2: case 3: lga = InsetQuotes::SwedishQ; break;
528 case 4: case 5: lga = InsetQuotes::GermanQ; break;
529 case 6: case 7: lga = InsetQuotes::PolishQ; break;
530 case 8: case 9: lga = InsetQuotes::FrenchQ; break;
531 case 10: case 11: lga = InsetQuotes::DanishQ; break;
533 lyxerr[Debug::GUI] << "unknown quotes style" <<
534 language->quotes->currentItem() << endl;
537 params.quotes_language = lga;
539 /* wow, tongue twister */
540 Language const * old_language = params.language;
541 Language const * new_language = languages.getLanguage(language->language->currentText());
544 if (old_language != new_language
545 && old_language->RightToLeft() == new_language->RightToLeft()
546 /*&& !lv_->buffer()->isMultiLingual()*/) {
547 //lv_->buffer()->ChangeLanguage(old_language, new_language);
550 redo = (old_language != new_language) || redo;
551 params.language = new_language;
553 params.inputenc = language->encoding->currentText();
557 params.graphicsDriver = extra->psdriver->currentText();
558 params.use_amsmath = extra->amsmath->isChecked();
560 if (extra->sectiondepth->value() != params.secnumdepth) {
562 params.secnumdepth = extra->sectiondepth->value();
565 params.tocdepth = extra->tocdepth->value();
569 place += placementString(extra->first);
570 place += placementString(extra->second);
571 place += placementString(extra->third);
572 place += placementString(extra->fourth);
573 params.float_placement = place;
580 string DocDialog::placementString(QComboBox * box) const
582 if (!compare(box->currentText(), _("Here")))
584 if (!compare(box->currentText(), _("Bottom of page")))
586 if (!compare(box->currentText(), _("Top of page")))
588 if (!compare(box->currentText(), _("Separate page")))
593 void DocDialog::linespacingChanged(const char * sel)
595 bool const custom = !compare(sel, _("custom"));
597 settings->linespacingVal->setEnabled(custom);
601 void DocDialog::paraspacingChanged(const char * sel)
603 bool const custom = !compare(sel, _("custom"));
604 settings->paraspacingValue->setEnabled(custom);
605 settings->paraspacingStretch->setEnabled(custom);
606 settings->paraspacingShrink->setEnabled(custom);
609 void DocDialog::addspaceChanged(bool on)
611 settings->paraspacing->setEnabled(on);
612 on = (on && !compare(settings->paraspacing->currentText(),
614 settings->paraspacingValue->setEnabled(on);
615 settings->paraspacingStretch->setEnabled(on);
616 settings->paraspacingShrink->setEnabled(on);