]> git.lyx.org Git - lyx.git/blobdiff - src/paragraph.C
the 'lots of small stuff' patch
[lyx.git] / src / paragraph.C
index 6e5d98b949d1da35093976a30bfe091b086cba82..35101a0327db470d3a223816a7db97c67653d8cd 100644 (file)
 #include "debug.h"
 #include "gettext.h"
 #include "language.h"
-#include "latexrunparams.h"
 #include "lyxfont.h"
 #include "lyxrc.h"
 #include "lyxrow.h"
+#include "outputparams.h"
 #include "paragraph_funcs.h"
 #include "sgml.h"
 #include "texrow.h"
@@ -61,23 +61,25 @@ using std::ostringstream;
 
 
 Paragraph::Paragraph()
-       : y(0), height(0), pimpl_(new Paragraph::Pimpl(this))
+       : y(0), height(0), begin_of_body_(0),
+         pimpl_(new Paragraph::Pimpl(this))
 {
        itemdepth = 0;
        params().clear();
 }
 
 
-Paragraph::Paragraph(Paragraph const & lp)
-       : y(0), height(0), text_(lp.text_), pimpl_(new Paragraph::Pimpl(*lp.pimpl_, this))
+Paragraph::Paragraph(Paragraph const & par)
+       : y(0), height(0), text_(par.text_), begin_of_body_(par.begin_of_body_),
+         pimpl_(new Paragraph::Pimpl(*par.pimpl_, this))
 {
        itemdepth = 0;
        // this is because of the dummy layout of the paragraphs that
        // follow footnotes
-       layout_ = lp.layout();
+       layout_ = par.layout();
 
        // copy everything behind the break-position to the new paragraph
-       insetlist = lp.insetlist;
+       insetlist = par.insetlist;
        InsetList::iterator it = insetlist.begin();
        InsetList::iterator end = insetlist.end();
        for (; it != end; ++it) {
@@ -87,26 +89,26 @@ Paragraph::Paragraph(Paragraph const & lp)
 }
 
 
-void Paragraph::operator=(Paragraph const & lp)
+void Paragraph::operator=(Paragraph const & par)
 {
        // needed as we will destroy the pimpl_ before copying it
-       if (&lp != this)
+       if (&par != this)
                return;
 
        lyxerr << "Paragraph::operator=()" << endl;
 
-       text_ = lp.text_;
+       text_ = par.text_;
 
        delete pimpl_;
-       pimpl_ = new Pimpl(*lp.pimpl_, this);
+       pimpl_ = new Pimpl(*par.pimpl_, this);
 
-       itemdepth = lp.itemdepth;
+       itemdepth = par.itemdepth;
        // this is because of the dummy layout of the paragraphs that
        // follow footnotes
-       layout_ = lp.layout();
+       layout_ = par.layout();
 
        // copy everything behind the break-position to the new paragraph
-       insetlist = lp.insetlist;
+       insetlist = par.insetlist;
        InsetList::iterator it = insetlist.begin();
        InsetList::iterator end = insetlist.end();
        for (; it != end; ++it) {
@@ -114,7 +116,7 @@ void Paragraph::operator=(Paragraph const & lp)
        }
 }
 
-// the destructor removes the new paragraph from the list
+
 Paragraph::~Paragraph()
 {
        delete pimpl_;
@@ -257,6 +259,15 @@ int Paragraph::erase(pos_type start, pos_type end)
 }
 
 
+void Paragraph::insert(pos_type start, string const & str,
+                      LyXFont const & font)
+{
+       int size = str.size();
+       for (int i = 0 ; i < size ; ++i)
+               insertChar(start + i, str[i], font);
+}
+
+
 bool Paragraph::checkInsertChar(LyXFont & font)
 {
        if (pimpl_->inset_owner)
@@ -375,7 +386,7 @@ LyXFont const Paragraph::getFont(BufferParams const & bparams, pos_type pos,
 
        LyXLayout_ptr const & lout = layout();
 
-       pos_type const body_pos = beginningOfBody();
+       pos_type const body_pos = beginOfBody();
 
        LyXFont layoutfont;
        if (pos < body_pos)
@@ -639,28 +650,36 @@ void Paragraph::applyLayout(LyXLayout_ptr const & new_layout)
 }
 
 
-int Paragraph::beginningOfBody() const
+int Paragraph::beginOfBody() const
 {
-       if (layout()->labeltype != LABEL_MANUAL)
-               return 0;
+       return begin_of_body_;
+}
+
+
+void Paragraph::setBeginOfBody()
+{
+       if (layout()->labeltype != LABEL_MANUAL) {
+               begin_of_body_ = 0;
+               return;
+       }
 
        // Unroll the first two cycles of the loop
        // and remember the previous character to
        // remove unnecessary getChar() calls
        pos_type i = 0;
-       if (i < size() && !isNewline(i)) {
+       pos_type end = size();
+       if (i < end && !isNewline(i)) {
                ++i;
                char previous_char = 0;
                char temp = 0;
-               if (i < size()) {
-                       previous_char = getChar(i);
+               if (i < end) {
+                       previous_char = text_[i];
                        if (!isNewline(i)) {
                                ++i;
-                               while (i < size() && previous_char != ' ') {
-                                       temp = getChar(i);
+                               while (i < end && previous_char != ' ') {
+                                       temp = text_[i];
                                        if (isNewline(i))
                                                break;
-
                                        ++i;
                                        previous_char = temp;
                                }
@@ -668,7 +687,7 @@ int Paragraph::beginningOfBody() const
                }
        }
 
-       return i;
+       begin_of_body_ = i;
 }
 
 
@@ -687,9 +706,11 @@ int Paragraph::getPositionOfInset(InsetOld const * inset) const
 
 InsetBibitem * Paragraph::bibitem() const
 {
-       InsetList::const_iterator it = insetlist.begin();
-       if (it != insetlist.end() && it->inset->lyxCode() == InsetOld::BIBTEX_CODE)
-               return static_cast<InsetBibitem *>(it->inset);
+       if (!insetlist.empty()) {
+               InsetOld * inset = insetlist.begin()->inset;
+               if (inset->lyxCode() == InsetOld::BIBTEX_CODE)
+                       return static_cast<InsetBibitem *>(inset);
+       }
        return 0;
 }
 
@@ -868,7 +889,7 @@ bool Paragraph::simpleTeXOnePar(Buffer const & buf,
                                BufferParams const & bparams,
                                LyXFont const & outerfont,
                                ostream & os, TexRow & texrow,
-                               LatexRunParams const & runparams)
+                               OutputParams const & runparams)
 {
        lyxerr[Debug::LATEX] << "SimpleTeXOnePar...     " << this << endl;
 
@@ -892,16 +913,7 @@ bool Paragraph::simpleTeXOnePar(Buffer const & buf,
        LyXFont basefont;
 
        // Maybe we have to create a optional argument.
-       pos_type body_pos;
-
-       // FIXME: can we actually skip this check and just call
-       // beginningOfBody() ??
-       if (style->labeltype != LABEL_MANUAL) {
-               body_pos = 0;
-       } else {
-               body_pos = beginningOfBody();
-       }
-
+       pos_type body_pos = beginOfBody();
        unsigned int column = 0;
 
        if (body_pos > 0) {
@@ -932,7 +944,6 @@ bool Paragraph::simpleTeXOnePar(Buffer const & buf,
                }
                if (!asdefault)
                        column += startTeXParParams(bparams, os, moving_arg);
-
        }
 
        for (pos_type i = 0; i < size(); ++i) {
@@ -971,8 +982,7 @@ bool Paragraph::simpleTeXOnePar(Buffer const & buf,
                // rather than "\textXX{text }". (Asger)
                if (open_font && c == ' ' && i <= size() - 2) {
                        LyXFont const & next_font = getFont(bparams, i + 1, outerfont);
-                       if (next_font != running_font
-                           && next_font != font) {
+                       if (next_font != running_font && next_font != font) {
                                font = next_font;
                        }
                }
@@ -1014,7 +1024,7 @@ bool Paragraph::simpleTeXOnePar(Buffer const & buf,
                column += Changes::latexMarkChange(os, running_change, change);
                running_change = change;
 
-               LatexRunParams rp = runparams;
+               OutputParams rp = runparams;
                rp.moving_arg = moving_arg;
                rp.free_spacing = style->free_spacing;
                pimpl_->simpleTeXSpecialChars(buf, bparams,
@@ -1124,6 +1134,7 @@ void reset(PAR_TAG & p1, PAR_TAG const & p2)
 void Paragraph::simpleLinuxDocOnePar(Buffer const & buf,
                                     ostream & os,
                                     LyXFont const & outerfont,
+                                    OutputParams const & runparams,
                                     lyx::depth_type /*depth*/) const
 {
        LyXLayout_ptr const & style = layout();
@@ -1266,7 +1277,7 @@ void Paragraph::simpleLinuxDocOnePar(Buffer const & buf,
 
                if (c == Paragraph::META_INSET) {
                        InsetOld const * inset = getInset(i);
-                       inset->linuxdoc(buf, os);
+                       inset->linuxdoc(buf, os, runparams);
                        font_old = font;
                        continue;
                }
@@ -1319,6 +1330,7 @@ void Paragraph::simpleDocBookOnePar(Buffer const & buf,
                                    ostream & os,
                                    LyXFont const & outerfont,
                                    int & desc_on,
+                                   OutputParams const & runparams,
                                    lyx::depth_type depth) const
 {
        bool emph_flag = false;
@@ -1361,7 +1373,7 @@ void Paragraph::simpleDocBookOnePar(Buffer const & buf,
                        if (i || desc_on != 3) {
                                if (style->latexparam() == "CDATA")
                                        os << "]]>";
-                               inset->docbook(buf, os, false);
+                               inset->docbook(buf, os, runparams);
                                if (style->latexparam() == "CDATA")
                                        os << "<![CDATA[";
                        }
@@ -1530,7 +1542,17 @@ bool Paragraph::isMultiLingual(BufferParams const & bparams)
 
 // Convert the paragraph to a string.
 // Used for building the table of contents
-string const Paragraph::asString(Buffer const & buffer, bool label) const
+string const Paragraph::asString(Buffer const & buffer,
+                                bool label) const
+{
+       OutputParams runparams;
+       return asString(buffer, runparams, label);
+}
+
+
+string const Paragraph::asString(Buffer const & buffer,
+                                OutputParams const & runparams,
+                                bool label) const
 {
 #if 0
        string s;
@@ -1544,7 +1566,7 @@ string const Paragraph::asString(Buffer const & buffer, bool label) const
                else if (c == META_INSET &&
                         getInset(i)->lyxCode() == InsetOld::MATH_CODE) {
                        ostringstream os;
-                       getInset(i)->ascii(buffer, os);
+                       getInset(i)->plaintext(buffer, os, runparams);
                        s += subst(STRCONV(os.str()),'\n',' ');
                }
        }
@@ -1552,7 +1574,7 @@ string const Paragraph::asString(Buffer const & buffer, bool label) const
        return s;
 #else
        // This should really be done by the caller and not here.
-       string ret = asString(buffer, 0, size(), label);
+       string ret = asString(buffer, runparams, 0, size(), label);
        return subst(ret, '\n', ' ');
 #endif
 }
@@ -1561,6 +1583,16 @@ string const Paragraph::asString(Buffer const & buffer, bool label) const
 string const Paragraph::asString(Buffer const & buffer,
                                 pos_type beg, pos_type end, bool label) const
 {
+
+       OutputParams const runparams;
+       return asString(buffer, runparams, beg, end, label);
+}
+
+
+string const Paragraph::asString(Buffer const & buffer,
+                                OutputParams const & runparams,
+                                pos_type beg, pos_type end, bool label) const
+{
        ostringstream os;
 
        if (beg == 0 && label && !params().labelString().empty())
@@ -1571,7 +1603,7 @@ string const Paragraph::asString(Buffer const & buffer,
                if (IsPrintable(c))
                        os << c;
                else if (c == META_INSET)
-                       getInset(i)->ascii(buffer, os);
+                       getInset(i)->plaintext(buffer, os, runparams);
        }
 
        return os.str();
@@ -1589,12 +1621,6 @@ void Paragraph::setInsetOwner(UpdatableInset * inset)
 }
 
 
-void Paragraph::deleteInsetsLyXText(BufferView * bv)
-{
-       insetlist.deleteInsetsLyXText(bv);
-}
-
-
 void Paragraph::setContentsFromPar(Paragraph const & par)
 {
        pimpl_->setContentsFromPar(par);