X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fparagraph.C;h=227568b43f2067155a02c48d60358c590768753c;hb=37d42d45f3f4a5d3e916a080af50b37ae4a9d118;hp=28471576219e4313967b06f6ce01cfc9e86123f9;hpb=2849fbae2a5c94175dcb918952ffbf87fe435199;p=lyx.git diff --git a/src/paragraph.C b/src/paragraph.C index 2847157621..227568b43f 100644 --- a/src/paragraph.C +++ b/src/paragraph.C @@ -48,6 +48,7 @@ #include #include +#include #include #include #include @@ -80,7 +81,8 @@ Paragraph::Paragraph() Paragraph::Paragraph(Paragraph const & par) : itemdepth(par.itemdepth), insetlist(par.insetlist), dim_(par.dim_), - rows_(par.rows_), layout_(par.layout_), + rows_(par.rows_), rowSignature_(par.rowSignature_), + layout_(par.layout_), text_(par.text_), begin_of_body_(par.begin_of_body_), pimpl_(new Paragraph::Pimpl(*par.pimpl_, this)) { @@ -106,6 +108,7 @@ Paragraph & Paragraph::operator=(Paragraph const & par) rows_ = par.rows_; dim_ = par.dim_; + rowSignature_ = par.rowSignature_; layout_ = par.layout(); text_ = par.text_; begin_of_body_ = par.begin_of_body_; @@ -260,18 +263,11 @@ 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) + for (size_t i = 0, n = str.size(); i != n ; ++i) insertChar(start + i, str[i], font); } -bool Paragraph::checkInsertChar(LyXFont &) -{ - return true; -} - - void Paragraph::insertChar(pos_type pos, Paragraph::value_type c, Change change) { @@ -307,20 +303,6 @@ bool Paragraph::insetAllowed(InsetBase_code code) } -InsetBase * Paragraph::getInset(pos_type pos) -{ - BOOST_ASSERT(pos < size()); - return insetlist.get(pos); -} - - -InsetBase const * Paragraph::getInset(pos_type pos) const -{ - BOOST_ASSERT(pos < size()); - return insetlist.get(pos); -} - - // Gets uninstantiated font setting at position. LyXFont const Paragraph::getFontSettings(BufferParams const & bparams, pos_type pos) const @@ -346,20 +328,30 @@ LyXFont const Paragraph::getFontSettings(BufferParams const & bparams, } -lyx::pos_type Paragraph::getEndPosOfFontSpan(lyx::pos_type pos) const +FontSpan Paragraph::fontSpan(lyx::pos_type pos) const { BOOST_ASSERT(pos <= size()); + lyx::pos_type start = 0; Pimpl::FontList::const_iterator cit = pimpl_->fontlist.begin(); Pimpl::FontList::const_iterator end = pimpl_->fontlist.end(); - for (; cit != end; ++cit) - if (cit->pos() >= pos) - return cit->pos(); + for (; cit != end; ++cit) { + if (cit->pos() >= pos) { + if (pos >= beginOfBody()) + return FontSpan(std::max(start, beginOfBody()), + cit->pos()); + else + return FontSpan(start, + std::min(beginOfBody() - 1, + cit->pos())); + } + start = cit->pos() + 1; + } // This should not happen, but if so, we take no chances. //lyxerr << "Paragraph::getEndPosOfFontSpan: This should not happen!" // << endl; - return pos; + return FontSpan(pos, pos); } @@ -518,7 +510,7 @@ void Paragraph::setFont(pos_type pos, LyXFont const & font) if (it->pos() >= pos) break; } - unsigned int i = distance(beg, it); + size_t const i = distance(beg, it); bool notfound = (it == endit); if (!notfound && pimpl_->fontlist[i].font() == font) @@ -704,7 +696,7 @@ InsetBibitem * Paragraph::bibitem() const { if (!insetlist.empty()) { InsetBase * inset = insetlist.begin()->inset; - if (inset->lyxCode() == InsetBase::BIBTEX_CODE) + if (inset->lyxCode() == InsetBase::BIBITEM_CODE) return static_cast(inset); } return 0; @@ -713,7 +705,7 @@ InsetBibitem * Paragraph::bibitem() const bool Paragraph::forceDefaultParagraphs() const { - return inInset() && inInset()->forceDefaultParagraphs(inInset()); + return inInset() && inInset()->forceDefaultParagraphs(0); } @@ -1031,7 +1023,7 @@ bool Paragraph::simpleTeXOnePar(Buffer const & buf, if (output || running_change != Change::DELETED) { OutputParams rp = runparams; rp.free_spacing = style->free_spacing; - rp.local_language = font.language()->babel(); + rp.local_font = &font; rp.intitle = style->intitle; pimpl_->simpleTeXSpecialChars(buf, bparams, os, texrow, rp, @@ -1069,7 +1061,7 @@ bool Paragraph::simpleTeXOnePar(Buffer const & buf, // Needed if there is an optional argument but no contents. if (body_pos > 0 && body_pos == size()) { - os << "]~"; + os << "}]~"; return_value = false; } @@ -1470,26 +1462,6 @@ void Paragraph::simpleDocBookOnePar(Buffer const & buf, } -namespace { - -/// return true if the char is a meta-character for an inset -inline -bool IsInsetChar(char c) -{ - return (c == Paragraph::META_INSET); -} - -} // namespace anon - - - -bool Paragraph::isHfill(pos_type pos) const -{ - return isInset(pos) - && getInset(pos)->lyxCode() == InsetBase::HFILL_CODE; -} - - bool Paragraph::isNewline(pos_type pos) const { return isInset(pos) @@ -1497,17 +1469,11 @@ bool Paragraph::isNewline(pos_type pos) const } -bool Paragraph::isSeparator(pos_type pos) const -{ - return IsSeparatorChar(getChar(pos)); -} - - bool Paragraph::isLineSeparator(pos_type pos) const { value_type const c = getChar(pos); return IsLineSeparatorChar(c) - || (IsInsetChar(c) && getInset(pos) && + || (c == Paragraph::META_INSET && getInset(pos) && getInset(pos)->isLineSeparator()); } @@ -1634,14 +1600,14 @@ string const Paragraph::asString(Buffer const & buffer, if (IsPrintable(c)) os << c; else if (c == META_INSET) - getInset(i)->plaintext(buffer, os, runparams); + getInset(i)->textString(buffer, os, runparams); } return os.str(); } -void Paragraph::setInsetOwner(UpdatableInset * inset) +void Paragraph::setInsetOwner(InsetBase * inset) { pimpl_->inset_owner = inset; } @@ -1703,9 +1669,9 @@ void Paragraph::setChange(lyx::pos_type pos, Change::Type type) } -void Paragraph::markErased() +void Paragraph::markErased(bool erased) { - pimpl_->markErased(); + pimpl_->markErased(erased); } @@ -1739,7 +1705,7 @@ void Paragraph::layout(LyXLayout_ptr const & new_layout) } -UpdatableInset * Paragraph::inInset() const +InsetBase * Paragraph::inInset() const { return pimpl_->inset_owner; } @@ -1795,10 +1761,15 @@ bool Paragraph::allowEmpty() const } -Row & Paragraph::getRow(pos_type pos) +Row & Paragraph::getRow(pos_type pos, bool boundary) { BOOST_ASSERT(!rows().empty()); + // If boundary is set we should return the row on which + // the character before is inside. + if (pos > 0 && boundary) + --pos; + RowList::iterator rit = rows_.end(); RowList::iterator const begin = rows_.begin(); @@ -1809,10 +1780,15 @@ Row & Paragraph::getRow(pos_type pos) } -Row const & Paragraph::getRow(pos_type pos) const +Row const & Paragraph::getRow(pos_type pos, bool boundary) const { BOOST_ASSERT(!rows().empty()); + // If boundary is set we should return the row on which + // the character before is inside. + if (pos > 0 && boundary) + --pos; + RowList::const_iterator rit = rows_.end(); RowList::const_iterator const begin = rows_.begin();