X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Ffrontends%2Fxforms%2FFormVSpace.C;h=0df4171318a063df41e775ab37d651e06c756cde;hb=37e82a546392d43f787826b85481a11f2a27af15;hp=59b7e1f50845819caf6106214f0cf8e70eb2ce1a;hpb=7de76711b14a4c0bcdf5770885be8efc59cac264;p=lyx.git diff --git a/src/frontends/xforms/FormVSpace.C b/src/frontends/xforms/FormVSpace.C index 59b7e1f508..0df4171318 100644 --- a/src/frontends/xforms/FormVSpace.C +++ b/src/frontends/xforms/FormVSpace.C @@ -33,16 +33,22 @@ #include "lyx_forms.h" -using lyx::support::contains_functor; -using lyx::support::getStringFromVector; -using lyx::support::rtrim; +#include + +using boost::bind; -using std::bind2nd; using std::remove_if; using std::vector; using std::string; +namespace lyx { + +using support::contains; +using support::getStringFromVector; +using support::rtrim; + +namespace frontend { namespace { @@ -54,83 +60,91 @@ void validateVSpaceWidgets(FL_OBJECT * choice_type, FL_OBJECT * input_length) BOOST_ASSERT(choice_type && choice_type->objclass == FL_CHOICE && input_length && input_length->objclass == FL_INPUT); - if (fl_get_choice(choice_type) != 7) + if (fl_get_choice(choice_type) != 6) return; // If a vspace kind is "Length" but there's no text in - // the input field, reset the kind to "None". + // the input field, insert nothing. string const input = rtrim(getString(input_length)); if (input.empty()) - fl_set_choice(choice_type, 1); + return; } VSpace const setVSpaceFromWidgets(FL_OBJECT * choice_type, FL_OBJECT * input_length, - FL_OBJECT * choice_length) + FL_OBJECT * choice_length, + bool keep) { // Paranoia check! BOOST_ASSERT(choice_type && choice_type->objclass == FL_CHOICE && input_length && input_length->objclass == FL_INPUT && choice_length && choice_length->objclass == FL_CHOICE); + VSpace space; + switch (fl_get_choice(choice_type)) { case 1: - return VSpace(VSpace::NONE); + space = VSpace(VSpace::DEFSKIP); + break; case 2: - return VSpace(VSpace::DEFSKIP); + space = VSpace(VSpace::SMALLSKIP); + break; case 3: - return VSpace(VSpace::SMALLSKIP); + space = VSpace(VSpace::MEDSKIP); + break; case 4: - return VSpace(VSpace::MEDSKIP); + space = VSpace(VSpace::BIGSKIP); + break; case 5: - return VSpace(VSpace::BIGSKIP); + space = VSpace(VSpace::VFILL); + break; case 6: - return VSpace(VSpace::VFILL); - case 7: - return VSpace(LyXGlueLength( - getLengthFromWidgets(input_length, choice_length))); + space = VSpace(LyXGlueLength( + getLengthFromWidgets(input_length, choice_length))); + break; } - return VSpace(VSpace::NONE); + space.setKeep(keep); + return space; } void setWidgetsFromVSpace(VSpace const & space, FL_OBJECT * choice_type, FL_OBJECT * input_length, - FL_OBJECT * choice_length) + FL_OBJECT * choice_length, + FL_OBJECT * check_keep) { // Paranoia check! BOOST_ASSERT(choice_type && choice_type->objclass == FL_CHOICE && input_length && input_length->objclass == FL_INPUT && - choice_length && choice_length->objclass == FL_CHOICE); + choice_length && choice_length->objclass == FL_CHOICE && + check_keep && check_keep->objclass == FL_CHECKBUTTON); int pos = 1; switch (space.kind()) { - case VSpace::NONE: - pos = 1; - break; case VSpace::DEFSKIP: - pos = 2; + pos = 1; break; case VSpace::SMALLSKIP: - pos = 3; + pos = 2; break; case VSpace::MEDSKIP: - pos = 4; + pos = 3; break; case VSpace::BIGSKIP: - pos = 5; + pos = 4; break; case VSpace::VFILL: - pos = 6; + pos = 5; break; case VSpace::LENGTH: - pos = 7; + pos = 6; break; } fl_set_choice(choice_type, pos); + fl_set_button(check_keep, space.keep()); bool const custom_vspace = space.kind() == VSpace::LENGTH; if (custom_vspace) { @@ -167,22 +181,28 @@ void FormVSpace::build() // disable for read-only documents bcview().addReadOnly(dialog_->choice_space); bcview().addReadOnly(dialog_->input_space); + bcview().addReadOnly(dialog_->choice_unit_space); - // check validity of "length + unit" input + // check validity of "length + unit" input. + // If invalid, the label of input_space is displayed in red. addCheckedGlueLength(bcview(), dialog_->input_space, - dialog_->choice_space); + dialog_->input_space); // trigger an input event for cut&paste with middle mouse button. setPrehandler(dialog_->input_space); fl_set_input_return(dialog_->input_space, FL_RETURN_CHANGED); + string const spacing = + _("DefSkip|SmallSkip|MedSkip|BigSkip|VFill|Length"); + fl_addto_choice(dialog_->choice_space, spacing.c_str()); + // Create the contents of the unit choices; don't include the "%" terms. vector units_vec = getLatexUnits(); vector::iterator del = remove_if(units_vec.begin(), units_vec.end(), - bind2nd(contains_functor(), "%")); + bind(contains, _1, '%')); units_vec.erase(del, units_vec.end()); string const units = getStringFromVector(units_vec, "|"); @@ -212,18 +232,15 @@ void FormVSpace::build() void FormVSpace::apply() { - if (!form()) - return; - - // spacing // If a vspace choice is "Length" but there's no text in - // the input field, reset the choice to "None". + // the input field, insert nothing. validateVSpaceWidgets(dialog_->choice_space, dialog_->input_space); VSpace const space = setVSpaceFromWidgets(dialog_->choice_space, dialog_->input_space, - dialog_->choice_unit_space); + dialog_->choice_unit_space, + fl_get_button(dialog_->check_keep)); controller().params() = space; } @@ -234,18 +251,28 @@ void FormVSpace::update() setWidgetsFromVSpace(controller().params(), dialog_->choice_space, dialog_->input_space, - dialog_->choice_unit_space); + dialog_->choice_unit_space, + dialog_->check_keep); + bool const custom_length = + fl_get_choice(dialog_->choice_space) == 6; + setEnabled(dialog_->input_space, custom_length); + setEnabled(dialog_->choice_unit_space, custom_length); } ButtonPolicy::SMInput FormVSpace::input(FL_OBJECT * ob, long) { - // Enable input when custum length is choosen, - // disable 'keep' when no space is choosen + // Enable input when custom length is chosen, + // disable 'keep' when no space is chosen if (ob == dialog_->choice_space) { bool const custom_length = - fl_get_choice(dialog_->choice_space) == 7; + fl_get_choice(dialog_->choice_space) == 6; + setEnabled(dialog_->input_space, custom_length); + setEnabled(dialog_->choice_unit_space, custom_length); } return ButtonPolicy::SMI_VALID; } + +} // namespace frontend +} // namespace lyx