X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fparagraph.C;h=1a6cdfc35a5a61713500709dde8b7fd92b9414e3;hb=b1be8f3cb0486b659ff7e35601d2ed74d3ce29e0;hp=9f0d646d8e6a61daf19c794b08666c6c8986fe36;hpb=22590a98b36977c2257c66dc2d2a72741432d261;p=lyx.git diff --git a/src/paragraph.C b/src/paragraph.C index 9f0d646d8e..1a6cdfc35a 100644 --- a/src/paragraph.C +++ b/src/paragraph.C @@ -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 #include +#include using lyx::pos_type; @@ -64,26 +65,28 @@ 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(); } Paragraph::Paragraph(Paragraph const & par) - : y(0), height(0), text_(par.text_), begin_of_body_(par.begin_of_body_), + : itemdepth(par.itemdepth), insetlist(par.insetlist), + 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_), pimpl_(new Paragraph::Pimpl(*par.pimpl_, this)) { - itemdepth = 0; - // this is because of the dummy layout of the paragraphs that - // follow footnotes - layout_ = par.layout(); - - // copy everything behind the break-position to the new paragraph - insetlist = par.insetlist; + //lyxerr << "Paragraph::Paragraph(Paragraph const&)" << endl; InsetList::iterator it = insetlist.begin(); InsetList::iterator end = insetlist.end(); for (; it != end; ++it) @@ -91,30 +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; - - text_ = par.text_; - - delete pimpl_; - pimpl_ = new Pimpl(*par.pimpl_, this); - - itemdepth = par.itemdepth; - // this is because of the dummy layout of the paragraphs that - // follow footnotes - layout_ = par.layout(); - - // copy everything behind the break-position to the new paragraph - insetlist = par.insetlist; - InsetList::iterator it = insetlist.begin(); - InsetList::iterator end = insetlist.end(); - for (; it != end; ++it) - it->inset = it->inset->clone().release(); + 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; } @@ -303,10 +306,7 @@ void Paragraph::insertInset(pos_type pos, InsetBase * inset, 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); } @@ -328,7 +328,10 @@ InsetBase const * Paragraph::getInset(pos_type pos) const LyXFont const Paragraph::getFontSettings(BufferParams const & bparams, pos_type pos) const { - BOOST_ASSERT(pos <= size()); + if (pos > size()) { + lyxerr << " pos: " << pos << " size: " << size() << endl; + BOOST_ASSERT(pos <= size()); + } Pimpl::FontList::const_iterator cit = pimpl_->fontlist.begin(); Pimpl::FontList::const_iterator end = pimpl_->fontlist.end(); @@ -645,7 +648,7 @@ void Paragraph::applyLayout(LyXLayout_ptr const & new_layout) } -int Paragraph::beginOfBody() const +pos_type Paragraph::beginOfBody() const { return begin_of_body_; } @@ -710,19 +713,26 @@ InsetBibitem * Paragraph::bibitem() const } +bool Paragraph::forceDefaultParagraphs() const +{ + return inInset() && inInset()->forceDefaultParagraphs(inInset()); +} + + +bool Paragraph::autoBreakRows() const +{ + return inInset() && static_cast(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; } @@ -739,10 +749,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; @@ -774,7 +784,7 @@ int Paragraph::startTeXParParams(BufferParams const & bparams, case LYX_ALIGN_CENTER: if (moving_arg) { os << "\\protect"; - column = 8; + column += 8; } break; } @@ -787,27 +797,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; @@ -848,27 +856,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; @@ -884,7 +890,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; @@ -896,8 +902,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(); @@ -919,8 +924,7 @@ bool Paragraph::simpleTeXOnePar(Buffer const & buf, 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); @@ -1022,8 +1026,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, @@ -1320,12 +1326,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(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; @@ -1385,18 +1406,13 @@ 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 << "latexparam() == "CDATA") + os << "]]>"; + inset->docbook(buf, os, runparams); + if (style->latexparam() == "CDATA") + os << "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 +1525,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 +1539,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 +1550,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; } @@ -1554,7 +1567,7 @@ void Paragraph::changeLanguage(BufferParams const & bparams, } -bool Paragraph::isMultiLingual(BufferParams const & bparams) +bool Paragraph::isMultiLingual(BufferParams const & bparams) const { Language const * doc_language = bparams.language; Pimpl::FontList::const_iterator cit = pimpl_->fontlist.begin(); @@ -1571,8 +1584,7 @@ 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); @@ -1642,11 +1654,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 +1683,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); } @@ -1703,7 +1710,6 @@ bool Paragraph::isChangeEdited(pos_type start, pos_type end) const void Paragraph::setChange(lyx::pos_type pos, Change::Type type) { pimpl_->setChange(pos, type); - } @@ -1738,7 +1744,6 @@ Paragraph::value_type Paragraph::getChar(pos_type pos) const << id() << " of size " << siz << " is a bit silly !" << endl; BOOST_ASSERT(false); - return '\0'; } return text_[pos]; @@ -1753,11 +1758,6 @@ int Paragraph::id() const LyXLayout_ptr const & Paragraph::layout() const { -/* - InsetBase * inset = inInset(); - if (inset && inset->lyxCode() == InsetBase::ENVIRONMENT_CODE) - return static_cast(inset)->layout(); -*/ return layout_; } @@ -1774,6 +1774,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(); @@ -1805,9 +1812,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; } @@ -1815,9 +1820,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; } @@ -1833,6 +1836,18 @@ RowList::iterator Paragraph::getRow(pos_type pos) } +RowList::const_iterator Paragraph::getRow(pos_type pos) const +{ + RowList::const_iterator rit = rows.end(); + RowList::const_iterator const begin = rows.begin(); + + for (--rit; rit != begin && rit->pos() > pos; --rit) + ; + + return rit; +} + + size_t Paragraph::row(pos_type pos) const { RowList::const_iterator rit = rows.end();