2 * \file GuiParagraph.cpp
3 * This file is part of LyX, the document processor.
4 * Licence details can be found in the file COPYING.
8 * \author Abdelrazak Younes
9 * \author Angus Leeming
11 * Full author contact details are available in file CREDITS.
16 #include "GuiParagraph.h"
18 #include "qt_helpers.h"
21 #include "BufferParams.h"
22 #include "BufferView.h"
24 #include "FuncRequest.h"
27 #include "Paragraph.h"
28 #include "ParagraphParameters.h"
31 #include "support/debug.h"
32 #include "support/gettext.h"
36 #include <QPushButton>
45 GuiParagraph::GuiParagraph(GuiView & lv)
46 : DialogView(lv, "paragraph", qt_("Paragraph Settings"))
50 connect(alignDefaultRB, SIGNAL(clicked()), this, SLOT(changed()));
51 connect(alignJustRB, SIGNAL(clicked()), this, SLOT(changed()));
52 connect(alignLeftRB, SIGNAL(clicked()), this, SLOT(changed()));
53 connect(alignRightRB, SIGNAL(clicked()), this, SLOT(changed()));
54 connect(alignCenterRB, SIGNAL(clicked()), this, SLOT(changed()));
55 connect(linespacing, SIGNAL(activated(int)), this, SLOT(changed()));
56 connect(linespacingValue, SIGNAL(textChanged(QString)),
57 this, SLOT(changed()));
58 connect(indentCB, SIGNAL(clicked()), this, SLOT(changed()));
59 connect(labelWidth, SIGNAL(textChanged(QString)),
60 this, SLOT(changed()));
63 // On Mac it's common to have tool windows which are always in the
64 // foreground and are hidden when the main window is not focused.
65 setWindowFlags(Qt::Tool);
66 synchronizedViewCB->setChecked(true);
68 synchronizedViewCB->setChecked(false);
71 on_synchronizedViewCB_toggled();
72 linespacingValue->setValidator(new QDoubleValidator(linespacingValue));
74 labelWidth->setWhatsThis(qt_(
75 "As described in the User Guide, the width of"
76 " this text determines the width of the label part"
77 " of each item in environments like List and"
80 " Normally, you won't need to set this,"
81 " since the largest label width of all the"
85 radioMap_[LYX_ALIGN_LAYOUT] = alignDefaultRB;
86 radioMap_[LYX_ALIGN_BLOCK] = alignJustRB;
87 radioMap_[LYX_ALIGN_LEFT] = alignLeftRB;
88 radioMap_[LYX_ALIGN_RIGHT] = alignRightRB;
89 radioMap_[LYX_ALIGN_CENTER] = alignCenterRB;
91 alignDefaultLabel_ = alignDefaultRB->text();
95 void GuiParagraph::on_linespacing_activated(int index)
97 linespacingValue->setEnabled(index == 4);
101 void GuiParagraph::checkAlignmentRadioButtons()
103 static std::map<LyXAlignment, QString> labelMap_;
104 if (labelMap_.empty()) {
105 labelMap_[LYX_ALIGN_BLOCK] = qt_("Justified");
106 labelMap_[LYX_ALIGN_LEFT] = qt_("Left");
107 labelMap_[LYX_ALIGN_RIGHT] = qt_("Right");
108 labelMap_[LYX_ALIGN_CENTER] = qt_("Center");
111 RadioMap::iterator it = radioMap_.begin();
112 for (; it != radioMap_.end(); ++it) {
113 LyXAlignment const align = it->first;
114 it->second->setEnabled(align & alignPossible());
116 if (haveMultiParSelection())
117 alignDefaultRB->setText(alignDefaultLabel_);
119 alignDefaultRB->setText(alignDefaultLabel_ + " ("
120 + labelMap_[alignDefault()] + ")");
124 void GuiParagraph::alignmentToRadioButtons(LyXAlignment align)
126 RadioMap::const_iterator it = radioMap_.begin();
127 for (;it != radioMap_.end(); ++it) {
128 it->second->blockSignals(true);
129 it->second->setChecked(align == it->first);
130 it->second->blockSignals(false);
135 LyXAlignment GuiParagraph::getAlignmentFromDialog()
137 LyXAlignment alignment = LYX_ALIGN_NONE;
138 RadioMap::const_iterator it = radioMap_.begin();
139 for (; it != radioMap_.end(); ++it) {
140 if (it->second->isChecked()) {
141 alignment = it->first;
149 void GuiParagraph::on_synchronizedViewCB_toggled()
151 bool in_sync = synchronizedViewCB->isChecked();
152 restorePB->setEnabled(!in_sync);
153 applyPB->setEnabled(!in_sync);
157 void GuiParagraph::changed()
159 if (synchronizedViewCB->isChecked())
160 on_applyPB_clicked();
164 void GuiParagraph::on_applyPB_clicked()
166 ParagraphParameters & pp = params();
168 pp.align(getAlignmentFromDialog());
171 Spacing::Space ls = Spacing::Default;
173 switch (linespacing->currentIndex()) {
175 ls = Spacing::Default;
178 ls = Spacing::Single;
181 ls = Spacing::Onehalf;
184 ls = Spacing::Double;
188 other = fromqstr(linespacingValue->text());
192 Spacing const spacing(ls, other);
196 pp.labelWidthString(qstring_to_ucs4(labelWidth->text()));
198 pp.noindent(!indentCB->isChecked());
204 void GuiParagraph::on_restorePB_clicked()
210 void GuiParagraph::updateView()
212 on_synchronizedViewCB_toggled();
214 ParagraphParameters const & pp = params();
217 docstring const & labelwidth = pp.labelWidthString();
218 // FIXME We should not compare translated strings
219 if (labelwidth != _("Senseless with this layout!")) {
220 labelwidthGB->setEnabled(true);
221 labelWidth->setText(toqstr(labelwidth));
223 labelwidthGB->setEnabled(false);
224 labelWidth->setText(QString());
228 checkAlignmentRadioButtons();
229 alignmentToRadioButtons(pp.align());
232 bool const canindent = canIndent();
233 indentCB->setEnabled(canindent);
234 indentCB->setChecked(canindent && !pp.noindent());
238 Spacing const & space = pp.spacing();
239 switch (space.getSpace()) {
240 case Spacing::Single:
243 case Spacing::Onehalf:
246 case Spacing::Double:
256 linespacing->setCurrentIndex(ls);
257 if (space.getSpace() == Spacing::Other) {
258 linespacingValue->setText(toqstr(space.getValueAsString()));
259 linespacingValue->setEnabled(true);
261 linespacingValue->setText(QString());
262 linespacingValue->setEnabled(false);
267 void GuiParagraph::enableView(bool enable)
269 indentCB->setEnabled(enable);
270 linespacing->setEnabled(enable);
271 labelWidth->setEnabled(enable);
272 synchronizedViewCB->setEnabled(enable);
273 applyPB->setEnabled(enable);
274 restorePB->setEnabled(enable);
276 synchronizedViewCB->setChecked(true);
277 RadioMap::const_iterator it = radioMap_.begin();
278 for (; it != radioMap_.end(); ++it)
279 it->second->setEnabled(enable);
283 ParagraphParameters & GuiParagraph::params()
285 if (haveMultiParSelection()) {
286 multiparsel_ = ParagraphParameters();
287 // FIXME: It would be nice to initialise the parameters that
288 // are common to all paragraphs.
292 return bufferview()->cursor().innerParagraph().params();
296 ParagraphParameters const & GuiParagraph::params() const
298 return bufferview()->cursor().innerParagraph().params();
302 void GuiParagraph::dispatchParams()
304 if (haveMultiParSelection()) {
306 multiparsel_.write(data);
307 FuncRequest const fr(getLfun(), data.str());
312 bufferview()->updateMetrics();
313 bufferview()->buffer().changed();
317 bool GuiParagraph::haveMultiParSelection()
319 Cursor cur = bufferview()->cursor();
320 return cur.selection() && cur.selBegin().pit() != cur.selEnd().pit();
324 bool GuiParagraph::canIndent() const
326 return buffer().params().paragraph_separation
327 == BufferParams::ParagraphIndentSeparation;
331 LyXAlignment GuiParagraph::alignPossible() const
333 return bufferview()->cursor().innerParagraph().layout().alignpossible;
337 LyXAlignment GuiParagraph::alignDefault() const
339 return bufferview()->cursor().innerParagraph().layout().align;
343 Dialog * createGuiParagraph(GuiView & lv)
345 return new GuiParagraph(lv);
349 } // namespace frontend
352 #include "GuiParagraph_moc.cpp"