X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FParagraphParameters.C;h=e40c14dad98fb6bed7dc76246631cadc1d77dcd7;hb=69bee02a8901793b34ac5ca6d07e93910cef4005;hp=d5a37e6875cfb8895881a13458d7f216fbcaa97a;hpb=03d1c984a0b22ec123cb86ba9004d9172a4190fb;p=lyx.git diff --git a/src/ParagraphParameters.C b/src/ParagraphParameters.C index d5a37e6875..e40c14dad9 100644 --- a/src/ParagraphParameters.C +++ b/src/ParagraphParameters.C @@ -1,8 +1,43 @@ +/** + * \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 "buffer.h" +#include "BufferView.h" +#include "gettext.h" +#include "lyxlayout.h" +#include "lyxlex.h" +#include "lyxtext.h" +#include "paragraph.h" #include "ParameterStruct.h" +#include "tex-strings.h" + +#include "frontends/LyXView.h" + +#include "support/lstrings.h" +#include "support/std_sstream.h" + +using lyx::support::rtrim; + +using std::istringstream; +using std::ostream; +using std::ostringstream; +using std::string; + // Initialize static member var. ShareContainer ParagraphParameters::container; @@ -10,9 +45,6 @@ ShareContainer ParagraphParameters::container; ParagraphParameters::ParagraphParameters() { ParameterStruct tmp; - tmp.appendix = false; - tmp.align = LYX_ALIGN_BLOCK; - set_from_struct(tmp); } @@ -20,12 +52,6 @@ ParagraphParameters::ParagraphParameters() 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; @@ -33,101 +59,32 @@ void ParagraphParameters::clear() tmp.labelstring.erase(); tmp.labelwidthstring.erase(); tmp.start_of_appendix = false; - //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; - set_from_struct(tmp); } +ParagraphParameters::depth_type ParagraphParameters::depth() const +{ + return param->depth; +} + + 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 && 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 && 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; - 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; - tmp.noindent = pp.param->noindent; - tmp.depth = pp.param->depth; - - set_from_struct(tmp); -} - - -void ParagraphParameters::set_from_struct(ParameterStruct const & ps) +void ParagraphParameters::set_from_struct(ParameterStruct const & ps) { // get new param from container with tmp as template param = container.get(ps); } -VSpace const & ParagraphParameters::spaceTop() const -{ - return param->added_space_top; -} - - -void ParagraphParameters::spaceTop(VSpace const & vs) -{ - ParameterStruct tmp(*param); - tmp.added_space_top = vs; - set_from_struct(tmp); -} - - -VSpace const & ParagraphParameters::spaceBottom() const -{ - return param->added_space_bottom; -} - - -void ParagraphParameters::spaceBottom(VSpace const & vs) -{ - ParameterStruct tmp(*param); - tmp.added_space_bottom = vs; - set_from_struct(tmp); -} - - Spacing const & ParagraphParameters::spacing() const { return param->spacing; @@ -156,62 +113,6 @@ void ParagraphParameters::noindent(bool ni) } -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); -} - - LyXAlignment ParagraphParameters::align() const { return param->align; @@ -226,13 +127,7 @@ void ParagraphParameters::align(LyXAlignment la) } -char ParagraphParameters::depth() const -{ - return param->depth; -} - - -void ParagraphParameters::depth(char d) +void ParagraphParameters::depth(depth_type d) { ParameterStruct tmp(*param); tmp.depth = d; @@ -296,85 +191,156 @@ void ParagraphParameters::labelWidthString(string const & lws) } -int ParagraphParameters::pextraType() const -{ - return param->pextra_type; -} - - -void ParagraphParameters::pextraType(int t) -{ - ParameterStruct tmp(*param); - tmp.pextra_type = t; - set_from_struct(tmp); -} - - -string const & ParagraphParameters::pextraWidth() const -{ - return param->pextra_width; -} - - -void ParagraphParameters::pextraWidth(string const & w) -{ - ParameterStruct tmp(*param); - tmp.pextra_width = w; - set_from_struct(tmp); -} - - -string const & ParagraphParameters::pextraWidthp() const -{ - return param->pextra_widthp; -} - - -void ParagraphParameters::pextraWidthp(string const & wp) -{ - ParameterStruct tmp(*param); - tmp.pextra_widthp = wp; - set_from_struct(tmp); -} - - -int ParagraphParameters::pextraAlignment() const +LyXLength const & ParagraphParameters::leftIndent() const { - return param->pextra_alignment; + return param->leftindent; } -void ParagraphParameters::pextraAlignment(int a) +void ParagraphParameters::leftIndent(LyXLength const & li) { ParameterStruct tmp(*param); - tmp.pextra_alignment = a; + tmp.leftindent = li; set_from_struct(tmp); } -bool ParagraphParameters::pextraHfill() const -{ - return param->pextra_hfill; -} - - -void ParagraphParameters::pextraHfill(bool hf) -{ - ParameterStruct tmp(*param); - tmp.pextra_hfill = hf; - set_from_struct(tmp); -} +void ParagraphParameters::read(LyXLex & lex) +{ + while (lex.isOK()) { + lex.nextToken(); + string const token = lex.getString(); + + if (token.empty()) + continue; + + if (token[0] != '\\') { + lex.pushToken(token); + break; + } + + if (token == "\\noindent") { + noindent(true); + } else if (token == "\\leftindent") { + lex.nextToken(); + 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.getFloat())); + } else { + lex.printError("Unknown spacing token: '$$Token'"); + } + } else if (token == "\\align") { + int tmpret = lex.findToken(string_align); + if (tmpret == -1) + ++tmpret; + align(LyXAlignment(1 << tmpret)); + } else if (token == "\\labelwidthstring") { + lex.eatLine(); + labelWidthString(lex.getString()); + } else { + lex.pushToken(token); + break; + } + } +} + + +void ParagraphParameters::write(ostream & os) const +{ + // Maybe the paragraph has special spacing + spacing().writeFile(os, true); + + // The labelwidth string used in lists. + if (!labelWidthString().empty()) + os << "\\labelwidthstring " + << labelWidthString() << '\n'; + + // Start of appendix? + if (startOfAppendix()) + os << "\\start_of_appendix "; + + // Noindent? + if (noindent()) + os << "\\noindent "; + + // Do we have a manual left indent? + if (!leftIndent().zero()) + os << "\\leftindent " << leftIndent().asString() + << ' '; + + // 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] << ' '; + } +} + + +void setParagraphParams(BufferView & bv, string const & data) +{ + istringstream is(data); + LyXLex lex(0,0); + lex.setStream(is); + + ParagraphParameters params; + params.read(lex); + + LyXText * text = bv.getLyXText(); + text->setParagraph( + params.spacing(), + params.align(), + params.labelWidthString(), + params.noindent()); + + bv.update(); + bv.owner()->message(_("Paragraph layout set")); +} + + +void params2string(Paragraph const & par, string & data) +{ + // 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 << '\n' << "\\alignpossible " << layout->alignpossible << '\n'; -bool ParagraphParameters::pextraStartMinipage() const -{ - return param->pextra_start_minipage; -} + /// set default alignment + os << "\\aligndefault " << layout->align << '\n'; + /// is paragraph in inset + os << "\\ininset " << (par.inInset()?1:0) << '\n'; -void ParagraphParameters::pextraStartMinipage(bool smp) -{ - ParameterStruct tmp(*param); - tmp.pextra_start_minipage = smp; - set_from_struct(tmp); + data = os.str(); }