X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fparagraph_pimpl.C;h=426862c246e3f8d04151b46d8ac03ef240cc1268;hb=35204f8f33d7400a5fefeffea533fb4cb4097211;hp=e7b1b57102ef57a663405505745550f8642746fb;hpb=62b09e3dbde8d38b8eff2aaff3e8b95341d6b336;p=lyx.git diff --git a/src/paragraph_pimpl.C b/src/paragraph_pimpl.C index e7b1b57102..426862c246 100644 --- a/src/paragraph_pimpl.C +++ b/src/paragraph_pimpl.C @@ -78,15 +78,6 @@ Paragraph::Pimpl::Pimpl(Pimpl const & p, Paragraph * owner) } -void Paragraph::Pimpl::setContentsFromPar(Paragraph const & par) -{ - owner_->text_ = par.text_; - // FIXME: change tracking (MG) - // check whether this method is really needed - changes_ = par.pimpl_->changes_; -} - - bool Paragraph::Pimpl::isChanged(pos_type start, pos_type end) const { BOOST_ASSERT(start >= 0 && start <= size()); @@ -187,6 +178,10 @@ void Paragraph::Pimpl::rejectChanges(pos_type start, pos_type end) for (pos_type pos = start; pos < end; ++pos) { switch (lookupChange(pos).type) { case Change::UNCHANGED: + // also reject changes inside of insets + if (pos < size() && owner_->isInset(pos)) { + owner_->getInset(pos)->rejectChanges(); + } break; case Change::INSERTED: @@ -201,12 +196,11 @@ void Paragraph::Pimpl::rejectChanges(pos_type start, pos_type end) case Change::DELETED: changes_.set(Change(Change::UNCHANGED), pos); - break; - } - // also reject changes in nested insets - if (pos < size() && owner_->isInset(pos)) { - owner_->getInset(pos)->rejectChanges(); + // Do NOT reject changes within a deleted inset! + // There may be insertions of a co-author inside of it! + + break; } } } @@ -270,21 +264,26 @@ bool Paragraph::Pimpl::eraseChar(pos_type pos, bool trackChanges) BOOST_ASSERT(pos >= 0 && pos <= size()); if (trackChanges) { - Change::Type changetype(changes_.lookup(pos).type); + Change change = changes_.lookup(pos); + + // set the character to DELETED if + // a) it was previously unchanged or + // b) it was inserted by a co-author - if (changetype == Change::UNCHANGED) { + if (change.type == Change::UNCHANGED || + (change.type == Change::INSERTED && change.author != 0)) { setChange(pos, Change(Change::DELETED)); return false; } - if (changetype == Change::DELETED) + if (change.type == Change::DELETED) return false; } - // Don't physically access nonexistent end-of-paragraph char + // Don't physically access the imaginary end-of-paragraph character. + // eraseChar() can only mark it as DELETED. A physical deletion of + // end-of-par must be handled externally. if (pos == size()) { - // FIXME: change tracking (MG) - // how do we handle end-of-pars previously marked inserted? return false; } @@ -338,7 +337,7 @@ bool Paragraph::Pimpl::eraseChar(pos_type pos, bool trackChanges) int Paragraph::Pimpl::eraseChars(pos_type start, pos_type end, bool trackChanges) { BOOST_ASSERT(start >= 0 && start <= size()); - BOOST_ASSERT(end > start && end <= size() + 1); + BOOST_ASSERT(end >= start && end <= size() + 1); pos_type i = start; for (pos_type count = end - start; count; --count) {