]> git.lyx.org Git - features.git/blob - src/frontends/kde/docdlg.C
7170ec4fcf378d58175b36c74abf32cf83df1f02
[features.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 using kde_helpers::setSizeHint;
27 using kde_helpers::setComboFromStr;
28 using std::endl;
29
30 DocDialog::DocDialog(FormDocument * form, QWidget * parent, char const * name, bool, WFlags)
31         : DocDialogData(parent,name), form_(form)
32 {
33         setCaption(name);
34
35         setUpdatesEnabled(false);
36
37         settings = new DocSettingsDialogData(this, "settings");
38         extra = new DocExtraDialogData(this, "extra");
39         geometry = new DocGeometryDialogData(this, "geometry");
40         language = new DocLanguageDialogData(this, "language");
41         bullets = new DocBulletsDialogData(this, "bullets");
42         
43         tabstack->addTabPage(settings, _("&Settings"));
44         tabstack->addTabPage(extra, _("&Extra"));
45         tabstack->addTabPage(geometry, _("&Geometry"));
46         tabstack->addTabPage(language, _("&Language"));
47         tabstack->addTabPage(bullets, _("&Bullets"));
48         
49         // document classes
50         for (LyXTextClassList::const_iterator cit = textclasslist.begin();
51                 cit != textclasslist.end(); ++cit)
52                 settings->combo_docclass->insertItem((*cit).description().c_str());
53         setSizeHint(settings->combo_docclass);
54         
55         settings->combo_pagestyle->insertItem(_("default"));
56         settings->combo_pagestyle->insertItem(_("empty"));
57         settings->combo_pagestyle->insertItem(_("plain"));
58         settings->combo_pagestyle->insertItem(_("headings"));
59         settings->combo_pagestyle->insertItem(_("fancy"));
60         setSizeHint(settings->combo_pagestyle);
61         
62         // available fonts
63         for (int i=0; tex_fonts[i][0]; i++)
64                 settings->combo_font->insertItem(tex_fonts[i]);
65         setSizeHint(settings->combo_font);
66
67         settings->combo_fontsize->insertItem(_("default"));
68         settings->combo_fontsize->insertItem(_("10 point"));
69         settings->combo_fontsize->insertItem(_("11 point"));
70         settings->combo_fontsize->insertItem(_("12 point"));
71         setSizeHint(settings->combo_fontsize);
72         
73         settings->combo_linespacing->insertItem(_("single"));
74         settings->combo_linespacing->insertItem(_("1 1/2 spacing"));
75         settings->combo_linespacing->insertItem(_("double"));
76         settings->combo_linespacing->insertItem(_("custom"));
77         setSizeHint(settings->combo_linespacing);
78
79         connect(settings->combo_linespacing, SIGNAL(highlighted(const char *)),
80                 this, SLOT(linespacingChanged(const char *)));
81
82         settings->combo_paraspacing->insertItem(_("small"));
83         settings->combo_paraspacing->insertItem(_("medium"));
84         settings->combo_paraspacing->insertItem(_("big"));
85         settings->combo_paraspacing->insertItem(_("custom"));
86         setSizeHint(settings->combo_paraspacing);
87
88         connect(settings->combo_paraspacing, SIGNAL(highlighted(const char *)),
89                 this, SLOT(paraspacingChanged(const char *)));
90
91         connect(settings->check_addspace, SIGNAL(toggled(bool)),
92                 this, SLOT(addspaceChanged(bool)));
93
94         extra->combo_first->insertItem(_("Here"));
95         extra->combo_first->insertItem(_("Bottom of page"));
96         extra->combo_first->insertItem(_("Top of page"));
97         extra->combo_first->insertItem(_("Separate page"));
98         extra->combo_first->insertItem(_("Not set"));
99         extra->combo_second->insertItem(_("Here"));
100         extra->combo_second->insertItem(_("Bottom of page"));
101         extra->combo_second->insertItem(_("Top of page"));
102         extra->combo_second->insertItem(_("Separate page"));
103         extra->combo_second->insertItem(_("Not set"));
104         extra->combo_third->insertItem(_("Here"));
105         extra->combo_third->insertItem(_("Bottom of page"));
106         extra->combo_third->insertItem(_("Top of page"));
107         extra->combo_third->insertItem(_("Separate page"));
108         extra->combo_third->insertItem(_("Not set"));
109         extra->combo_fourth->insertItem(_("Here"));
110         extra->combo_fourth->insertItem(_("Bottom of page"));
111         extra->combo_fourth->insertItem(_("Top of page"));
112         extra->combo_fourth->insertItem(_("Separate page"));
113         extra->combo_fourth->insertItem(_("Not set"));
114
115         // ps driver options
116         for (int i = 0; tex_graphics[i][0]; i++)
117                 extra->combo_psdriver->insertItem(tex_graphics[i]);
118         setSizeHint(extra->combo_psdriver);
119
120         geometry->combo_papersize->insertItem(_("default"));
121         geometry->combo_papersize->insertItem(_("US letter"));
122         geometry->combo_papersize->insertItem(_("US legal"));
123         geometry->combo_papersize->insertItem(_("US executive"));
124         geometry->combo_papersize->insertItem("A3");
125         geometry->combo_papersize->insertItem("A4");
126         geometry->combo_papersize->insertItem("A5");
127         geometry->combo_papersize->insertItem("B3");
128         geometry->combo_papersize->insertItem("B4");
129         geometry->combo_papersize->insertItem("B5");
130         setSizeHint(geometry->combo_papersize);
131         
132         geometry->combo_margins->insertItem(_("default"));
133         geometry->combo_margins->insertItem(_("A4 small margins"));
134         geometry->combo_margins->insertItem(_("A4 very small margins"));
135         geometry->combo_margins->insertItem(_("A4 very wide margins"));
136         setSizeHint(geometry->combo_margins);
137         
138         for (Languages::const_iterator cit = languages.begin();
139                 cit != languages.end(); ++cit)
140                 language->combo_language->insertItem((*cit).second.lang().c_str());
141         setSizeHint(language->combo_language);
142         
143         language->combo_encoding->insertItem(_("default"));
144         language->combo_encoding->insertItem(_("auto"));
145         language->combo_encoding->insertItem(_("latin1"));
146         language->combo_encoding->insertItem(_("latin2"));
147         language->combo_encoding->insertItem(_("latin5"));
148         language->combo_encoding->insertItem(_("koi8-r"));
149         language->combo_encoding->insertItem(_("koi8-u"));
150         language->combo_encoding->insertItem(_("cp866"));
151         language->combo_encoding->insertItem(_("cp1251"));
152         language->combo_encoding->insertItem(_("iso88595"));
153         setSizeHint(language->combo_encoding);
154         
155         language->combo_quotes->insertItem(_("`text'"));
156         language->combo_quotes->insertItem(_("``text''"));
157         language->combo_quotes->insertItem(_("'text'"));
158         language->combo_quotes->insertItem(_("''text''"));
159         language->combo_quotes->insertItem(_(",text`"));
160         language->combo_quotes->insertItem(_(",,text``"));
161         language->combo_quotes->insertItem(_(",text'"));
162         language->combo_quotes->insertItem(_(",,text''"));
163         language->combo_quotes->insertItem(_("<text>"));
164         language->combo_quotes->insertItem(_("«text»"));
165         language->combo_quotes->insertItem(_(">text<"));
166         language->combo_quotes->insertItem(_("»text«"));
167         setSizeHint(language->combo_quotes);
168
169         /* FIXME: bullets */
170         
171         QToolTip::add(settings->combo_pagestyle, _("Specify header + footer style etc"));
172         QToolTip::add(settings->check_addspace, _("Add spacing between paragraphs rather\n than indenting"));
173         QToolTip::add(settings->combo_linespacing, _("Custom line spacing in line units"));
174         QToolTip::add(settings->line_extraoptions, _("Additional LaTeX options"));
175         QToolTip::add(extra->combo_first, _("Specify preferred order for\nplacing floats"));
176         QToolTip::add(extra->combo_second, _("Specify preferred order for\nplacing floats"));
177         QToolTip::add(extra->combo_third, _("Specify preferred order for\nplacing floats"));
178         QToolTip::add(extra->combo_fourth, _("Specify preferred order for\nplacing floats"));
179         QToolTip::add(extra->check_ignore, _("Tell LaTeX to ignore usual rules\n for float placement"));
180         QToolTip::add(extra->spin_sectiondepth, _("How far in the (sub)sections are numbered"));
181         QToolTip::add(extra->spin_tocdepth, _("How detailed the Table of Contents is"));
182         QToolTip::add(extra->combo_psdriver, _("Program to produce PostScript output"));
183         QToolTip::add(extra->check_amsmath, _("FIXME please !"));
184         QToolTip::add(geometry->length_headheight, _("FIXME please !"));
185         QToolTip::add(geometry->length_headsep, _("FIXME please !"));
186         QToolTip::add(geometry->length_footskip, _("FIXME please !"));
187
188         setUpdatesEnabled(true);
189         update();
190 }
191
192
193 DocDialog::~DocDialog()
194 {
195 }
196
197
198 void DocDialog::closeEvent(QCloseEvent * e)
199 {
200         form_->close();
201         e->accept();
202 }
203
204
205 void DocDialog::setReadOnly(bool readonly)
206 {
207         /* FIXME */
208         button_cancel->setText(readonly ? _("&Close") : _("&Cancel"));
209 }
210
211
212 void DocDialog::setFromParams(BufferParams const & params)
213 {
214         setUpdatesEnabled(false);
215  
216         if (!setComboFromStr(settings->combo_docclass, textclasslist.DescOfClass(params.textclass)))
217                 lyxerr[Debug::GUI] << "Couldn't set docclass " << textclasslist.DescOfClass(params.textclass) << endl;
218
219         if (!setComboFromStr(settings->combo_font, params.fonts))
220                 lyxerr[Debug::GUI] << "Couldn't set font " << params.fonts << endl;
221
222         LyXTextClass const & tclass = textclasslist.TextClass(params.textclass);
223         
224         // opt_fontsize is a string like "10|11|12"
225         settings->combo_fontsize->setCurrentItem(tokenPos(tclass.opt_fontsize(), '|', params.fontsize) + 1);
226
227         // "empty|plain|headings|fancy"
228         settings->combo_pagestyle->setCurrentItem(tokenPos(tclass.opt_pagestyle(), '|', params.pagestyle) + 1);
229         
230         settings->check_addspace->setChecked(params.paragraph_separation == BufferParams::PARSEP_SKIP);
231
232         bool const isskip = (params.paragraph_separation == BufferParams::PARSEP_SKIP);
233
234         settings->combo_paraspacing->setEnabled(isskip);
235         settings->length_paraspacing->setEnabled(isskip);
236         settings->length_paraspacingstretch->setEnabled(isskip);
237         settings->length_paraspacingshrink->setEnabled(isskip);
238
239         int item=0;
240
241         switch (params.getDefSkip().kind()) {
242                 case VSpace::SMALLSKIP: item = 0; break;
243                 case VSpace::MEDSKIP: item = 1; break;
244                 case VSpace::BIGSKIP: item = 2; break;
245                 case VSpace::LENGTH: item = 3; break;
246                 default:
247                         lyxerr[Debug::GUI] << "Unknown defskip " << int(params.getDefSkip().kind()) << endl;
248         }
249
250         settings->combo_paraspacing->setCurrentItem(item);
251
252         settings->length_paraspacing->setEnabled(item == 3);
253         settings->length_paraspacingstretch->setEnabled(item == 3);
254         settings->length_paraspacingshrink->setEnabled(item == 3);
255
256         if (item == 3) {
257                 LyXGlueLength const len = params.getDefSkip().length();
258                 settings->length_paraspacing->setValue(len.value());
259                 settings->length_paraspacing->setUnits(len.unit());
260                 settings->length_paraspacingstretch->setValue(len.plusValue());
261                 settings->length_paraspacingstretch->setUnits(len.plusUnit());
262                 settings->length_paraspacingshrink->setValue(len.minusValue());
263                 settings->length_paraspacingshrink->setUnits(len.minusUnit());
264                 lyxerr[Debug::GUI] << params.getDefSkip().asLyXCommand() << endl;;
265         } else {
266                 settings->length_paraspacing->setFromLengthStr("0cm");
267                 settings->length_paraspacingstretch->setFromLengthStr("0cm");
268                 settings->length_paraspacingshrink->setFromLengthStr("0cm");
269         }
270
271         settings->check_sides->setChecked(params.sides == LyXTextClass::TwoSides);
272         settings->check_columns->setChecked(params.columns == 2);
273
274         switch (params.spacing.getSpace()) {
275                 case Spacing::Default:
276                 case Spacing::Single: item = 0; break;
277                 case Spacing::Onehalf: item = 1; break;
278                 case Spacing::Double: item = 2; break;
279                 case Spacing::Other: item = 3; break;
280                 default:
281                         lyxerr[Debug::GUI] << "Unknown line spacing " << int(params.spacing.getSpace()) << endl;
282         }
283
284         settings->combo_linespacing->setCurrentItem(item);
285         settings->line_linespacing->setEnabled(item == 3);
286         
287         if (item == 3)
288                 settings->line_linespacing->setText(tostr(params.spacing.getValue()).c_str());
289         else
290                 settings->line_linespacing->setText("");
291
292         if (params.options.empty())
293                 settings->line_extraoptions->setText("");
294         else
295                 settings->line_extraoptions->setText(params.options.c_str());
296
297         // geometry page
298
299         geometry->combo_papersize->setCurrentItem(params.papersize2);
300         
301         geometry->combo_margins->setCurrentItem(params.paperpackage);
302         
303         geometry->radio_portrait->setChecked(params.orientation == BufferParams::ORIENTATION_PORTRAIT);
304         geometry->radio_landscape->setChecked(params.orientation != BufferParams::ORIENTATION_PORTRAIT);
305         
306         geometry->length_width->setFromLengthStr(params.paperwidth);
307         geometry->length_height->setFromLengthStr(params.paperheight);
308         geometry->length_left->setFromLengthStr(params.leftmargin);
309         geometry->length_right->setFromLengthStr(params.rightmargin);
310         geometry->length_top->setFromLengthStr(params.topmargin);
311         geometry->length_bottom->setFromLengthStr(params.bottommargin);
312         geometry->length_headheight->setFromLengthStr(params.headheight);
313         geometry->length_headsep->setFromLengthStr(params.headsep);
314         geometry->length_footskip->setFromLengthStr(params.footskip);
315         
316         // language page
317
318         if (!setComboFromStr(language->combo_language, params.language->lang()))
319                 lyxerr[Debug::GUI] << "Couldn't set language " << params.language->lang() << endl;
320         
321         if (!setComboFromStr(language->combo_encoding, params.inputenc))
322                 lyxerr[Debug::GUI] << "Couldn't set encoding " << params.inputenc << endl;
323
324         switch (params.quotes_language) {
325                 case InsetQuotes::EnglishQ: item = 0; break;
326                 case InsetQuotes::SwedishQ: item = 2; break;
327                 case InsetQuotes::GermanQ: item = 4; break;
328                 case InsetQuotes::PolishQ: item = 6; break;
329                 case InsetQuotes::FrenchQ: item = 8; break;
330                 case InsetQuotes::DanishQ: item = 10; break;
331                 default:
332                         lyxerr[Debug::GUI] << "Unknown quote style " << int(params.quotes_language) << endl;
333         }
334
335         if (params.quotes_times == InsetQuotes::DoubleQ)
336                 item++;
337
338         language->combo_quotes->setCurrentItem(item);
339         
340         // extra page
341
342         if (!setComboFromStr(extra->combo_psdriver, params.graphicsDriver))
343                 lyxerr[Debug::GUI] << "Couldn't set psdriver " << params.graphicsDriver << endl;
344         
345         extra->check_amsmath->setChecked(params.use_amsmath);
346         extra->spin_sectiondepth->setValue(params.secnumdepth);
347         extra->spin_tocdepth->setValue(params.tocdepth);
348
349         string const place = params.float_placement;
350         int count = 0;
351         QComboBox * box;
352
353         extra->check_ignore->setChecked(false);
354         setComboFromStr(extra->combo_first, _("Not set"));
355         setComboFromStr(extra->combo_second, _("Not set"));
356         setComboFromStr(extra->combo_third, _("Not set"));
357         setComboFromStr(extra->combo_fourth, _("Not set"));
358
359         for (string::const_iterator iter = place.begin(); iter != place.end(); ++count, ++iter) {
360                 switch (count) {
361                         case 0: box = extra->combo_first; break;
362                         case 1: box = extra->combo_second; break;
363                         case 2: box = extra->combo_third; break;
364                         default: box = extra->combo_fourth; break;
365                 };
366
367                 if (*iter == '!') {
368                         extra->check_ignore->setChecked(true);
369                         continue;
370                 }
371
372                 switch (*iter) {
373                         case 'h': setComboFromStr(box, _("Here")); break;
374                         case 'b': setComboFromStr(box, _("Bottom of page")); break;
375                         case 't': setComboFromStr(box, _("Top of page")); break;
376                         case 'p': setComboFromStr(box, _("Separate page")); break;
377                         default:
378                                 lyxerr[Debug::GUI] << "Unknown float placement \'" << *iter << endl;
379                 }
380         }
381
382         /* FIXME: bullets ! */
383  
384         setUpdatesEnabled(true);
385         update();
386 }
387
388
389 bool DocDialog::updateParams(BufferParams & params)
390 {
391         bool redo = false;
392
393         params.fonts = string(settings->combo_font->currentText());
394         LyXTextClass const & tclass = textclasslist.TextClass(params.textclass);
395         params.fontsize = token(tclass.opt_fontsize(), '|', settings->combo_fontsize->currentItem() - 1);
396         params.pagestyle = token(tclass.opt_pagestyle(), '|', settings->combo_pagestyle->currentItem() - 1);
397
398         // set and update class
399
400         unsigned int const new_class = settings->combo_docclass->currentItem();
401
402         if (new_class != params.textclass) {
403                 if (!form_->changeClass(params, new_class)) {
404                         // FIXME: error msg
405                         // restore old class
406                         if (!setComboFromStr(settings->combo_docclass, textclasslist.DescOfClass(params.textclass)))
407                                 lyxerr[Debug::GUI] << "Couldn't set docclass " << textclasslist.DescOfClass(params.textclass) << endl;
408                 } else
409                         redo = true;
410         }
411
412         BufferParams::PARSEP tmpsep = params.paragraph_separation;
413
414         (settings->check_addspace->isChecked())
415                 ? params.paragraph_separation = BufferParams::PARSEP_SKIP
416                 : params.paragraph_separation = BufferParams::PARSEP_INDENT;
417                 
418         redo = (tmpsep != params.paragraph_separation) || redo;
419
420         // the skip spacing
421
422         VSpace tmpskip;
423
424         switch (settings->combo_paraspacing->currentItem()) {
425                 case 0: tmpskip = VSpace(VSpace::SMALLSKIP); break;
426                 case 1: tmpskip = VSpace(VSpace::MEDSKIP); break;
427                 case 2: tmpskip = VSpace(VSpace::BIGSKIP); break;
428                 default:
429                         lyxerr[Debug::GUI] << "Unknown skip spacing " <<
430                                 settings->combo_paraspacing->currentItem() << endl;
431                         break;
432                 case 3:
433                         string const val = settings->length_paraspacing->getLengthStr()
434                                 + "+" + settings->length_paraspacingstretch->getLengthStr()
435                                 + "-" + settings->length_paraspacingshrink->getLengthStr();
436                         lyxerr[Debug::GUI] << "Read para spacing of \"" << val << "\"" << endl;
437                         LyXGlueLength length(0.0, LyXLength::PT);
438                         isValidGlueLength(val, &length);
439                         tmpskip = VSpace(length);
440                         break;
441         }
442
443         if (!(tmpskip == params.getDefSkip())) {
444                 redo = true;
445                 params.setDefSkip(tmpskip);
446         }
447
448         // columns and sides
449
450         (settings->check_sides->isChecked())
451                 ? params.sides = LyXTextClass::TwoSides
452                 : params.sides = LyXTextClass::OneSide;
453
454         (settings->check_columns->isChecked())
455                 ? params.columns = 2
456                 : params.columns = 1;
457
458         // line spacing
459
460         Spacing tmpspacing = params.spacing;
461
462         switch (settings->combo_linespacing->currentItem()) {
463                 case 0: params.spacing.set(Spacing::Single); break;
464                 case 1: params.spacing.set(Spacing::Onehalf); break;
465                 case 2: params.spacing.set(Spacing::Double); break;
466                 case 3:
467                         params.spacing.set(Spacing::Other, settings->line_linespacing->text());
468                         break;
469                 default:
470                         lyxerr[Debug::GUI] << "Unknown line spacing " <<
471                                 settings->combo_linespacing->currentItem();
472         }
473
474         if (tmpspacing != params.spacing)
475                 redo = true;
476
477         // extra options
478
479         params.options = settings->line_extraoptions->text();
480                 
481         
482         // paper package and margin package
483         params.papersize2 = static_cast<char>(geometry->combo_papersize->currentItem());
484         params.paperpackage = static_cast<char>(geometry->combo_margins->currentItem());
485         if (geometry->radio_landscape->isChecked())
486                 params.orientation = BufferParams::ORIENTATION_LANDSCAPE;
487         else
488                 params.orientation = BufferParams::ORIENTATION_PORTRAIT;
489
490         params.paperwidth = geometry->length_width->getLengthStr();
491         params.paperheight = geometry->length_height->getLengthStr();
492         params.leftmargin = geometry->length_left->getLengthStr();
493         params.rightmargin = geometry->length_right->getLengthStr();
494         params.topmargin = geometry->length_top->getLengthStr();
495         params.bottommargin = geometry->length_bottom->getLengthStr();
496         params.headheight = geometry->length_headheight->getLengthStr();
497         params.headsep = geometry->length_headsep->getLengthStr();
498         params.footskip = geometry->length_footskip->getLengthStr();
499         
500         /* FIXME: is geometry required for headheight,sep,footskip ? */
501         params.use_geometry =
502                 (params.paperwidth != "" ||
503                 params.paperheight != "" ||
504                 params.leftmargin != "" ||
505                 params.rightmargin != "" ||
506                 params.topmargin != "" ||
507                 params.bottommargin != "");
508
509         // language dialog
510
511         InsetQuotes::quote_language lga = InsetQuotes::EnglishQ;
512
513         switch (language->combo_quotes->currentItem()) {
514                 case 0: case 2: case 4: case 6: case 8: case 10:
515                         params.quotes_times = InsetQuotes::SingleQ;
516                         break;
517                 default:
518                         params.quotes_times = InsetQuotes::DoubleQ;
519         }
520
521         switch (language->combo_quotes->currentItem()) {
522                 case 0: case 1: lga = InsetQuotes::EnglishQ; break;
523                 case 2: case 3: lga = InsetQuotes::SwedishQ; break;
524                 case 4: case 5: lga = InsetQuotes::GermanQ; break;
525                 case 6: case 7: lga = InsetQuotes::PolishQ; break;
526                 case 8: case 9: lga = InsetQuotes::FrenchQ; break;
527                 case 10: case 11: lga = InsetQuotes::DanishQ; break;
528                 default:
529                         lyxerr[Debug::GUI] << "unknown quotes style" <<
530                                 language->combo_quotes->currentItem() << endl;
531         }
532
533         params.quotes_language = lga;
534
535         /* wow, tongue twister */
536         Language const * old_language = params.language;
537         Language const * new_language = languages.getLanguage(language->combo_language->currentText());
538
539         /* FIXME */
540         if (old_language != new_language
541                 && old_language->RightToLeft() == new_language->RightToLeft()
542                 /*&& !lv_->buffer()->isMultiLingual()*/) {
543                 //lv_->buffer()->ChangeLanguage(old_language, new_language);
544         }
545         
546         redo = (old_language != new_language) || redo;
547         params.language = new_language;
548
549         params.inputenc = language->combo_encoding->currentText();
550
551         // extra dialog
552
553         params.graphicsDriver = extra->combo_psdriver->currentText();
554         params.use_amsmath = extra->check_amsmath->isChecked();
555         
556         if (extra->spin_sectiondepth->value() != params.secnumdepth) {
557                 redo = true;
558                 params.secnumdepth = extra->spin_sectiondepth->value();
559         }
560
561         params.tocdepth = extra->spin_tocdepth->value();
562
563         string place;
564
565         place += placementString(extra->combo_first);
566         place += placementString(extra->combo_second);
567         place += placementString(extra->combo_third);
568         place += placementString(extra->combo_fourth);
569         params.float_placement = place;
570
571         /* FIXME: bullets */
572         
573         return redo;
574 }
575
576 string DocDialog::placementString(QComboBox * box) const
577 {
578         if (!compare(box->currentText(), _("Here")))
579                 return "h";
580         if (!compare(box->currentText(), _("Bottom of page")))
581                 return "b";
582         if (!compare(box->currentText(), _("Top of page")))
583                 return "t";
584         if (!compare(box->currentText(), _("Separate page")))
585                 return "p";
586         return "";
587 }
588
589 void DocDialog::linespacingChanged(const char * sel)
590 {
591         bool const custom = !compare(sel, _("custom"));
592
593         settings->line_linespacing->setEnabled(custom);
594 }
595
596
597 void DocDialog::paraspacingChanged(const char * sel)
598 {
599         bool const custom = !compare(sel, _("custom"));
600         settings->length_paraspacing->setEnabled(custom);
601         settings->length_paraspacingstretch->setEnabled(custom);
602         settings->length_paraspacingshrink->setEnabled(custom);
603 }
604
605 void DocDialog::addspaceChanged(bool on)
606 {
607         settings->combo_paraspacing->setEnabled(on);
608         on = (on && !compare(settings->combo_paraspacing->currentText(),
609                              _("custom")));
610         settings->length_paraspacing->setEnabled(on);
611         settings->length_paraspacingstretch->setEnabled(on);
612         settings->length_paraspacingshrink->setEnabled(on);
613 }