1 /* This file is part of
2 * ======================================================
4 * LyX, The Document Processor
6 * Copyright 2000-2001 The LyX Team.
10 *======================================================*/
15 #pragma implementation
18 #include FORMS_H_LOCATION
20 #include "FormParagraph.h"
21 #include "form_paragraph.h"
23 #include "support/lstrings.h"
28 #include "xforms_helpers.h"
29 #include "BufferView.h"
31 #include "ParagraphParameters.h"
32 #include "input_validators.h"
34 using Liason::setMinibuffer;
38 FormParagraph::FormParagraph(LyXView * lv, Dialogs * d)
39 : FormBaseBD(lv, d, _("Paragraph Layout")), par_(0)
41 // let the dialog be shown
42 // This is a permanent connection so we won't bother
43 // storing a copy because we won't be disconnecting.
44 d->showParagraph.connect(slot(this, &FormParagraph::show));
48 void FormParagraph::connect()
50 cp_ = d_->updateParagraph
51 .connect(slot(this, &FormParagraph::changedParagraph));
52 FormBaseBD::connect();
56 void FormParagraph::disconnect()
59 FormBaseBD::disconnect();
63 Paragraph const * FormParagraph::getCurrentParagraph() const
67 if (lv_->view()->theLockingInset())
68 text = lv_->view()->theLockingInset()->getLyXText(lv_->view());
70 text = lv_->view()->text;
71 return text->cursor.par();
75 void FormParagraph::changedParagraph()
77 /// Record the paragraph
78 Paragraph const * const p = getCurrentParagraph();
79 if (p == 0 || p == par_)
82 // For now don't bother checking if the params are different,
83 // just activate the Apply button
88 void FormParagraph::redraw()
90 if( form() && form()->visible )
91 fl_redraw_form( form() );
95 FL_FORM * outer_form = fl_get_active_folder(dialog_->tabbed_folder);
96 if (outer_form && outer_form->visible)
97 fl_redraw_form( outer_form );
101 FL_FORM * FormParagraph::form() const
103 if (dialog_.get()) return dialog_->form;
108 void FormParagraph::build()
111 dialog_.reset(build_tabbed_paragraph());
113 // Manage the ok, apply, restore and cancel/close buttons
114 bc_.setOK(dialog_->button_ok);
115 bc_.setApply(dialog_->button_apply);
116 bc_.setCancel(dialog_->button_cancel);
117 bc_.setRestore(dialog_->button_restore);
119 // the general paragraph data form
120 general_.reset(build_paragraph_general());
122 fl_addto_choice(general_->choice_space_above,
123 _(" None | Defskip | Smallskip "
124 "| Medskip | Bigskip | VFill | Length "));
125 fl_addto_choice(general_->choice_space_below,
126 _(" None | Defskip | Smallskip "
127 "| Medskip | Bigskip | VFill | Length "));
129 fl_addto_choice(general_->choice_linespacing,
130 _(" Default | Single | OneHalf | Double | Other "));
132 fl_set_input_return(general_->input_space_above, FL_RETURN_CHANGED);
133 fl_set_input_return(general_->input_space_below, FL_RETURN_CHANGED);
134 fl_set_input_return(general_->input_labelwidth, FL_RETURN_CHANGED);
136 bc_.addReadOnly (general_->group_radio_alignment);
137 // bc_.addReadOnly (general_->radio_align_right);
138 // bc_.addReadOnly (general_->radio_align_left);
139 // bc_.addReadOnly (general_->radio_align_block);
140 // bc_.addReadOnly (general_->radio_align_center);
141 bc_.addReadOnly (general_->check_lines_top);
142 bc_.addReadOnly (general_->check_lines_bottom);
143 bc_.addReadOnly (general_->check_pagebreaks_top);
144 bc_.addReadOnly (general_->check_pagebreaks_bottom);
145 bc_.addReadOnly (general_->choice_space_above);
146 bc_.addReadOnly (general_->input_space_above);
147 bc_.addReadOnly (general_->check_space_above);
148 bc_.addReadOnly (general_->choice_space_below);
149 bc_.addReadOnly (general_->input_space_below);
150 bc_.addReadOnly (general_->check_space_below);
151 bc_.addReadOnly (general_->choice_linespacing);
152 bc_.addReadOnly (general_->input_linespacing);
153 bc_.addReadOnly (general_->check_noindent);
154 bc_.addReadOnly (general_->input_labelwidth);
156 fl_set_input_filter(general_->input_linespacing, fl_unsigned_float_filter);
158 // now make them fit together
159 fl_addto_tabfolder(dialog_->tabbed_folder,_("General"), general_->form);
163 void FormParagraph::apply()
165 if (!lv_->view()->available() || !dialog_.get())
170 lv_->view()->update(lv_->view()->text,
171 BufferView::SELECT | BufferView::FITCUR | BufferView::CHANGE);
172 lv_->buffer()->markDirty();
173 setMinibuffer(lv_, _("Paragraph layout set"));
177 void FormParagraph::update()
182 // Do this first; some objects may be de/activated subsequently.
183 bc_.readOnly(lv_->buffer()->isReadonly());
189 void FormParagraph::general_apply()
191 VSpace space_top, space_bottom;
193 string labelwidthstring;
196 // If a vspace kind is "Length" but there's no text in
197 // the input field, reset the kind to "None".
198 if ((fl_get_choice (general_->choice_space_above) == 7) &&
199 !*(fl_get_input (general_->input_space_above)))
201 fl_set_choice (general_->choice_space_above, 1);
203 if ((fl_get_choice (general_->choice_space_below) == 7) &&
204 !*(fl_get_input (general_->input_space_below)))
206 fl_set_choice (general_->choice_space_below, 1);
209 bool line_top = fl_get_button(general_->check_lines_top);
210 bool line_bottom = fl_get_button(general_->check_lines_bottom);
211 bool pagebreak_top = fl_get_button(general_->check_pagebreaks_top);
212 bool pagebreak_bottom = fl_get_button(general_->check_pagebreaks_bottom);
214 switch (fl_get_choice (general_->choice_space_above)) {
216 space_top = VSpace(VSpace::NONE);
219 space_top = VSpace(VSpace::DEFSKIP);
222 space_top = VSpace(VSpace::SMALLSKIP);
225 space_top = VSpace(VSpace::MEDSKIP);
228 space_top = VSpace(VSpace::BIGSKIP);
231 space_top = VSpace(VSpace::VFILL);
235 VSpace(LyXGlueLength(fl_get_input(general_->input_space_above)));
238 if (fl_get_button (general_->check_space_above))
239 space_top.setKeep (true);
240 switch (fl_get_choice (general_->choice_space_below)) {
242 space_bottom = VSpace(VSpace::NONE);
245 space_bottom = VSpace(VSpace::DEFSKIP);
248 space_bottom = VSpace(VSpace::SMALLSKIP);
251 space_bottom = VSpace(VSpace::MEDSKIP);
254 space_bottom = VSpace(VSpace::BIGSKIP);
257 space_bottom = VSpace(VSpace::VFILL);
261 VSpace(LyXGlueLength(fl_get_input(general_->input_space_below)));
264 if (fl_get_button (general_->check_space_below))
265 space_bottom.setKeep (true);
267 if (fl_get_button(general_->radio_align_left))
268 align = LYX_ALIGN_LEFT;
269 else if (fl_get_button(general_->radio_align_right))
270 align = LYX_ALIGN_RIGHT;
271 else if (fl_get_button(general_->radio_align_center))
272 align = LYX_ALIGN_CENTER;
274 align = LYX_ALIGN_BLOCK;
276 labelwidthstring = fl_get_input(general_->input_labelwidth);
277 noindent = fl_get_button(general_->check_noindent);
278 Spacing::Space linespacing;
279 string other_linespacing;
280 switch (fl_get_choice(general_->choice_linespacing)) {
281 case 1: linespacing = Spacing::Default; break;
282 case 2: linespacing = Spacing::Single; break;
283 case 3: linespacing = Spacing::Onehalf; break;
284 case 4: linespacing = Spacing::Double; break;
286 linespacing = Spacing::Other;
287 other_linespacing = fl_get_input(general_->input_linespacing);
291 Spacing const spacing(linespacing, other_linespacing);
293 if (lv_->view()->theLockingInset())
294 text = lv_->view()->theLockingInset()->getLyXText(lv_->view());
296 text = lv_->view()->text;
297 text->setParagraph(lv_->view(), line_top, line_bottom, pagebreak_top,
298 pagebreak_bottom, space_top, space_bottom, spacing,
299 align, labelwidthstring, noindent);
303 void FormParagraph::general_update()
308 Buffer * buf = lv_->view()->buffer();
310 /// Record the paragraph
311 par_ = getCurrentParagraph();
313 fl_set_input(general_->input_labelwidth,
314 par_->getLabelWidthString().c_str());
315 fl_set_button(general_->radio_align_right, 0);
316 fl_set_button(general_->radio_align_left, 0);
317 fl_set_button(general_->radio_align_center, 0);
318 fl_set_button(general_->radio_align_block, 0);
320 int align = par_->getAlign();
321 if (align == LYX_ALIGN_LAYOUT)
322 align = textclasslist.Style(buf->params.textclass,
323 par_->getLayout()).align;
326 case LYX_ALIGN_RIGHT:
327 fl_set_button(general_->radio_align_right, 1);
330 fl_set_button(general_->radio_align_left, 1);
332 case LYX_ALIGN_CENTER:
333 fl_set_button(general_->radio_align_center, 1);
336 fl_set_button(general_->radio_align_block, 1);
340 LyXAlignment alignpos =
341 textclasslist.Style(buf->params.textclass,
342 par_->getLayout()).alignpossible;
344 setEnabled(general_->radio_align_block, bool(alignpos & LYX_ALIGN_BLOCK));
345 setEnabled(general_->radio_align_center, bool(alignpos & LYX_ALIGN_CENTER));
346 setEnabled(general_->radio_align_left, bool(alignpos & LYX_ALIGN_LEFT));
347 setEnabled(general_->radio_align_right, bool(alignpos & LYX_ALIGN_RIGHT));
349 fl_set_button(general_->check_lines_top,
350 par_->params().lineTop());
351 fl_set_button(general_->check_lines_bottom,
352 par_->params().lineBottom());
353 fl_set_button(general_->check_pagebreaks_top,
354 par_->params().pagebreakTop());
355 fl_set_button(general_->check_pagebreaks_bottom,
356 par_->params().pagebreakBottom());
357 fl_set_button(general_->check_noindent,
358 par_->params().noindent());
361 Spacing space = par_->params().spacing();
364 switch (lv_->buffer()->params.spacing.getSpace()) {
365 case Spacing::Default: linespacing = 1; break;
366 case Spacing::Single: linespacing = 2; break;
367 case Spacing::Onehalf: linespacing = 3; break;
368 case Spacing::Double: linespacing = 4; break;
369 case Spacing::Other: linespacing = 5; break;
373 switch (space.getSpace()) {
374 case Spacing::Default: linespacing = 1; break;
375 case Spacing::Single: linespacing = 2; break;
376 case Spacing::Onehalf: linespacing = 3; break;
377 case Spacing::Double: linespacing = 4; break;
378 case Spacing::Other: linespacing = 5; break;
380 fl_set_choice(general_->choice_linespacing, linespacing);
381 if (space.getSpace() == Spacing::Other) {
384 if (space.getSpace() == Spacing::Default)
385 sp = tostr(lv_->buffer()->params.spacing.getValue());
387 sp = tostr(space.getValue());
388 fl_set_input(general_->input_linespacing, sp.c_str());
389 setEnabled(general_->input_linespacing, true);
391 fl_set_input(general_->input_linespacing, "");
392 setEnabled(general_->input_linespacing, false);
395 fl_set_input (general_->input_space_above, "");
397 switch (par_->params().spaceTop().kind()) {
399 fl_set_choice (general_->choice_space_above, 1);
401 case VSpace::DEFSKIP:
402 fl_set_choice (general_->choice_space_above, 2);
404 case VSpace::SMALLSKIP:
405 fl_set_choice (general_->choice_space_above, 3);
407 case VSpace::MEDSKIP:
408 fl_set_choice (general_->choice_space_above, 4);
410 case VSpace::BIGSKIP:
411 fl_set_choice (general_->choice_space_above, 5);
414 fl_set_choice (general_->choice_space_above, 6);
417 fl_set_choice (general_->choice_space_above, 7);
418 fl_set_input(general_->input_space_above, par_->
419 params().spaceTop().length().asString().c_str());
423 fl_set_button (general_->check_space_above,
424 par_->params().spaceTop().keep());
425 fl_set_input (general_->input_space_below, "");
427 switch (par_->params().spaceBottom().kind()) {
429 fl_set_choice (general_->choice_space_below, 1);
431 case VSpace::DEFSKIP:
432 fl_set_choice (general_->choice_space_below, 2);
434 case VSpace::SMALLSKIP:
435 fl_set_choice (general_->choice_space_below, 3);
437 case VSpace::MEDSKIP:
438 fl_set_choice (general_->choice_space_below, 4);
440 case VSpace::BIGSKIP:
441 fl_set_choice (general_->choice_space_below, 5);
444 fl_set_choice (general_->choice_space_below, 6);
447 fl_set_choice (general_->choice_space_below, 7);
448 fl_set_input(general_->input_space_below, par_->
449 params().spaceBottom().length().asString().c_str());
452 fl_set_button(general_->check_space_below,
453 par_->params().spaceBottom().keep());
454 fl_set_button(general_->check_noindent,
455 par_->params().noindent());
459 bool FormParagraph::input(FL_OBJECT * ob, long)
463 fl_hide_object(dialog_->text_warning);
465 // First check the buttons which are exclusive and you have to
466 // check only the actuall de/activated button.
468 // general form first
470 // "Synchronize" the choices and input fields, making it
471 // impossible to commit senseless data.
473 if (fl_get_choice (general_->choice_space_above) != 7)
474 fl_set_input (general_->input_space_above, "");
476 if (fl_get_choice (general_->choice_space_below) != 7)
477 fl_set_input (general_->input_space_below, "");
479 if (fl_get_choice (general_->choice_linespacing) == 4)
480 setEnabled (general_->input_linespacing, true);
482 setEnabled (general_->input_linespacing, false);
483 fl_set_input (general_->input_linespacing, "");
487 // first the general form
489 string input = fl_get_input (general_->input_space_above);
490 bool invalid = false;
492 if (fl_get_choice(general_->choice_space_above)==7)
493 invalid = !input.empty() && !isValidGlueLength(input);
495 input = fl_get_input (general_->input_space_below);
497 if (fl_get_choice(general_->choice_space_below)==7)
498 invalid = invalid || (!input.empty() && !isValidGlueLength(input));
500 if (ob == general_->input_space_above || ob == general_->input_space_below) {
502 fl_set_object_label(dialog_->text_warning,
503 _("Warning: Invalid Length (valid example: 10mm)"));
504 fl_show_object(dialog_->text_warning);
507 fl_hide_object(dialog_->text_warning);