- // This is in the critical path for loading!
- pos_type const siz = size();
- lyx::Assert(pos <= siz);
- // This is stronger, and I belive that this is the assertion
- // that we should really use. (Lgb)
- //Assert(pos < size());
-
- // Then this has no meaning. (Lgb)
- if (!siz || pos == siz)
- return '\0';
-
- return text[pos];
+ 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);