+ return changes_->isChangeEdited(start, end);
+}
+
+
+void Paragraph::Pimpl::setChange(pos_type pos, Change::Type type)
+{
+ if (!tracking())
+ return;
+
+ changes_->set(type, pos);
+}
+
+
+Change::Type Paragraph::Pimpl::lookupChange(pos_type pos) const
+{
+ if (!tracking())
+ return Change::UNCHANGED;
+
+ return changes_->lookup(pos);
+}
+
+
+Change const Paragraph::Pimpl::lookupChangeFull(pos_type pos) const
+{
+ if (!tracking())
+ return Change(Change::UNCHANGED);
+
+ return changes_->lookupFull(pos);
+}
+
+
+void Paragraph::Pimpl::markErased()
+{
+ BOOST_ASSERT(tracking());
+
+ // FIXME: we should actually remove INSERTED chars.
+ // difficult because owning insettexts/tabulars need
+ // to update themselves when rows etc. change
+ changes_->set(Change::DELETED, 0, size());
+ changes_->reset(Change::DELETED);
+}
+
+
+void Paragraph::Pimpl::acceptChange(pos_type start, pos_type end)
+{
+ if (!tracking())
+ return;
+
+ if (!size()) {
+ changes_.reset(new Changes(Change::UNCHANGED));
+ return;
+ }
+
+ lyxerr << "acceptchange" << endl;
+ pos_type i = start;
+
+ for (; i < end; ++i) {
+ switch (lookupChange(i)) {
+ case Change::UNCHANGED:
+ break;
+
+ case Change::INSERTED:
+ changes_->set(Change::UNCHANGED, i);
+ break;
+
+ case Change::DELETED:
+ eraseIntern(i);
+ changes_->erase(i);
+ --end;
+ --i;
+ break;
+ }
+ }
+
+ lyxerr << "endacceptchange" << endl;
+ changes_->reset(Change::UNCHANGED);
+}
+
+
+void Paragraph::Pimpl::rejectChange(pos_type start, pos_type end)
+{
+ if (!tracking())
+ return;
+
+ if (!size()) {
+ changes_.reset(new Changes(Change::UNCHANGED));
+ return;
+ }
+
+ pos_type i = start;
+
+ for (; i < end; ++i) {
+ switch (lookupChange(i)) {
+ case Change::UNCHANGED:
+ break;
+
+ case Change::INSERTED:
+ eraseIntern(i);
+ changes_->erase(i);
+ --end;
+ --i;
+ break;
+
+ case Change::DELETED:
+ changes_->set(Change::UNCHANGED, i);
+ break;
+ }
+ }
+ changes_->reset(Change::UNCHANGED);
+}
+
+
+Paragraph::value_type Paragraph::Pimpl::getChar(pos_type pos) const
+{
+ return owner_->getChar(pos);
+}
+
+
+void Paragraph::Pimpl::insertChar(pos_type pos, value_type c,
+ LyXFont const & font, Change change)
+{
+ BOOST_ASSERT(pos <= size());
+
+ if (tracking()) {
+ changes_->record(change, pos);
+ }
+
+ // This is actually very common when parsing buffers (and
+ // maybe inserting ascii text)
+ if (pos == size()) {
+ // when appending characters, no need to update tables
+ owner_->text_.push_back(c);
+ owner_->setFont(pos, font);
+ return;
+ }
+
+ owner_->text_.insert(owner_->text_.begin() + pos, c);