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 "tex-strings.h"
28 #include "support/lstrings.h"
32 using lyx::support::rtrim;
34 using std::istringstream;
36 using std::ostringstream;
41 int findToken(char const * const str[], string const & search_token)
43 return search_token == "default" ?
45 lyx::support::findToken(str, search_token);
51 ParagraphParameters::ParagraphParameters()
53 start_of_appendix_(false), appendix_(false),
54 align_(LYX_ALIGN_LAYOUT), depth_(0)
58 void ParagraphParameters::clear()
60 operator=(ParagraphParameters());
64 ParagraphParameters::depth_type ParagraphParameters::depth() const
70 bool ParagraphParameters::sameLayout(ParagraphParameters const & pp) const
72 return align_ == pp.align_
73 && spacing_ == pp.spacing_
74 && noindent_ == pp.noindent_
75 && depth_ == pp.depth_;
79 Spacing const & ParagraphParameters::spacing() const
85 void ParagraphParameters::spacing(Spacing const & s)
91 bool ParagraphParameters::noindent() const
97 void ParagraphParameters::noindent(bool ni)
103 LyXAlignment ParagraphParameters::align() const
109 void ParagraphParameters::align(LyXAlignment la)
115 void ParagraphParameters::depth(depth_type d)
121 bool ParagraphParameters::startOfAppendix() const
123 return start_of_appendix_;
127 void ParagraphParameters::startOfAppendix(bool soa)
129 start_of_appendix_ = soa;
133 bool ParagraphParameters::appendix() const
139 void ParagraphParameters::appendix(bool a)
145 string const & ParagraphParameters::labelString() const
151 void ParagraphParameters::labelString(string const & ls)
157 string const & ParagraphParameters::labelWidthString() const
159 return labelwidthstring_;
163 void ParagraphParameters::labelWidthString(string const & lws)
165 labelwidthstring_ = lws;
169 LyXLength const & ParagraphParameters::leftIndent() const
175 void ParagraphParameters::leftIndent(LyXLength const & li)
181 void ParagraphParameters::read(LyXLex & lex)
185 string const token = lex.getString();
190 if (token[0] != '\\') {
191 lex.pushToken(token);
195 if (token == "\\noindent") {
197 } else if (token == "\\leftindent") {
199 LyXLength value(lex.getString());
201 } else if (token == "\\start_of_appendix") {
202 startOfAppendix(true);
203 } else if (token == "\\paragraph_spacing") {
205 string const tmp = rtrim(lex.getString());
206 if (tmp == "single") {
207 spacing(Spacing(Spacing::Single));
208 } else if (tmp == "onehalf") {
209 spacing(Spacing(Spacing::Onehalf));
210 } else if (tmp == "double") {
211 spacing(Spacing(Spacing::Double));
212 } else if (tmp == "other") {
214 spacing(Spacing(Spacing::Other,
217 lex.printError("Unknown spacing token: '$$Token'");
219 } else if (token == "\\align") {
221 int tmpret = findToken(string_align, lex.getString());
224 align(LyXAlignment(1 << tmpret));
225 } else if (token == "\\labelwidthstring") {
227 labelWidthString(lex.getString());
229 lex.pushToken(token);
236 void ParagraphParameters::write(ostream & os) const
238 // Maybe the paragraph has special spacing
239 spacing().writeFile(os, true);
241 // The labelwidth string used in lists.
242 if (!labelWidthString().empty())
243 os << "\\labelwidthstring "
244 << labelWidthString() << '\n';
246 // Start of appendix?
247 if (startOfAppendix())
248 os << "\\start_of_appendix\n";
252 os << "\\noindent\n";
254 // Do we have a manual left indent?
255 if (!leftIndent().zero())
256 os << "\\leftindent " << leftIndent().asString() << '\n';
259 if (align() != LYX_ALIGN_LAYOUT) {
262 case LYX_ALIGN_LEFT: h = 1; break;
263 case LYX_ALIGN_RIGHT: h = 2; break;
264 case LYX_ALIGN_CENTER: h = 3; break;
265 default: h = 0; break;
267 os << "\\align " << string_align[h] << '\n';
272 void params2string(Paragraph const & par, string & data)
275 ParagraphParameters params = par.params();
277 // This needs to be done separately
278 params.labelWidthString(par.getLabelWidthString());
281 LyXLayout_ptr const & layout = par.layout();
282 if (params.align() == LYX_ALIGN_LAYOUT)
283 params.align(layout->align);
288 // Is alignment possible
289 os << "\\alignpossible " << layout->alignpossible << '\n';
291 /// set default alignment
292 os << "\\aligndefault " << layout->align << '\n';
294 /// paragraph is always in inset. This is redundant.
295 os << "\\ininset " << 1 << '\n';
302 bool operator==(ParagraphParameeters const & ps1,
303 ParagraphParameeters const & ps2)
306 ps1.spacing == ps2.spacing
307 && ps1.noindent == ps2.noindent
308 && ps1.align == ps2.align
309 && ps1.depth == ps2.depth
310 && ps1.start_of_appendix == ps2.start_of_appendix
311 && ps1.appendix == ps2.appendix
312 && ps1.labelstring == ps2.labelstring
313 && ps1.labelwidthstring == ps2.labelwidthstring
314 && ps1.leftindent == ps2.leftindent;