]> git.lyx.org Git - lyx.git/blobdiff - src/ParagraphParameters.C
mathed uglyfication
[lyx.git] / src / ParagraphParameters.C
index d5a37e6875cfb8895881a13458d7f216fbcaa97a..e40c14dad98fb6bed7dc76246631cadc1d77dcd7 100644 (file)
@@ -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 <config.h>
 
 #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<ParameterStruct> ParagraphParameters::container;
@@ -10,9 +45,6 @@ ShareContainer<ParameterStruct> 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();
 }