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 _(" 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;
195 Spacing::Space linespacing;
196 string other_linespacing;
198 // If a vspace kind is "Length" but there's no text in
199 // the input field, reset the kind to "None".
200 if ((fl_get_choice (general_->choice_space_above) == 7) &&
201 !*(fl_get_input (general_->input_space_above)))
203 fl_set_choice (general_->choice_space_above, 1);
205 if ((fl_get_choice (general_->choice_space_below) == 7) &&
206 !*(fl_get_input (general_->input_space_below)))
208 fl_set_choice (general_->choice_space_below, 1);
211 bool line_top = fl_get_button(general_->check_lines_top);
212 bool line_bottom = fl_get_button(general_->check_lines_bottom);
213 bool pagebreak_top = fl_get_button(general_->check_pagebreaks_top);
214 bool pagebreak_bottom = fl_get_button(general_->check_pagebreaks_bottom);
216 switch (fl_get_choice (general_->choice_space_above)) {
218 space_top = VSpace(VSpace::NONE);
221 space_top = VSpace(VSpace::DEFSKIP);
224 space_top = VSpace(VSpace::SMALLSKIP);
227 space_top = VSpace(VSpace::MEDSKIP);
230 space_top = VSpace(VSpace::BIGSKIP);
233 space_top = VSpace(VSpace::VFILL);
237 VSpace(LyXGlueLength(fl_get_input(general_->input_space_above)));
240 if (fl_get_button (general_->check_space_above))
241 space_top.setKeep (true);
242 switch (fl_get_choice (general_->choice_space_below)) {
244 space_bottom = VSpace(VSpace::NONE);
247 space_bottom = VSpace(VSpace::DEFSKIP);
250 space_bottom = VSpace(VSpace::SMALLSKIP);
253 space_bottom = VSpace(VSpace::MEDSKIP);
256 space_bottom = VSpace(VSpace::BIGSKIP);
259 space_bottom = VSpace(VSpace::VFILL);
263 VSpace(LyXGlueLength(fl_get_input(general_->input_space_below)));
266 if (fl_get_button (general_->check_space_below))
267 space_bottom.setKeep (true);
269 if (fl_get_button(general_->radio_align_left))
270 align = LYX_ALIGN_LEFT;
271 else if (fl_get_button(general_->radio_align_right))
272 align = LYX_ALIGN_RIGHT;
273 else if (fl_get_button(general_->radio_align_center))
274 align = LYX_ALIGN_CENTER;
276 align = LYX_ALIGN_BLOCK;
278 labelwidthstring = fl_get_input(general_->input_labelwidth);
279 noindent = fl_get_button(general_->check_noindent);
280 switch (fl_get_choice(general_->choice_linespacing)) {
281 case 1: linespacing = Spacing::Single; break;
282 case 2: linespacing = Spacing::Onehalf; break;
283 case 3: linespacing = Spacing::Double; break;
285 linespacing = Spacing::Other;
286 other_linespacing = fl_get_input(general_->input_linespacing);
290 Spacing const spacing(linespacing, other_linespacing);
292 if (lv_->view()->theLockingInset())
293 text = lv_->view()->theLockingInset()->getLyXText(lv_->view());
295 text = lv_->view()->text;
296 text->setParagraph(lv_->view(), line_top, line_bottom, pagebreak_top,
297 pagebreak_bottom, space_top, space_bottom, spacing,
298 align, labelwidthstring, noindent);
302 void FormParagraph::general_update()
307 Buffer * buf = lv_->view()->buffer();
309 /// Record the paragraph
310 par_ = getCurrentParagraph();
312 fl_set_input(general_->input_labelwidth,
313 par_->getLabelWidthString().c_str());
314 fl_set_button(general_->radio_align_right, 0);
315 fl_set_button(general_->radio_align_left, 0);
316 fl_set_button(general_->radio_align_center, 0);
317 fl_set_button(general_->radio_align_block, 0);
319 int align = par_->getAlign();
320 if (align == LYX_ALIGN_LAYOUT)
321 align = textclasslist.Style(buf->params.textclass,
322 par_->getLayout()).align;
325 case LYX_ALIGN_RIGHT:
326 fl_set_button(general_->radio_align_right, 1);
329 fl_set_button(general_->radio_align_left, 1);
331 case LYX_ALIGN_CENTER:
332 fl_set_button(general_->radio_align_center, 1);
335 fl_set_button(general_->radio_align_block, 1);
339 LyXAlignment alignpos =
340 textclasslist.Style(buf->params.textclass,
341 par_->getLayout()).alignpossible;
343 setEnabled(general_->radio_align_block, bool(alignpos & LYX_ALIGN_BLOCK));
344 setEnabled(general_->radio_align_center, bool(alignpos & LYX_ALIGN_CENTER));
345 setEnabled(general_->radio_align_left, bool(alignpos & LYX_ALIGN_LEFT));
346 setEnabled(general_->radio_align_right, bool(alignpos & LYX_ALIGN_RIGHT));
348 fl_set_button(general_->check_lines_top,
349 par_->params().lineTop());
350 fl_set_button(general_->check_lines_bottom,
351 par_->params().lineBottom());
352 fl_set_button(general_->check_pagebreaks_top,
353 par_->params().pagebreakTop());
354 fl_set_button(general_->check_pagebreaks_bottom,
355 par_->params().pagebreakBottom());
356 fl_set_button(general_->check_noindent,
357 par_->params().noindent());
360 Spacing space = par_->params().spacing();
362 switch (lv_->buffer()->params.spacing.getSpace()) {
363 case Spacing::Single: linespacing = 1; break;
364 case Spacing::Onehalf: linespacing = 2; break;
365 case Spacing::Double: linespacing = 3; break;
366 case Spacing::Other: linespacing = 4; break;
369 switch (space.getSpace()) {
370 case Spacing::Single: linespacing = 1; break;
371 case Spacing::Onehalf: linespacing = 2; break;
372 case Spacing::Double: linespacing = 3; break;
373 case Spacing::Other: linespacing = 4; break;
374 case Spacing::Default:
375 space = lv_->buffer()->params.spacing;
378 fl_set_choice(general_->choice_linespacing, linespacing);
379 if (space.getSpace() == Spacing::Other) {
382 if (space.getSpace() == Spacing::Default)
383 sp = tostr(lv_->buffer()->params.spacing.getValue());
385 sp = tostr(space.getValue());
386 fl_set_input(general_->input_linespacing, sp.c_str());
387 setEnabled(general_->input_linespacing, true);
389 fl_set_input(general_->input_linespacing, "");
390 setEnabled(general_->input_linespacing, false);
393 fl_set_input (general_->input_space_above, "");
395 switch (par_->params().spaceTop().kind()) {
397 fl_set_choice (general_->choice_space_above, 1);
399 case VSpace::DEFSKIP:
400 fl_set_choice (general_->choice_space_above, 2);
402 case VSpace::SMALLSKIP:
403 fl_set_choice (general_->choice_space_above, 3);
405 case VSpace::MEDSKIP:
406 fl_set_choice (general_->choice_space_above, 4);
408 case VSpace::BIGSKIP:
409 fl_set_choice (general_->choice_space_above, 5);
412 fl_set_choice (general_->choice_space_above, 6);
415 fl_set_choice (general_->choice_space_above, 7);
416 fl_set_input(general_->input_space_above, par_->
417 params().spaceTop().length().asString().c_str());
421 fl_set_button (general_->check_space_above,
422 par_->params().spaceTop().keep());
423 fl_set_input (general_->input_space_below, "");
425 switch (par_->params().spaceBottom().kind()) {
427 fl_set_choice (general_->choice_space_below, 1);
429 case VSpace::DEFSKIP:
430 fl_set_choice (general_->choice_space_below, 2);
432 case VSpace::SMALLSKIP:
433 fl_set_choice (general_->choice_space_below, 3);
435 case VSpace::MEDSKIP:
436 fl_set_choice (general_->choice_space_below, 4);
438 case VSpace::BIGSKIP:
439 fl_set_choice (general_->choice_space_below, 5);
442 fl_set_choice (general_->choice_space_below, 6);
445 fl_set_choice (general_->choice_space_below, 7);
446 fl_set_input(general_->input_space_below, par_->
447 params().spaceBottom().length().asString().c_str());
450 fl_set_button(general_->check_space_below,
451 par_->params().spaceBottom().keep());
452 fl_set_button(general_->check_noindent,
453 par_->params().noindent());
457 bool FormParagraph::input(FL_OBJECT * ob, long)
461 fl_hide_object(dialog_->text_warning);
463 // First check the buttons which are exclusive and you have to
464 // check only the actuall de/activated button.
466 // general form first
468 // "Synchronize" the choices and input fields, making it
469 // impossible to commit senseless data.
471 if (fl_get_choice (general_->choice_space_above) != 7)
472 fl_set_input (general_->input_space_above, "");
474 if (fl_get_choice (general_->choice_space_below) != 7)
475 fl_set_input (general_->input_space_below, "");
477 if (fl_get_choice (general_->choice_linespacing) == 4)
478 setEnabled (general_->input_linespacing, true);
480 setEnabled (general_->input_linespacing, false);
481 fl_set_input (general_->input_linespacing, "");
485 // first the general form
487 string input = fl_get_input (general_->input_space_above);
488 bool invalid = false;
490 if (fl_get_choice(general_->choice_space_above)==7)
491 invalid = !input.empty() && !isValidGlueLength(input);
493 input = fl_get_input (general_->input_space_below);
495 if (fl_get_choice(general_->choice_space_below)==7)
496 invalid = invalid || (!input.empty() && !isValidGlueLength(input));
498 if (ob == general_->input_space_above || ob == general_->input_space_below) {
500 fl_set_object_label(dialog_->text_warning,
501 _("Warning: Invalid Length (valid example: 10mm)"));
502 fl_show_object(dialog_->text_warning);
505 fl_hide_object(dialog_->text_warning);