4 * John Levon, moz@compsoc.man.ac.uk
7 /***************************************************************************
9 * This program is free software; you can redistribute it and/or modify *
10 * it under the terms of the GNU General Public License as published by *
11 * the Free Software Foundation; either version 2 of the License, or *
12 * (at your option) any later version. *
14 ***************************************************************************/
16 #include "support/lstrings.h"
24 * This is the top-level dialog which contains the buttons, and the tab bar for adding
25 * the qtarch-designed child widget dialogs.
27 * FIXME: QTabDialog is not good for three reasons -
28 * 1) OK/Apply don't emit different signals. Why didn't the Qt people consider we might
29 * care about things other than visibility of the dialog *sigh*
30 * 2) the default button placement goes against the style used in the other dialogs
31 * 3) we don't seem to be able to disable the OK/Apply buttons
35 * In fact I'm not at all sure that this design is a good one from the user's point of view, but I
36 * don't really have a better solution at the moment :/
39 ParaDialog::ParaDialog(FormParagraph *form, QWidget *parent, const char *name, bool, WFlags)
40 : QTabDialog(parent,name,false), form_(form)
44 generalpage = new ParaGeneralDialog(this, "generalpage");
45 extrapage = new ParaExtraDialog(this, "extrapage");
47 addTab(generalpage, _("&General"));
48 addTab(extrapage, _("&Extra"));
50 setOKButton(_("&OK"));
51 setApplyButton(_("&Apply"));
52 setDefaultButton(_("&Restore"));
53 setCancelButton(_("&Cancel"));
55 connect(this, SIGNAL(applyButtonPressed()), SLOT(apply_adaptor()));
56 connect(this, SIGNAL(defaultButtonPressed()), SLOT(restore()));
57 connect(this, SIGNAL(cancelButtonPressed()), SLOT(close_adaptor()));
60 ParaDialog::~ParaDialog()
64 void ParaDialog::restore()
66 // this will restore to the settings of the paragraph
70 void ParaDialog::closeEvent(QCloseEvent *e)
76 void ParaDialog::setReadOnly(bool readonly)
78 generalpage->alignment->setEnabled(!readonly);
79 generalpage->lineabove->setEnabled(!readonly);
80 generalpage->linebelow->setEnabled(!readonly);
81 generalpage->pagebreakabove->setEnabled(!readonly);
82 generalpage->pagebreakbelow->setEnabled(!readonly);
83 generalpage->noindent->setEnabled(!readonly);
84 generalpage->spaceabove->setEnabled(!readonly);
85 generalpage->spacebelow->setEnabled(!readonly);
86 generalpage->spaceabovevalue->setEnabled(!readonly);
87 generalpage->spacebelowvalue->setEnabled(!readonly);
88 generalpage->spaceabovevalueunits->setEnabled(!readonly);
89 generalpage->spacebelowvalueunits->setEnabled(!readonly);
90 generalpage->spaceaboveplus->setEnabled(!readonly);
91 generalpage->spacebelowplus->setEnabled(!readonly);
92 generalpage->spaceaboveplusunits->setEnabled(!readonly);
93 generalpage->spacebelowplusunits->setEnabled(!readonly);
94 generalpage->spaceaboveminus->setEnabled(!readonly);
95 generalpage->spacebelowminus->setEnabled(!readonly);
96 generalpage->spaceaboveminusunits->setEnabled(!readonly);
97 generalpage->spacebelowminusunits->setEnabled(!readonly);
98 generalpage->block->setEnabled(!readonly);
99 generalpage->left->setEnabled(!readonly);
100 generalpage->right->setEnabled(!readonly);
101 generalpage->center->setEnabled(!readonly);
102 generalpage->labelwidth->setEnabled(!readonly);
103 extrapage->specialalignment->setEnabled(!readonly);
104 extrapage->type->setEnabled(!readonly);
105 extrapage->widthvalue->setEnabled(!readonly);
106 extrapage->widthvalueunits->setEnabled(!readonly);
107 extrapage->hfillbetween->setEnabled(!readonly);
108 extrapage->startnewminipage->setEnabled(!readonly);
109 extrapage->top->setEnabled(!readonly);
110 extrapage->middle->setEnabled(!readonly);
111 extrapage->bottom->setEnabled(!readonly);
112 // FIXME: can't set buttons readonly
115 void ParaDialog::setLabelWidth(const char *text)
117 // FIXME: should be cleverer here
118 if (!strcmp(_("Senseless with this layout!"),text)) {
119 generalpage->labelwidth->setText("");
120 generalpage->labelwidth->setEnabled(false);
122 generalpage->labelwidth->setText(text);
123 generalpage->labelwidth->setEnabled(true);
127 void ParaDialog::setAlign(int type)
130 case LYX_ALIGN_RIGHT:
131 generalpage->right->setChecked(true);
134 generalpage->left->setChecked(true);
136 case LYX_ALIGN_CENTER:
137 generalpage->center->setChecked(true);
140 generalpage->block->setChecked(true);
145 void ParaDialog::setChecks(bool labove, bool lbelow, bool pabove, bool pbelow, bool noindent)
147 generalpage->lineabove->setChecked(labove);
148 generalpage->linebelow->setChecked(lbelow);
149 generalpage->pagebreakabove->setChecked(pabove);
150 generalpage->pagebreakbelow->setChecked(pbelow);
151 generalpage->noindent->setChecked(noindent);
154 void ParaDialog::setSpace(VSpace::vspace_kind kindabove, VSpace::vspace_kind kindbelow, bool keepabove, bool keepbelow)
158 generalpage->spaceabove->setCurrentItem(0);
160 case VSpace::DEFSKIP:
161 generalpage->spaceabove->setCurrentItem(1);
163 case VSpace::SMALLSKIP:
164 generalpage->spaceabove->setCurrentItem(2);
166 case VSpace::MEDSKIP:
167 generalpage->spaceabove->setCurrentItem(3);
169 case VSpace::BIGSKIP:
170 generalpage->spaceabove->setCurrentItem(4);
173 generalpage->spaceabove->setCurrentItem(5);
176 generalpage->spaceabove->setCurrentItem(6);
181 generalpage->spacebelow->setCurrentItem(0);
183 case VSpace::DEFSKIP:
184 generalpage->spacebelow->setCurrentItem(1);
186 case VSpace::SMALLSKIP:
187 generalpage->spacebelow->setCurrentItem(2);
189 case VSpace::MEDSKIP:
190 generalpage->spacebelow->setCurrentItem(3);
192 case VSpace::BIGSKIP:
193 generalpage->spacebelow->setCurrentItem(4);
196 generalpage->spacebelow->setCurrentItem(5);
199 generalpage->spacebelow->setCurrentItem(6);
203 generalpage->spaceabovevalue->setEnabled(kindabove == VSpace::LENGTH);
204 generalpage->spaceabovevalueunits->setEnabled(kindabove == VSpace::LENGTH);
205 generalpage->spaceaboveplus->setEnabled(kindabove == VSpace::LENGTH);
206 generalpage->spaceaboveplusunits->setEnabled(kindabove == VSpace::LENGTH);
207 generalpage->spaceaboveminus->setEnabled(kindabove == VSpace::LENGTH);
208 generalpage->spaceaboveminusunits->setEnabled(kindabove == VSpace::LENGTH);
209 generalpage->spacebelowvalue->setEnabled(kindbelow == VSpace::LENGTH);
210 generalpage->spacebelowvalueunits->setEnabled(kindbelow == VSpace::LENGTH);
211 generalpage->spacebelowplus->setEnabled(kindbelow == VSpace::LENGTH);
212 generalpage->spacebelowplusunits->setEnabled(kindbelow == VSpace::LENGTH);
213 generalpage->spacebelowminus->setEnabled(kindbelow == VSpace::LENGTH);
214 generalpage->spacebelowminusunits->setEnabled(kindbelow == VSpace::LENGTH);
216 // FIXME: I admit I don't know what keep does, or what is best to do with it ...
219 void ParaDialog::setUnits(QComboBox *box, LyXLength::UNIT unit)
222 case LyXLength::CM: box->setCurrentItem(0); break;
223 case LyXLength::IN: box->setCurrentItem(1); break;
224 case LyXLength::PT: box->setCurrentItem(2); break;
225 case LyXLength::MM: box->setCurrentItem(3); break;
226 case LyXLength::PC: box->setCurrentItem(4); break;
227 case LyXLength::EX: box->setCurrentItem(5); break;
228 case LyXLength::EM: box->setCurrentItem(6); break;
229 case LyXLength::SP: box->setCurrentItem(7); break;
230 case LyXLength::BP: box->setCurrentItem(8); break;
231 case LyXLength::DD: box->setCurrentItem(9); break;
232 case LyXLength::CC: box->setCurrentItem(10); break;
233 case LyXLength::MU: box->setCurrentItem(11); break;
234 case LyXLength::UNIT_NONE: box->setCurrentItem(0); break;
236 lyxerr[Debug::GUI] << "Unknown unit " << long(unit) << endl;
240 void ParaDialog::setAboveLength(float val, float plus, float minus,
241 LyXLength::UNIT vunit, LyXLength::UNIT punit, LyXLength::UNIT munit)
243 if (vunit==LyXLength::UNIT_NONE) {
244 generalpage->spaceabovevalue->setText("");
245 generalpage->spaceaboveplus->setText("");
246 generalpage->spaceaboveminus->setText("");
247 setUnits(generalpage->spaceabovevalueunits, LyXLength::CM);
248 setUnits(generalpage->spaceaboveplusunits, LyXLength::CM);
249 setUnits(generalpage->spaceaboveminusunits, LyXLength::CM);
253 generalpage->spaceabovevalue->setText(tostr(val).c_str());
254 generalpage->spaceaboveplus->setText(tostr(plus).c_str());
255 generalpage->spaceaboveminus->setText(tostr(minus).c_str());
256 setUnits(generalpage->spaceabovevalueunits, vunit);
257 setUnits(generalpage->spaceaboveplusunits, punit);
258 setUnits(generalpage->spaceaboveminusunits, munit);
261 void ParaDialog::setBelowLength(float val, float plus, float minus,
262 LyXLength::UNIT vunit, LyXLength::UNIT punit, LyXLength::UNIT munit)
264 if (vunit==LyXLength::UNIT_NONE) {
265 generalpage->spacebelowvalue->setText("");
266 generalpage->spacebelowplus->setText("");
267 generalpage->spacebelowminus->setText("");
268 setUnits(generalpage->spacebelowvalueunits, LyXLength::CM);
269 setUnits(generalpage->spacebelowplusunits, LyXLength::CM);
270 setUnits(generalpage->spacebelowminusunits, LyXLength::CM);
274 generalpage->spacebelowvalue->setText(tostr(val).c_str());
275 generalpage->spacebelowplus->setText(tostr(plus).c_str());
276 generalpage->spacebelowminus->setText(tostr(minus).c_str());
277 setUnits(generalpage->spacebelowvalueunits, vunit);
278 setUnits(generalpage->spacebelowplusunits, punit);
279 setUnits(generalpage->spacebelowminusunits, munit);
282 void ParaDialog::setExtra(float widthval, LyXLength::UNIT units, const string percent, int align,
283 bool hfill, bool startminipage, LyXParagraph::PEXTRA_TYPE type)
286 if (type!=LyXParagraph::PEXTRA_NONE) {
287 lyxerr[Debug::GUI] << "percent : $" << percent << "$ widthval " << widthval << " unit " << long(units) << endl;
289 extrapage->widthvalue->setText(percent.c_str());
290 extrapage->widthvalueunits->setCurrentItem(12);
292 extrapage->widthvalue->setText(tostr(widthval).c_str());
293 setUnits(extrapage->widthvalueunits,units);
296 extrapage->widthvalue->setText("");
299 case LyXParagraph::MINIPAGE_ALIGN_TOP:
300 extrapage->top->setChecked(true);
302 case LyXParagraph::MINIPAGE_ALIGN_MIDDLE:
303 extrapage->middle->setChecked(true);
305 case LyXParagraph::MINIPAGE_ALIGN_BOTTOM:
306 extrapage->bottom->setChecked(true);
310 extrapage->hfillbetween->setChecked(hfill);
311 extrapage->startnewminipage->setChecked(startminipage);
313 extrapage->specialalignment->setEnabled(type==LyXParagraph::PEXTRA_MINIPAGE);
314 extrapage->top->setEnabled(type==LyXParagraph::PEXTRA_MINIPAGE);
315 extrapage->middle->setEnabled(type==LyXParagraph::PEXTRA_MINIPAGE);
316 extrapage->bottom->setEnabled(type==LyXParagraph::PEXTRA_MINIPAGE);
317 extrapage->widthvalue->setEnabled(type!=LyXParagraph::PEXTRA_NONE);
318 extrapage->widthvalueunits->setEnabled(type!=LyXParagraph::PEXTRA_NONE);
319 extrapage->hfillbetween->setEnabled(type==LyXParagraph::PEXTRA_MINIPAGE);
320 extrapage->startnewminipage->setEnabled(type==LyXParagraph::PEXTRA_MINIPAGE);
323 case LyXParagraph::PEXTRA_NONE:
324 extrapage->type->setCurrentItem(0);
326 case LyXParagraph::PEXTRA_INDENT:
327 extrapage->type->setCurrentItem(1);
329 case LyXParagraph::PEXTRA_MINIPAGE:
330 extrapage->type->setCurrentItem(2);
332 case LyXParagraph::PEXTRA_FLOATFLT:
333 extrapage->type->setCurrentItem(3);
338 LyXLength::UNIT ParaDialog::getUnits(QComboBox *box) const
340 switch (box->currentItem()) {
341 case 0: return LyXLength::CM;
342 case 1: return LyXLength::IN;
343 case 2: return LyXLength::PT;
344 case 3: return LyXLength::MM;
345 case 4: return LyXLength::PC;
346 case 5: return LyXLength::EX;
347 case 6: return LyXLength::EM;
348 case 7: return LyXLength::SP;
349 case 8: return LyXLength::BP;
350 case 9: return LyXLength::DD;
351 case 10: return LyXLength::CC;
352 case 11: return LyXLength::MU;
354 lyxerr[Debug::GUI] << "Unknown combo choice " << box->currentItem() << endl;
356 return LyXLength::UNIT_NONE;
359 LyXGlueLength ParaDialog::getAboveLength() const
362 strToDbl(generalpage->spaceabovevalue->text()),
363 getUnits(generalpage->spaceabovevalueunits),
364 strToDbl(generalpage->spaceaboveplus->text()),
365 getUnits(generalpage->spaceaboveplusunits),
366 strToDbl(generalpage->spaceaboveminus->text()),
367 getUnits(generalpage->spaceaboveminusunits)
373 LyXGlueLength ParaDialog::getBelowLength() const
376 strToDbl(generalpage->spacebelowvalue->text()),
377 getUnits(generalpage->spacebelowvalueunits),
378 strToDbl(generalpage->spacebelowplus->text()),
379 getUnits(generalpage->spacebelowplusunits),
380 strToDbl(generalpage->spacebelowminus->text()),
381 getUnits(generalpage->spacebelowminusunits)
387 LyXLength ParaDialog::getExtraWidth() const
390 if (extrapage->widthvalueunits->currentItem()!=12) {
391 LyXLength len(strToDbl(extrapage->widthvalue->text()), getUnits(extrapage->widthvalueunits));
394 LyXLength len(0.0, LyXLength::UNIT_NONE);
399 string ParaDialog::getExtraWidthPercent() const
401 double val = strToDbl(extrapage->widthvalue->text());