X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Ffrontends%2Fxforms%2FFormParagraph.C;h=a5f36f809618afe07ac452af612ffe5097a24476;hb=d5443737342903de489d527802cd2cdd38987d74;hp=a7dcab78bf808a6dfe3912fd15dd51d3a1fd6b84;hpb=f10227802b25d39657bd8b4de2dbd43276c236c6;p=lyx.git diff --git a/src/frontends/xforms/FormParagraph.C b/src/frontends/xforms/FormParagraph.C index a7dcab78bf..a5f36f8096 100644 --- a/src/frontends/xforms/FormParagraph.C +++ b/src/frontends/xforms/FormParagraph.C @@ -1,311 +1,155 @@ /** * \file FormParagraph.C - * Copyright 2000-2001 The LyX Team. - * See the file COPYING. + * This file is part of LyX, the document processor. + * Licence details can be found in the file COPYING. * - * \author Jürgen Vigna, jug@sad.it + * \author Jürgen Vigna + * \author Rob Lahaye + * + * Full author contact details are available in file CREDITS. */ #include -#ifdef __GNUG_ -#pragma implementation -#endif - -#include FORMS_H_LOCATION - #include "FormParagraph.h" -#include "form_paragraph.h" -#include "Dialogs.h" -#include "Liason.h" -#include "LyXView.h" -#include "buffer.h" -#include "lyxtext.h" +#include "ControlParagraph.h" +#include "forms/form_paragraph.h" + +#include "checkedwidgets.h" +#include "input_validators.h" +#include "Tooltips.h" #include "xforms_helpers.h" +#include "xformsBC.h" + +#include "controllers/helper_funcs.h" + #include "lyxrc.h" // to set the deafult length values -#include "BufferView.h" -#include "lyxtextclasslist.h" -#include "Spacing.h" #include "ParagraphParameters.h" -#include "input_validators.h" -#include "helper_funcs.h" +#include "Spacing.h" #include "support/lstrings.h" +#include "support/convert.h" -#include - -using Liason::setMinibuffer; -using SigC::slot; -using std::vector; -using std::bind2nd; -using std::remove_if; - - -FormParagraph::FormParagraph(LyXView * lv, Dialogs * d) - : FormBaseBD(lv, d, _("Paragraph Layout")), par_(0) -{ - // let the dialog be shown - // This is a permanent connection so we won't bother - // storing a copy because we won't be disconnecting. - d->showParagraph.connect(slot(this, &FormParagraph::show)); -} - - -void FormParagraph::connect() -{ - cp_ = d_->updateParagraph - .connect(slot(this, &FormParagraph::changedParagraph)); - FormBaseBD::connect(); -} - - -void FormParagraph::disconnect() -{ - cp_.disconnect(); - FormBaseBD::disconnect(); -} +#include "lyx_forms.h" +#include -Paragraph const * FormParagraph::getCurrentParagraph() const -{ - return lv_->view()->getLyXText()->cursor.par(); -} +using boost::bind; +using std::remove_if; -void FormParagraph::changedParagraph() -{ - /// Record the paragraph - Paragraph const * const p = getCurrentParagraph(); - if (p == 0 || p == par_) - return; +using std::vector; +using std::string; - // OBS FIX LOOK HERE +namespace lyx { - // shouldn't we chage the par_ pointer too? - // anyway for me the below function does just nothing! - // (Jug 20020108) +using support::contains; +using support::getStringFromVector; +using support::rtrim; - // For now don't bother checking if the params are different, - // just activate the Apply button - bc().valid(); -} +namespace frontend { +typedef FormController > base_class; -void FormParagraph::redraw() -{ - if (form() && form()->visible) - fl_redraw_form(form()); -} - - -FL_FORM * FormParagraph::form() const -{ - if (dialog_.get()) - return dialog_->form; - return 0; -} +FormParagraph::FormParagraph(Dialog & parent) + : base_class(parent, _("Paragraph Settings")) +{} void FormParagraph::build() { // the tabbed folder - dialog_.reset(build_paragraph()); + dialog_.reset(build_paragraph(this)); - fl_addto_choice(dialog_->choice_space_above, - _(" None | Defskip | Smallskip " - "| Medskip | Bigskip | VFill | Length ")); - fl_addto_choice(dialog_->choice_space_below, - _(" None | Defskip | Smallskip " - "| Medskip | Bigskip | VFill | Length ")); + // Manage the ok, apply, restore and cancel/close buttons + bcview().setOK(dialog_->button_ok); + bcview().setApply(dialog_->button_apply); + bcview().setCancel(dialog_->button_close); + bcview().setRestore(dialog_->button_restore); + + // disable for read-only documents + bcview().addReadOnly(dialog_->check_noindent); + bcview().addReadOnly(dialog_->choice_linespacing); + bcview().addReadOnly(dialog_->input_linespacing); - fl_addto_choice(dialog_->choice_linespacing, - _(" Default | Single | OneHalf | Double | Other ")); + bcview().addReadOnly(dialog_->input_labelwidth); - fl_set_input_return(dialog_->input_space_above, FL_RETURN_CHANGED); - fl_set_input_return(dialog_->input_space_below, FL_RETURN_CHANGED); - fl_set_input_return(dialog_->input_labelwidth, FL_RETURN_CHANGED); + // trigger an input event for cut&paste with middle mouse button. + setPrehandler(dialog_->input_linespacing); + setPrehandler(dialog_->input_labelwidth); + + fl_set_input_return(dialog_->input_labelwidth, FL_RETURN_CHANGED); fl_set_input_return(dialog_->input_linespacing, FL_RETURN_CHANGED); + + // limit these inputs to unsigned floats fl_set_input_filter(dialog_->input_linespacing, fl_unsigned_float_filter); - setPrehandler(dialog_->input_space_above); - setPrehandler(dialog_->input_space_below); - setPrehandler(dialog_->input_labelwidth); - setPrehandler(dialog_->input_linespacing); + // add alignment radio buttons + alignment_.init(dialog_->radio_align_left, LYX_ALIGN_LEFT); + alignment_.init(dialog_->radio_align_right, LYX_ALIGN_RIGHT); + alignment_.init(dialog_->radio_align_block, LYX_ALIGN_BLOCK); + alignment_.init(dialog_->radio_align_center, LYX_ALIGN_CENTER); - // Create the contents of the unit choices - // Don't include the "%" terms... + string const linespacing = _("Default|Single|OneHalf|Double|Custom"); + fl_addto_choice(dialog_->choice_linespacing, linespacing.c_str()); + + // Create the contents of the unit choices; don't include the "%" terms. vector units_vec = getLatexUnits(); -#if 0 - for (vector::iterator it = units_vec.begin(); - it != units_vec.end(); ++it) { - if (contains(*it, "%")) - it = units_vec.erase(it, it+1) - 1; - } -#else - // Something similar to this is a better way to erase vector::iterator del = remove_if(units_vec.begin(), units_vec.end(), - bind2nd(contains_functor(), "%")); + bind(contains, _1, '%')); units_vec.erase(del, units_vec.end()); -#endif - - string units = getStringFromVector(units_vec, "|"); - - fl_addto_choice(dialog_->choice_value_space_above, units.c_str()); - fl_addto_choice(dialog_->choice_value_space_below, units.c_str()); - - // Manage the ok, apply, restore and cancel/close buttons - bc_.setOK(dialog_->button_ok); - bc_.setApply(dialog_->button_apply); - bc_.setCancel(dialog_->button_close); - bc_.setRestore(dialog_->button_restore); - - bc_.addReadOnly(dialog_->radio_align_right); - bc_.addReadOnly(dialog_->radio_align_left); - bc_.addReadOnly(dialog_->radio_align_block); - bc_.addReadOnly(dialog_->radio_align_center); - bc_.addReadOnly(dialog_->check_lines_top); - bc_.addReadOnly(dialog_->check_lines_bottom); - bc_.addReadOnly(dialog_->check_pagebreaks_top); - bc_.addReadOnly(dialog_->check_pagebreaks_bottom); - bc_.addReadOnly(dialog_->choice_space_above); - bc_.addReadOnly(dialog_->input_space_above); - bc_.addReadOnly(dialog_->check_space_above); - bc_.addReadOnly(dialog_->choice_space_below); - bc_.addReadOnly(dialog_->input_space_below); - bc_.addReadOnly(dialog_->check_space_below); - bc_.addReadOnly(dialog_->choice_linespacing); - bc_.addReadOnly(dialog_->input_linespacing); - bc_.addReadOnly(dialog_->check_noindent); - bc_.addReadOnly(dialog_->input_labelwidth); } void FormParagraph::apply() { - if (!lv_->view()->available() || !dialog_.get()) + if (!form()) return; - VSpace space_top; - VSpace space_bottom; - LyXAlignment align; - string labelwidthstring; - bool noindent; - - // If a vspace kind is "Length" but there's no text in - // the input field, reset the kind to "None". - if ((fl_get_choice(dialog_->choice_space_above) == 7) && - !*(fl_get_input(dialog_->input_space_above))) - { - fl_set_choice(dialog_->choice_space_above, 1); - } + // alignment + LyXAlignment const alignment = + static_cast(alignment_.get()); + controller().params().align(alignment); - if ((fl_get_choice (dialog_->choice_space_below) == 7) && - !*(fl_get_input (dialog_->input_space_below))) - { - fl_set_choice(dialog_->choice_space_below, 1); - } + // label width + string const labelwidthstring = + getString(dialog_->input_labelwidth); + controller().params().labelWidthString(labelwidthstring); - bool line_top = fl_get_button(dialog_->check_lines_top); - bool line_bottom = fl_get_button(dialog_->check_lines_bottom); - bool pagebreak_top = fl_get_button(dialog_->check_pagebreaks_top); - bool pagebreak_bottom = fl_get_button(dialog_->check_pagebreaks_bottom); - - switch (fl_get_choice(dialog_->choice_space_above)) { - case 1: - space_top = VSpace(VSpace::NONE); - break; - case 2: - space_top = VSpace(VSpace::DEFSKIP); - break; - case 3: - space_top = VSpace(VSpace::SMALLSKIP); - break; - case 4: - space_top = VSpace(VSpace::MEDSKIP); - break; - case 5: - space_top = VSpace(VSpace::BIGSKIP); - break; - case 6: - space_top = VSpace(VSpace::VFILL); - break; - case 7: { - string const length = - getLengthFromWidgets(dialog_->input_space_above, - dialog_->choice_value_space_above); - space_top = VSpace(LyXGlueLength(length)); - break; - } - } + // indendation + bool const noindent = fl_get_button(dialog_->check_noindent); + controller().params().noindent(noindent); - if (fl_get_button(dialog_->check_space_above)) - space_top.setKeep(true); - switch (fl_get_choice(dialog_->choice_space_below)) { - case 1: - space_bottom = VSpace(VSpace::NONE); - break; - case 2: - space_bottom = VSpace(VSpace::DEFSKIP); - break; - case 3: - space_bottom = VSpace(VSpace::SMALLSKIP); - break; - case 4: - space_bottom = VSpace(VSpace::MEDSKIP); - break; - case 5: - space_bottom = VSpace(VSpace::BIGSKIP); - break; - case 6: - space_bottom = VSpace(VSpace::VFILL); - break; - case 7: - string const length = - getLengthFromWidgets(dialog_->input_space_below, - dialog_->choice_value_space_below); - space_bottom = VSpace(LyXGlueLength(length)); - break; - } - if (fl_get_button (dialog_->check_space_below)) - space_bottom.setKeep (true); - - if (fl_get_button(dialog_->radio_align_left)) - align = LYX_ALIGN_LEFT; - else if (fl_get_button(dialog_->radio_align_right)) - align = LYX_ALIGN_RIGHT; - else if (fl_get_button(dialog_->radio_align_center)) - align = LYX_ALIGN_CENTER; - else - align = LYX_ALIGN_BLOCK; - - labelwidthstring = fl_get_input(dialog_->input_labelwidth); - noindent = fl_get_button(dialog_->check_noindent); + // get spacing Spacing::Space linespacing = Spacing::Default; - string other_linespacing; + string other; switch (fl_get_choice(dialog_->choice_linespacing)) { - case 1: linespacing = Spacing::Default; break; - case 2: linespacing = Spacing::Single; break; - case 3: linespacing = Spacing::Onehalf; break; - case 4: linespacing = Spacing::Double; break; - case 5: + case 1: + linespacing = Spacing::Default; + break; + case 2: + linespacing = Spacing::Single; + break; + case 3: + linespacing = Spacing::Onehalf; + break; + case 4: + linespacing = Spacing::Double; + break; + case 5: + // reset to default if input is empty + other = getString(dialog_->input_linespacing); + if (!other.empty()) { linespacing = Spacing::Other; - other_linespacing = fl_get_input(dialog_->input_linespacing); - break; + } else { + linespacing = Spacing::Default; + fl_set_choice(dialog_->choice_linespacing, 1); + } + break; } - - Spacing const spacing(linespacing, other_linespacing); - LyXText * text(lv_->view()->getLyXText()); - text->setParagraph(lv_->view(), line_top, line_bottom, pagebreak_top, - pagebreak_bottom, space_top, space_bottom, spacing, - align, labelwidthstring, noindent); - - - // Actually apply these settings - lv_->view()->update(text, - BufferView::SELECT | BufferView::FITCUR | BufferView::CHANGE); - lv_->buffer()->markDirty(); - setMinibuffer(lv_, _("Paragraph layout set")); + Spacing const spacing(linespacing, other); + controller().params().spacing(spacing); } @@ -314,257 +158,115 @@ void FormParagraph::update() if (!dialog_.get()) return; - // Do this first; some objects may be de/activated subsequently. - bc_.readOnly(lv_->buffer()->isReadonly()); + // label width + string const labelwidth = controller().params().labelWidthString(); + fl_set_input(dialog_->input_labelwidth, labelwidth.c_str()); + setEnabled(dialog_->input_labelwidth, + labelwidth != _("Senseless with this layout!")); - Buffer * buf = lv_->view()->buffer(); + // alignment + alignment_.set(controller().params().align()); - /// Record the paragraph - par_ = getCurrentParagraph(); + // mark default alignment + LyXAlignment const default_alignment = controller().alignDefault(); - fl_set_input(dialog_->input_labelwidth, - par_->getLabelWidthString().c_str()); - setEnabled(dialog_->input_labelwidth, - (par_->getLabelWidthString() != _("Senseless with this layout!"))); - - fl_set_button(dialog_->radio_align_right, 0); - fl_set_button(dialog_->radio_align_left, 0); - fl_set_button(dialog_->radio_align_center, 0); - fl_set_button(dialog_->radio_align_block, 0); - - LyXTextClass const & tclass = textclasslist[buf->params.textclass]; - - int align = par_->getAlign(); - if (align == LYX_ALIGN_LAYOUT) - align = tclass[par_->layout()].align; - - switch (align) { - case LYX_ALIGN_RIGHT: - fl_set_button(dialog_->radio_align_right, 1); - break; - case LYX_ALIGN_LEFT: - fl_set_button(dialog_->radio_align_left, 1); - break; - case LYX_ALIGN_CENTER: - fl_set_button(dialog_->radio_align_center, 1); - break; - default: - fl_set_button(dialog_->radio_align_block, 1); - break; + string label = _("Block"); + if (default_alignment == LYX_ALIGN_BLOCK) { + label += _(" (default)"); } + fl_set_object_label(dialog_->radio_align_block, label.c_str()); + fl_set_button_shortcut(dialog_->radio_align_block, "#B", 1); - LyXAlignment alignpos = tclass[par_->layout()].alignpossible; - - setEnabled(dialog_->radio_align_block, bool(alignpos & LYX_ALIGN_BLOCK)); - setEnabled(dialog_->radio_align_center, bool(alignpos & LYX_ALIGN_CENTER)); - setEnabled(dialog_->radio_align_left, bool(alignpos & LYX_ALIGN_LEFT)); - setEnabled(dialog_->radio_align_right, bool(alignpos & LYX_ALIGN_RIGHT)); - - // no inset-text-owned paragraph may have pagebreaks - setEnabled(dialog_->check_pagebreaks_top, !par_->inInset()); - setEnabled(dialog_->check_pagebreaks_bottom, !par_->inInset()); - - fl_set_button(dialog_->check_lines_top, - par_->params().lineTop()); - fl_set_button(dialog_->check_lines_bottom, - par_->params().lineBottom()); - fl_set_button(dialog_->check_pagebreaks_top, - par_->params().pagebreakTop()); - fl_set_button(dialog_->check_pagebreaks_bottom, - par_->params().pagebreakBottom()); + label = _("Center"); + if (default_alignment == LYX_ALIGN_CENTER) { + label += _(" (default)"); + } + fl_set_object_label(dialog_->radio_align_center, label.c_str()); + fl_set_button_shortcut(dialog_->radio_align_center, "#C", 1); + + label = _("Left"); + if (default_alignment == LYX_ALIGN_LEFT) { + label += _(" (default)"); + } + fl_set_object_label(dialog_->radio_align_left, label.c_str()); + fl_set_button_shortcut(dialog_->radio_align_left, "#L", 1); + + label = _("Right"); + if (default_alignment == LYX_ALIGN_RIGHT) { + label = _(" (default)"); + } + fl_set_object_label(dialog_->radio_align_right, label.c_str()); + fl_set_button_shortcut(dialog_->radio_align_right, "#R", 1); + + // Ensure that there's no crud left on the screen from this change + // of labels. + fl_redraw_form(form()); + + LyXAlignment alignpos = controller().alignPossible(); + setEnabled(dialog_->radio_align_block, + bool(alignpos & LYX_ALIGN_BLOCK)); + setEnabled(dialog_->radio_align_center, + bool(alignpos & LYX_ALIGN_CENTER)); + setEnabled(dialog_->radio_align_left, + bool(alignpos & LYX_ALIGN_LEFT)); + setEnabled(dialog_->radio_align_right, + bool(alignpos & LYX_ALIGN_RIGHT)); + + // lines, pagebreaks and indent fl_set_button(dialog_->check_noindent, - par_->params().noindent()); + controller().params().noindent()); - int linespacing; - Spacing const space = par_->params().spacing(); + // linespacing + Spacing const space = controller().params().spacing(); + int pos; switch (space.getSpace()) { - default: linespacing = 1; break; - case Spacing::Single: linespacing = 2; break; - case Spacing::Onehalf: linespacing = 3; break; - case Spacing::Double: linespacing = 4; break; - case Spacing::Other: linespacing = 5; break; + case Spacing::Other: + pos = 5; + break; + case Spacing::Double: + pos = 4; + break; + case Spacing::Onehalf: + pos = 3; + break; + case Spacing::Single: + pos = 2; + break; + case Spacing::Default: + default: + pos = 1; + break; } + fl_set_choice(dialog_->choice_linespacing, pos); - fl_set_choice(dialog_->choice_linespacing, linespacing); - if (space.getSpace() == Spacing::Other) { - string const sp = tostr(space.getValue()); - fl_set_input(dialog_->input_linespacing, sp.c_str()); - setEnabled(dialog_->input_linespacing, true); + bool const spacing_other = space.getSpace() == Spacing::Other; + setEnabled(dialog_->input_linespacing, spacing_other); + if (spacing_other) { + fl_set_input(dialog_->input_linespacing, + space.getValueAsString().c_str()); } else { fl_set_input(dialog_->input_linespacing, ""); - setEnabled(dialog_->input_linespacing, false); } - fl_set_input (dialog_->input_space_above, ""); - - setEnabled(dialog_->input_space_above, false); - setEnabled(dialog_->choice_value_space_above, false); - switch (par_->params().spaceTop().kind()) { - case VSpace::NONE: - fl_set_choice (dialog_->choice_space_above, 1); - break; - case VSpace::DEFSKIP: - fl_set_choice (dialog_->choice_space_above, 2); - break; - case VSpace::SMALLSKIP: - fl_set_choice (dialog_->choice_space_above, 3); - break; - case VSpace::MEDSKIP: - fl_set_choice (dialog_->choice_space_above, 4); - break; - case VSpace::BIGSKIP: - fl_set_choice (dialog_->choice_space_above, 5); - break; - case VSpace::VFILL: - fl_set_choice (dialog_->choice_space_above, 6); - break; - case VSpace::LENGTH: { - fl_set_choice (dialog_->choice_space_above, 7); - setEnabled(dialog_->input_space_above, true); - setEnabled(dialog_->choice_value_space_above, true); - bool const metric = lyxrc.default_papersize > 3; - string const default_unit = metric ? "cm" : "in"; - string const length = par_->params().spaceTop().length().asString(); - updateWidgetsFromLengthString(dialog_->input_space_above, - dialog_->choice_value_space_above, - length, default_unit); - break; - } - } - - fl_set_button (dialog_->check_space_above, - par_->params().spaceTop().keep()); - fl_set_input (dialog_->input_space_below, ""); - - setEnabled(dialog_->input_space_below, false); - setEnabled(dialog_->choice_value_space_below, false); - switch (par_->params().spaceBottom().kind()) { - case VSpace::NONE: - fl_set_choice(dialog_->choice_space_below, 1); - break; - case VSpace::DEFSKIP: - fl_set_choice(dialog_->choice_space_below, 2); - break; - case VSpace::SMALLSKIP: - fl_set_choice(dialog_->choice_space_below, 3); - break; - case VSpace::MEDSKIP: - fl_set_choice(dialog_->choice_space_below, 4); - break; - case VSpace::BIGSKIP: - fl_set_choice(dialog_->choice_space_below, 5); - break; - case VSpace::VFILL: - fl_set_choice(dialog_->choice_space_below, 6); - break; - case VSpace::LENGTH: { - fl_set_choice(dialog_->choice_space_below, 7); - setEnabled(dialog_->input_space_below, true); - setEnabled(dialog_->choice_value_space_below, true); - bool const metric = lyxrc.default_papersize > 3; - string const default_unit = metric ? "cm" : "in"; - string const length = - par_->params().spaceBottom().length().asString(); - updateWidgetsFromLengthString(dialog_->input_space_below, - dialog_->choice_value_space_below, - length, default_unit); - break; - } - } - - fl_set_button(dialog_->check_space_below, - par_->params().spaceBottom().keep()); + // no indent fl_set_button(dialog_->check_noindent, - par_->params().noindent()); + controller().params().noindent()); } -bool FormParagraph::input(FL_OBJECT * ob, long) +ButtonPolicy::SMInput FormParagraph::input(FL_OBJECT * ob, long) { - bool valid = true; - - fl_hide_object(dialog_->text_warning); - - // First check the buttons which are exclusive and you have to - // check only the actuall de/activated button. - // - // "Synchronize" the choices and input fields, making it - // impossible to commit senseless data. - - if (ob == dialog_->choice_space_above) { - if (fl_get_choice (dialog_->choice_space_above) != 7) { - fl_set_input(dialog_->input_space_above, ""); - setEnabled(dialog_->input_space_above, false); - setEnabled(dialog_->choice_value_space_above, false); - } else { - setEnabled(dialog_->input_space_above, - !lv_->buffer()->isReadonly()); - setEnabled(dialog_->choice_value_space_above, - !lv_->buffer()->isReadonly()); - bool const metric = lyxrc.default_papersize > 3; - int const default_unit = metric ? 8 : 9; - if (strip(fl_get_input(dialog_->input_space_above)).empty()) - fl_set_choice(dialog_->choice_value_space_above, default_unit); - } - } - if (ob == dialog_->choice_space_below) { - if (fl_get_choice (dialog_->choice_space_below) != 7) { - fl_set_input(dialog_->input_space_below, ""); - setEnabled(dialog_->input_space_below, false); - setEnabled(dialog_->choice_value_space_below, false); - } else { - setEnabled(dialog_->input_space_below, - !lv_->buffer()->isReadonly()); - setEnabled(dialog_->choice_value_space_below, - !lv_->buffer()->isReadonly()); - bool const metric = lyxrc.default_papersize > 3; - int const default_unit = metric ? 8 : 9; - if (strip(fl_get_input(dialog_->input_space_below)).empty()) - fl_set_choice(dialog_->choice_value_space_below, default_unit); - } - } - - // - // warnings if input is senseless - // - string input = fl_get_input(dialog_->input_space_above); - bool invalid = false; - - if (fl_get_choice(dialog_->choice_space_above) == 7) - invalid = !input.empty() && - !isValidGlueLength(input) && - !isStrDbl(input); - - input = fl_get_input(dialog_->input_space_below); - - if (fl_get_choice(dialog_->choice_space_below) == 7) - invalid = invalid || - (!input.empty() && !isValidGlueLength(input) && !isStrDbl(input)); - - if (ob == dialog_->input_space_above || ob == dialog_->input_space_below) { - if (invalid) { - fl_set_object_label(dialog_->text_warning, - _("Warning: Invalid Length (valid example: 10mm)")); - fl_show_object(dialog_->text_warning); - return false; - } else { - fl_hide_object(dialog_->text_warning); - return true; - } + // Enable input when custum length is choosen, + // disable 'keep' when no space is choosen + if (ob == dialog_->choice_linespacing) { + bool const custom_spacing = + fl_get_choice(dialog_->choice_linespacing) == 5; + setEnabled(dialog_->input_linespacing, custom_spacing); } - if (fl_get_choice (dialog_->choice_linespacing) == 5) - setEnabled(dialog_->input_linespacing, true); - else { - setEnabled(dialog_->input_linespacing, false); - fl_set_input (dialog_->input_linespacing, ""); - } - - double spacing(strToDbl(fl_get_input(dialog_->input_linespacing))); - - if (fl_get_choice(dialog_->choice_linespacing) == 5 && int(spacing) == 0) - valid = false; - - return valid; + return ButtonPolicy::SMI_VALID; } + +} // namespace frontend +} // namespace lyx