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.
18 #include "floatplacement.h"
19 #include "qt_helpers.h"
21 #include <QVBoxLayout>
22 #include <QHBoxLayout>
24 #include "insets/insetfloat.h"
25 #include "support/lstrings.h"
31 using lyx::support::contains;
36 // FIXME: set disabled doesn't work properly
37 // should be fixed now (jspitzm)
38 FloatPlacement::FloatPlacement(QWidget * parent)
41 QHBoxLayout * toplayout = new QHBoxLayout(this, 11, 6);
42 layout = new QVBoxLayout(0, 0, 6);
43 QGroupBox * options = new QGroupBox(qt_("Advanced Placement Options"), this);
45 defaultsCB = new QCheckBox(qt_("Use &default placement"), this);
46 topCB = new QCheckBox(qt_("&Top of page"), options);
47 bottomCB = new QCheckBox(qt_("&Bottom of page"), options);
48 pageCB = new QCheckBox(qt_("&Page of floats"), options);
49 herepossiblyCB = new QCheckBox(qt_("&Here if possible"), options);
50 heredefinitelyCB = new QCheckBox(qt_("Here definitely"), options);
51 ignoreCB = new QCheckBox(qt_("&Ignore LaTeX rules"), options);
55 layout->addWidget(defaultsCB);
57 QVBoxLayout * optlay = new QVBoxLayout(options, 10, 6);
58 optlay->addSpacing(6);
59 optlay->addWidget(topCB);
60 optlay->addWidget(bottomCB);
61 optlay->addWidget(pageCB);
62 optlay->addWidget(herepossiblyCB);
63 optlay->addWidget(heredefinitelyCB);
64 optlay->addWidget(ignoreCB);
66 layout->addWidget(options);
68 toplayout->addLayout(layout);
70 connect(defaultsCB, SIGNAL(toggled(bool)), options, SLOT(setDisabled(bool)));
72 connect(heredefinitelyCB, SIGNAL(clicked()), this, SLOT(heredefinitelyClicked()));
73 connect(topCB, SIGNAL(clicked()), this, SLOT(tbhpClicked()));
74 connect(bottomCB, SIGNAL(clicked()), this, SLOT(tbhpClicked()));
75 connect(pageCB, SIGNAL(clicked()), this, SLOT(tbhpClicked()));
76 connect(herepossiblyCB, SIGNAL(clicked()), this, SLOT(tbhpClicked()));
77 connect(defaultsCB, SIGNAL(clicked()), this, SLOT(tbhpClicked()));
79 connect(defaultsCB, SIGNAL(toggled(bool)), this, SLOT(changedSlot()));
80 connect(ignoreCB, SIGNAL(toggled(bool)), this, SLOT(changedSlot()));
81 connect(pageCB, SIGNAL(toggled(bool)), this, SLOT(changedSlot()));
82 connect(heredefinitelyCB, SIGNAL(toggled(bool)), this, SLOT(changedSlot()));
83 connect(herepossiblyCB, SIGNAL(toggled(bool)), this, SLOT(changedSlot()));
84 connect(bottomCB, SIGNAL(toggled(bool)), this, SLOT(changedSlot()));
85 connect(topCB, SIGNAL(toggled(bool)), this, SLOT(changedSlot()));
89 void FloatPlacement::useWide()
91 spanCB = new QCheckBox(qt_("&Span columns"), this);
92 layout->addWidget(spanCB);
93 setTabOrder(ignoreCB, spanCB);
94 connect(spanCB, SIGNAL(clicked()), this, SLOT(spanClicked()));
95 connect(spanCB, SIGNAL(toggled(bool)), this, SLOT(changedSlot()));
99 void FloatPlacement::useSideways()
101 sidewaysCB = new QCheckBox(qt_("&Rotate sideways"), this);
102 layout->addWidget(sidewaysCB);
103 setTabOrder(spanCB, sidewaysCB);
104 connect(sidewaysCB, SIGNAL(clicked()), this, SLOT(sidewaysClicked()));
105 connect(sidewaysCB, SIGNAL(toggled(bool)), this, SLOT(changedSlot()));
109 void FloatPlacement::changedSlot()
116 void FloatPlacement::set(string const & placement)
118 bool def_placement = false;
124 bool here_definitely = false;
126 if (placement.empty()) {
127 def_placement = true;
128 } else if (contains(placement, 'H')) {
129 here_definitely = true;
131 if (contains(placement, '!')) {
134 if (contains(placement, 't')) {
137 if (contains(placement, 'b')) {
140 if (contains(placement, 'p')) {
143 if (contains(placement, 'h')) {
148 defaultsCB->setChecked(def_placement);
149 topCB->setChecked(top);
150 bottomCB->setChecked(bottom);
151 pageCB->setChecked(page);
152 herepossiblyCB->setChecked(here);
153 ignoreCB->setChecked(force);
154 ignoreCB->setEnabled(top || bottom || page || here);
155 heredefinitelyCB->setChecked(here_definitely);
160 void FloatPlacement::set(InsetFloatParams const & params)
162 set(params.placement);
165 herepossiblyCB->setChecked(false);
166 heredefinitelyCB->setChecked(false);
167 bottomCB->setChecked(false);
170 spanCB->setChecked(params.wide);
171 sidewaysCB->setChecked(params.sideways);
172 sidewaysCB->setEnabled(params.type == "figure"
173 || params.type == "table");
178 string const FloatPlacement::get(bool & wide, bool & sideways) const
180 wide = spanCB->isChecked();
181 sideways = sidewaysCB->isChecked();
187 string const FloatPlacement::get() const
191 if (defaultsCB->isChecked())
194 if (heredefinitelyCB->isChecked()) {
197 if (ignoreCB->isChecked()) {
200 if (topCB->isChecked()) {
203 if (bottomCB->isChecked()) {
206 if (pageCB->isChecked()) {
209 if (herepossiblyCB->isChecked()) {
217 void FloatPlacement::tbhpClicked()
219 heredefinitelyCB->setChecked(false);
224 void FloatPlacement::heredefinitelyClicked()
226 if (heredefinitelyCB->isChecked())
227 ignoreCB->setEnabled(false);
229 topCB->setChecked(false);
230 bottomCB->setChecked(false);
231 pageCB->setChecked(false);
232 herepossiblyCB->setChecked(false);
233 ignoreCB->setChecked(false);
237 void FloatPlacement::spanClicked()
241 if (!spanCB->isChecked())
244 herepossiblyCB->setChecked(false);
245 heredefinitelyCB->setChecked(false);
246 bottomCB->setChecked(false);
250 void FloatPlacement::sidewaysClicked()
256 void FloatPlacement::checkAllowed()
258 bool const defaults(defaultsCB->isChecked());
259 bool ignore(topCB->isChecked());
260 ignore |= bottomCB->isChecked();
261 ignore |= pageCB->isChecked();
262 ignore |= herepossiblyCB->isChecked();
264 // float or document dialog?
266 bool const span(spanCB->isChecked());
267 bool const sideways(sidewaysCB->isChecked());
268 defaultsCB->setEnabled(!sideways);
269 topCB->setEnabled(!sideways && !defaults);
270 bottomCB->setEnabled(!sideways && !defaults && !span);
271 pageCB->setEnabled(!sideways && !defaults);
272 ignoreCB->setEnabled(!sideways && !defaults && ignore);
273 herepossiblyCB->setEnabled(!sideways && !defaults && !span);
274 heredefinitelyCB->setEnabled(!sideways && !defaults && !span);
275 spanCB->setEnabled(!sideways);
277 topCB->setEnabled(!defaults);
278 bottomCB->setEnabled(!defaults);
279 pageCB->setEnabled(!defaults);
280 ignoreCB->setEnabled(!defaults && ignore);
281 herepossiblyCB->setEnabled(!defaults);
282 heredefinitelyCB->setEnabled(!defaults);
286 #include "floatplacement_moc.cpp"