- // 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 false;
+
+ return changes_->isChangeEdited(start, end);
+}
+
+
+void Paragraph::Pimpl::setChangeType(pos_type pos, Change::Type type)
+{
+ if (!tracking())
+ return;
+
+ changes_->set(type, pos);
+}
+
+
+void Paragraph::Pimpl::setChange(pos_type pos, Change change)
+{
+ if (!tracking())
+ return;
+
+ changes_->set(change, pos);
+}
+
+
+Change const Paragraph::Pimpl::lookupChange(pos_type pos) const
+{
+ if (!tracking())
+ return Change(Change::UNCHANGED);
+
+ return changes_->lookup(pos);
+}
+
+
+void Paragraph::Pimpl::markErased(bool erased)
+{
+ BOOST_ASSERT(tracking());
+
+ if (erased) {
+ erase(0, size());
+ } else {
+ for (pos_type i = 0; i < size(); ++i) {
+ changes_->set(Change::UNCHANGED, i);
+ if (owner_->isInset(i))
+ owner_->getInset(i)->markErased(false);
+ }
+ }
+}
+
+
+void Paragraph::Pimpl::acceptChange(pos_type start, pos_type end)
+{
+ if (!tracking())
+ return;
+
+ if (!size()) {
+ changes_.reset(new Changes(Change::UNCHANGED));
+ return;
+ }
+
+ lyxerr[Debug::CHANGES] << "acceptchange" << endl;
+ pos_type i = start;
+
+ for (; i < end; ++i) {
+ switch (lookupChange(i).type) {
+ case Change::UNCHANGED:
+ break;
+
+ case Change::INSERTED:
+ changes_->set(Change::UNCHANGED, i);
+ break;
+
+ case Change::DELETED:
+ // Suppress access to nonexistent
+ // "end-of-paragraph char":
+ if (i < size()) {
+ eraseIntern(i);
+ changes_->erase(i);
+ --end;
+ --i;
+ }
+ break;
+ }
+ }
+
+ lyxerr[Debug::CHANGES] << "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).type) {
+ case Change::UNCHANGED:
+ break;
+
+ case Change::INSERTED:
+ if (i < size()) {
+ eraseIntern(i);
+ changes_->erase(i);
+ --end;
+ --i;
+ }
+ break;
+
+ case Change::DELETED:
+ changes_->set(Change::UNCHANGED, i);
+ // No real char at position size():
+ if (i < size() && owner_->isInset(i))
+ owner_->getInset(i)->markErased(false);
+ break;
+ }
+ }
+ changes_->reset(Change::UNCHANGED);