]> git.lyx.org Git - lyx.git/blobdiff - src/ParagraphParameters.C
do not define boost::throw_exceptions if we are compiling with exceptions
[lyx.git] / src / ParagraphParameters.C
index 70b002cfe630b052c48feeaf17a06c76b439beaa..1f5da6720a93de1cb22715edf5508c2a1a17f7d3 100644 (file)
+/**
+ * \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"
-#include "tex-strings.h"
-#include "lyxlex.h"
 
 #include "buffer.h"
 #include "BufferView.h"
 #include "gettext.h"
-#include "paragraph.h"
+#include "lyxlayout.h"
+#include "lyxlex.h"
 #include "lyxtext.h"
+#include "paragraph.h"
+#include "tex-strings.h"
+
 #include "frontends/LyXView.h"
 
 #include "support/lstrings.h"
 
-#include <iostream>
-
-using std::ostream;
+#include <sstream>
 
-// Initialize static member var.
-ShareContainer<ParameterStruct> ParagraphParameters::container;
-
-ParagraphParameters::ParagraphParameters()
-{
-       ParameterStruct tmp;
-       set_from_struct(tmp);
-}
+using lyx::support::rtrim;
 
+using std::istringstream;
+using std::ostream;
+using std::ostringstream;
+using std::string;
 
-void ParagraphParameters::clear()
+// anonym namespace
+namespace {
+int findToken(char const * const str[], string const search_token)
 {
-       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;
-       set_from_struct(tmp);
-}
+       int i = 0;
 
+       if (search_token != "default") {
+               while (str[i][0] && str[i] != search_token) {
+                       ++i;
+               }
+               if (!str[i][0]) {
+                       i = -1;
+               }
+       }
 
-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->noindent == pp.param->noindent &&
-               param->depth == pp.param->depth;
+       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;
 }
 
 
 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
 {
-       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;
 }
 
 
 LyXLength const & ParagraphParameters::leftIndent() const
 {
-       return param->leftindent;
+       return leftindent_;
 }
 
 
 void ParagraphParameters::leftIndent(LyXLength const & li)
 {
-       ParameterStruct tmp(*param);
-       tmp.leftindent = li;
-       set_from_struct(tmp);
+       leftindent_ = li;
 }
 
 
@@ -292,21 +206,9 @@ void ParagraphParameters::read(LyXLex & lex)
                if (token == "\\noindent") {
                        noindent(true);
                } else if (token == "\\leftindent") {
-                       lex.nextToken();
+                       lex.next();
                        LyXLength value(lex.getString());
                        leftIndent(value);
-               } else if (token == "\\fill_top") {
-                       spaceTop(VSpace(VSpace::VFILL));
-               } else if (token == "\\fill_bottom") {
-                       spaceBottom(VSpace(VSpace::VFILL));
-               } else if (token == "\\line_top") {
-                       lineTop(true);
-               } else if (token == "\\line_bottom") {
-                       lineBottom(true);
-               } else if (token == "\\pagebreak_top") {
-                       pagebreakTop(true);
-               } else if (token == "\\pagebreak_bottom") {
-                       pagebreakBottom(true);
                } else if (token == "\\start_of_appendix") {
                        startOfAppendix(true);
                } else if (token == "\\paragraph_spacing") {
@@ -321,33 +223,16 @@ void ParagraphParameters::read(LyXLex & lex)
                        } else if (tmp == "other") {
                                lex.next();
                                spacing(Spacing(Spacing::Other,
-                                                lex.getFloat()));
+                                                lex.getString()));
                        } else {
                                lex.printError("Unknown spacing token: '$$Token'");
                        }
                } else if (token == "\\align") {
-                       int tmpret = lex.findToken(string_align);
+                       lex.next();
+                       int tmpret = findToken(string_align, lex.getString());
                        if (tmpret == -1)
                                ++tmpret;
                        align(LyXAlignment(1 << tmpret));
-               } else if (token == "\\added_space_top") {
-                       lex.nextToken();
-                       VSpace value = VSpace(lex.getString());
-                       // only add the length when value > 0 or
-                       // with option keep
-                       if ((value.length().len().value() != 0) ||
-                           value.keep() ||
-                           (value.kind() != VSpace::LENGTH))
-                               spaceTop(value);
-               } else if (token == "\\added_space_bottom") {
-                       lex.nextToken();
-                       VSpace value = VSpace(lex.getString());
-                       // only add the length when value > 0 or
-                       // with option keep
-                       if ((value.length().len().value() != 0) ||
-                          value.keep() ||
-                           (value.kind() != VSpace::LENGTH))
-                               spaceBottom(value);
                } else if (token == "\\labelwidthstring") {
                        lex.eatLine();
                        labelWidthString(lex.getString());
@@ -361,14 +246,6 @@ void ParagraphParameters::read(LyXLex & lex)
 
 void ParagraphParameters::write(ostream & os) const
 {
-       // Maybe some vertical spaces.
-       if (spaceTop().kind() != VSpace::NONE)
-               os << "\\added_space_top "
-                  << spaceTop().asLyXCommand() << ' ';
-       if (spaceBottom().kind() != VSpace::NONE)
-               os << "\\added_space_bottom "
-                  << spaceBottom().asLyXCommand() << ' ';
-
        // Maybe the paragraph has special spacing
        spacing().writeFile(os, true);
 
@@ -377,30 +254,17 @@ void ParagraphParameters::write(ostream & os) const
                os << "\\labelwidthstring "
                   << labelWidthString() << '\n';
 
-       // Lines above or below?
-       if (lineTop())
-               os << "\\line_top ";
-       if (lineBottom())
-               os << "\\line_bottom ";
-
-       // Pagebreaks above or below?
-       if (pagebreakTop())
-               os << "\\pagebreak_top ";
-       if (pagebreakBottom())
-               os << "\\pagebreak_bottom ";
-
        // Start of appendix?
        if (startOfAppendix())
-               os << "\\start_of_appendix ";
+               os << "\\start_of_appendix\n";
 
        // Noindent?
        if (noindent())
-               os << "\\noindent ";
+               os << "\\noindent\n";
 
        // Do we have a manual left indent?
        if (!leftIndent().zero())
-               os << "\\leftindent " << leftIndent().asString()
-                  << ' ';
+               os << "\\leftindent " << leftIndent().asString() << '\n';
 
        // Alignment?
        if (align() != LYX_ALIGN_LAYOUT) {
@@ -411,45 +275,11 @@ void ParagraphParameters::write(ostream & os) const
                case LYX_ALIGN_CENTER: h = 3; break;
                default: h = 0; break;
                }
-               os << "\\align " << string_align[h] << ' ';
+               os << "\\align " << string_align[h] << '\n';
        }
 }
 
 
-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(&bv,
-                          params.lineTop(),
-                          params.lineBottom(),
-                          params.pagebreakTop(),
-                          params.pagebreakBottom(),
-                          params.spaceTop(),
-                          params.spaceBottom(),
-                          params.spacing(),
-                          params.align(),
-                          params.labelWidthString(),
-                          params.noindent());
-
-       // Actually apply these settings
-       bv.update(text,
-                 BufferView::SELECT |
-                 BufferView::FITCUR |
-                 BufferView::CHANGE);
-
-       bv.buffer()->markDirty();
-
-       bv.owner()->message(_("Paragraph layout set"));
-}
-
-
 void params2string(Paragraph const & par, string & data)
 {
        // A local copy
@@ -467,13 +297,31 @@ void params2string(Paragraph const & par, string & data)
        params.write(os);
 
        // Is alignment possible
-       os << '\n' << "\\alignpossible " << layout->alignpossible << '\n';
+       os << "\\alignpossible " << layout->alignpossible << '\n';
 
        /// set default alignment
        os << "\\aligndefault " << layout->align << '\n';
 
-       /// is paragraph in inset
-       os << "\\ininset " << par.inInset() << '\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;
+}
+*/