2 * \file ParagraphParameters.C
3 * This file is part of LyX, the document processor.
4 * Licence details can be found in the file COPYING.
6 * \author Lars Gullik Bjønnes
7 * \author Angus Leeming
10 * \author Jürgen Vigna
12 * Full author contact details are available in file CREDITS.
17 #include "ParagraphParameters.h"
20 #include "BufferView.h"
22 #include "lyxlayout.h"
25 #include "paragraph.h"
26 #include "ParameterStruct.h"
27 #include "tex-strings.h"
29 #include "frontends/LyXView.h"
31 #include "support/lstrings.h"
32 #include "support/std_sstream.h"
34 using lyx::support::rtrim;
36 using std::istringstream;
38 using std::ostringstream;
42 // Initialize static member var.
43 ShareContainer<ParameterStruct> ParagraphParameters::container;
45 ParagraphParameters::ParagraphParameters()
52 void ParagraphParameters::clear()
54 ParameterStruct tmp(*param);
55 tmp.spacing.set(Spacing::Default);
56 tmp.align = LYX_ALIGN_LAYOUT;
59 tmp.labelstring.erase();
60 tmp.labelwidthstring.erase();
61 tmp.start_of_appendix = false;
66 ParagraphParameters::depth_type ParagraphParameters::depth() const
72 bool ParagraphParameters::sameLayout(ParagraphParameters const & pp) const
74 return param->align == pp.param->align &&
75 param->spacing == pp.param->spacing &&
76 param->noindent == pp.param->noindent &&
77 param->depth == pp.param->depth;
81 void ParagraphParameters::set_from_struct(ParameterStruct const & ps)
83 // get new param from container with tmp as template
84 param = container.get(ps);
88 Spacing const & ParagraphParameters::spacing() const
90 return param->spacing;
94 void ParagraphParameters::spacing(Spacing const & s)
96 ParameterStruct tmp(*param);
102 bool ParagraphParameters::noindent() const
104 return param->noindent;
108 void ParagraphParameters::noindent(bool ni)
110 ParameterStruct tmp(*param);
112 set_from_struct(tmp);
116 LyXAlignment ParagraphParameters::align() const
122 void ParagraphParameters::align(LyXAlignment la)
124 ParameterStruct tmp(*param);
126 set_from_struct(tmp);
130 void ParagraphParameters::depth(depth_type d)
132 ParameterStruct tmp(*param);
134 set_from_struct(tmp);
138 bool ParagraphParameters::startOfAppendix() const
140 return param->start_of_appendix;
144 void ParagraphParameters::startOfAppendix(bool soa)
146 ParameterStruct tmp(*param);
147 tmp.start_of_appendix = soa;
148 set_from_struct(tmp);
152 bool ParagraphParameters::appendix() const
154 return param->appendix;
158 void ParagraphParameters::appendix(bool a)
160 ParameterStruct tmp(*param);
162 set_from_struct(tmp);
166 string const & ParagraphParameters::labelString() const
168 return param->labelstring;
172 void ParagraphParameters::labelString(string const & ls)
174 ParameterStruct tmp(*param);
175 tmp.labelstring = ls;
176 set_from_struct(tmp);
180 string const & ParagraphParameters::labelWidthString() const
182 return param->labelwidthstring;
186 void ParagraphParameters::labelWidthString(string const & lws)
188 ParameterStruct tmp(*param);
189 tmp.labelwidthstring = lws;
190 set_from_struct(tmp);
194 LyXLength const & ParagraphParameters::leftIndent() const
196 return param->leftindent;
200 void ParagraphParameters::leftIndent(LyXLength const & li)
202 ParameterStruct tmp(*param);
204 set_from_struct(tmp);
208 void ParagraphParameters::read(LyXLex & lex)
212 string const token = lex.getString();
217 if (token[0] != '\\') {
218 lex.pushToken(token);
222 if (token == "\\noindent") {
224 } else if (token == "\\leftindent") {
226 LyXLength value(lex.getString());
228 } else if (token == "\\start_of_appendix") {
229 startOfAppendix(true);
230 } else if (token == "\\paragraph_spacing") {
232 string const tmp = rtrim(lex.getString());
233 if (tmp == "single") {
234 spacing(Spacing(Spacing::Single));
235 } else if (tmp == "onehalf") {
236 spacing(Spacing(Spacing::Onehalf));
237 } else if (tmp == "double") {
238 spacing(Spacing(Spacing::Double));
239 } else if (tmp == "other") {
241 spacing(Spacing(Spacing::Other,
244 lex.printError("Unknown spacing token: '$$Token'");
246 } else if (token == "\\align") {
247 int tmpret = lex.findToken(string_align);
250 align(LyXAlignment(1 << tmpret));
251 } else if (token == "\\labelwidthstring") {
253 labelWidthString(lex.getString());
255 lex.pushToken(token);
262 void ParagraphParameters::write(ostream & os) const
264 // Maybe the paragraph has special spacing
265 spacing().writeFile(os, true);
267 // The labelwidth string used in lists.
268 if (!labelWidthString().empty())
269 os << "\\labelwidthstring "
270 << labelWidthString() << '\n';
272 // Start of appendix?
273 if (startOfAppendix())
274 os << "\\start_of_appendix ";
280 // Do we have a manual left indent?
281 if (!leftIndent().zero())
282 os << "\\leftindent " << leftIndent().asString()
286 if (align() != LYX_ALIGN_LAYOUT) {
289 case LYX_ALIGN_LEFT: h = 1; break;
290 case LYX_ALIGN_RIGHT: h = 2; break;
291 case LYX_ALIGN_CENTER: h = 3; break;
292 default: h = 0; break;
294 os << "\\align " << string_align[h] << ' ';
299 void setParagraphParams(BufferView & bv, string const & data)
301 istringstream is(data);
305 ParagraphParameters params;
308 LyXText * text = bv.getLyXText();
312 params.labelWidthString(),
316 bv.owner()->message(_("Paragraph layout set"));
320 void params2string(Paragraph const & par, string & data)
323 ParagraphParameters params = par.params();
325 // This needs to be done separately
326 params.labelWidthString(par.getLabelWidthString());
329 LyXLayout_ptr const & layout = par.layout();
330 if (params.align() == LYX_ALIGN_LAYOUT)
331 params.align(layout->align);
336 // Is alignment possible
337 os << '\n' << "\\alignpossible " << layout->alignpossible << '\n';
339 /// set default alignment
340 os << "\\aligndefault " << layout->align << '\n';
342 /// is paragraph in inset
343 os << "\\ininset " << (par.inInset()?1:0) << '\n';