X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FParagraphParameters.C;h=0ac99a7850f501428d2a71d8ce868acc8155b094;hb=b01a9dc187d9cd396a57463ad27511379dcdc9cd;hp=8f73b952d166a15e6286e30bb1decefaf3ddf994;hpb=b17500c1c47d7bdd4508743c27fb72f0e57a5105;p=lyx.git diff --git a/src/ParagraphParameters.C b/src/ParagraphParameters.C index 8f73b952d1..0ac99a7850 100644 --- a/src/ParagraphParameters.C +++ b/src/ParagraphParameters.C @@ -1,380 +1,317 @@ +/** + * \file ParagraphParameters.C + * This file is part of LyX, the document processor. + * Licence details can be found in the file COPYING. + * + * \author Lars Gullik Bjønnes + * \author Angus Leeming + * \author John Levon + * \author André Pönitz + * \author Jürgen Vigna + * + * Full author contact details are available in file CREDITS. + */ #include #include "ParagraphParameters.h" -#include "ParameterStruct.h" -// Initialize static member var. -ShareContainer ParagraphParameters::container; +#include "buffer.h" +#include "gettext.h" +#include "lyxlayout.h" +#include "lyxlex.h" +#include "lyxtext.h" +#include "paragraph.h" +#include "tex-strings.h" -ParagraphParameters::ParagraphParameters() -{ - ParameterStruct tmp; - tmp.appendix = false; - tmp.align = LYX_ALIGN_BLOCK; +#include "support/lstrings.h" - set_from_struct(tmp); -} +#include +namespace lyx { -void ParagraphParameters::clear() -{ - ParameterStruct tmp(*param); - tmp.line_top = false; - tmp.line_bottom = false; - tmp.pagebreak_top = false; - tmp.pagebreak_bottom = false; - tmp.added_space_top = VSpace(VSpace::NONE); - tmp.added_space_bottom = VSpace(VSpace::NONE); - tmp.spacing.set(Spacing::Default); - tmp.align = LYX_ALIGN_LAYOUT; - tmp.depth = 0; - tmp.noindent = false; - tmp.labelstring.erase(); - tmp.labelwidthstring.erase(); - tmp.start_of_appendix = false; -#ifndef NO_PEXTRA_REALLY - //tmp.pextra_type = PEXTRA_NONE; - tmp.pextra_type = 0; - tmp.pextra_width.erase(); - tmp.pextra_widthp.erase(); - //tmp.pextra_alignment = MINIPAGE_ALIGN_TOP; - tmp.pextra_alignment = 0; - tmp.pextra_hfill = false; - tmp.pextra_start_minipage = false; -#endif - set_from_struct(tmp); -} +using support::rtrim; +using std::istringstream; +using std::ostream; +using std::ostringstream; +using std::string; -bool ParagraphParameters::sameLayout(ParagraphParameters const & pp) const -{ - return param->align == pp.param->align && - param->line_bottom == pp.param->line_bottom && - param->pagebreak_bottom == pp.param->pagebreak_bottom && - param->added_space_bottom == pp.param->added_space_bottom && - - param->line_top == pp.param->line_top && - param->pagebreak_top == pp.param->pagebreak_top && - param->added_space_top == pp.param->added_space_top && -#ifndef NO_PEXTRA_REALLY - param->spacing == pp.param->spacing && - param->pextra_type == pp.param->pextra_type && - param->pextra_width == pp.param->pextra_width && - param->pextra_widthp == pp.param->pextra_widthp && - param->pextra_alignment == pp.param->pextra_alignment && - param->pextra_hfill == pp.param->pextra_hfill && - param->pextra_start_minipage == pp.param->pextra_start_minipage && -#endif - param->noindent == pp.param->noindent && - param->depth == pp.param->depth; -} - -void ParagraphParameters::makeSame(ParagraphParameters const & pp) -{ - ParameterStruct tmp(*param); - tmp.align = pp.param->align; - // tmp.labelwidthstring = pp.params.labelwidthstring; - tmp.line_bottom = pp.param->line_bottom; - tmp.pagebreak_bottom = pp.param->pagebreak_bottom; - tmp.added_space_bottom = pp.param->added_space_bottom; - tmp.line_top = pp.param->line_top; - tmp.pagebreak_top = pp.param->pagebreak_top; - tmp.added_space_top = pp.param->added_space_top; - tmp.spacing = pp.param->spacing; -#ifndef NO_PEXTRA_REALLY - tmp.pextra_type = pp.param->pextra_type; - tmp.pextra_width = pp.param->pextra_width; - tmp.pextra_widthp = pp.param->pextra_widthp; - tmp.pextra_alignment = pp.param->pextra_alignment; - tmp.pextra_hfill = pp.param->pextra_hfill; - tmp.pextra_start_minipage = pp.param->pextra_start_minipage; -#endif - tmp.noindent = pp.param->noindent; - tmp.depth = pp.param->depth; - - set_from_struct(tmp); -} - - -void ParagraphParameters::set_from_struct(ParameterStruct const & ps) +static int findToken(char const * const str[], string const & search_token) { - // get new param from container with tmp as template - param = container.get(ps); + return search_token == "default" ? + 0 : + support::findToken(str, search_token); } -VSpace const & ParagraphParameters::spaceTop() const -{ - return param->added_space_top; -} +ParagraphParameters::ParagraphParameters() + : noindent_(false), + start_of_appendix_(false), appendix_(false), + align_(LYX_ALIGN_LAYOUT), depth_(0) +{} -void ParagraphParameters::spaceTop(VSpace const & vs) +void ParagraphParameters::clear() { - ParameterStruct tmp(*param); - tmp.added_space_top = vs; - set_from_struct(tmp); + operator=(ParagraphParameters()); } -VSpace const & ParagraphParameters::spaceBottom() const +depth_type ParagraphParameters::depth() const { - return param->added_space_bottom; + return depth_; } -void ParagraphParameters::spaceBottom(VSpace const & vs) +bool ParagraphParameters::sameLayout(ParagraphParameters const & pp) const { - ParameterStruct tmp(*param); - tmp.added_space_bottom = vs; - set_from_struct(tmp); + return align_ == pp.align_ + && spacing_ == pp.spacing_ + && noindent_ == pp.noindent_ + && depth_ == pp.depth_; } Spacing const & ParagraphParameters::spacing() const { - return param->spacing; + return spacing_; } void ParagraphParameters::spacing(Spacing const & s) { - ParameterStruct tmp(*param); - tmp.spacing = s; - set_from_struct(tmp); + spacing_ = s; } bool ParagraphParameters::noindent() const { - return param->noindent; + return noindent_; } void ParagraphParameters::noindent(bool ni) { - ParameterStruct tmp(*param); - tmp.noindent = ni; - set_from_struct(tmp); -} - - -bool ParagraphParameters::lineTop() const -{ - return param->line_top; -} - - -void ParagraphParameters::lineTop(bool lt) -{ - ParameterStruct tmp(*param); - tmp.line_top = lt; - set_from_struct(tmp); -} - - -bool ParagraphParameters::lineBottom() const -{ - return param->line_bottom; -} - - -void ParagraphParameters::lineBottom(bool lb) -{ - ParameterStruct tmp(*param); - tmp.line_bottom = lb; - set_from_struct(tmp); -} - - -bool ParagraphParameters::pagebreakTop() const -{ - return param->pagebreak_top; -} - - -void ParagraphParameters::pagebreakTop(bool pbt) -{ - ParameterStruct tmp(*param); - tmp.pagebreak_top = pbt; - set_from_struct(tmp); -} - - -bool ParagraphParameters::pagebreakBottom() const -{ - return param->pagebreak_bottom; -} - - -void ParagraphParameters::pagebreakBottom(bool pbb) -{ - ParameterStruct tmp(*param); - tmp.pagebreak_bottom = pbb; - set_from_struct(tmp); + noindent_ = ni; } LyXAlignment ParagraphParameters::align() const { - return param->align; + return align_; } void ParagraphParameters::align(LyXAlignment la) { - ParameterStruct tmp(*param); - tmp.align = la; - set_from_struct(tmp); + align_ = la; } -void ParagraphParameters::depth(char d) +void ParagraphParameters::depth(depth_type d) { - ParameterStruct tmp(*param); - tmp.depth = d; - set_from_struct(tmp); + depth_ = d; } bool ParagraphParameters::startOfAppendix() const { - return param->start_of_appendix; + return start_of_appendix_; } void ParagraphParameters::startOfAppendix(bool soa) { - ParameterStruct tmp(*param); - tmp.start_of_appendix = soa; - set_from_struct(tmp); + start_of_appendix_ = soa; } bool ParagraphParameters::appendix() const { - return param->appendix; + return appendix_; } void ParagraphParameters::appendix(bool a) { - ParameterStruct tmp(*param); - tmp.appendix = a; - set_from_struct(tmp); + appendix_ = a; } -string const & ParagraphParameters::labelString() const +docstring const & ParagraphParameters::labelString() const { - return param->labelstring; + return labelstring_; } -void ParagraphParameters::labelString(string const & ls) +void ParagraphParameters::labelString(docstring const & ls) { - ParameterStruct tmp(*param); - tmp.labelstring = ls; - set_from_struct(tmp); + labelstring_ = ls; } -string const & ParagraphParameters::labelWidthString() const +docstring const & ParagraphParameters::labelWidthString() const { - return param->labelwidthstring; + return labelwidthstring_; } -void ParagraphParameters::labelWidthString(string const & lws) +void ParagraphParameters::labelWidthString(docstring const & lws) { - ParameterStruct tmp(*param); - tmp.labelwidthstring = lws; - set_from_struct(tmp); -} - -#ifndef NO_PEXTRA_REALLY -int ParagraphParameters::pextraType() const -{ - return param->pextra_type; + labelwidthstring_ = lws; } -void ParagraphParameters::pextraType(int t) +LyXLength const & ParagraphParameters::leftIndent() const { - ParameterStruct tmp(*param); - tmp.pextra_type = t; - set_from_struct(tmp); + return leftindent_; } -string const & ParagraphParameters::pextraWidth() const +void ParagraphParameters::leftIndent(LyXLength const & li) { - return param->pextra_width; + leftindent_ = li; } -void ParagraphParameters::pextraWidth(string const & w) +void ParagraphParameters::read(LyXLex & lex) { - ParameterStruct tmp(*param); - tmp.pextra_width = w; - set_from_struct(tmp); -} + while (lex.isOK()) { + lex.nextToken(); + string const token = lex.getString(); + if (token.empty()) + continue; -string const & ParagraphParameters::pextraWidthp() const -{ - return param->pextra_widthp; -} - + if (token[0] != '\\') { + lex.pushToken(token); + break; + } -void ParagraphParameters::pextraWidthp(string const & wp) -{ - ParameterStruct tmp(*param); - tmp.pextra_widthp = wp; - set_from_struct(tmp); + if (token == "\\noindent") { + noindent(true); + } else if (token == "\\leftindent") { + lex.next(); + LyXLength value(lex.getString()); + leftIndent(value); + } else if (token == "\\start_of_appendix") { + startOfAppendix(true); + } else if (token == "\\paragraph_spacing") { + lex.next(); + string const tmp = rtrim(lex.getString()); + if (tmp == "single") { + spacing(Spacing(Spacing::Single)); + } else if (tmp == "onehalf") { + spacing(Spacing(Spacing::Onehalf)); + } else if (tmp == "double") { + spacing(Spacing(Spacing::Double)); + } else if (tmp == "other") { + lex.next(); + spacing(Spacing(Spacing::Other, + lex.getString())); + } else { + lex.printError("Unknown spacing token: '$$Token'"); + } + } else if (token == "\\align") { + lex.next(); + int tmpret = findToken(string_align, lex.getString()); + if (tmpret == -1) + ++tmpret; + align(LyXAlignment(1 << tmpret)); + } else if (token == "\\labelwidthstring") { + lex.eatLine(); + labelWidthString(lex.getDocString()); + } else { + lex.pushToken(token); + break; + } + } } -int ParagraphParameters::pextraAlignment() const +void ParagraphParameters::write(ostream & os) const { - return param->pextra_alignment; -} + // Maybe the paragraph has special spacing + spacing().writeFile(os, true); + // The labelwidth string used in lists. + if (!labelWidthString().empty()) + os << "\\labelwidthstring " + << to_utf8(labelWidthString()) << '\n'; -void ParagraphParameters::pextraAlignment(int a) -{ - ParameterStruct tmp(*param); - tmp.pextra_alignment = a; - set_from_struct(tmp); -} + // Start of appendix? + if (startOfAppendix()) + os << "\\start_of_appendix\n"; + // Noindent? + if (noindent()) + os << "\\noindent\n"; -bool ParagraphParameters::pextraHfill() const -{ - return param->pextra_hfill; -} - + // Do we have a manual left indent? + if (!leftIndent().zero()) + os << "\\leftindent " << leftIndent().asString() << '\n'; -void ParagraphParameters::pextraHfill(bool hf) -{ - ParameterStruct tmp(*param); - tmp.pextra_hfill = hf; - set_from_struct(tmp); + // Alignment? + if (align() != LYX_ALIGN_LAYOUT) { + int h = 0; + switch (align()) { + case LYX_ALIGN_LEFT: h = 1; break; + case LYX_ALIGN_RIGHT: h = 2; break; + case LYX_ALIGN_CENTER: h = 3; break; + default: h = 0; break; + } + os << "\\align " << string_align[h] << '\n'; + } } -bool ParagraphParameters::pextraStartMinipage() const +void params2string(Paragraph const & par, string & data) { - return param->pextra_start_minipage; + // A local copy + ParagraphParameters params = par.params(); + + // This needs to be done separately + params.labelWidthString(par.getLabelWidthString()); + + // Alignment + LyXLayout_ptr const & layout = par.layout(); + if (params.align() == LYX_ALIGN_LAYOUT) + params.align(layout->align); + + ostringstream os; + params.write(os); + + // Is alignment possible + os << "\\alignpossible " << layout->alignpossible << '\n'; + + /// set default alignment + os << "\\aligndefault " << layout->align << '\n'; + + /// paragraph is always in inset. This is redundant. + os << "\\ininset " << 1 << '\n'; + + data = os.str(); +} + + +/* +bool operator==(ParagraphParameeters const & ps1, + ParagraphParameeters const & ps2) +{ + return + ps1.spacing == ps2.spacing + && ps1.noindent == ps2.noindent + && ps1.align == ps2.align + && ps1.depth == ps2.depth + && ps1.start_of_appendix == ps2.start_of_appendix + && ps1.appendix == ps2.appendix + && ps1.labelstring == ps2.labelstring + && ps1.labelwidthstring == ps2.labelwidthstring + && ps1.leftindent == ps2.leftindent; } +*/ -void ParagraphParameters::pextraStartMinipage(bool smp) -{ - ParameterStruct tmp(*param); - tmp.pextra_start_minipage = smp; - set_from_struct(tmp); -} -#endif +} // namespace lyx