/**
* \file FormFloat.C
- * Copyright 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 Lars Gullik Bjønnes, larsbj@lyx.org
- * \author Juergen Spitzmueller j.spitzmueller@gmx.de
+ * \author Lars Gullik Bjønnes
+ * \author Jürgen Spitzmüller
+ * \author Rob Lahaye
+ *
+ * Full author contact details are available in file CREDITS.
*/
#include <config.h>
-#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"
-typedef FormCB<ControlFloat, FormDB<FD_float> > base_class;
+#include "lyx_forms.h"
-FormFloat::FormFloat(ControlFloat & c, Dialogs & d)
- : base_class(c, d, _("Float Options"))
+using lyx::support::contains;
+
+using std::string;
+
+
+namespace {
+
+enum {
+ DOCUMENT_DEFAULTS,
+ HERE_DEFINITELY,
+ ALTERNATIVES
+};
+
+} // namespace anon
+
+
+typedef FormController<ControlFloat, FormView<FD_float> > base_class;
+
+FormFloat::FormFloat(Dialog & parent)
+ : base_class(parent, _("Float Settings"))
{}
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);
+
+ 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);
}
void FormFloat::apply()
{
+ bool const wide = fl_get_button(dialog_->check_wide);
+
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;
}
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;
- 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);
+
+ setEnabled(dialog_->radio_here_definitely, !wide);
+ setEnabled(dialog_->check_force, alternatives);
+ setEnabled(dialog_->check_top, alternatives);
+ setEnabled(dialog_->check_bottom, alternatives);
+ setEnabled(dialog_->check_page, alternatives);
+ setEnabled(dialog_->check_here, alternatives && !wide);
}
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);
+
+ 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_bottom, alternatives);
+ setEnabled(dialog_->check_page, alternatives);
+ // wide float doesn't allow 'here' placement
+ setEnabled(dialog_->check_here, 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);
- }
+ if (wide && placement_.get() == HERE_DEFINITELY) {
+ // wide float doesn't allow 'Here, definitely!'
+ // placement
+ placement_.set(dialog_->radio_default);
}
- 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);
- }
-
- } 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);
-
+ setEnabled(dialog_->check_here, alternatives && !wide);
+ setEnabled(dialog_->radio_here_definitely, !wide);
}
+ // enable force button, if Alternatives is selected and at least
+ // one of its check buttons
+ bool const enable_force = alternatives &&
+ (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;
}