]> git.lyx.org Git - lyx.git/blob - src/frontends/qt4/floatplacement.C
3151a7f00851204710df233f2b66a78b130f0086
[lyx.git] / src / frontends / qt4 / floatplacement.C
1 /**
2  * \file floatplacement.C
3  * This file is part of LyX, the document processor.
4  * Licence details can be found in the file COPYING.
5  *
6  * \author Edwin Leuven
7  * \author John Levon
8  *
9  * Full author contact details are available in file CREDITS.
10  */
11
12 #include <config.h>
13
14 #include "floatplacement.h"
15 #include "qt_helpers.h"
16 //Added by qt3to4:
17 #include <QVBoxLayout>
18 #include <QHBoxLayout>
19
20 #include "insets/insetfloat.h"
21 #include "support/lstrings.h"
22
23 #include <QCheckBox>
24 #include <QLayout>
25 #include <QGroupBox>
26
27 using lyx::support::contains;
28
29 using std::string;
30
31
32 // FIXME: set disabled doesn't work properly
33 // should be fixed now (jspitzm)
34 FloatPlacement::FloatPlacement(QWidget * parent, char * name)
35         : QWidget(parent)
36 {
37         QHBoxLayout * toplayout = new QHBoxLayout(this, 11, 6);
38         layout = new QVBoxLayout(0, 0, 6);
39         QGroupBox * options = new QGroupBox(qt_("Advanced Placement Options"), this);
40
41         defaultsCB = new QCheckBox(qt_("Use &default placement"), this);
42         topCB = new QCheckBox(qt_("&Top of page"), options);
43         bottomCB = new QCheckBox(qt_("&Bottom of page"), options);
44         pageCB = new QCheckBox(qt_("&Page of floats"), options);
45         herepossiblyCB = new QCheckBox(qt_("&Here if possible"), options);
46         heredefinitelyCB = new QCheckBox(qt_("Here definitely"), options);
47         ignoreCB = new QCheckBox(qt_("&Ignore LaTeX rules"), options);
48         spanCB = 0;
49         sidewaysCB = 0;
50
51         layout->addWidget(defaultsCB);
52
53         QVBoxLayout * optlay = new QVBoxLayout(options, 10, 6);
54         optlay->addSpacing(6);
55         optlay->addWidget(topCB);
56         optlay->addWidget(bottomCB);
57         optlay->addWidget(pageCB);
58         optlay->addWidget(herepossiblyCB);
59         optlay->addWidget(heredefinitelyCB);
60         optlay->addWidget(ignoreCB);
61
62         layout->addWidget(options);
63
64         toplayout->addLayout(layout);
65
66         connect(defaultsCB, SIGNAL(toggled(bool)), options, SLOT(setDisabled(bool)));
67
68         connect(heredefinitelyCB, SIGNAL(clicked()), this, SLOT(heredefinitelyClicked()));
69         connect(topCB, SIGNAL(clicked()), this, SLOT(tbhpClicked()));
70         connect(bottomCB, SIGNAL(clicked()), this, SLOT(tbhpClicked()));
71         connect(pageCB, SIGNAL(clicked()), this, SLOT(tbhpClicked()));
72         connect(herepossiblyCB, SIGNAL(clicked()), this, SLOT(tbhpClicked()));
73         connect(defaultsCB, SIGNAL(clicked()), this, SLOT(tbhpClicked()));
74
75         connect(defaultsCB, SIGNAL(toggled(bool)), this, SLOT(changedSlot()));
76         connect(ignoreCB, SIGNAL(toggled(bool)), this, SLOT(changedSlot()));
77         connect(pageCB, SIGNAL(toggled(bool)), this, SLOT(changedSlot()));
78         connect(heredefinitelyCB, SIGNAL(toggled(bool)), this, SLOT(changedSlot()));
79         connect(herepossiblyCB, SIGNAL(toggled(bool)), this, SLOT(changedSlot()));
80         connect(bottomCB, SIGNAL(toggled(bool)), this, SLOT(changedSlot()));
81         connect(topCB, SIGNAL(toggled(bool)), this, SLOT(changedSlot()));
82 }
83
84
85 void FloatPlacement::useWide()
86 {
87         spanCB = new QCheckBox(qt_("&Span columns"), this);
88         layout->addWidget(spanCB);
89         setTabOrder(ignoreCB, spanCB);
90         connect(spanCB, SIGNAL(clicked()), this, SLOT(spanClicked()));
91         connect(spanCB, SIGNAL(toggled(bool)), this, SLOT(changedSlot()));
92 }
93
94
95 void FloatPlacement::useSideways()
96 {
97         sidewaysCB = new QCheckBox(qt_("&Rotate sideways"), this);
98         layout->addWidget(sidewaysCB);
99         setTabOrder(spanCB, sidewaysCB);
100         connect(sidewaysCB, SIGNAL(clicked()), this, SLOT(sidewaysClicked()));
101         connect(sidewaysCB, SIGNAL(toggled(bool)), this, SLOT(changedSlot()));
102 }
103
104
105 void FloatPlacement::changedSlot()
106 {
107         // emit signal
108         changed();
109 }
110
111
112 void FloatPlacement::set(string const & placement)
113 {
114         bool def_placement = false;
115         bool top = false;
116         bool bottom = false;
117         bool page = false;
118         bool here = false;
119         bool force = false;
120         bool here_definitely = false;
121
122         if (placement.empty()) {
123                 def_placement = true;
124         } else if (contains(placement, 'H')) {
125                 here_definitely = true;
126         } else {
127                 if (contains(placement, '!')) {
128                         force = true;
129                 }
130                 if (contains(placement, 't')) {
131                         top = true;
132                 }
133                 if (contains(placement, 'b')) {
134                         bottom = true;
135                 }
136                 if (contains(placement, 'p')) {
137                         page = true;
138                 }
139                 if (contains(placement, 'h')) {
140                         here = true;
141                 }
142         }
143
144         defaultsCB->setChecked(def_placement);
145         topCB->setChecked(top);
146         bottomCB->setChecked(bottom);
147         pageCB->setChecked(page);
148         herepossiblyCB->setChecked(here);
149         ignoreCB->setChecked(force);
150         ignoreCB->setEnabled(top || bottom || page || here);
151         heredefinitelyCB->setChecked(here_definitely);
152         checkAllowed();
153 }
154
155
156 void FloatPlacement::set(InsetFloatParams const & params)
157 {
158         set(params.placement);
159
160         if (params.wide) {
161                 herepossiblyCB->setChecked(false);
162                 heredefinitelyCB->setChecked(false);
163                 bottomCB->setChecked(false);
164         }
165
166         spanCB->setChecked(params.wide);
167         sidewaysCB->setChecked(params.sideways);
168         sidewaysCB->setEnabled(params.type == "figure"
169                 || params.type == "table");
170         checkAllowed();
171 }
172
173
174 string const FloatPlacement::get(bool & wide, bool & sideways) const
175 {
176         wide = spanCB->isChecked();
177         sideways = sidewaysCB->isChecked();
178
179         return get();
180 }
181
182
183 string const FloatPlacement::get() const
184 {
185         string placement;
186
187         if (defaultsCB->isChecked())
188                 return placement;
189
190         if (heredefinitelyCB->isChecked()) {
191                 placement += 'H';
192         } else {
193                 if (ignoreCB->isChecked()) {
194                         placement += '!';
195                 }
196                 if (topCB->isChecked()) {
197                         placement += 't';
198                 }
199                 if (bottomCB->isChecked()) {
200                         placement += 'b';
201                 }
202                 if (pageCB->isChecked()) {
203                         placement += 'p';
204                 }
205                 if (herepossiblyCB->isChecked()) {
206                         placement += 'h';
207                 }
208         }
209         return placement;
210 }
211
212
213 void FloatPlacement::tbhpClicked()
214 {
215         heredefinitelyCB->setChecked(false);
216         checkAllowed();
217 }
218
219
220 void FloatPlacement::heredefinitelyClicked()
221 {
222         if (heredefinitelyCB->isChecked())
223                 ignoreCB->setEnabled(false);
224
225         topCB->setChecked(false);
226         bottomCB->setChecked(false);
227         pageCB->setChecked(false);
228         herepossiblyCB->setChecked(false);
229         ignoreCB->setChecked(false);
230 }
231
232
233 void FloatPlacement::spanClicked()
234 {
235         checkAllowed();
236
237         if (!spanCB->isChecked())
238                 return;
239
240         herepossiblyCB->setChecked(false);
241         heredefinitelyCB->setChecked(false);
242         bottomCB->setChecked(false);
243 }
244
245
246 void FloatPlacement::sidewaysClicked()
247 {
248         checkAllowed();
249 }
250
251
252 void FloatPlacement::checkAllowed()
253 {
254         bool const defaults(defaultsCB->isChecked());
255         bool ignore(topCB->isChecked());
256         ignore |= bottomCB->isChecked();
257         ignore |= pageCB->isChecked();
258         ignore |= herepossiblyCB->isChecked();
259
260         // float or document dialog?
261         if (spanCB != 0) {
262                 bool const span(spanCB->isChecked());
263                 bool const sideways(sidewaysCB->isChecked());
264                 defaultsCB->setEnabled(!sideways);
265                 topCB->setEnabled(!sideways && !defaults);
266                 bottomCB->setEnabled(!sideways && !defaults && !span);
267                 pageCB->setEnabled(!sideways && !defaults);
268                 ignoreCB->setEnabled(!sideways && !defaults && ignore);
269                 herepossiblyCB->setEnabled(!sideways && !defaults && !span);
270                 heredefinitelyCB->setEnabled(!sideways && !defaults && !span);
271                 spanCB->setEnabled(!sideways);
272         } else {
273                 topCB->setEnabled(!defaults);
274                 bottomCB->setEnabled(!defaults);
275                 pageCB->setEnabled(!defaults);
276                 ignoreCB->setEnabled(!defaults && ignore);
277                 herepossiblyCB->setEnabled(!defaults);
278                 heredefinitelyCB->setEnabled(!defaults);
279         }
280 }
281
282 #include "floatplacement_moc.cpp"