]> git.lyx.org Git - lyx.git/blobdiff - src/paragraph.C
fix reading the author field.
[lyx.git] / src / paragraph.C
index 2be105b73b34677e7989a48cd9562a8ee61985fd..05a525c53a9e22dbfd891308c190d3e6ab31fae7 100644 (file)
@@ -32,6 +32,7 @@
 #include "lyxrow.h"
 #include "outputparams.h"
 #include "paragraph_funcs.h"
+#include "ParagraphList_fwd.h"
 #include "sgml.h"
 #include "texrow.h"
 #include "vspace.h"
@@ -40,7 +41,6 @@
 #include "insets/insetoptarg.h"
 
 #include "support/lstrings.h"
-#include "support/std_sstream.h"
 #include "support/textutils.h"
 #include "support/tostr.h"
 
@@ -49,6 +49,7 @@
 
 #include <list>
 #include <stack>
+#include <sstream>
 
 using lyx::pos_type;
 
@@ -64,10 +65,15 @@ using std::ostream;
 using std::ostringstream;
 
 
+ParagraphList::ParagraphList()
+{}
+
+
 Paragraph::Paragraph()
        : y(0), height(0), begin_of_body_(0),
          pimpl_(new Paragraph::Pimpl(this))
 {
+       //lyxerr << "sizeof Paragraph::Pimpl: " << sizeof(Paragraph::Pimpl) << endl;
        itemdepth = 0;
        params().clear();
 }
@@ -80,6 +86,7 @@ Paragraph::Paragraph(Paragraph const & par)
                text_(par.text_), begin_of_body_(par.begin_of_body_),
          pimpl_(new Paragraph::Pimpl(*par.pimpl_, this))
 {
+       //lyxerr << "Paragraph::Paragraph(Paragraph const&)" << endl;
        InsetList::iterator it = insetlist.begin();
        InsetList::iterator end = insetlist.end();
        for (; it != end; ++it)
@@ -87,32 +94,30 @@ Paragraph::Paragraph(Paragraph const & par)
 }
 
 
-void Paragraph::operator=(Paragraph const & par)
+Paragraph & Paragraph::operator=(Paragraph const & par)
 {
        // needed as we will destroy the pimpl_ before copying it
-       if (&par != this)
-               return;
-
-       lyxerr << "Paragraph::operator=()" << endl;
-
-       itemdepth = par.itemdepth;
-
-       insetlist = par.insetlist;
-       InsetList::iterator it = insetlist.begin();
-       InsetList::iterator end = insetlist.end();
-       for (; it != end; ++it)
-               it->inset = it->inset->clone().release();
-
-       rows = par.rows;
-       y = par.y;
-       height = par.height;
-       width = par.width;
-       layout_ = par.layout();
-       text_ = par.text_;
-       begin_of_body_ = par.begin_of_body_;
-
-       delete pimpl_;
-       pimpl_ = new Pimpl(*par.pimpl_, this);
+       if (&par != this) {
+               itemdepth = par.itemdepth;
+
+               insetlist = par.insetlist;
+               InsetList::iterator it = insetlist.begin();
+               InsetList::iterator end = insetlist.end();
+               for (; it != end; ++it)
+                       it->inset = it->inset->clone().release();
+
+               rows = par.rows;
+               y = par.y;
+               height = par.height;
+               width = par.width;
+               layout_ = par.layout();
+               text_ = par.text_;
+               begin_of_body_ = par.begin_of_body_;
+
+               delete pimpl_;
+               pimpl_ = new Pimpl(*par.pimpl_, this);
+       }
+       return *this;
 }
 
 
@@ -133,12 +138,12 @@ void Paragraph::write(Buffer const & buf, ostream & os,
        if (dth != params().depth()) {
                if (params().depth() > dth) {
                        while (params().depth() > dth) {
-                               os << "\n\\begin_deeper ";
+                               os << "\n\\begin_deeper";
                                ++dth;
                        }
                } else {
                        while (params().depth() < dth) {
-                               os << "\n\\end_deeper ";
+                               os << "\n\\end_deeper";
                                --dth;
                        }
                }
@@ -187,13 +192,13 @@ void Paragraph::write(Buffer const & buf, ostream & os,
                                } else {
                                        os << "\n\\begin_inset ";
                                        inset->write(buf, os);
-                                       os << "\n\\end_inset \n\n";
+                                       os << "\n\\end_inset\n\n";
                                        column = 0;
                                }
                }
                break;
                case '\\':
-                       os << "\n\\backslash \n";
+                       os << "\n\\backslash\n";
                        column = 0;
                        break;
                case '.':
@@ -273,38 +278,38 @@ bool Paragraph::checkInsertChar(LyXFont &)
 }
 
 
-void Paragraph::insertChar(pos_type pos, Paragraph::value_type c)
+void Paragraph::insertChar(pos_type pos, Paragraph::value_type c,
+                          Change change)
 {
-       insertChar(pos, c, LyXFont(LyXFont::ALL_INHERIT));
+       pimpl_->insertChar(pos, c, change);
 }
 
 
 void Paragraph::insertChar(pos_type pos, Paragraph::value_type c,
                           LyXFont const & font, Change change)
 {
-       pimpl_->insertChar(pos, c, font, change);
+       pimpl_->insertChar(pos, c, change);
+       setFont(pos, font);
 }
 
 
-void Paragraph::insertInset(pos_type pos, InsetBase * inset)
+void Paragraph::insertInset(pos_type pos, InsetBase * inset, Change change)
 {
-       insertInset(pos, inset, LyXFont(LyXFont::ALL_INHERIT));
+       pimpl_->insertInset(pos, inset, change);
 }
 
 
 void Paragraph::insertInset(pos_type pos, InsetBase * inset,
-       LyXFont const & font, Change change)
+                           LyXFont const & font, Change change)
 {
-       pimpl_->insertInset(pos, inset, font, change);
+       pimpl_->insertInset(pos, inset, change);
+       setFont(pos, font);
 }
 
 
 bool Paragraph::insetAllowed(InsetOld_code code)
 {
-       //lyxerr << "Paragraph::InsertInsetAllowed" << endl;
-       if (pimpl_->inset_owner)
-               return pimpl_->inset_owner->insetAllowed(code);
-       return true;
+       return !pimpl_->inset_owner || pimpl_->inset_owner->insetAllowed(code);
 }
 
 
@@ -646,7 +651,7 @@ void Paragraph::applyLayout(LyXLayout_ptr const & new_layout)
 }
 
 
-int Paragraph::beginOfBody() const
+pos_type Paragraph::beginOfBody() const
 {
        return begin_of_body_;
 }
@@ -711,19 +716,26 @@ InsetBibitem * Paragraph::bibitem() const
 }
 
 
+bool Paragraph::forceDefaultParagraphs() const
+{
+       return inInset() && inInset()->forceDefaultParagraphs(inInset());
+}
+
+
+bool Paragraph::autoBreakRows() const
+{
+       return inInset() && static_cast<InsetText *>(inInset())->getAutoBreakRows();
+}
+
+
 namespace {
 
 // paragraphs inside floats need different alignment tags to avoid
 // unwanted space
 
-bool noTrivlistCentering(UpdatableInset const * inset)
+bool noTrivlistCentering(InsetBase::Code code)
 {
-       if (inset && inset->owner()) {
-               InsetBase::Code const code = inset->owner()->lyxCode();
-               return code == InsetBase::FLOAT_CODE ||
-                       code == InsetBase::WRAP_CODE;
-       }
-       return false;
+       return code == InsetBase::FLOAT_CODE || code == InsetBase::WRAP_CODE;
 }
 
 
@@ -740,10 +752,10 @@ string correction(string const & orig)
 
 
 string const corrected_env(string const & suffix, string const & env,
-                          UpdatableInset const * inset)
+       InsetBase::Code code)
 {
        string output = suffix + "{";
-       if (noTrivlistCentering(inset))
+       if (noTrivlistCentering(code))
                output += correction(env);
        else
                output += env;
@@ -775,7 +787,7 @@ int Paragraph::startTeXParParams(BufferParams const & bparams,
        case LYX_ALIGN_CENTER:
                if (moving_arg) {
                        os << "\\protect";
-                       column = 8;
+                       column += 8;
                }
                break;
        }
@@ -788,27 +800,25 @@ int Paragraph::startTeXParParams(BufferParams const & bparams,
                break;
        case LYX_ALIGN_LEFT: {
                string output;
-               UpdatableInset const * const inset = pimpl_->inset_owner;
                if (getParLanguage(bparams)->babel() != "hebrew")
-                       output = corrected_env("\\begin", "flushleft", inset);
+                       output = corrected_env("\\begin", "flushleft", ownerCode());
                else
-                       output = corrected_env("\\begin", "flushright", inset);
+                       output = corrected_env("\\begin", "flushright", ownerCode());
                os << output;
                column += output.size();
                break;
        } case LYX_ALIGN_RIGHT: {
                string output;
-               UpdatableInset const * const inset = pimpl_->inset_owner;
                if (getParLanguage(bparams)->babel() != "hebrew")
-                       output = corrected_env("\\begin", "flushright", inset);
+                       output = corrected_env("\\begin", "flushright", ownerCode());
                else
-                       output = corrected_env("\\begin", "flushleft", inset);
+                       output = corrected_env("\\begin", "flushleft", ownerCode());
                os << output;
                column += output.size();
                break;
        } case LYX_ALIGN_CENTER: {
                string output;
-               output = corrected_env("\\begin", "center", pimpl_->inset_owner);
+               output = corrected_env("\\begin", "center", ownerCode());
                os << output;
                column += output.size();
                break;
@@ -849,27 +859,25 @@ int Paragraph::endTeXParParams(BufferParams const & bparams,
                break;
        case LYX_ALIGN_LEFT: {
                string output;
-               UpdatableInset const * const inset = pimpl_->inset_owner;
                if (getParLanguage(bparams)->babel() != "hebrew")
-                       output = corrected_env("\\par\\end", "flushleft", inset);
+                       output = corrected_env("\\par\\end", "flushleft", ownerCode());
                else
-                       output = corrected_env("\\par\\end", "flushright", inset);
+                       output = corrected_env("\\par\\end", "flushright", ownerCode());
                os << output;
                column += output.size();
                break;
        } case LYX_ALIGN_RIGHT: {
                string output;
-               UpdatableInset const * const inset = pimpl_->inset_owner;
                if (getParLanguage(bparams)->babel() != "hebrew")
-                       output = corrected_env("\\par\\end", "flushright", inset);
+                       output = corrected_env("\\par\\end", "flushright", ownerCode());
                else
-                       output = corrected_env("\\par\\end", "flushleft", inset);
+                       output = corrected_env("\\par\\end", "flushleft", ownerCode());
                os << output;
                column += output.size();
                break;
        } case LYX_ALIGN_CENTER: {
                string output;
-               output = corrected_env("\\par\\end", "center", pimpl_->inset_owner);
+               output = corrected_env("\\par\\end", "center", ownerCode());
                os << output;
                column += output.size();
                break;
@@ -885,7 +893,7 @@ bool Paragraph::simpleTeXOnePar(Buffer const & buf,
                                BufferParams const & bparams,
                                LyXFont const & outerfont,
                                ostream & os, TexRow & texrow,
-                               OutputParams const & runparams)
+                               OutputParams const & runparams) const
 {
        lyxerr[Debug::LATEX] << "SimpleTeXOnePar...     " << this << endl;
 
@@ -897,8 +905,7 @@ bool Paragraph::simpleTeXOnePar(Buffer const & buf,
        // length (all in one row) if that is true then we don't allow
        // any special options in the paragraph and also we don't allow
        // any environment other then "Standard" to be valid!
-       bool asdefault =
-               (inInset() && inInset()->forceDefaultParagraphs(inInset()));
+       bool asdefault = forceDefaultParagraphs();
 
        if (asdefault) {
                style = bparams.getLyXTextClass().defaultLayout();
@@ -913,15 +920,16 @@ bool Paragraph::simpleTeXOnePar(Buffer const & buf,
        unsigned int column = 0;
 
        if (body_pos > 0) {
-               os << '[';
-               ++column;
+               // the optional argument is kept in curly brackets in
+               // case it contains a ']'
+               os << "[{";
+               column += 2;
                basefont = getLabelFont(bparams, outerfont);
        } else {
                basefont = getLayoutFont(bparams, outerfont);
        }
 
-       bool moving_arg = runparams.moving_arg;
-       moving_arg |= style->needprotect;
+       bool const moving_arg = runparams.moving_arg | style->needprotect;
 
        // Which font is currently active?
        LyXFont running_font(basefont);
@@ -953,8 +961,8 @@ bool Paragraph::simpleTeXOnePar(Buffer const & buf,
                                }
                                basefont = getLayoutFont(bparams, outerfont);
                                running_font = basefont;
-                               os << ']';
-                               ++column;
+                               os << "}] ";
+                               column +=3;
                        }
                        if (style->isCommand()) {
                                os << '{';
@@ -1023,8 +1031,10 @@ bool Paragraph::simpleTeXOnePar(Buffer const & buf,
                OutputParams rp = runparams;
                rp.moving_arg = moving_arg;
                rp.free_spacing = style->free_spacing;
+               rp.lang = font.language()->babel();
+               rp.intitle = style->intitle;
                pimpl_->simpleTeXSpecialChars(buf, bparams,
-                                             os, texrow, runparams,
+                                             os, texrow, rp,
                                              font, running_font,
                                              basefont, outerfont, open_font,
                                              running_change,
@@ -1321,12 +1331,27 @@ void Paragraph::simpleLinuxDocOnePar(Buffer const & buf,
 }
 
 
+string Paragraph::getDocbookId() const
+{
+       for (pos_type i = 0; i < size(); ++i) {
+               if (isInset(i)) {
+                       InsetBase const * inset = getInset(i);
+                       InsetBase::Code lyx_code = inset->lyxCode();
+                       if (lyx_code == InsetBase::LABEL_CODE) {
+                               return static_cast<InsetCommand const *>(inset)->getContents();
+                       }
+               }
+
+       }
+       return string();
+}
+
+
 void Paragraph::simpleDocBookOnePar(Buffer const & buf,
                                    ostream & os,
                                    LyXFont const & outerfont,
                                    OutputParams const & runparams,
-                                   lyx::depth_type depth,
-                                   bool labelid) const
+                                   lyx::depth_type depth) const
 {
        bool emph_flag = false;
 
@@ -1388,15 +1413,11 @@ void Paragraph::simpleDocBookOnePar(Buffer const & buf,
 
                if (isInset(i)) {
                        InsetBase const * inset = getInset(i);
-                       // don't print the inset in position 0 if desc_on == 3 (label)
-                       //if (i || desc_on != 3) {
-                       if (!labelid) {
-                               if (style->latexparam() == "CDATA")
-                                       os << "]]>";
-                               inset->docbook(buf, os, runparams);
-                               if (style->latexparam() == "CDATA")
-                                       os << "<![CDATA[";
-                       }
+                       if (style->latexparam() == "CDATA")
+                               os << "]]>";
+                       inset->docbook(buf, os, runparams);
+                       if (style->latexparam() == "CDATA")
+                               os << "<![CDATA[";
                } else {
                        char c = getChar(i);
                        bool ws;
@@ -1460,21 +1481,15 @@ bool IsInsetChar(char c)
 
 bool Paragraph::isHfill(pos_type pos) const
 {
-       return IsInsetChar(getChar(pos))
-              && getInset(pos)->lyxCode() == InsetBase::HFILL_CODE;
-}
-
-
-bool Paragraph::isInset(pos_type pos) const
-{
-       return IsInsetChar(getChar(pos));
+       return isInset(pos) 
+               && getInset(pos)->lyxCode() == InsetBase::HFILL_CODE;
 }
 
 
 bool Paragraph::isNewline(pos_type pos) const
 {
-       return IsInsetChar(getChar(pos))
-              && getInset(pos)->lyxCode() == InsetBase::NEWLINE_CODE;
+       return isInset(pos) 
+               && getInset(pos)->lyxCode() == InsetBase::NEWLINE_CODE;
 }
 
 
@@ -1515,7 +1530,9 @@ bool Paragraph::isLetter(pos_type pos) const
 
 bool Paragraph::isWord(pos_type pos) const
 {
-       unsigned char const c = getChar(pos);
+       if (isInset(pos))
+               return getInset(pos)->isLetter();
+       value_type const c = getChar(pos);
        return !(IsSeparatorChar(c)
                  || IsKommaChar(c)
                  || IsInsetChar(c));
@@ -1527,7 +1544,9 @@ Paragraph::getParLanguage(BufferParams const & bparams) const
 {
        if (!empty())
                return getFirstFontSettings().language();
+#ifdef WITH_WARNINGS
 #warning FIXME we should check the prev par as well (Lgb)
+#endif
        return bparams.language;
 }
 
@@ -1536,8 +1555,7 @@ bool Paragraph::isRightToLeftPar(BufferParams const & bparams) const
 {
        return lyxrc.rtl_support
                && getParLanguage(bparams)->RightToLeft()
-               && !(inInset() && inInset()->owner() &&
-                    inInset()->owner()->lyxCode() == InsetBase::ERT_CODE);
+               && ownerCode() != InsetBase::ERT_CODE;
 }
 
 
@@ -1571,8 +1589,7 @@ bool Paragraph::isMultiLingual(BufferParams const & bparams) const
 
 // 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);
@@ -1642,11 +1659,6 @@ string const Paragraph::asString(Buffer const & buffer,
 void Paragraph::setInsetOwner(UpdatableInset * inset)
 {
        pimpl_->inset_owner = inset;
-       InsetList::iterator it = insetlist.begin();
-       InsetList::iterator end = insetlist.end();
-       for (; it != end; ++it)
-               if (it->inset)
-                       it->inset->setOwner(inset);
 }
 
 
@@ -1676,14 +1688,14 @@ void Paragraph::cleanChanges()
 
 Change::Type Paragraph::lookupChange(lyx::pos_type pos) const
 {
-       BOOST_ASSERT(!size() || pos < size());
+       BOOST_ASSERT(empty() || pos < size());
        return pimpl_->lookupChange(pos);
 }
 
 
 Change const Paragraph::lookupChangeFull(lyx::pos_type pos) const
 {
-       BOOST_ASSERT(!size() || pos < size());
+       BOOST_ASSERT(empty() || pos < size());
        return pimpl_->lookupChangeFull(pos);
 }
 
@@ -1724,25 +1736,6 @@ void Paragraph::rejectChange(pos_type start, pos_type end)
 }
 
 
-Paragraph::value_type Paragraph::getChar(pos_type pos) const
-{
-       // This is in the critical path!
-       pos_type const siz = text_.size();
-
-       BOOST_ASSERT(0 <= pos);
-       BOOST_ASSERT(pos <= siz);
-
-       if (pos == siz) {
-               lyxerr << "getChar() on pos " << pos << " in par id "
-                      << id() << " of size " << siz
-                      << "  is a bit silly !" << endl;
-               BOOST_ASSERT(false);
-       }
-
-       return text_[pos];
-}
-
-
 int Paragraph::id() const
 {
        return pimpl_->id_;
@@ -1751,11 +1744,6 @@ int Paragraph::id() const
 
 LyXLayout_ptr const & Paragraph::layout() const
 {
-/*
-       InsetBase * inset = inInset();
-       if (inset && inset->lyxCode() == InsetBase::ENVIRONMENT_CODE)
-               return static_cast<InsetEnvironment*>(inset)->layout();
-*/
        return layout_;
 }
 
@@ -1772,6 +1760,13 @@ UpdatableInset * Paragraph::inInset() const
 }
 
 
+InsetBase::Code Paragraph::ownerCode() const
+{
+       return pimpl_->inset_owner
+               ? pimpl_->inset_owner->lyxCode() : InsetBase::NO_CODE;
+}
+
+
 void Paragraph::clearContents()
 {
        text_.clear();
@@ -1803,9 +1798,7 @@ bool Paragraph::isFreeSpacing() const
 
        // for now we just need this, later should we need this in some
        // other way we can always add a function to InsetBase too.
-       if (pimpl_->inset_owner && pimpl_->inset_owner->owner())
-               return pimpl_->inset_owner->owner()->lyxCode() == InsetBase::ERT_CODE;
-       return false;
+       return ownerCode() == InsetBase::ERT_CODE;
 }
 
 
@@ -1813,9 +1806,7 @@ bool Paragraph::allowEmpty() const
 {
        if (layout()->keepempty)
                return true;
-       if (pimpl_->inset_owner && pimpl_->inset_owner->owner())
-               return pimpl_->inset_owner->owner()->lyxCode() == InsetBase::ERT_CODE;
-       return false;
+       return ownerCode() == InsetBase::ERT_CODE;
 }