2 * \file ParagraphParameters.cpp
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"
24 #include "Paragraph.h"
26 #include "support/lstrings.h"
30 using lyx::support::rtrim;
32 using std::istringstream;
34 using std::ostringstream;
40 static char const * const string_align[] = {
41 "block", "left", "right", "center", ""
45 static int findToken(char const * const str[], string const & search_token)
47 return search_token == "default" ?
49 support::findToken(str, search_token);
53 ParagraphParameters::ParagraphParameters()
55 start_of_appendix_(false), appendix_(false),
56 align_(LYX_ALIGN_LAYOUT), depth_(0)
60 void ParagraphParameters::clear()
62 operator=(ParagraphParameters());
66 depth_type ParagraphParameters::depth() const
72 bool ParagraphParameters::sameLayout(ParagraphParameters const & pp) const
74 return align_ == pp.align_
75 && spacing_ == pp.spacing_
76 && noindent_ == pp.noindent_
77 && depth_ == pp.depth_;
81 Spacing const & ParagraphParameters::spacing() const
87 void ParagraphParameters::spacing(Spacing const & s)
93 bool ParagraphParameters::noindent() const
99 void ParagraphParameters::noindent(bool ni)
105 LyXAlignment ParagraphParameters::align() const
111 void ParagraphParameters::align(LyXAlignment la)
117 void ParagraphParameters::depth(depth_type d)
123 bool ParagraphParameters::startOfAppendix() const
125 return start_of_appendix_;
129 void ParagraphParameters::startOfAppendix(bool soa)
131 start_of_appendix_ = soa;
135 bool ParagraphParameters::appendix() const
141 void ParagraphParameters::appendix(bool a)
147 docstring const & ParagraphParameters::labelString() const
153 void ParagraphParameters::labelString(docstring const & ls)
159 docstring const & ParagraphParameters::labelWidthString() const
161 return labelwidthstring_;
165 void ParagraphParameters::labelWidthString(docstring const & lws)
167 labelwidthstring_ = lws;
171 Length const & ParagraphParameters::leftIndent() const
177 void ParagraphParameters::leftIndent(Length const & li)
183 void ParagraphParameters::read(Lexer & lex)
187 string const token = lex.getString();
192 if (token[0] != '\\') {
193 lex.pushToken(token);
197 if (token == "\\noindent") {
199 } else if (token == "\\leftindent") {
201 Length value(lex.getString());
203 } else if (token == "\\start_of_appendix") {
204 startOfAppendix(true);
205 } else if (token == "\\paragraph_spacing") {
207 string const tmp = rtrim(lex.getString());
208 if (tmp == "single") {
209 spacing(Spacing(Spacing::Single));
210 } else if (tmp == "onehalf") {
211 spacing(Spacing(Spacing::Onehalf));
212 } else if (tmp == "double") {
213 spacing(Spacing(Spacing::Double));
214 } else if (tmp == "other") {
216 spacing(Spacing(Spacing::Other,
219 lex.printError("Unknown spacing token: '$$Token'");
221 } else if (token == "\\align") {
223 int tmpret = findToken(string_align, lex.getString());
226 align(LyXAlignment(1 << tmpret));
227 } else if (token == "\\labelwidthstring") {
229 labelWidthString(lex.getDocString());
231 lex.pushToken(token);
238 void ParagraphParameters::write(ostream & os) const
240 // Maybe the paragraph has special spacing
241 spacing().writeFile(os, true);
243 // The labelwidth string used in lists.
244 if (!labelWidthString().empty())
245 os << "\\labelwidthstring "
246 << to_utf8(labelWidthString()) << '\n';
248 // Start of appendix?
249 if (startOfAppendix())
250 os << "\\start_of_appendix\n";
254 os << "\\noindent\n";
256 // Do we have a manual left indent?
257 if (!leftIndent().zero())
258 os << "\\leftindent " << leftIndent().asString() << '\n';
261 if (align() != LYX_ALIGN_LAYOUT) {
264 case LYX_ALIGN_LEFT: h = 1; break;
265 case LYX_ALIGN_RIGHT: h = 2; break;
266 case LYX_ALIGN_CENTER: h = 3; break;
267 default: h = 0; break;
269 os << "\\align " << string_align[h] << '\n';
274 void params2string(Paragraph const & par, string & data)
277 ParagraphParameters params = par.params();
279 // This needs to be done separately
280 params.labelWidthString(par.getLabelWidthString());
285 Layout_ptr const & layout = par.layout();
287 // Is alignment possible
288 os << "\\alignpossible " << layout->alignpossible << '\n';
290 /// set default alignment
291 os << "\\aligndefault " << layout->align << '\n';
293 /// paragraph is always in inset. This is redundant.
294 os << "\\ininset " << 1 << '\n';
301 bool operator==(ParagraphParameeters const & ps1,
302 ParagraphParameeters const & ps2)
305 ps1.spacing == ps2.spacing
306 && ps1.noindent == ps2.noindent
307 && ps1.align == ps2.align
308 && ps1.depth == ps2.depth
309 && ps1.start_of_appendix == ps2.start_of_appendix
310 && ps1.appendix == ps2.appendix
311 && ps1.labelstring == ps2.labelstring
312 && ps1.labelwidthstring == ps2.labelwidthstring
313 && ps1.leftindent == ps2.leftindent;