2 * \file floatplacement.C
3 * This file is part of LyX, the document processor.
4 * Licence details can be found in the file COPYING.
9 * Full author contact details are available in file CREDITS.
14 #include "floatplacement.h"
15 #include "qt_helpers.h"
17 #include <QVBoxLayout>
18 #include <QHBoxLayout>
20 #include "insets/insetfloat.h"
21 #include "support/lstrings.h"
27 using lyx::support::contains;
32 // FIXME: set disabled doesn't work properly
33 // should be fixed now (jspitzm)
34 FloatPlacement::FloatPlacement(QWidget * parent)
37 QHBoxLayout * toplayout = new QHBoxLayout(this);
38 toplayout->setMargin(11);
39 toplayout->setSpacing(6);
41 layout = new QVBoxLayout(0);
43 layout->setSpacing(6);
45 QGroupBox * options = new QGroupBox(qt_("Advanced Placement Options"), this);
47 defaultsCB = new QCheckBox(qt_("Use &default placement"), this);
48 topCB = new QCheckBox(qt_("&Top of page"), options);
49 bottomCB = new QCheckBox(qt_("&Bottom of page"), options);
50 pageCB = new QCheckBox(qt_("&Page of floats"), options);
51 herepossiblyCB = new QCheckBox(qt_("&Here if possible"), options);
52 heredefinitelyCB = new QCheckBox(qt_("Here definitely"), options);
53 ignoreCB = new QCheckBox(qt_("&Ignore LaTeX rules"), options);
57 layout->addWidget(defaultsCB);
59 QVBoxLayout * optlay = new QVBoxLayout(options);
60 optlay->setMargin(10);
61 optlay->setSpacing(6);
63 optlay->addSpacing(6);
64 optlay->addWidget(topCB);
65 optlay->addWidget(bottomCB);
66 optlay->addWidget(pageCB);
67 optlay->addWidget(herepossiblyCB);
68 optlay->addWidget(heredefinitelyCB);
69 optlay->addWidget(ignoreCB);
71 layout->addWidget(options);
73 toplayout->addLayout(layout);
75 connect(defaultsCB, SIGNAL(toggled(bool)), options, SLOT(setDisabled(bool)));
77 connect(heredefinitelyCB, SIGNAL(clicked()), this, SLOT(heredefinitelyClicked()));
78 connect(topCB, SIGNAL(clicked()), this, SLOT(tbhpClicked()));
79 connect(bottomCB, SIGNAL(clicked()), this, SLOT(tbhpClicked()));
80 connect(pageCB, SIGNAL(clicked()), this, SLOT(tbhpClicked()));
81 connect(herepossiblyCB, SIGNAL(clicked()), this, SLOT(tbhpClicked()));
82 connect(defaultsCB, SIGNAL(clicked()), this, SLOT(tbhpClicked()));
84 connect(defaultsCB, SIGNAL(toggled(bool)), this, SLOT(changedSlot()));
85 connect(ignoreCB, SIGNAL(toggled(bool)), this, SLOT(changedSlot()));
86 connect(pageCB, SIGNAL(toggled(bool)), this, SLOT(changedSlot()));
87 connect(heredefinitelyCB, SIGNAL(toggled(bool)), this, SLOT(changedSlot()));
88 connect(herepossiblyCB, SIGNAL(toggled(bool)), this, SLOT(changedSlot()));
89 connect(bottomCB, SIGNAL(toggled(bool)), this, SLOT(changedSlot()));
90 connect(topCB, SIGNAL(toggled(bool)), this, SLOT(changedSlot()));
94 void FloatPlacement::useWide()
96 spanCB = new QCheckBox(qt_("&Span columns"), this);
97 layout->addWidget(spanCB);
98 setTabOrder(ignoreCB, spanCB);
99 connect(spanCB, SIGNAL(clicked()), this, SLOT(spanClicked()));
100 connect(spanCB, SIGNAL(toggled(bool)), this, SLOT(changedSlot()));
104 void FloatPlacement::useSideways()
106 sidewaysCB = new QCheckBox(qt_("&Rotate sideways"), this);
107 layout->addWidget(sidewaysCB);
108 setTabOrder(spanCB, sidewaysCB);
109 connect(sidewaysCB, SIGNAL(clicked()), this, SLOT(sidewaysClicked()));
110 connect(sidewaysCB, SIGNAL(toggled(bool)), this, SLOT(changedSlot()));
114 void FloatPlacement::changedSlot()
121 void FloatPlacement::set(string const & placement)
123 bool def_placement = false;
129 bool here_definitely = false;
131 if (placement.empty()) {
132 def_placement = true;
133 } else if (contains(placement, 'H')) {
134 here_definitely = true;
136 if (contains(placement, '!')) {
139 if (contains(placement, 't')) {
142 if (contains(placement, 'b')) {
145 if (contains(placement, 'p')) {
148 if (contains(placement, 'h')) {
153 defaultsCB->setChecked(def_placement);
154 topCB->setChecked(top);
155 bottomCB->setChecked(bottom);
156 pageCB->setChecked(page);
157 herepossiblyCB->setChecked(here);
158 ignoreCB->setChecked(force);
159 ignoreCB->setEnabled(top || bottom || page || here);
160 heredefinitelyCB->setChecked(here_definitely);
165 void FloatPlacement::set(InsetFloatParams const & params)
167 set(params.placement);
170 herepossiblyCB->setChecked(false);
171 heredefinitelyCB->setChecked(false);
172 bottomCB->setChecked(false);
175 spanCB->setChecked(params.wide);
176 sidewaysCB->setChecked(params.sideways);
177 sidewaysCB->setEnabled(params.type == "figure"
178 || params.type == "table");
183 string const FloatPlacement::get(bool & wide, bool & sideways) const
185 wide = spanCB->isChecked();
186 sideways = sidewaysCB->isChecked();
192 string const FloatPlacement::get() const
196 if (defaultsCB->isChecked())
199 if (heredefinitelyCB->isChecked()) {
202 if (ignoreCB->isChecked()) {
205 if (topCB->isChecked()) {
208 if (bottomCB->isChecked()) {
211 if (pageCB->isChecked()) {
214 if (herepossiblyCB->isChecked()) {
222 void FloatPlacement::tbhpClicked()
224 heredefinitelyCB->setChecked(false);
229 void FloatPlacement::heredefinitelyClicked()
231 if (heredefinitelyCB->isChecked())
232 ignoreCB->setEnabled(false);
234 topCB->setChecked(false);
235 bottomCB->setChecked(false);
236 pageCB->setChecked(false);
237 herepossiblyCB->setChecked(false);
238 ignoreCB->setChecked(false);
242 void FloatPlacement::spanClicked()
246 if (!spanCB->isChecked())
249 herepossiblyCB->setChecked(false);
250 heredefinitelyCB->setChecked(false);
251 bottomCB->setChecked(false);
255 void FloatPlacement::sidewaysClicked()
261 void FloatPlacement::checkAllowed()
263 bool const defaults(defaultsCB->isChecked());
264 bool ignore(topCB->isChecked());
265 ignore |= bottomCB->isChecked();
266 ignore |= pageCB->isChecked();
267 ignore |= herepossiblyCB->isChecked();
269 // float or document dialog?
271 bool const span(spanCB->isChecked());
272 bool const sideways(sidewaysCB->isChecked());
273 defaultsCB->setEnabled(!sideways);
274 topCB->setEnabled(!sideways && !defaults);
275 bottomCB->setEnabled(!sideways && !defaults && !span);
276 pageCB->setEnabled(!sideways && !defaults);
277 ignoreCB->setEnabled(!sideways && !defaults && ignore);
278 herepossiblyCB->setEnabled(!sideways && !defaults && !span);
279 heredefinitelyCB->setEnabled(!sideways && !defaults && !span);
280 spanCB->setEnabled(!sideways);
282 topCB->setEnabled(!defaults);
283 bottomCB->setEnabled(!defaults);
284 pageCB->setEnabled(!defaults);
285 ignoreCB->setEnabled(!defaults && ignore);
286 herepossiblyCB->setEnabled(!defaults);
287 heredefinitelyCB->setEnabled(!defaults);
291 #include "floatplacement_moc.cpp"