+/**
+ * \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 <config.h>
#include "ParagraphParameters.h"
-#include "ParameterStruct.h"
-// Initialize static member var.
-ShareContainer<ParameterStruct> ParagraphParameters::container;
+#include "buffer.h"
+#include "BufferView.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 "frontends/LyXView.h"
- set_from_struct(tmp);
-}
+#include "support/lstrings.h"
+#include <sstream>
-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;
- //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);
-}
+using lyx::support::rtrim;
+using std::istringstream;
+using std::ostream;
+using std::ostringstream;
+using std::string;
-bool ParagraphParameters::sameLayout(ParagraphParameters const & pp) const
+// anonym namespace
+namespace {
+int findToken(char const * const str[], string const search_token)
{
- 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;
-}
+ int i = 0;
+ if (search_token != "default") {
+ while (str[i][0] && str[i] != search_token) {
+ ++i;
+ }
+ if (!str[i][0]) {
+ i = -1;
+ }
+ }
-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);
+ return i;
}
-
-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;
-}
+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
+ParagraphParameters::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;
}
-char ParagraphParameters::depth() const
+void ParagraphParameters::depth(depth_type d)
{
- return param->depth;
-}
-
-
-void ParagraphParameters::depth(char 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
{
- return param->labelstring;
+ return labelstring_;
}
void ParagraphParameters::labelString(string const & ls)
{
- ParameterStruct tmp(*param);
- tmp.labelstring = ls;
- set_from_struct(tmp);
+ labelstring_ = ls;
}
string const & ParagraphParameters::labelWidthString() const
{
- return param->labelwidthstring;
+ return labelwidthstring_;
}
void ParagraphParameters::labelWidthString(string const & lws)
{
- ParameterStruct tmp(*param);
- tmp.labelwidthstring = lws;
- set_from_struct(tmp);
+ labelwidthstring_ = lws;
}
-
-
-int ParagraphParameters::pextraType() const
+
+
+LyXLength const & ParagraphParameters::leftIndent() const
{
- return param->pextra_type;
+ return leftindent_;
}
-void ParagraphParameters::pextraType(int t)
+void ParagraphParameters::leftIndent(LyXLength const & li)
{
- ParameterStruct tmp(*param);
- tmp.pextra_type = t;
- set_from_struct(tmp);
+ leftindent_ = li;
}
-string const & ParagraphParameters::pextraWidth() const
+void ParagraphParameters::read(LyXLex & lex)
{
- return param->pextra_width;
-}
+ while (lex.isOK()) {
+ lex.nextToken();
+ string const token = lex.getString();
+ if (token.empty())
+ continue;
-void ParagraphParameters::pextraWidth(string const & w)
-{
- ParameterStruct tmp(*param);
- tmp.pextra_width = w;
- set_from_struct(tmp);
-}
+ if (token[0] != '\\') {
+ lex.pushToken(token);
+ break;
+ }
-
-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
-{
- return param->pextra_alignment;
+ 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.getString());
+ } else {
+ lex.pushToken(token);
+ break;
+ }
+ }
}
-void ParagraphParameters::pextraAlignment(int a)
+void ParagraphParameters::write(ostream & os) const
{
- ParameterStruct tmp(*param);
- tmp.pextra_alignment = a;
- set_from_struct(tmp);
-}
+ // Maybe the paragraph has special spacing
+ spacing().writeFile(os, true);
+ // The labelwidth string used in lists.
+ if (!labelWidthString().empty())
+ os << "\\labelwidthstring "
+ << labelWidthString() << '\n';
-bool ParagraphParameters::pextraHfill() const
-{
- return param->pextra_hfill;
-}
+ // Start of appendix?
+ if (startOfAppendix())
+ os << "\\start_of_appendix\n";
+ // Noindent?
+ if (noindent())
+ os << "\\noindent\n";
-void ParagraphParameters::pextraHfill(bool hf)
-{
- ParameterStruct tmp(*param);
- tmp.pextra_hfill = hf;
- set_from_struct(tmp);
-}
-
+ // Do we have a manual left indent?
+ if (!leftIndent().zero())
+ os << "\\leftindent " << leftIndent().asString() << '\n';
-bool ParagraphParameters::pextraStartMinipage() const
-{
- return param->pextra_start_minipage;
+ // 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';
+ }
}
-void ParagraphParameters::pextraStartMinipage(bool smp)
-{
- ParameterStruct tmp(*param);
- tmp.pextra_start_minipage = smp;
- set_from_struct(tmp);
+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 << "\\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;
}
+*/