]> git.lyx.org Git - lyx.git/blob - src/frontends/kde/docdlg.C
21e7169b8ac8908434bed2aba0328234ca49ea85
[lyx.git] / src / frontends / kde / docdlg.C
1 /**
2  * \file docdlg.C
3  * Copyright 2001 the LyX Team
4  * Read the file COPYING
5  *
6  * \author John Levon
7  */
8
9 #include <config.h>
10
11 #include <qtooltip.h>
12
13 #include "docdlg.h"
14
15 #include "support/lstrings.h"
16
17 #include "layout.h"
18 #include "tex-strings.h"
19 #include "bufferparams.h"
20
21 #include "dlg/helpers.h"
22
23 #include "gettext.h"
24 #include "debug.h"
25
26 #ifdef CXX_WORKING_NAMESPACES
27 using kde_helpers::setSizeHint;
28 using kde_helpers::setComboFromStr;
29 #endif
30
31 using std::endl;
32
33 DocDialog::DocDialog(FormDocument * form, QWidget * parent, char const * name, bool, WFlags)
34         : DocDialogData(parent,name), form_(form)
35 {
36         setCaption(name);
37
38         setUpdatesEnabled(false);
39
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");
45         
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"));
51         
52         // document classes
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);
57         
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);
64         
65         // available fonts
66         for (int i=0; tex_fonts[i][0]; i++)
67                 settings->font->insertItem(tex_fonts[i]);
68         setSizeHint(settings->font);
69
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);
75         
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);
81
82         connect(settings->linespacing, SIGNAL(highlighted(const char *)),
83                 this, SLOT(linespacingChanged(const char *)));
84
85         settings->paraspacing->insertItem(_("small"));
86         settings->paraspacing->insertItem(_("medium"));
87         settings->paraspacing->insertItem(_("big"));
88         settings->paraspacing->insertItem(_("custom"));
89         setSizeHint(settings->paraspacing);
90
91         connect(settings->paraspacing, SIGNAL(highlighted(const char *)),
92                 this, SLOT(paraspacingChanged(const char *)));
93
94         connect(settings->addspace, SIGNAL(toggled(bool)),
95                 this, SLOT(addspaceChanged(bool)));
96
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"));
117
118         // ps driver options
119         for (int i = 0; tex_graphics[i][0]; i++)
120                 extra->psdriver->insertItem(tex_graphics[i]);
121         setSizeHint(extra->psdriver);
122
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);
134         
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);
140         
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);
145         
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);
157         
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);
171
172         /* FIXME: bullets */
173         
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 !"));
190
191         setUpdatesEnabled(true);
192         update();
193 }
194
195
196 DocDialog::~DocDialog()
197 {
198 }
199
200
201 void DocDialog::closeEvent(QCloseEvent * e)
202 {
203         form_->close();
204         e->accept();
205 }
206
207
208 void DocDialog::setReadOnly(bool readonly)
209 {
210         /* FIXME */
211         cancel->setText(readonly ? _("&Close") : _("&Cancel"));
212 }
213
214
215 void DocDialog::setFromParams(BufferParams const & params)
216 {
217         setUpdatesEnabled(false);
218  
219         if (!setComboFromStr(settings->docclass, textclasslist.DescOfClass(params.textclass)))
220                 lyxerr[Debug::GUI] << "Couldn't set docclass " << textclasslist.DescOfClass(params.textclass) << endl;
221
222         if (!setComboFromStr(settings->font, params.fonts))
223                 lyxerr[Debug::GUI] << "Couldn't set font " << params.fonts << endl;
224
225         LyXTextClass const & tclass = textclasslist.TextClass(params.textclass);
226         
227         // opt_fontsize is a string like "10|11|12"
228         settings->fontsize->setCurrentItem(tokenPos(tclass.opt_fontsize(), '|', params.fontsize) + 1);
229
230         // "empty|plain|headings|fancy"
231         settings->pagestyle->setCurrentItem(tokenPos(tclass.opt_pagestyle(), '|', params.pagestyle) + 1);
232         
233         settings->addspace->setChecked(params.paragraph_separation == BufferParams::PARSEP_SKIP);
234
235         bool const isskip = (params.paragraph_separation == BufferParams::PARSEP_SKIP);
236
237         settings->paraspacing->setEnabled(isskip);
238         settings->paraspacingValue->setEnabled(isskip);
239         settings->paraspacingStretch->setEnabled(isskip);
240         settings->paraspacingShrink->setEnabled(isskip);
241
242         int item=0;
243
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;
249                 default:
250                         lyxerr[Debug::GUI] << "Unknown defskip " << int(params.getDefSkip().kind()) << endl;
251         }
252
253         settings->paraspacing->setCurrentItem(item);
254
255         settings->paraspacingValue->setEnabled(item == 3);
256         settings->paraspacingStretch->setEnabled(item == 3);
257         settings->paraspacingShrink->setEnabled(item == 3);
258
259         if (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;;
268         } else {
269                 settings->paraspacingValue->setFromLengthStr("0cm");
270                 settings->paraspacingStretch->setFromLengthStr("0cm");
271                 settings->paraspacingShrink->setFromLengthStr("0cm");
272         }
273
274         settings->sides->setChecked(params.sides == LyXTextClass::TwoSides);
275         settings->columns->setChecked(params.columns == 2);
276
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;
283                 default:
284                         lyxerr[Debug::GUI] << "Unknown line spacing " << int(params.spacing.getSpace()) << endl;
285         }
286
287         settings->linespacing->setCurrentItem(item);
288         settings->linespacingVal->setEnabled(item == 3);
289         
290         if (item == 3)
291                 settings->linespacingVal->setText(tostr(params.spacing.getValue()).c_str());
292         else
293                 settings->linespacingVal->setText("");
294
295         if (params.options.empty())
296                 settings->extraoptions->setText("");
297         else
298                 settings->extraoptions->setText(params.options.c_str());
299
300         // geometry page
301
302         geometry->papersize->setCurrentItem(params.papersize2);
303         
304         geometry->margins->setCurrentItem(params.paperpackage);
305         
306         geometry->portrait->setChecked(params.orientation == BufferParams::ORIENTATION_PORTRAIT);
307         geometry->landscape->setChecked(params.orientation != BufferParams::ORIENTATION_PORTRAIT);
308         
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);
318         
319         // language page
320
321         if (!setComboFromStr(language->language, params.language->lang()))
322                 lyxerr[Debug::GUI] << "Couldn't set language " << params.language->lang() << endl;
323         
324         if (!setComboFromStr(language->encoding, params.inputenc))
325                 lyxerr[Debug::GUI] << "Couldn't set encoding " << params.inputenc << endl;
326
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;
334                 default:
335                         lyxerr[Debug::GUI] << "Unknown quote style " << int(params.quotes_language) << endl;
336         }
337
338         if (params.quotes_times == InsetQuotes::DoubleQ)
339                 item++;
340
341         language->quotes->setCurrentItem(item);
342         
343         // extra page
344
345         if (!setComboFromStr(extra->psdriver, params.graphicsDriver))
346                 lyxerr[Debug::GUI] << "Couldn't set psdriver " << params.graphicsDriver << endl;
347         
348         extra->amsmath->setChecked(params.use_amsmath);
349         extra->sectiondepth->setValue(params.secnumdepth);
350         extra->tocdepth->setValue(params.tocdepth);
351
352         string const place = params.float_placement;
353         int count = 0;
354         QComboBox * box;
355
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"));
361
362         for (string::const_iterator iter = place.begin(); iter != place.end(); ++count, ++iter) {
363                 switch (count) {
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;
368                 };
369
370                 if (*iter == '!') {
371                         extra->ignore->setChecked(true);
372                         continue;
373                 }
374
375                 switch (*iter) {
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;
380                         default:
381                                 lyxerr[Debug::GUI] << "Unknown float placement \'" << *iter << endl;
382                 }
383         }
384
385         /* FIXME: bullets ! */
386  
387         setUpdatesEnabled(true);
388         update();
389 }
390
391
392 bool DocDialog::updateParams(BufferParams & params)
393 {
394         bool redo = false;
395
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);
400
401         // set and update class
402
403         unsigned int const new_class = settings->docclass->currentItem();
404
405         if (new_class != params.textclass) {
406                 if (!form_->changeClass(params, new_class)) {
407                         // FIXME: error msg
408                         // restore old class
409                         if (!setComboFromStr(settings->docclass, textclasslist.DescOfClass(params.textclass)))
410                                 lyxerr[Debug::GUI] << "Couldn't set docclass " << textclasslist.DescOfClass(params.textclass) << endl;
411                 } else
412                         redo = true;
413         }
414
415         BufferParams::PARSEP tmpsep = params.paragraph_separation;
416
417         (settings->addspace->isChecked())
418                 ? params.paragraph_separation = BufferParams::PARSEP_SKIP
419                 : params.paragraph_separation = BufferParams::PARSEP_INDENT;
420                 
421         redo = (tmpsep != params.paragraph_separation) || redo;
422
423         // the skip spacing
424
425         VSpace tmpskip;
426
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;
431                 default:
432                         lyxerr[Debug::GUI] << "Unknown skip spacing " <<
433                                 settings->paraspacing->currentItem() << endl;
434                         break;
435                 case 3:
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);
443                         break;
444         }
445
446         if (!(tmpskip == params.getDefSkip())) {
447                 redo = true;
448                 params.setDefSkip(tmpskip);
449         }
450
451         // columns and sides
452
453         (settings->sides->isChecked())
454                 ? params.sides = LyXTextClass::TwoSides
455                 : params.sides = LyXTextClass::OneSide;
456
457         (settings->columns->isChecked())
458                 ? params.columns = 2
459                 : params.columns = 1;
460
461         // line spacing
462
463         Spacing tmpspacing = params.spacing;
464
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;
469                 case 3:
470                         params.spacing.set(Spacing::Other, settings->linespacingVal->text());
471                         break;
472                 default:
473                         lyxerr[Debug::GUI] << "Unknown line spacing " <<
474                                 settings->linespacing->currentItem();
475         }
476
477         if (tmpspacing != params.spacing)
478                 redo = true;
479
480         // extra options
481
482         params.options = settings->extraoptions->text();
483                 
484         
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;
490         else
491                 params.orientation = BufferParams::ORIENTATION_PORTRAIT;
492
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();
502         
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 != "");
511
512
513         // language dialog
514
515         InsetQuotes::quote_language lga = InsetQuotes::EnglishQ;
516
517         switch (language->quotes->currentItem()) {
518                 case 0: case 2: case 4: case 6: case 8: case 10:
519                         params.quotes_times = InsetQuotes::SingleQ;
520                         break;
521                 default:
522                         params.quotes_times = InsetQuotes::DoubleQ;
523         }
524
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;
532                 default:
533                         lyxerr[Debug::GUI] << "unknown quotes style" <<
534                                 language->quotes->currentItem() << endl;
535         }
536
537         params.quotes_language = lga;
538
539         /* wow, tongue twister */
540         Language const * old_language = params.language;
541         Language const * new_language = languages.getLanguage(language->language->currentText());
542
543         /* FIXME */
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);
548         }
549         
550         redo = (old_language != new_language) || redo;
551         params.language = new_language;
552
553         params.inputenc = language->encoding->currentText();
554
555         // extra dialog
556
557         params.graphicsDriver = extra->psdriver->currentText();
558         params.use_amsmath = extra->amsmath->isChecked();
559         
560         if (extra->sectiondepth->value() != params.secnumdepth) {
561                 redo = true;
562                 params.secnumdepth = extra->sectiondepth->value();
563         }
564
565         params.tocdepth = extra->tocdepth->value();
566
567         string place;
568
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;
574
575         /* FIXME: bullets */
576         
577         return redo;
578 }
579
580 string DocDialog::placementString(QComboBox * box) const
581 {
582         if (!compare(box->currentText(), _("Here")))
583                 return "h";
584         if (!compare(box->currentText(), _("Bottom of page")))
585                 return "b";
586         if (!compare(box->currentText(), _("Top of page")))
587                 return "t";
588         if (!compare(box->currentText(), _("Separate page")))
589                 return "p";
590         return "";
591 }
592
593 void DocDialog::linespacingChanged(const char * sel)
594 {
595         bool const custom = !compare(sel, _("custom"));
596
597         settings->linespacingVal->setEnabled(custom);
598 }
599
600
601 void DocDialog::paraspacingChanged(const char * sel)
602 {
603         bool const custom = !compare(sel, _("custom"));
604         settings->paraspacingValue->setEnabled(custom);
605         settings->paraspacingStretch->setEnabled(custom);
606         settings->paraspacingShrink->setEnabled(custom);
607 }
608
609 void DocDialog::addspaceChanged(bool on)
610 {
611         settings->paraspacing->setEnabled(on);
612         on = (on && !compare(settings->paraspacing->currentText(),
613                              _("custom")));
614         settings->paraspacingValue->setEnabled(on);
615         settings->paraspacingStretch->setEnabled(on);
616         settings->paraspacingShrink->setEnabled(on);
617 }