]> git.lyx.org Git - lyx.git/blob - src/frontends/qt2/QParagraphDialog.C
some more random changes, added Timeout (make clean if LyX crashes !!)
[lyx.git] / src / frontends / qt2 / QParagraphDialog.C
1 /**
2  * \file QParagraphDialog.C
3  * Copyright 2001 LyX Team
4  * see the file COPYING
5  *
6  * \author John Levon, moz@compsoc.man.ac.uk
7  * \author Edwin Leuven, leuven@fee.uva.nl
8  */
9
10 #include <config.h>
11 #include <gettext.h>
12 #include <string>
13
14 #include "QParagraphDialog.h"
15 #include "QParagraph.h"
16 #include "support/lstrings.h" 
17 #include "debug.h"
18
19 #include <qlineedit.h>
20 #include <qcombobox.h>
21 #include <qcheckbox.h>
22 #include <qpushbutton.h>
23 #include <qtabwidget.h>
24 #include <qlabel.h>
25 #include <qgroupbox.h>
26
27 using std::endl;
28
29 QParagraphDialog::QParagraphDialog(QParagraph * form, QWidget * parent, const char * name, bool modal, WFlags fl)
30         : QParagraphDialogBase(parent, name, modal, fl), 
31         form_(form)
32 {
33         setCaption(name);
34 }
35
36
37 QParagraphDialog::~QParagraphDialog()
38 {
39 }
40
41
42 void QParagraphDialog::setReadOnly(bool readonly)
43 {
44         TabsParagraph->setEnabled(!readonly);
45         okPB->setEnabled(!readonly);
46         applyPB->setEnabled(!readonly);
47         defaultsPB->setEnabled(!readonly);
48         cancelPB->setText(readonly ? _("&Close") : _("&Cancel"));
49 }
50
51
52 void QParagraphDialog::setLabelWidth(const char *text)
53 {
54         // FIXME: should be cleverer here
55         if (!strcmp(_("Senseless with this layout!"),text)) {
56                 listOptions->setEnabled(false);
57                 labelWidth->setText("");
58         } else {
59                 listOptions->setEnabled(true);
60                 labelWidth->setText(text);
61         }
62 }
63
64
65 void QParagraphDialog::setAlign(int type)
66 {
67         int item=0;
68         switch (type) {
69                 case LYX_ALIGN_BLOCK : item=0; break;
70                 case LYX_ALIGN_LEFT : item=1; break;
71                 case LYX_ALIGN_RIGHT : item=2; break;
72                 case LYX_ALIGN_CENTER : item=3; break;
73                 default:
74                         item=0;
75         }
76         alignment->setCurrentItem(item);
77 }
78
79
80 void QParagraphDialog::setChecks(bool labove, bool lbelow, bool pabove, bool pbelow, bool noindent)
81 {
82         lineAbove->setChecked(labove);
83         lineBelow->setChecked(lbelow);
84         pagebreakAbove->setChecked(pabove);
85         pagebreakBelow->setChecked(pbelow);
86         noIndent->setChecked(noindent);
87 }
88
89
90 void QParagraphDialog::setSpace(VSpace::vspace_kind kindabove, VSpace::vspace_kind kindbelow, bool keepabove, bool keepbelow)
91 {
92         int item=0;
93         
94         switch (kindabove) {
95                 case VSpace::NONE: item = 0; break;
96                 case VSpace::DEFSKIP: item = 1; break;
97                 case VSpace::SMALLSKIP: item = 2; break;
98                 case VSpace::MEDSKIP: item = 3; break;
99                 case VSpace::BIGSKIP: item = 4; break;
100                 case VSpace::VFILL: item = 5; break;
101                 case VSpace::LENGTH: item = 6; break;
102         }
103         spacingAbove->setCurrentItem(item);
104         
105         switch (kindbelow) {
106                 case VSpace::NONE: item = 0; break;
107                 case VSpace::DEFSKIP: item = 1; break;
108                 case VSpace::SMALLSKIP: item = 2; break;
109                 case VSpace::MEDSKIP: item = 3; break;
110                 case VSpace::BIGSKIP: item = 4; break;
111                 case VSpace::VFILL: item = 5; break;
112                 case VSpace::LENGTH: item = 6; break;
113         }
114         spacingBelow->setCurrentItem(item);
115         
116         spacingAboveValue->setEnabled(kindabove == VSpace::LENGTH);
117         spacingAbovePlus->setEnabled(kindabove == VSpace::LENGTH);
118         spacingAboveMinus->setEnabled(kindabove == VSpace::LENGTH);
119         spacingBelowValue->setEnabled(kindbelow == VSpace::LENGTH);
120         spacingBelowPlus->setEnabled(kindbelow == VSpace::LENGTH);
121         spacingBelowMinus->setEnabled(kindbelow == VSpace::LENGTH);
122         
123         spacingAboveKeep->setChecked(keepabove);
124         spacingBelowKeep->setChecked(keepbelow);
125 }
126
127
128 void QParagraphDialog::setAboveLength(float val, float plus, float minus, 
129         LyXLength::UNIT vunit, LyXLength::UNIT punit, LyXLength::UNIT munit)
130 {
131         if (vunit==LyXLength::UNIT_NONE) {
132                 spacingAboveValue->setText("");
133                 spacingAbovePlus->setText("");
134                 spacingAboveMinus->setText("");
135         } else {
136                 spacingAboveValue->setText(tostr(val).c_str());
137                 spacingAbovePlus->setText(tostr(plus).c_str());
138                 spacingAboveMinus->setText(tostr(minus).c_str());
139         }
140         
141         spacingAboveValueUnit->setCurrentItem(getItem(vunit));
142         spacingAbovePlusUnit->setCurrentItem(getItem(punit));
143         spacingAboveMinusUnit->setCurrentItem(getItem(munit));
144
145 }
146
147
148 void QParagraphDialog::setBelowLength(float val, float plus, float minus, 
149         LyXLength::UNIT vunit, LyXLength::UNIT punit, LyXLength::UNIT munit)
150 {
151         if (vunit==LyXLength::UNIT_NONE) {
152                 spacingBelowValue->setText("");
153                 spacingBelowPlus->setText("");
154                 spacingBelowMinus->setText("");
155         } else {
156                 spacingBelowValue->setText(tostr(val).c_str());
157                 spacingBelowPlus->setText(tostr(plus).c_str());
158                 spacingBelowMinus->setText(tostr(minus).c_str());
159         }
160         
161         spacingBelowValueUnit->setCurrentItem(getItem(vunit));
162         spacingBelowPlusUnit->setCurrentItem(getItem(punit));
163         spacingBelowMinusUnit->setCurrentItem(getItem(munit));
164 }
165
166
167 void QParagraphDialog::setExtra(float widthval, LyXLength::UNIT units, const string percent, int align, 
168         bool hfill, bool startminipage, Paragraph::PEXTRA_TYPE type)
169 {
170         if (type!=Paragraph::PEXTRA_NONE) {
171                 lyxerr[Debug::GUI] << "percent : $" << percent << "$ widthval " << widthval << " unit " << long(units) << endl;
172                 if (percent != "") {
173                         extraWidth->setText(percent.c_str());
174                         extraUnit->setCurrentItem(11);
175                 } else {
176                         extraWidth->setText(tostr(widthval).c_str());
177                         extraUnit->setCurrentItem(getItem(units));
178                 }
179         } else
180                 extraWidth->setText("");
181         
182         switch (type) {
183                 case Paragraph::PEXTRA_NONE: 
184                         extraType->setCurrentItem(0); 
185                         break;
186                 case Paragraph::PEXTRA_MINIPAGE: 
187                         extraType->setCurrentItem(1); 
188                         enable_extraOptions(1); 
189                         enable_minipageOptions(1); 
190                         break;
191                 case Paragraph::PEXTRA_FLOATFLT: 
192                         extraType->setCurrentItem(2); 
193                         enable_extraOptions(2); 
194                         break;
195                 case Paragraph::PEXTRA_INDENT: 
196                         extraType->setCurrentItem(3); 
197                         enable_extraOptions(3); 
198                         break;
199         }
200         
201         switch (align) {
202                 case Paragraph::MINIPAGE_ALIGN_TOP: 
203                         minipageValign->setCurrentItem(0); 
204                         break;
205                 case Paragraph::MINIPAGE_ALIGN_MIDDLE:  
206                         minipageValign->setCurrentItem(1); 
207                         break;
208                 case Paragraph::MINIPAGE_ALIGN_BOTTOM:  
209                         minipageValign->setCurrentItem(2); 
210                         break;
211         }
212         
213         minipageHfill->setChecked(hfill);
214         minipageStart->setChecked(startminipage);
215 }
216
217
218 LyXGlueLength QParagraphDialog::getAboveLength() const
219 {
220         LyXGlueLength len(
221                 spacingAboveValue->text().toFloat(),
222                 getLyXLength( spacingAboveValueUnit->currentItem() ),
223                 spacingAbovePlus->text().toFloat(),
224                 getLyXLength( spacingAbovePlusUnit->currentItem() ),
225                 spacingAboveMinus->text().toFloat(),
226                 getLyXLength( spacingAboveMinusUnit->currentItem() )
227                 );
228         return len;
229 }
230
231  
232 LyXGlueLength QParagraphDialog::getBelowLength() const
233 {
234         LyXGlueLength len(
235                 spacingBelowValue->text().toFloat(),
236                 getLyXLength( spacingBelowValueUnit->currentItem() ),
237                 spacingBelowPlus->text().toFloat(),
238                 getLyXLength( spacingBelowPlusUnit->currentItem() ),
239                 spacingBelowMinus->text().toFloat(),
240                 getLyXLength( spacingBelowMinusUnit->currentItem() )
241                 );
242         return len;
243 }
244
245
246 LyXLength QParagraphDialog::getExtraWidth() const
247 {
248         if (extraUnit->currentItem()!=11) {
249                 LyXLength len( 
250                          (extraWidth->text()).toDouble(), 
251                          getLyXLength(extraUnit->currentItem())
252                          );
253                 return len;
254         } else {
255                 LyXLength len(0.0, LyXLength::UNIT_NONE);
256                 return len;
257         }
258 }
259
260  
261 string QParagraphDialog::getExtraWidthPercent() const
262 {
263         double val = (extraWidth->text()).toDouble();
264         if (val > 100.0)
265                 val = 100.0;
266         if (val < 0.0)
267                 val = 0.0;
268         return tostr(val);
269 }
270
271
272 const char * QParagraphDialog::getLabelWidth() const 
273 {
274         return labelWidth->text(); 
275 }
276
277
278 LyXAlignment QParagraphDialog::getAlign() const 
279 {
280         switch (alignment->currentItem()) {
281                 case 0: return LYX_ALIGN_BLOCK;
282                 case 1: return LYX_ALIGN_LEFT;
283                 case 2: return LYX_ALIGN_RIGHT;
284                 case 3: return LYX_ALIGN_CENTER;
285                 default: return LYX_ALIGN_CENTER;
286         }
287 }
288         
289         
290 bool QParagraphDialog::getAboveKeep() const 
291
292         return spacingAboveKeep->isChecked(); 
293 }
294
295         
296 bool QParagraphDialog::getBelowKeep() const 
297
298         return spacingBelowKeep->isChecked(); 
299 }
300
301         
302 bool QParagraphDialog::getLineAbove() const 
303
304         return lineAbove->isChecked(); 
305 }
306
307         
308 bool QParagraphDialog::getLineBelow() const 
309
310         return lineBelow->isChecked(); 
311 }
312
313         
314 bool QParagraphDialog::getPagebreakAbove() const 
315
316         return pagebreakAbove->isChecked(); 
317 }
318
319         
320 bool QParagraphDialog::getPagebreakBelow() const 
321 {
322         return pagebreakBelow->isChecked(); 
323 }
324
325         
326 bool QParagraphDialog::getNoIndent() const 
327 {
328         return noIndent->isChecked(); 
329 }
330
331         
332 VSpace::vspace_kind QParagraphDialog::getSpaceAboveKind() const 
333 {
334         return getSpaceKind(spacingAbove->currentItem());
335 }
336
337         
338 VSpace::vspace_kind QParagraphDialog::getSpaceBelowKind() const 
339 {
340         return getSpaceKind(spacingBelow->currentItem());
341 }
342
343
344 Paragraph::PEXTRA_TYPE QParagraphDialog::getExtraType() const 
345 {
346         switch (extraType->currentItem()) {
347                 case 0: return Paragraph::PEXTRA_NONE;
348                 case 1: return Paragraph::PEXTRA_MINIPAGE;
349                 case 2: return Paragraph::PEXTRA_FLOATFLT;
350                 case 3: return Paragraph::PEXTRA_INDENT;
351         }
352         return Paragraph::PEXTRA_NONE;
353 }
354
355         
356 Paragraph::MINIPAGE_ALIGNMENT QParagraphDialog::getExtraAlign() const 
357 {
358         switch (minipageValign->currentItem()) {
359                 case 0: return Paragraph::MINIPAGE_ALIGN_TOP;
360                 case 1: return Paragraph::MINIPAGE_ALIGN_MIDDLE;
361                 case 2: return Paragraph::MINIPAGE_ALIGN_BOTTOM;
362                 default: return Paragraph::MINIPAGE_ALIGN_BOTTOM;
363         }
364 }
365
366         
367 bool QParagraphDialog::getHfillBetween() const 
368 {
369         return minipageHfill->isChecked();
370 }
371
372
373 bool QParagraphDialog::getStartNewMinipage() const 
374 {
375         return minipageStart->isChecked();
376 }
377
378
379 VSpace::vspace_kind QParagraphDialog::getSpaceKind(int val) const 
380 {
381         switch (val) {
382                 case 0: return VSpace::NONE;
383                 case 1: return VSpace::DEFSKIP;
384                 case 2: return VSpace::SMALLSKIP;
385                 case 3: return VSpace::MEDSKIP;
386                 case 4: return VSpace::BIGSKIP;
387                 case 5: return VSpace::VFILL;
388                 case 6: return VSpace::LENGTH;
389                 default:
390                         lyxerr[Debug::GUI] << "Unknown kind combo entry " << val << std::endl;
391                 }
392         return VSpace::NONE;
393 }
394
395
396 LyXLength::UNIT QParagraphDialog::getLyXLength(int val) const 
397 {
398         switch (val) {
399                 case 0: return LyXLength::CM;
400                 case 1: return LyXLength::IN;
401                 case 2: return LyXLength::PT;
402                 case 3: return LyXLength::MM;
403                 case 4: return LyXLength::PC;
404                 case 5: return LyXLength::EX;
405                 case 6: return LyXLength::EM;
406                 case 7: return LyXLength::SP;
407                 case 8: return LyXLength::BP;
408                 case 9: return LyXLength::DD;
409                 case 10: return LyXLength::CC;
410                 default:
411                         lyxerr[Debug::GUI] << "Unknown kind combo entry " << val << std::endl;
412         }
413         return LyXLength::UNIT_NONE;
414 }
415
416         
417 int QParagraphDialog::getItem(LyXLength::UNIT unit) const 
418 {
419         int item=0;
420         switch (unit) {
421                 case LyXLength::CM: item = 0; break;
422                 case LyXLength::IN: item = 1; break;
423                 case LyXLength::PT: item = 2; break;
424                 case LyXLength::MM: item = 3; break;
425                 case LyXLength::PC: item = 4; break;
426                 case LyXLength::EX: item = 5; break;
427                 case LyXLength::EM: item = 6; break;
428                 case LyXLength::SP: item = 7; break;
429                 case LyXLength::BP: item = 8; break;
430                 case LyXLength::DD: item = 9; break;
431                 case LyXLength::CC: item = 10; break;
432                 case LyXLength::MU: item = 0; break;
433                 case LyXLength::UNIT_NONE: item = 0; break;
434                 default:
435                         lyxerr[Debug::GUI] << "Unknown unit " << long(unit) << endl;
436         }
437         return item;
438 }
439
440
441 void QParagraphDialog::enable_extraOptions(int item)
442 {
443         bool const enable = (item!=0);
444         extraWidth->setEnabled(enable);
445         extraWidthL->setEnabled(enable);
446         extraUnit->setEnabled(enable);
447         extraUnitL->setEnabled(enable);
448 }
449
450
451 void QParagraphDialog::enable_minipageOptions(int item)
452 {
453         minipageOptions->setEnabled( item==1 );
454 }
455
456
457 void QParagraphDialog::enable_spacingAbove(int item)
458 {
459         bool const enable = (item==6);
460         spacingAboveValue->setEnabled(enable);
461         spacingAbovePlus->setEnabled(enable);
462         spacingAboveMinus->setEnabled(enable);
463         spacingAboveValueUnit->setEnabled(enable);
464         spacingAbovePlusUnit->setEnabled(enable);
465         spacingAboveMinusUnit->setEnabled(enable);
466         spacingAboveUnitsL->setEnabled(enable);
467         bool const enablel = ( (item==6) || (item!=6 && spacingBelow->currentItem()==6) );
468         spacingValueL->setEnabled(enablel);
469         spacingPlusL->setEnabled(enablel);
470         spacingMinusL->setEnabled(enablel);
471 }
472
473
474 void QParagraphDialog::enable_spacingBelow(int item)
475 {
476         bool const enable = (item==6);
477         spacingBelowValue->setEnabled(enable);
478         spacingBelowPlus->setEnabled(enable);
479         spacingBelowMinus->setEnabled(enable);
480         spacingBelowValueUnit->setEnabled(enable);
481         spacingBelowPlusUnit->setEnabled(enable);
482         spacingBelowMinusUnit->setEnabled(enable);
483         spacingBelowUnitsL->setEnabled(enable);
484         bool const enablel = ( (item==6) || (item!=6 && spacingAbove->currentItem()==6) );
485         spacingValueL->setEnabled(enablel);
486         spacingPlusL->setEnabled(enablel);
487         spacingMinusL->setEnabled(enablel);
488 }
489
490
491 void QParagraphDialog::closeEvent(QCloseEvent * e)
492 {
493         form_->close();
494         e->accept();
495 }
496
497
498 void QParagraphDialog::apply_adaptor()
499 {
500         form_->apply();
501 }
502
503
504 void QParagraphDialog::cancel_adaptor()  
505 {
506         form_->close();
507         hide();
508 }
509
510
511 void QParagraphDialog::ok_adaptor()
512 {
513         apply_adaptor();
514         form_->close();
515         hide();
516 }
517
518
519 void QParagraphDialog::restore_adaptor()
520 {
521         form_->update();
522 }