]> git.lyx.org Git - lyx.git/blob - src/frontends/qt4/floatplacement.C
resolve last occurrence of QT3_SUPPORT
[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)
35         : QWidget(parent)
36 {
37         QHBoxLayout * toplayout = new QHBoxLayout(this);
38         toplayout->setMargin(11);
39         toplayout->setSpacing(6);
40
41         layout = new QVBoxLayout(0);
42         layout->setMargin(0);
43         layout->setSpacing(6);
44
45         QGroupBox * options = new QGroupBox(qt_("Advanced Placement Options"), this);
46
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);
54         spanCB = 0;
55         sidewaysCB = 0;
56
57         layout->addWidget(defaultsCB);
58
59         QVBoxLayout * optlay = new QVBoxLayout(options);
60         optlay->setMargin(10);
61         optlay->setSpacing(6);
62
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);
70
71         layout->addWidget(options);
72
73         toplayout->addLayout(layout);
74
75         connect(defaultsCB, SIGNAL(toggled(bool)), options, SLOT(setDisabled(bool)));
76
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()));
83
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()));
91 }
92
93
94 void FloatPlacement::useWide()
95 {
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()));
101 }
102
103
104 void FloatPlacement::useSideways()
105 {
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()));
111 }
112
113
114 void FloatPlacement::changedSlot()
115 {
116         // emit signal
117         changed();
118 }
119
120
121 void FloatPlacement::set(string const & placement)
122 {
123         bool def_placement = false;
124         bool top = false;
125         bool bottom = false;
126         bool page = false;
127         bool here = false;
128         bool force = false;
129         bool here_definitely = false;
130
131         if (placement.empty()) {
132                 def_placement = true;
133         } else if (contains(placement, 'H')) {
134                 here_definitely = true;
135         } else {
136                 if (contains(placement, '!')) {
137                         force = true;
138                 }
139                 if (contains(placement, 't')) {
140                         top = true;
141                 }
142                 if (contains(placement, 'b')) {
143                         bottom = true;
144                 }
145                 if (contains(placement, 'p')) {
146                         page = true;
147                 }
148                 if (contains(placement, 'h')) {
149                         here = true;
150                 }
151         }
152
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);
161         checkAllowed();
162 }
163
164
165 void FloatPlacement::set(InsetFloatParams const & params)
166 {
167         set(params.placement);
168
169         if (params.wide) {
170                 herepossiblyCB->setChecked(false);
171                 heredefinitelyCB->setChecked(false);
172                 bottomCB->setChecked(false);
173         }
174
175         spanCB->setChecked(params.wide);
176         sidewaysCB->setChecked(params.sideways);
177         sidewaysCB->setEnabled(params.type == "figure"
178                 || params.type == "table");
179         checkAllowed();
180 }
181
182
183 string const FloatPlacement::get(bool & wide, bool & sideways) const
184 {
185         wide = spanCB->isChecked();
186         sideways = sidewaysCB->isChecked();
187
188         return get();
189 }
190
191
192 string const FloatPlacement::get() const
193 {
194         string placement;
195
196         if (defaultsCB->isChecked())
197                 return placement;
198
199         if (heredefinitelyCB->isChecked()) {
200                 placement += 'H';
201         } else {
202                 if (ignoreCB->isChecked()) {
203                         placement += '!';
204                 }
205                 if (topCB->isChecked()) {
206                         placement += 't';
207                 }
208                 if (bottomCB->isChecked()) {
209                         placement += 'b';
210                 }
211                 if (pageCB->isChecked()) {
212                         placement += 'p';
213                 }
214                 if (herepossiblyCB->isChecked()) {
215                         placement += 'h';
216                 }
217         }
218         return placement;
219 }
220
221
222 void FloatPlacement::tbhpClicked()
223 {
224         heredefinitelyCB->setChecked(false);
225         checkAllowed();
226 }
227
228
229 void FloatPlacement::heredefinitelyClicked()
230 {
231         if (heredefinitelyCB->isChecked())
232                 ignoreCB->setEnabled(false);
233
234         topCB->setChecked(false);
235         bottomCB->setChecked(false);
236         pageCB->setChecked(false);
237         herepossiblyCB->setChecked(false);
238         ignoreCB->setChecked(false);
239 }
240
241
242 void FloatPlacement::spanClicked()
243 {
244         checkAllowed();
245
246         if (!spanCB->isChecked())
247                 return;
248
249         herepossiblyCB->setChecked(false);
250         heredefinitelyCB->setChecked(false);
251         bottomCB->setChecked(false);
252 }
253
254
255 void FloatPlacement::sidewaysClicked()
256 {
257         checkAllowed();
258 }
259
260
261 void FloatPlacement::checkAllowed()
262 {
263         bool const defaults(defaultsCB->isChecked());
264         bool ignore(topCB->isChecked());
265         ignore |= bottomCB->isChecked();
266         ignore |= pageCB->isChecked();
267         ignore |= herepossiblyCB->isChecked();
268
269         // float or document dialog?
270         if (spanCB != 0) {
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);
281         } else {
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);
288         }
289 }
290
291 #include "floatplacement_moc.cpp"