X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Ffrontends%2Fxforms%2FFormFloat.C;h=c38b68a99885fef5d75cffa361477afb8262a61d;hb=37e82a546392d43f787826b85481a11f2a27af15;hp=f481a7b37b27990cbe247ff912fdf87232503e37;hpb=6fac1dc98003a6a6e02765f078b3d3426d426508;p=lyx.git diff --git a/src/frontends/xforms/FormFloat.C b/src/frontends/xforms/FormFloat.C index f481a7b37b..c38b68a998 100644 --- a/src/frontends/xforms/FormFloat.C +++ b/src/frontends/xforms/FormFloat.C @@ -1,31 +1,54 @@ /** * \file FormFloat.C - * See the file COPYING. + * This file is part of LyX, the document processor. + * Licence details can be found in the file COPYING. * * \author Lars Gullik Bjønnes - * \author Juergen Spitzmueller j.spitzmueller@gmx.de + * \author Jürgen Spitzmüller + * \author Rob Lahaye * - * Full author contact details are available in file CREDITS + * Full author contact details are available in file CREDITS. */ #include -#ifdef __GNUG__ -#pragma implementation -#endif - -#include "xformsBC.h" -#include "ControlFloat.h" #include "FormFloat.h" +#include "ControlFloat.h" #include "forms/form_float.h" -#include "support/lstrings.h" + +#include "Tooltips.h" #include "xforms_helpers.h" -#include FORMS_H_LOCATION +#include "xformsBC.h" + +#include "insets/insetfloat.h" + +#include "support/lstrings.h" + +#include "lyx_forms.h" + +using std::string; -typedef FormCB > base_class; +namespace lyx { -FormFloat::FormFloat() - : base_class(_("Float Options")) +using support::contains; + +namespace frontend { + +namespace { + +enum { + DOCUMENT_DEFAULTS, + HERE_DEFINITELY, + ALTERNATIVES +}; + +} // namespace anon + + +typedef FormController > base_class; + +FormFloat::FormFloat(Dialog & parent) + : base_class(parent, _("Float Settings")) {} @@ -34,169 +57,206 @@ void FormFloat::build() dialog_.reset(build_float(this)); // Manage the ok, apply 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_->check_default); - bc().addReadOnly(dialog_->check_top); - bc().addReadOnly(dialog_->check_bottom); - bc().addReadOnly(dialog_->check_page); - bc().addReadOnly(dialog_->check_here); - bc().addReadOnly(dialog_->check_force); - bc().addReadOnly(dialog_->check_here_definitely); - bc().addReadOnly(dialog_->check_wide); + 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_->radio_default); + bcview().addReadOnly(dialog_->radio_here_definitely); + bcview().addReadOnly(dialog_->radio_alternatives); + bcview().addReadOnly(dialog_->check_top); + bcview().addReadOnly(dialog_->check_bottom); + bcview().addReadOnly(dialog_->check_page); + bcview().addReadOnly(dialog_->check_here); + bcview().addReadOnly(dialog_->check_force); + bcview().addReadOnly(dialog_->check_wide); + bcview().addReadOnly(dialog_->check_sideways); + + placement_.init(dialog_->radio_default, DOCUMENT_DEFAULTS); + placement_.init(dialog_->radio_here_definitely, HERE_DEFINITELY); + placement_.init(dialog_->radio_alternatives, ALTERNATIVES); + + // set up the tooltips + string str = _("Use the document's default settings."); + tooltips().init(dialog_->radio_default, str); + str = _("Enforce placement of float here."); + tooltips().init(dialog_->radio_here_definitely, str); + str = _("Alternative suggestions for placement of float."); + tooltips().init(dialog_->radio_alternatives, str); + str = _("Try top of page."); + tooltips().init(dialog_->check_top, str); + str = _("Try bottom of page."); + tooltips().init(dialog_->check_bottom, str); + str = _("Put float on a separate page of floats."); + tooltips().init(dialog_->check_page, str); + str = _("Try float here."); + tooltips().init(dialog_->check_here, str); + str = _("Ignore internal settings. This is the \"!\" in LaTeX."); + tooltips().init(dialog_->check_force, str); + str = _("Span float over the columns."); + tooltips().init(dialog_->check_wide, str); + str = _("Rotate the float sideways by 90 degs."); + tooltips().init(dialog_->check_sideways, str); } void FormFloat::apply() { + bool const wide = fl_get_button(dialog_->check_wide); + bool const sideways = fl_get_button(dialog_->check_sideways); + string placement; - if (fl_get_button(dialog_->check_here_definitely)) { - placement += "H"; - } else { + switch (placement_.get()) { + case ALTERNATIVES: if (fl_get_button(dialog_->check_force)) { - placement += "!"; - } - if (fl_get_button(dialog_->check_here)) { - placement += "h"; + // Ignore internal LaTeX rules + placement += '!'; } if (fl_get_button(dialog_->check_top)) { - placement += "t"; + // Top of page + placement += 't'; } if (fl_get_button(dialog_->check_bottom)) { - placement += "b"; + // Bottom of page + placement += 'b'; } if (fl_get_button(dialog_->check_page)) { - placement += "p"; + // Page of floats + placement += 'p'; + } + // ignore if wide is selected + if (!wide && fl_get_button(dialog_->check_here)) { + // Here, if possible + placement += 'h'; + } + if (placement == "!") { + // ignore placement if only force is selected. + placement.erase(); + } + + if (placement.length() == 0) { + // none of Alternatives is selected; flip to default + placement.erase(); + placement_.set(dialog_->radio_default); + setEnabled(dialog_->check_force, false); + setEnabled(dialog_->check_top, false); + setEnabled(dialog_->check_bottom, false); + setEnabled(dialog_->check_page, false); + setEnabled(dialog_->check_here, false); } + break; + case HERE_DEFINITELY: + placement = "H"; + break; + + case DOCUMENT_DEFAULTS: + // default, do nothing. + break; } + controller().params().placement = placement; - controller().params().wide = fl_get_button(dialog_->check_wide); + controller().params().wide = wide; + controller().params().sideways = sideways; } void FormFloat::update() { - bool def_placement = false; - bool top = false; - bool bottom = false; - bool page = false; - bool here = false; - bool force = false; - bool here_definitely = false; - string placement(controller().params().placement); + bool const wide = controller().params().wide; + bool const sideways = controller().params().sideways; + bool const sideways_possible = (controller().params().type == "figure" + || controller().params().type == "table"); - if (placement.empty()) { - def_placement = true; + bool const here_definitely = contains(placement, 'H'); - } else if (contains(placement, "H")) { - here_definitely = true; + bool const top = contains(placement, 't'); + bool const bottom = contains(placement, 'b'); + bool const page = contains(placement, 'p'); + bool const here = contains(placement, 'h'); + bool const force = contains(placement, '!'); + bool const alternatives = top || bottom || page || (here && !wide); + if (alternatives) { + placement_.set(dialog_->radio_alternatives); + } else if (here_definitely) { + placement_.set(dialog_->radio_here_definitely); } else { - if (contains(placement, "!")) { - force = true; - } - if (contains(placement, "t")) { - top = true; - } - if (contains(placement, "b")) { - bottom = true; - } - if (contains(placement, "p")) { - page = true; - } - if (contains(placement, "h")) { - here = true; - } + placement_.set(dialog_->radio_default); } - fl_set_button(dialog_->check_default, def_placement); + fl_set_button(dialog_->check_force, force); fl_set_button(dialog_->check_top, top); fl_set_button(dialog_->check_bottom, bottom); fl_set_button(dialog_->check_page, page); fl_set_button(dialog_->check_here, here); - fl_set_button(dialog_->check_force, force); - fl_set_button(dialog_->check_here_definitely, here_definitely); - setEnabled(dialog_->check_here_definitely, !controller().params().wide - && !def_placement); - if (controller().params().wide) { - fl_set_button(dialog_->check_here, false); - fl_set_button(dialog_->check_bottom, false); - } - setEnabled(dialog_->check_here, !controller().params().wide && !def_placement); - setEnabled(dialog_->check_bottom, !controller().params().wide && !def_placement); - fl_set_button(dialog_->check_wide, controller().params().wide); - setEnabled(dialog_->check_top, !def_placement); - setEnabled(dialog_->check_page, !def_placement); - setEnabled(dialog_->check_force, top || bottom || page || here); + fl_set_button(dialog_->check_wide, wide); + fl_set_button(dialog_->check_sideways, sideways); + + setEnabled(dialog_->radio_here_definitely, !wide && !sideways); + setEnabled(dialog_->check_force, alternatives && !sideways); + setEnabled(dialog_->check_top, alternatives && !sideways); + setEnabled(dialog_->check_bottom, alternatives && !sideways); + setEnabled(dialog_->check_page, alternatives && !sideways); + setEnabled(dialog_->check_here, alternatives && !wide && !sideways); + setEnabled(dialog_->check_wide, !sideways); + setEnabled(dialog_->radio_default, !sideways); + setEnabled(dialog_->radio_alternatives, !sideways); + setEnabled(dialog_->check_sideways, sideways_possible); } ButtonPolicy::SMInput FormFloat::input(FL_OBJECT * ob, long) { - bool const def_place = fl_get_button(dialog_->check_default); - bool const wide_float = fl_get_button(dialog_->check_wide); - // with wide floats, h[ere] is not allowed - // b[ottom] is allowed (only) for figure* in multicolumn, don't - // disallow it therefore - bool const wide_options = (fl_get_button(dialog_->check_top) - || fl_get_button(dialog_->check_bottom) - || fl_get_button(dialog_->check_page)); - // The !-option is only allowed together with h, t, b, or p - // We have to take this into account - bool const standard_options = (wide_options || fl_get_button(dialog_->check_here)); - - if (ob == dialog_->check_default) { - if (def_place) { - fl_set_button(dialog_->check_top, false); - fl_set_button(dialog_->check_bottom, false); - fl_set_button(dialog_->check_page, false); - fl_set_button(dialog_->check_here, false); - fl_set_button(dialog_->check_force, false); - fl_set_button(dialog_->check_here_definitely, false); - } - setEnabled(dialog_->check_top, !def_place); - setEnabled(dialog_->check_bottom, !def_place); - setEnabled(dialog_->check_page, !def_place); - setEnabled(dialog_->check_here, !def_place && !wide_float); - setEnabled(dialog_->check_force, !def_place && standard_options); - setEnabled(dialog_->check_here_definitely, !def_place && !wide_float); + bool const alternatives = placement_.get() == ALTERNATIVES; + bool const wide = fl_get_button(dialog_->check_wide); + bool const sideways = fl_get_button(dialog_->check_sideways); + + if (ob == dialog_->radio_default || + ob == dialog_->radio_here_definitely || + ob == dialog_->radio_alternatives) { + // enable check buttons only for Alternatives + setEnabled(dialog_->check_top, alternatives); + setEnabled(dialog_->check_page, alternatives); + // wide float doesn't allow 'here' or 'bottom' placement + setEnabled(dialog_->check_here, alternatives && !wide); + setEnabled(dialog_->check_bottom, alternatives && !wide); } else if (ob == dialog_->check_wide) { - if (wide_float) { - fl_set_button(dialog_->check_here_definitely, false); - fl_set_button(dialog_->check_here, false); - if (!wide_options) { - fl_set_button(dialog_->check_force, false); - setEnabled(dialog_->check_force, false); - } - } - setEnabled(dialog_->check_here, !def_place && !wide_float); - setEnabled(dialog_->check_force, !def_place && wide_options); - setEnabled(dialog_->check_here_definitely, !def_place && !wide_float); - - } else if (ob == dialog_->check_here_definitely) { - if (fl_get_button(dialog_->check_here_definitely)) { - fl_set_button(dialog_->check_top, false); - fl_set_button(dialog_->check_bottom, false); - fl_set_button(dialog_->check_page, false); - fl_set_button(dialog_->check_here, false); - fl_set_button(dialog_->check_force, false); - setEnabled(dialog_->check_force, false); + if (wide && placement_.get() == HERE_DEFINITELY) { + // wide float doesn't allow 'Here, definitely!' + // placement + placement_.set(dialog_->radio_default); } + setEnabled(dialog_->check_here, alternatives && !wide); + setEnabled(dialog_->radio_here_definitely, !wide); + setEnabled(dialog_->check_bottom, alternatives && !wide); - } else if (ob == dialog_->check_here || ob == dialog_->check_top - || ob == dialog_->check_bottom || ob == dialog_->check_page) { - if (!standard_options) - fl_set_button(dialog_->check_force, false); - else - fl_set_button(dialog_->check_here_definitely, false); - setEnabled(dialog_->check_force, standard_options); - + } else if (ob == dialog_->check_sideways) { + setEnabled(dialog_->radio_default, !sideways); + setEnabled(dialog_->radio_alternatives, !sideways); + setEnabled(dialog_->radio_here_definitely, !wide && !sideways); + setEnabled(dialog_->check_top, alternatives && !sideways); + setEnabled(dialog_->check_bottom, + alternatives && !wide && !sideways); + setEnabled(dialog_->check_page, alternatives && !sideways); + setEnabled(dialog_->check_here, alternatives && !wide && !sideways); + setEnabled(dialog_->check_wide, !sideways); } + // enable force button, if Alternatives is selected and at least + // one of its check buttons + bool const enable_force = alternatives && !sideways && + (fl_get_button(dialog_->check_top) || + fl_get_button(dialog_->check_bottom) || + fl_get_button(dialog_->check_page) || + (fl_get_button(dialog_->check_here) && !wide)); + setEnabled(dialog_->check_force, enable_force); + return ButtonPolicy::SMI_VALID; } + +} // namespace frontend +} // namespace lyx