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