3 * This file is part of LyX, the document processor.
4 * Licence details can be found in the file COPYING.
8 * Full author contact details are available in file CREDITS.
13 // Too hard to make concept checks work with this file
14 #ifdef _GLIBCPP_CONCEPT_CHECKS
15 #undef _GLIBCPP_CONCEPT_CHECKS
19 #include "ControlFloat.h"
23 #include "insets/insetfloat.h"
25 #include "support/lstrings.h"
27 #include <libglademm.h>
33 using support::contains;
37 GFloat::GFloat(Dialog & parent)
38 : GViewCB<ControlFloat, GViewGladeB>(parent, _("Float Settings"), false)
42 void GFloat::doBuild()
44 string const gladeName = findGladeFile("float");
45 xml_ = Gnome::Glade::Xml::create(gladeName);
47 Gtk::Button * cancelbutton;
48 xml_->get_widget("Close", cancelbutton);
49 setCancel(cancelbutton);
51 xml_->get_widget("Default", defaultradio_);
52 xml_->get_widget("HereDefinitely", heredefinitelyradio_);
53 xml_->get_widget("Alternative", alternativeradio_);
54 xml_->get_widget("Top", topcheck_);
55 xml_->get_widget("Bottom", bottomcheck_);
56 xml_->get_widget("PageOfFloats", pageoffloatscheck_);
57 xml_->get_widget("HereIfPossible", hereifpossiblecheck_);
58 xml_->get_widget("IgnoreRules", ignorerulescheck_);
59 xml_->get_widget("SpanColumns", spancolumnscheck_);
60 xml_->get_widget("RotateSideways", rotatesidewayscheck_);
62 defaultradio_->signal_toggled().connect(
63 sigc::mem_fun(*this, &GFloat::apply));
64 heredefinitelyradio_->signal_toggled().connect(
65 sigc::mem_fun(*this, &GFloat::apply));
66 alternativeradio_->signal_toggled().connect(
67 sigc::mem_fun(*this, &GFloat::apply));
68 topcheck_->signal_toggled().connect(
69 sigc::mem_fun(*this, &GFloat::apply));
70 bottomcheck_->signal_toggled().connect(
71 sigc::mem_fun(*this, &GFloat::apply));
72 pageoffloatscheck_->signal_toggled().connect(
73 sigc::mem_fun(*this, &GFloat::apply));
74 hereifpossiblecheck_->signal_toggled().connect(
75 sigc::mem_fun(*this, &GFloat::apply));
76 ignorerulescheck_->signal_toggled().connect(
77 sigc::mem_fun(*this, &GFloat::apply));
78 spancolumnscheck_->signal_toggled().connect(
79 sigc::mem_fun(*this, &GFloat::apply));
80 rotatesidewayscheck_->signal_toggled().connect(
81 sigc::mem_fun(*this, &GFloat::apply));
83 bcview().addReadOnly(defaultradio_);
84 bcview().addReadOnly(heredefinitelyradio_);
85 bcview().addReadOnly(alternativeradio_);
86 bcview().addReadOnly(topcheck_);
87 bcview().addReadOnly(bottomcheck_);
88 bcview().addReadOnly(pageoffloatscheck_);
89 bcview().addReadOnly(hereifpossiblecheck_);
90 bcview().addReadOnly(ignorerulescheck_);
91 bcview().addReadOnly(spancolumnscheck_);
92 bcview().addReadOnly(rotatesidewayscheck_);
100 bc().refreshReadOnly();
102 string placement(controller().params().placement);
103 bool const wide = controller().params().wide;
104 bool const sideways = controller().params().sideways;
106 bool const here_definitely = contains(placement, 'H');
108 bool const top = contains(placement, 't');
109 bool const bottom = contains(placement, 'b');
110 bool const page = contains(placement, 'p');
111 bool const here = contains(placement, 'h');
112 bool const force = contains(placement, '!');
113 bool const alternatives = top || bottom || page || (here && !wide);
116 alternativeradio_->set_active(true);
117 } else if (here_definitely) {
118 heredefinitelyradio_->set_active(true);
120 defaultradio_->set_active(true);
122 ignorerulescheck_->set_active(force);
123 topcheck_->set_active(top);
124 bottomcheck_->set_active(bottom);
125 pageoffloatscheck_->set_active(page);
126 hereifpossiblecheck_->set_active(here);
127 spancolumnscheck_->set_active(wide);
128 rotatesidewayscheck_->set_active(sideways);
136 void GFloat::updateSensitivity()
138 bool const wide = spancolumnscheck_->get_active();
139 bool const sideways = rotatesidewayscheck_->get_active();
140 bool const sideways_possible = (controller().params().type == "figure"
141 || controller().params().type == "table");
142 bool const alternatives = alternativeradio_->get_active();
143 bool const readonly = readOnly();
145 heredefinitelyradio_->set_sensitive(!wide && !sideways && !readonly);
146 ignorerulescheck_->set_sensitive(alternatives && !sideways && !readonly);
147 topcheck_->set_sensitive(alternatives && !sideways && !readonly);
148 bottomcheck_->set_sensitive(alternatives && !sideways && !readonly);
149 pageoffloatscheck_->set_sensitive(alternatives && !sideways && !readonly);
150 hereifpossiblecheck_->set_sensitive(alternatives && !wide && !sideways && !readonly);
151 spancolumnscheck_->set_sensitive(!sideways && !readonly);
152 defaultradio_->set_sensitive(!sideways && !readonly);
153 alternativeradio_->set_sensitive(!sideways && !readonly);
154 rotatesidewayscheck_->set_sensitive(sideways_possible && !readonly);
165 bool const wide = spancolumnscheck_->get_active();
166 bool const sideways = rotatesidewayscheck_->get_active();
168 int placementmode = 0; //default
169 if (heredefinitelyradio_->get_active())
170 placementmode = 1; // "Here, definitely"
171 else if (alternativeradio_->get_active())
172 placementmode = 2; // "Alternative"
175 switch (placementmode) {
178 if (ignorerulescheck_->get_active()) {
179 // Ignore internal LaTeX rules
182 if (topcheck_->get_active()) {
186 if (bottomcheck_->get_active()) {
190 if (pageoffloatscheck_->get_active()) {
194 // ignore if wide is selected
195 if (!wide && hereifpossiblecheck_->get_active()) {
199 if (placement == "!") {
200 // ignore placement if only force is selected.
211 // default, do nothing.
215 controller().params().placement = placement;
216 controller().params().wide = wide;
217 controller().params().sideways = sideways;
219 controller().dispatchParams();
222 } // namespace frontend