diff --git a/src/Paragraph.cpp b/src/Paragraph.cpp index 09c13cc43b..d3ef713338 100644 --- a/src/Paragraph.cpp +++ b/src/Paragraph.cpp @@ -83,6 +83,8 @@ public: Private(Paragraph * owner, Layout const & layout); /// "Copy constructor" Private(Private const &, Paragraph * owner); + /// Copy constructor from \p beg to \p end + Private(Private const &, Paragraph * owner, pos_type beg, pos_type end); /// void insertChar(pos_type pos, char_type c, Change const & change); @@ -247,6 +249,43 @@ Paragraph::Private::Private(Private const & p, Paragraph * owner) } +Paragraph::Private::Private(Private const & p, Paragraph * owner, + pos_type beg, pos_type end) + : owner_(owner), inset_owner_(p.inset_owner_), fontlist_(p.fontlist_), + params_(p.params_), changes_(p.changes_), + begin_of_body_(p.begin_of_body_), words_(p.words_), + layout_(p.layout_) +{ + id_ = paragraph_id++; + if (beg >= pos_type(p.text_.size())) + return; + text_ = p.text_.substr(beg, end - beg); + InsetList::const_iterator icit = p.insetlist_.begin(); + InsetList::const_iterator iend = p.insetlist_.end(); + for (; icit != iend; ++icit) { + if (icit->pos < beg) + continue; + if (icit->pos >= end) + break; + // Add a new entry in the insetlist_. + insetlist_.insert(icit->inset, icit->pos - beg); + } + FontList::const_iterator fcit = fontlist_.begin(); + FontList::const_iterator fend = fontlist_.end(); + for (; fcit != fend; ++fcit) { + if (fcit->pos() < beg) + continue; + if (fcit->pos() >= end) { + // Add last entry in the fontlist_. + fontlist_.set(text_.size() - 1, fcit->font()); + break; + } + // Add a new entry in the fontlist_. + fontlist_.set(fcit->pos() - beg, fcit->font()); + } +} + + bool Paragraph::isChanged(pos_type start, pos_type end) const { LASSERT(start >= 0 && start <= size(), /**/); @@ -1060,6 +1099,14 @@ Paragraph::Paragraph(Paragraph const & par) } +Paragraph::Paragraph(Paragraph const & par, pos_type beg, pos_type end) + : itemdepth(par.itemdepth), + d(new Paragraph::Private(*par.d, this, beg, end)) +{ + registerWords(); +} + + Paragraph & Paragraph::operator=(Paragraph const & par) { // needed as we will destroy the private part before copying it diff --git a/src/Paragraph.h b/src/Paragraph.h index b5c0cc2f9c..2e720d8aa6 100644 --- a/src/Paragraph.h +++ b/src/Paragraph.h @@ -89,6 +89,9 @@ public: Paragraph(); /// Paragraph(Paragraph const &); + /// Partial copy constructor. + /// Copy the Paragraph contents from \p beg to \p end (without end). + Paragraph(Paragraph const & par, pos_type beg, pos_type end); /// Paragraph & operator=(Paragraph const &); ///