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"
27 #include "xforms_helpers.h"
28 #include "BufferView.h"
29 #include "ParagraphParameters.h"
31 using Liason::setMinibuffer;
35 FormParagraph::FormParagraph(LyXView * lv, Dialogs * d)
36 : FormBaseBD(lv, d, _("Paragraph Layout")), par_(0)
38 // let the dialog be shown
39 // This is a permanent connection so we won't bother
40 // storing a copy because we won't be disconnecting.
41 d->showParagraph.connect(slot(this, &FormParagraph::show));
45 void FormParagraph::connect()
47 cp_ = d_->updateParagraph
48 .connect(slot(this, &FormParagraph::changedParagraph));
49 FormBaseBD::connect();
53 void FormParagraph::disconnect()
56 FormBaseBD::disconnect();
60 Paragraph const * FormParagraph::getCurrentParagraph() const
64 if (lv_->view()->theLockingInset())
65 text = lv_->view()->theLockingInset()->getLyXText(lv_->view());
67 text = lv_->view()->text;
68 return text->cursor.par();
72 void FormParagraph::changedParagraph()
74 /// Record the paragraph
75 Paragraph const * const p = getCurrentParagraph();
76 if (p == 0 || p == par_)
79 // For now don't bother checking if the params are different,
80 // just activate the Apply button
85 void FormParagraph::redraw()
87 if( form() && form()->visible )
88 fl_redraw_form( form() );
92 FL_FORM * outer_form = fl_get_active_folder(dialog_->tabbed_folder);
93 if (outer_form && outer_form->visible)
94 fl_redraw_form( outer_form );
98 FL_FORM * FormParagraph::form() const
100 if (dialog_.get()) return dialog_->form;
105 void FormParagraph::build()
108 dialog_.reset(build_tabbed_paragraph());
110 // Manage the ok, apply, restore and cancel/close buttons
111 bc_.setOK(dialog_->button_ok);
112 bc_.setApply(dialog_->button_apply);
113 bc_.setCancel(dialog_->button_cancel);
114 bc_.setRestore(dialog_->button_restore);
116 // the general paragraph data form
117 general_.reset(build_paragraph_general());
119 fl_addto_choice(general_->choice_space_above,
120 _(" None | Defskip | Smallskip "
121 "| Medskip | Bigskip | VFill | Length "));
122 fl_addto_choice(general_->choice_space_below,
123 _(" None | Defskip | Smallskip "
124 "| Medskip | Bigskip | VFill | Length "));
126 fl_set_input_return(general_->input_space_above, FL_RETURN_CHANGED);
127 fl_set_input_return(general_->input_space_below, FL_RETURN_CHANGED);
128 fl_set_input_return(general_->input_labelwidth, FL_RETURN_CHANGED);
130 bc_.addReadOnly (general_->radio_align_right);
131 bc_.addReadOnly (general_->radio_align_left);
132 bc_.addReadOnly (general_->radio_align_block);
133 bc_.addReadOnly (general_->radio_align_center);
134 bc_.addReadOnly (general_->check_lines_top);
135 bc_.addReadOnly (general_->check_lines_bottom);
136 bc_.addReadOnly (general_->check_pagebreaks_top);
137 bc_.addReadOnly (general_->check_pagebreaks_bottom);
138 bc_.addReadOnly (general_->choice_space_above);
139 bc_.addReadOnly (general_->input_space_above);
140 bc_.addReadOnly (general_->check_space_above);
141 bc_.addReadOnly (general_->choice_space_below);
142 bc_.addReadOnly (general_->input_space_below);
143 bc_.addReadOnly (general_->check_space_below);
144 bc_.addReadOnly (general_->check_noindent);
145 bc_.addReadOnly (general_->input_labelwidth);
147 // now make them fit together
148 fl_addto_tabfolder(dialog_->tabbed_folder,_("General"), general_->form);
152 void FormParagraph::apply()
154 if (!lv_->view()->available() || !dialog_.get())
159 lv_->view()->update(lv_->view()->text,
160 BufferView::SELECT | BufferView::FITCUR | BufferView::CHANGE);
161 lv_->buffer()->markDirty();
162 setMinibuffer(lv_, _("Paragraph layout set"));
166 void FormParagraph::update()
171 // Do this first; some objects may be de/activated subsequently.
172 bc_.readOnly(lv_->buffer()->isReadonly());
178 void FormParagraph::general_apply()
180 VSpace space_top, space_bottom;
182 string labelwidthstring;
185 // If a vspace kind is "Length" but there's no text in
186 // the input field, reset the kind to "None".
187 if ((fl_get_choice (general_->choice_space_above) == 7) &&
188 !*(fl_get_input (general_->input_space_above)))
190 fl_set_choice (general_->choice_space_above, 1);
192 if ((fl_get_choice (general_->choice_space_below) == 7) &&
193 !*(fl_get_input (general_->input_space_below)))
195 fl_set_choice (general_->choice_space_below, 1);
198 bool line_top = fl_get_button(general_->check_lines_top);
199 bool line_bottom = fl_get_button(general_->check_lines_bottom);
200 bool pagebreak_top = fl_get_button(general_->check_pagebreaks_top);
201 bool pagebreak_bottom = fl_get_button(general_->check_pagebreaks_bottom);
203 switch (fl_get_choice (general_->choice_space_above)) {
205 space_top = VSpace(VSpace::NONE);
208 space_top = VSpace(VSpace::DEFSKIP);
211 space_top = VSpace(VSpace::SMALLSKIP);
214 space_top = VSpace(VSpace::MEDSKIP);
217 space_top = VSpace(VSpace::BIGSKIP);
220 space_top = VSpace(VSpace::VFILL);
224 VSpace(LyXGlueLength(fl_get_input(general_->input_space_above)));
227 if (fl_get_button (general_->check_space_above))
228 space_top.setKeep (true);
229 switch (fl_get_choice (general_->choice_space_below)) {
231 space_bottom = VSpace(VSpace::NONE);
234 space_bottom = VSpace(VSpace::DEFSKIP);
237 space_bottom = VSpace(VSpace::SMALLSKIP);
240 space_bottom = VSpace(VSpace::MEDSKIP);
243 space_bottom = VSpace(VSpace::BIGSKIP);
246 space_bottom = VSpace(VSpace::VFILL);
250 VSpace(LyXGlueLength(fl_get_input(general_->input_space_below)));
253 if (fl_get_button (general_->check_space_below))
254 space_bottom.setKeep (true);
256 if (fl_get_button(general_->radio_align_left))
257 align = LYX_ALIGN_LEFT;
258 else if (fl_get_button(general_->radio_align_right))
259 align = LYX_ALIGN_RIGHT;
260 else if (fl_get_button(general_->radio_align_center))
261 align = LYX_ALIGN_CENTER;
263 align = LYX_ALIGN_BLOCK;
265 labelwidthstring = fl_get_input(general_->input_labelwidth);
266 noindent = fl_get_button(general_->check_noindent);
269 if (lv_->view()->theLockingInset())
270 text = lv_->view()->theLockingInset()->getLyXText(lv_->view());
272 text = lv_->view()->text;
273 text->setParagraph(lv_->view(), line_top, line_bottom, pagebreak_top,
274 pagebreak_bottom, space_top, space_bottom, align,
275 labelwidthstring, noindent);
279 void FormParagraph::general_update()
284 Buffer * buf = lv_->view()->buffer();
286 /// Record the paragraph
287 par_ = getCurrentParagraph();
289 fl_set_input(general_->input_labelwidth,
290 par_->getLabelWidthString().c_str());
291 fl_set_button(general_->radio_align_right, 0);
292 fl_set_button(general_->radio_align_left, 0);
293 fl_set_button(general_->radio_align_center, 0);
294 fl_set_button(general_->radio_align_block, 0);
296 int align = par_->getAlign();
297 if (align == LYX_ALIGN_LAYOUT)
298 align = textclasslist.Style(buf->params.textclass,
299 par_->getLayout()).align;
302 case LYX_ALIGN_RIGHT:
303 fl_set_button(general_->radio_align_right, 1);
306 fl_set_button(general_->radio_align_left, 1);
308 case LYX_ALIGN_CENTER:
309 fl_set_button(general_->radio_align_center, 1);
312 fl_set_button(general_->radio_align_block, 1);
316 LyXAlignment alignpos =
317 textclasslist.Style(buf->params.textclass,
318 par_->getLayout()).alignpossible;
320 setEnabled(general_->radio_align_block, bool(alignpos & LYX_ALIGN_BLOCK));
321 setEnabled(general_->radio_align_center, bool(alignpos & LYX_ALIGN_CENTER));
322 setEnabled(general_->radio_align_left, bool(alignpos & LYX_ALIGN_LEFT));
323 setEnabled(general_->radio_align_right, bool(alignpos & LYX_ALIGN_RIGHT));
325 fl_set_button(general_->check_lines_top,
326 par_->params().lineTop());
327 fl_set_button(general_->check_lines_bottom,
328 par_->params().lineBottom());
329 fl_set_button(general_->check_pagebreaks_top,
330 par_->params().pagebreakTop());
331 fl_set_button(general_->check_pagebreaks_bottom,
332 par_->params().pagebreakBottom());
333 fl_set_button(general_->check_noindent,
334 par_->params().noindent());
336 fl_set_input (general_->input_space_above, "");
338 switch (par_->params().spaceTop().kind()) {
340 fl_set_choice (general_->choice_space_above, 1);
342 case VSpace::DEFSKIP:
343 fl_set_choice (general_->choice_space_above, 2);
345 case VSpace::SMALLSKIP:
346 fl_set_choice (general_->choice_space_above, 3);
348 case VSpace::MEDSKIP:
349 fl_set_choice (general_->choice_space_above, 4);
351 case VSpace::BIGSKIP:
352 fl_set_choice (general_->choice_space_above, 5);
355 fl_set_choice (general_->choice_space_above, 6);
358 fl_set_choice (general_->choice_space_above, 7);
359 fl_set_input(general_->input_space_above, par_->
360 params().spaceTop().length().asString().c_str());
364 fl_set_button (general_->check_space_above,
365 par_->params().spaceTop().keep());
366 fl_set_input (general_->input_space_below, "");
368 switch (par_->params().spaceBottom().kind()) {
370 fl_set_choice (general_->choice_space_below, 1);
372 case VSpace::DEFSKIP:
373 fl_set_choice (general_->choice_space_below, 2);
375 case VSpace::SMALLSKIP:
376 fl_set_choice (general_->choice_space_below, 3);
378 case VSpace::MEDSKIP:
379 fl_set_choice (general_->choice_space_below, 4);
381 case VSpace::BIGSKIP:
382 fl_set_choice (general_->choice_space_below, 5);
385 fl_set_choice (general_->choice_space_below, 6);
388 fl_set_choice (general_->choice_space_below, 7);
389 fl_set_input(general_->input_space_below, par_->
390 params().spaceBottom().length().asString().c_str());
393 fl_set_button(general_->check_space_below,
394 par_->params().spaceBottom().keep());
395 fl_set_button(general_->check_noindent,
396 par_->params().noindent());
400 bool FormParagraph::input(FL_OBJECT * ob, long)
404 fl_hide_object(dialog_->text_warning);
406 // First check the buttons which are exclusive and you have to
407 // check only the actuall de/activated button.
409 // general form first
411 // "Synchronize" the choices and input fields, making it
412 // impossible to commit senseless data.
414 if (fl_get_choice (general_->choice_space_above) != 7)
415 fl_set_input (general_->input_space_above, "");
417 if (fl_get_choice (general_->choice_space_below) != 7)
418 fl_set_input (general_->input_space_below, "");
421 // first the general form
423 string input = fl_get_input (general_->input_space_above);
424 bool invalid = false;
426 if (fl_get_choice(general_->choice_space_above)==7)
427 invalid = !input.empty() && !isValidGlueLength(input);
429 input = fl_get_input (general_->input_space_below);
431 if (fl_get_choice(general_->choice_space_below)==7)
432 invalid = invalid || (!input.empty() && !isValidGlueLength(input));
434 if (ob == general_->input_space_above || ob == general_->input_space_below) {
436 fl_set_object_label(dialog_->text_warning,
437 _("Warning: Invalid Length (valid example: 10mm)"));
438 fl_show_object(dialog_->text_warning);
441 fl_hide_object(dialog_->text_warning);