]> git.lyx.org Git - lyx.git/blob - src/frontends/qt4/FloatPlacement.cpp
Fix i18n as suggested by Jürgen:
[lyx.git] / src / frontends / qt4 / FloatPlacement.cpp
1 /**
2  * \file FloatPlacement.cpp
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 using namespace std;
21 using namespace lyx::support;
22
23
24 namespace lyx {
25
26 FloatPlacement::FloatPlacement(bool show_options, QWidget * parent)
27         : QWidget(parent)
28 {
29         setupUi(this);
30
31         connect(topCB, SIGNAL(clicked()), this, SLOT(changedSlot()));
32         connect(bottomCB, SIGNAL(clicked()), this, SLOT(changedSlot()));
33         connect(pageCB, SIGNAL(clicked()), this, SLOT(changedSlot()));
34         connect(herepossiblyCB, SIGNAL(clicked()), this, SLOT(changedSlot()));
35         connect(heredefinitelyCB, SIGNAL(clicked()), this, SLOT(changedSlot()));
36         connect(ignoreCB, SIGNAL(clicked()), this, SLOT(changedSlot()));
37         connect(spanCB, SIGNAL(clicked()), this, SLOT(changedSlot()));
38         connect(sidewaysCB, SIGNAL(clicked()), this, SLOT(changedSlot()));
39
40         spanCB->setVisible(show_options);
41         sidewaysCB->setVisible(show_options);
42 }
43
44
45 docstring FloatPlacement::dialogToParams() const
46 {
47         InsetFloatParams params;
48         params.type = float_type_;
49         params.placement = get(params.wide, params.sideways);
50         return from_ascii(InsetFloat::params2string(params));
51 }
52
53
54 void FloatPlacement::useWide()
55 {
56         spanCB->show();
57 }
58
59
60 void FloatPlacement::useSideways()
61 {
62         sidewaysCB->show();
63 }
64
65
66 void FloatPlacement::set(string const & placement)
67 {
68         bool def_placement = false;
69         bool top = false;
70         bool bottom = false;
71         bool page = false;
72         bool here = false;
73         bool force = false;
74         bool here_definitely = false;
75
76         if (placement.empty()) {
77                 def_placement = true;
78         } else if (contains(placement, 'H')) {
79                 here_definitely = true;
80         } else {
81                 if (contains(placement, '!')) {
82                         force = true;
83                 }
84                 if (contains(placement, 't')) {
85                         top = true;
86                 }
87                 if (contains(placement, 'b')) {
88                         bottom = true;
89                 }
90                 if (contains(placement, 'p')) {
91                         page = true;
92                 }
93                 if (contains(placement, 'h')) {
94                         here = true;
95                 }
96         }
97
98         defaultsCB->setChecked(def_placement);
99         topCB->setChecked(top);
100         bottomCB->setChecked(bottom);
101         pageCB->setChecked(page);
102         herepossiblyCB->setChecked(here);
103         ignoreCB->setChecked(force);
104         heredefinitelyCB->setChecked(here_definitely);
105         checkAllowed();
106 }
107
108
109 void FloatPlacement::paramsToDialog(Inset const * inset)
110 {
111         InsetFloat const * fl = static_cast<InsetFloat const *>(inset);
112         InsetFloatParams const & params = fl->params();
113
114         float_type_ = params.type;
115         floatType->setText(toqstr(fl->floatName(float_type_)));
116
117         set(params.placement);
118
119         standardfloat_ = (params.type == "figure"
120                 || params.type == "table");
121
122         if (params.wide) {
123                 herepossiblyCB->setChecked(false);
124                 heredefinitelyCB->setChecked(false);
125                 bottomCB->setChecked(false);
126         }
127
128         spanCB->setChecked(params.wide);
129         sidewaysCB->setChecked(params.sideways);
130         // the package rotfloat only has *-versions for figure and table
131         spanCB->setEnabled(!params.sideways || standardfloat_);
132         checkAllowed();
133 }
134
135
136 string const FloatPlacement::get(bool & wide, bool & sideways) const
137 {
138         wide = spanCB->isChecked();
139         sideways = sidewaysCB->isChecked();
140
141         return get();
142 }
143
144
145 string const FloatPlacement::get() const
146 {
147         string placement;
148
149         if (defaultsCB->isChecked())
150                 return placement;
151
152         if (heredefinitelyCB->isChecked()) {
153                 placement += 'H';
154         } else {
155                 if (ignoreCB->isChecked()) {
156                         placement += '!';
157                 }
158                 if (topCB->isChecked()) {
159                         placement += 't';
160                 }
161                 if (bottomCB->isChecked()) {
162                         placement += 'b';
163                 }
164                 if (pageCB->isChecked()) {
165                         placement += 'p';
166                 }
167                 if (herepossiblyCB->isChecked()) {
168                         placement += 'h';
169                 }
170         }
171         return placement;
172 }
173
174
175 void FloatPlacement::on_defaultsCB_stateChanged(int state)
176 {
177         checkAllowed();
178         if (state == Qt::Checked)
179                 return;
180         if (topCB->isChecked() || bottomCB->isChecked()
181            || pageCB->isChecked() || herepossiblyCB->isChecked()
182            || heredefinitelyCB->isChecked() || ignoreCB->isChecked())
183                 changed();
184 }
185
186
187 void FloatPlacement::changedSlot()
188 {
189         checkAllowed();
190         changed();
191 }
192
193
194 void FloatPlacement::checkAllowed()
195 {
196         bool const defaults = defaultsCB->isChecked();
197         bool const ignore = topCB->isChecked() || bottomCB->isChecked()
198                       || pageCB->isChecked() || herepossiblyCB->isChecked();
199         bool const heredefinitely = heredefinitelyCB->isChecked();
200
201         // float or document dialog?
202         if (spanCB->isVisible()) {
203                 bool const span = spanCB->isChecked();
204                 bool const sideways = sidewaysCB->isChecked();
205                 defaultsCB->setEnabled(!sideways);
206                 topCB->setEnabled(!sideways && !defaults && !heredefinitely);
207                 bottomCB->setEnabled(!sideways && !defaults && !span && !heredefinitely);
208                 pageCB->setEnabled(!sideways && !defaults && !heredefinitely);
209                 herepossiblyCB->setEnabled(!sideways && !defaults && !span && !heredefinitely);
210                 heredefinitelyCB->setEnabled(!sideways && !defaults && !span);
211                 ignoreCB->setEnabled(!sideways && !defaults && ignore && !heredefinitely);
212                 spanCB->setEnabled(!sideways || standardfloat_);
213         } else {
214                 topCB->setEnabled(!defaults && !heredefinitely);
215                 bottomCB->setEnabled(!defaults && !heredefinitely);
216                 pageCB->setEnabled(!defaults && !heredefinitely);
217                 herepossiblyCB->setEnabled(!defaults && !heredefinitely);
218                 heredefinitelyCB->setEnabled(!defaults);
219                 ignoreCB->setEnabled(!defaults && ignore && !heredefinitely);
220         }
221 }
222
223 } // namespace lyx
224
225 #include "moc_FloatPlacement.cpp"