lyxerr[Debug::CHANGES] << "track changes for par "
<< id_ << " type " << type << endl;
changes_.reset(new Changes(type));
- changes_->set(type, 0, size());
+ changes_->set(type, 0, size() + 1);
}
return;
changes_.reset(new Changes(Change::INSERTED));
- changes_->set(Change::INSERTED, 0, size());
+ changes_->set(Change::INSERTED, 0, size() + 1);
}
}
+void Paragraph::Pimpl::setChangeFull(pos_type pos, Change change)
+{
+ if (!tracking())
+ return;
+
+ changes_->set(change, pos);
+}
+
Change::Type Paragraph::Pimpl::lookupChange(pos_type pos) const
{
if (!tracking())
break;
case Change::DELETED:
- eraseIntern(i);
- changes_->erase(i);
- --end;
- --i;
+ // Suppress access to nonexistent
+ // "end-of-paragraph char":
+ if (i < size()) {
+ eraseIntern(i);
+ changes_->erase(i);
+ --end;
+ --i;
+ }
break;
}
}
break;
case Change::INSERTED:
- eraseIntern(i);
- changes_->erase(i);
- --end;
- --i;
+ if (i < size()) {
+ eraseIntern(i);
+ changes_->erase(i);
+ --end;
+ --i;
+ }
break;
case Change::DELETED:
changes_->set(Change::UNCHANGED, i);
- if (owner_->isInset(i))
+ // No real char at position size():
+ if (i < size() && owner_->isInset(i))
owner_->getInset(i)->markErased(false);
break;
}
bool Paragraph::Pimpl::erase(pos_type pos)
{
- BOOST_ASSERT(pos < size());
+ BOOST_ASSERT(pos <= size());
if (tracking()) {
Change::Type changetype(changes_->lookup(pos));
// only allow the actual removal if it was /new/ text
if (changetype != Change::INSERTED) {
- if (owner_->isInset(pos))
+ if (pos < size() && owner_->isInset(pos))
owner_->getInset(pos)->markErased(true);
return false;
}
}
- eraseIntern(pos);
- return true;
+ // Don't physically access nonexistent end-of-paragraph char
+ if (pos < size()) {
+ eraseIntern(pos);
+ return true;
+ }
+
+ return false;
}
&& runparams.flavor == OutputParams::LATEX
&& features.isAvailable("dvipost");
- if (inset->isTextInset()) {
+ if (inset->canTrackChanges()) {
column += Changes::latexMarkChange(os, running_change,
Change::UNCHANGED, output);
running_change = Change::UNCHANGED;