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