]> git.lyx.org Git - features.git/blob - src/frontends/kde/paradlg.C
The KDE monster patch from John
[features.git] / src / frontends / kde / paradlg.C
1 /*
2  * paradlg.C
3  * (C) 2000 LyX Team
4  * John Levon, moz@compsoc.man.ac.uk
5  */
6
7 /***************************************************************************
8  *                                                                         *
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.                                   *
13  *                                                                         *
14  ***************************************************************************/
15
16 #include "support/lstrings.h" 
17
18 #include "paradlg.h"
19
20 #include "gettext.h"
21 #include "debug.h"
22
23 /*
24  * This is the top-level dialog which contains the buttons, and the tab bar for adding
25  * the qtarch-designed child widget dialogs.
26  *
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
32  *
33  * So this must go
34  *
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 :/
37  */
38
39 ParaDialog::ParaDialog(FormParagraph *form, QWidget *parent, const char *name, bool, WFlags)
40         : QTabDialog(parent,name,false), form_(form)
41 {
42         setCaption(name);
43
44         generalpage = new ParaGeneralDialog(this, "generalpage");
45         extrapage = new ParaExtraDialog(this, "extrapage");
46         
47         addTab(generalpage, _("&General"));
48         addTab(extrapage, _("&Extra"));
49
50         setOKButton(_("&OK"));
51         setApplyButton(_("&Apply"));
52         setDefaultButton(_("&Restore"));
53         setCancelButton(_("&Cancel")); 
54
55         connect(this, SIGNAL(applyButtonPressed()), SLOT(apply_adaptor()));
56         connect(this, SIGNAL(defaultButtonPressed()), SLOT(restore()));
57         connect(this, SIGNAL(cancelButtonPressed()), SLOT(close_adaptor()));
58 }
59
60 ParaDialog::~ParaDialog()
61 {
62 }
63
64 void ParaDialog::restore()
65 {
66         // this will restore to the settings of the paragraph
67         form_->update();
68 }
69
70 void ParaDialog::closeEvent(QCloseEvent *e)
71 {
72         form_->close();
73         e->accept();
74 }
75
76 void ParaDialog::setReadOnly(bool readonly)
77 {
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
113 }
114
115 void ParaDialog::setLabelWidth(const char *text)
116 {
117         // FIXME: should be cleverer here
118         if (!strcmp(_("Senseless with this layout!"),text)) {
119                 generalpage->labelwidth->setText("");
120                 generalpage->labelwidth->setEnabled(false);
121         } else {
122                 generalpage->labelwidth->setText(text);
123                 generalpage->labelwidth->setEnabled(true);
124         }
125 }
126
127 void ParaDialog::setAlign(int type)
128 {
129         switch (type) {
130                 case LYX_ALIGN_RIGHT:
131                         generalpage->right->setChecked(true);
132                         break;
133                 case LYX_ALIGN_LEFT:
134                         generalpage->left->setChecked(true);
135                         break;
136                 case LYX_ALIGN_CENTER:
137                         generalpage->center->setChecked(true);
138                         break;
139                 default: // ewww
140                         generalpage->block->setChecked(true);
141                         break;
142         }
143 }
144
145 void ParaDialog::setChecks(bool labove, bool lbelow, bool pabove, bool pbelow, bool noindent)
146 {
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); 
152 }
153
154 void ParaDialog::setSpace(VSpace::vspace_kind kindabove, VSpace::vspace_kind kindbelow, bool keepabove, bool keepbelow)
155 {
156         switch (kindabove) {
157                 case VSpace::NONE:
158                         generalpage->spaceabove->setCurrentItem(0);
159                         break;
160                 case VSpace::DEFSKIP:
161                         generalpage->spaceabove->setCurrentItem(1);
162                         break;
163                 case VSpace::SMALLSKIP:
164                         generalpage->spaceabove->setCurrentItem(2);
165                         break;
166                 case VSpace::MEDSKIP:
167                         generalpage->spaceabove->setCurrentItem(3);
168                         break;
169                 case VSpace::BIGSKIP:
170                         generalpage->spaceabove->setCurrentItem(4);
171                         break;
172                 case VSpace::VFILL:
173                         generalpage->spaceabove->setCurrentItem(5);
174                         break;
175                 case VSpace::LENGTH:
176                         generalpage->spaceabove->setCurrentItem(6);
177                         break;
178         }
179         switch (kindbelow) {
180                 case VSpace::NONE:
181                         generalpage->spacebelow->setCurrentItem(0);
182                         break;
183                 case VSpace::DEFSKIP:
184                         generalpage->spacebelow->setCurrentItem(1);
185                         break;
186                 case VSpace::SMALLSKIP:
187                         generalpage->spacebelow->setCurrentItem(2);
188                         break;
189                 case VSpace::MEDSKIP:
190                         generalpage->spacebelow->setCurrentItem(3);
191                         break;
192                 case VSpace::BIGSKIP:
193                         generalpage->spacebelow->setCurrentItem(4);
194                         break;
195                 case VSpace::VFILL:
196                         generalpage->spacebelow->setCurrentItem(5);
197                         break;
198                 case VSpace::LENGTH:
199                         generalpage->spacebelow->setCurrentItem(6);
200                         break;
201         }
202
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);
215
216         // FIXME: I admit I don't know what keep does, or what is best to do with it ...
217 }
218
219 void ParaDialog::setUnits(QComboBox *box, LyXLength::UNIT unit)
220 {
221         switch (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;
235                 default:
236                         lyxerr[Debug::GUI] << "Unknown unit " << long(unit) << endl;
237         }
238 }
239
240 void ParaDialog::setAboveLength(float val, float plus, float minus, 
241         LyXLength::UNIT vunit, LyXLength::UNIT punit, LyXLength::UNIT munit)
242 {
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);
250                 return;
251         }
252
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);
259 }
260
261 void ParaDialog::setBelowLength(float val, float plus, float minus, 
262         LyXLength::UNIT vunit, LyXLength::UNIT punit, LyXLength::UNIT munit)
263 {
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);
271                 return;
272         }
273
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); 
280 }
281
282 void ParaDialog::setExtra(float widthval, LyXLength::UNIT units, const string percent, int align, 
283         bool hfill, bool startminipage, LyXParagraph::PEXTRA_TYPE type)
284 {
285
286         if (type!=LyXParagraph::PEXTRA_NONE) {
287                 lyxerr[Debug::GUI] << "percent : $" << percent << "$ widthval " << widthval << " unit " << long(units) << endl;
288                 if (percent!="") {
289                         extrapage->widthvalue->setText(percent.c_str());
290                         extrapage->widthvalueunits->setCurrentItem(12);
291                 } else {
292                         extrapage->widthvalue->setText(tostr(widthval).c_str());
293                         setUnits(extrapage->widthvalueunits,units);
294                 }
295         } else
296                 extrapage->widthvalue->setText("");
297
298         switch (align) {
299                 case LyXParagraph::MINIPAGE_ALIGN_TOP:
300                         extrapage->top->setChecked(true);
301                         break;
302                 case LyXParagraph::MINIPAGE_ALIGN_MIDDLE:
303                         extrapage->middle->setChecked(true);
304                         break;
305                 case LyXParagraph::MINIPAGE_ALIGN_BOTTOM:
306                         extrapage->bottom->setChecked(true);
307                         break;
308         }
309         
310         extrapage->hfillbetween->setChecked(hfill);
311         extrapage->startnewminipage->setChecked(startminipage);
312
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);
321
322         switch (type) {
323                 case LyXParagraph::PEXTRA_NONE:
324                         extrapage->type->setCurrentItem(0); 
325                         break;
326                 case LyXParagraph::PEXTRA_INDENT:
327                         extrapage->type->setCurrentItem(1); 
328                         break;
329                 case LyXParagraph::PEXTRA_MINIPAGE:
330                         extrapage->type->setCurrentItem(2); 
331                         break;
332                 case LyXParagraph::PEXTRA_FLOATFLT:
333                         extrapage->type->setCurrentItem(3); 
334                         break;
335         }
336 }
337
338 LyXLength::UNIT ParaDialog::getUnits(QComboBox *box) const
339 {
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;
353                 default:
354                         lyxerr[Debug::GUI] << "Unknown combo choice " << box->currentItem() << endl;
355         }
356         return LyXLength::UNIT_NONE;
357 }
358
359 LyXGlueLength ParaDialog::getAboveLength() const
360 {
361         LyXGlueLength len(
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)
368                 );
369         
370         return len;
371 }
372
373 LyXGlueLength ParaDialog::getBelowLength() const
374 {
375         LyXGlueLength len(
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)
382                 );
383         
384         return len;
385 }
386
387 LyXLength ParaDialog::getExtraWidth() const
388 {
389
390         if (extrapage->widthvalueunits->currentItem()!=12) {
391                 LyXLength len(strToDbl(extrapage->widthvalue->text()), getUnits(extrapage->widthvalueunits));
392                 return len;
393         } else {
394                 LyXLength len(0.0, LyXLength::UNIT_NONE);
395                 return len;
396         }
397 }
398
399 string ParaDialog::getExtraWidthPercent() const
400 {
401         double val = strToDbl(extrapage->widthvalue->text()); 
402         if (val > 100.0) 
403                 val = 100.0;
404         if (val < 0.0)
405                 val = 0.0;
406         return tostr(val);
407 }