3 * This file is part of LyX, the document processor.
4 * Licence details can be found in the file COPYING.
6 * \author Jürgen Spitzmüller
8 * Full author contact details are available in file CREDITS.
13 #include "GuiHSpace.h"
15 #include "LengthCombo.h"
16 #include "qt_helpers.h"
17 #include "Validator.h"
21 #include "FuncRequest.h"
23 #include "insets/InsetSpace.h"
25 #include "support/gettext.h"
26 #include "support/lstrings.h"
30 #include <QPushButton>
38 GuiHSpace::GuiHSpace(GuiView & lv, bool math)
39 : GuiDialog(lv, math ? "mathspace" : "space", qt_("Horizontal Space Settings"))
44 connect(okPB, SIGNAL(clicked()), this, SLOT(slotOK()));
45 connect(applyPB, SIGNAL(clicked()), this, SLOT(slotApply()));
46 connect(closePB, SIGNAL(clicked()), this, SLOT(slotClose()));
48 connect(spacingCO, SIGNAL(highlighted(QString)),
49 this, SLOT(change_adaptor()));
50 connect(valueLE, SIGNAL(textChanged(QString)),
51 this, SLOT(change_adaptor()));
52 connect(spacingCO, SIGNAL(activated(int)),
53 this, SLOT(enableWidgets(int)));
54 connect(keepCB, SIGNAL(clicked()),
55 this, SLOT(change_adaptor()));
56 connect(unitCO, SIGNAL(selectionChanged(lyx::Length::UNIT)),
57 this, SLOT(change_adaptor()));
58 connect(fillPatternCO, SIGNAL(activated(int)),
59 this, SLOT(patternChanged()));
61 valueLE->setValidator(unsignedLengthValidator(valueLE));
63 // Manage the ok, apply, restore and cancel/close buttons
64 bc().setPolicy(ButtonPolicy::OkApplyCancelReadOnlyPolicy);
66 bc().setApply(applyPB);
67 bc().setCancel(closePB);
69 // disable for read-only documents
70 bc().addReadOnly(spacingCO);
71 bc().addReadOnly(valueLE);
72 bc().addReadOnly(unitCO);
73 bc().addReadOnly(keepCB);
74 bc().addReadOnly(fillPatternCO);
76 // initialize the length validator
77 bc().addCheckedLineEdit(valueLE, valueL);
79 // remove the %-items from the unit choice
84 void GuiHSpace::change_adaptor()
90 void GuiHSpace::setMath(bool custom)
92 valueLE->setEnabled(custom);
93 unitCO->setEnabled(custom);
94 fillPatternCO->setEnabled(false);
95 keepCB->setToolTip(qt_("Insert the spacing even after a line break"));
96 keepCB->setEnabled(false);
100 void GuiHSpace::enableWidgets(int selection)
103 setMath(selection == 9);
107 valueLE->setEnabled(selection == 7);
108 unitCO->setEnabled(selection == 7);
109 fillPatternCO->setEnabled(selection == 6);
110 int pattern = fillPatternCO->currentIndex();
111 bool const enable_keep =
112 selection == 0 || selection == 3 ||
113 (selection == 6 && pattern == 0) || selection == 7;
114 keepCB->setEnabled(enable_keep);
116 keepCB->setToolTip(qt_("Insert the spacing even after a line break.\n"
117 "Note that a protected Half Quad will be turned into\n"
118 "a vertical space if used at the beginning of a paragraph!"));
120 keepCB->setToolTip(qt_("Insert the spacing even after a line break"));
125 void GuiHSpace::patternChanged()
127 enableWidgets(spacingCO->currentIndex());
132 static void setWidgetsFromHSpace(InsetSpaceParams const & params,
137 QComboBox * fillPattern)
141 spacing->addItem(qt_("Thin space"));
142 spacing->addItem(qt_("Medium space"));
143 spacing->addItem(qt_("Thick space"));
144 spacing->addItem(qt_("Negative thin space"));
145 spacing->addItem(qt_("Negative medium space"));
146 spacing->addItem(qt_("Negative thick space"));
147 spacing->addItem(qt_("Half Quad (0.5 em)"));
148 spacing->addItem(qt_("Quad (1 em)"));
149 spacing->addItem(qt_("Double Quad (2 em)"));
150 spacing->addItem(qt_("Custom"));
151 keep->setEnabled(false);
152 fillPattern->setEnabled(false);
154 spacing->addItem(qt_("Inter-word space"));
155 spacing->addItem(qt_("Thin space"));
156 spacing->addItem(qt_("Negative thin space"));
157 spacing->addItem(qt_("Half Quad (0.5 em)"));
158 spacing->addItem(qt_("Quad (1 em)"));
159 spacing->addItem(qt_("Double Quad (2 em)"));
160 spacing->addItem(qt_("Horizontal Fill"));
161 spacing->addItem(qt_("Custom"));
162 keep->setEnabled(true);
163 fillPattern->setEnabled(true);
168 bool protect = false;
169 switch (params.kind) {
170 case InsetSpaceParams::NORMAL:
173 case InsetSpaceParams::PROTECTED:
175 protect = !params.math;
177 case InsetSpaceParams::THIN:
178 item = params.math ? 0 : 1;
180 case InsetSpaceParams::MEDIUM:
183 case InsetSpaceParams::THICK:
184 item = params.math ? 2 : 1;
186 case InsetSpaceParams::NEGTHIN:
187 item = params.math ? 3 : 2;
189 case InsetSpaceParams::NEGMEDIUM:
190 item = params.math ? 4 : 2;
192 case InsetSpaceParams::NEGTHICK:
193 item = params.math ? 5 : 2;
195 case InsetSpaceParams::ENSKIP:
196 item = params.math ? 6 : 3;
198 case InsetSpaceParams::ENSPACE:
199 item = params.math ? 6 : 3;
200 protect = !params.math;
202 case InsetSpaceParams::QUAD:
203 item = params.math ? 7 : 4;
205 case InsetSpaceParams::QQUAD:
206 item = params.math ? 8 : 5;
208 case InsetSpaceParams::HFILL:
209 item = params.math ? 3 : 6;
211 case InsetSpaceParams::HFILL_PROTECTED:
212 item = params.math ? 3 : 6;
213 protect = !params.math;
215 case InsetSpaceParams::DOTFILL:
216 item = params.math ? 3 : 6;
219 case InsetSpaceParams::HRULEFILL:
220 item = params.math ? 3 : 6;
223 case InsetSpaceParams::LEFTARROWFILL:
224 item = params.math ? 3 : 6;
227 case InsetSpaceParams::RIGHTARROWFILL:
228 item = params.math ? 3 : 6;
231 case InsetSpaceParams::UPBRACEFILL:
232 item = params.math ? 3 : 6;
235 case InsetSpaceParams::DOWNBRACEFILL:
236 item = params.math ? 3 : 6;
239 case InsetSpaceParams::CUSTOM:
240 item = params.math ? 9 : 7;
242 case InsetSpaceParams::CUSTOM_PROTECTED:
243 item = params.math ? 9 : 7;
244 protect = !params.math;
247 spacing->setCurrentIndex(item);
248 fillPattern->setCurrentIndex(pattern);
249 keep->setChecked(protect);
251 Length::UNIT default_unit =
252 (lyxrc.default_papersize > 3) ? Length::CM : Length::IN;
253 if (item == (params.math ? 9 : 7))
254 lengthToWidgets(value, unit, params.length, default_unit);
256 lengthToWidgets(value, unit, "", default_unit);
260 static InsetSpaceParams setHSpaceFromWidgets(int spacing,
261 QLineEdit * value, LengthCombo * unit, bool keep, int fill, bool math)
263 InsetSpaceParams params(math);
266 case 0: params.kind = InsetSpaceParams::THIN; break;
267 case 1: params.kind = InsetSpaceParams::MEDIUM; break;
268 case 2: params.kind = InsetSpaceParams::THICK; break;
269 case 3: params.kind = InsetSpaceParams::NEGTHIN; break;
270 case 4: params.kind = InsetSpaceParams::NEGMEDIUM; break;
271 case 5: params.kind = InsetSpaceParams::NEGTHICK; break;
272 case 6: params.kind = InsetSpaceParams::ENSKIP; break;
273 case 7: params.kind = InsetSpaceParams::QUAD; break;
274 case 8: params.kind = InsetSpaceParams::QQUAD; break;
276 params.kind = InsetSpaceParams::CUSTOM;
277 params.length = Length(widgetsToLength(value, unit));
286 params.kind = InsetSpaceParams::PROTECTED;
288 params.kind = InsetSpaceParams::NORMAL;
291 params.kind = InsetSpaceParams::THIN;
294 params.kind = InsetSpaceParams::NEGTHIN;
298 params.kind = InsetSpaceParams::ENSPACE;
300 params.kind = InsetSpaceParams::ENSKIP;
303 params.kind = InsetSpaceParams::QUAD;
306 params.kind = InsetSpaceParams::QQUAD;
310 params.kind = InsetSpaceParams::DOTFILL;
312 params.kind = InsetSpaceParams::HRULEFILL;
314 params.kind = InsetSpaceParams::LEFTARROWFILL;
316 params.kind = InsetSpaceParams::RIGHTARROWFILL;
318 params.kind = InsetSpaceParams::UPBRACEFILL;
320 params.kind = InsetSpaceParams::DOWNBRACEFILL;
322 params.kind = InsetSpaceParams::HFILL_PROTECTED;
324 params.kind = InsetSpaceParams::HFILL;
328 params.kind = InsetSpaceParams::CUSTOM_PROTECTED;
330 params.kind = InsetSpaceParams::CUSTOM;
331 params.length = Length(widgetsToLength(value, unit));
338 void GuiHSpace::applyView()
340 params_ = setHSpaceFromWidgets(spacingCO->currentIndex(),
341 valueLE, unitCO, keepCB->isChecked(),
342 fillPatternCO->currentIndex(), params_.math);
346 void GuiHSpace::updateContents()
348 setWidgetsFromHSpace(params_, spacingCO, valueLE, unitCO, keepCB,
350 enableWidgets(spacingCO->currentIndex());
354 bool GuiHSpace::initialiseParams(string const & data)
356 bool const math = params_.math;
357 InsetSpace::string2params(data, params_);
360 setMath(params_.kind == InsetSpaceParams::CUSTOM);
361 setButtonsValid(true);
366 void GuiHSpace::clearParams()
368 params_ = InsetSpaceParams(params_.math);
372 void GuiHSpace::dispatchParams()
374 dispatch(FuncRequest(getLfun(), InsetSpace::params2string(params_)));
378 bool GuiHSpace::isValid()
380 return spacingCO->currentIndex() != (params_.math ? 9 : 7)
381 || !valueLE->text().isEmpty();
385 Dialog * createGuiMathHSpace(GuiView & lv) { return new GuiHSpace(lv, true); }
388 Dialog * createGuiTextHSpace(GuiView & lv) { return new GuiHSpace(lv, false); }
391 } // namespace frontend
395 #include "moc_GuiHSpace.cpp"