+bool DocIterator::fixIfBroken()
+{
+ if (empty())
+ return false;
+
+ // Go through the slice stack from the bottom.
+ // Check that all coordinates (idx, pit, pos) are correct and
+ // that the inset is the one which is claimed to be there
+ Inset * inset = &slices_[0].inset();
+ size_t i = 0;
+ size_t n = slices_.size();
+ for (; i != n; ++i) {
+ CursorSlice & cs = slices_[i];
+ if (&cs.inset() != inset) {
+ // the whole slice is wrong, chop off this as well
+ --i;
+ LYXERR(Debug::DEBUG, "fixIfBroken(): inset changed");
+ break;
+ } else if (cs.idx() > cs.lastidx()) {
+ cs.idx() = cs.lastidx();
+ cs.pit() = cs.lastpit();
+ cs.pos() = cs.lastpos();
+ LYXERR(Debug::DEBUG, "fixIfBroken(): idx fixed");
+ break;
+ } else if (cs.pit() > cs.lastpit()) {
+ cs.pit() = cs.lastpit();
+ cs.pos() = cs.lastpos();
+ LYXERR(Debug::DEBUG, "fixIfBroken(): pit fixed");
+ break;
+ } else if (cs.pos() > cs.lastpos()) {
+ cs.pos() = cs.lastpos();
+ LYXERR(Debug::DEBUG, "fixIfBroken(): pos fixed");
+ break;
+ } else if (i != n - 1 && cs.pos() != cs.lastpos()) {
+ // get inset which is supposed to be in the next slice
+ if (cs.inset().inMathed())
+ inset = (cs.cell().begin() + cs.pos())->nucleus();
+ else if (Inset * csInset = cs.paragraph().getInset(cs.pos()))
+ inset = csInset;
+ else {
+ // there are slices left, so there must be another inset
+ break;
+ }
+ }
+ }
+
+ // Did we make it through the whole slice stack? Otherwise there
+ // was a problem at slice i, and we have to chop off above
+ if (i < n) {
+ LYXERR(Debug::DEBUG, "fixIfBroken(): cursor chopped at " << i);
+ resize(i + 1);
+ return true;
+ } else
+ return false;
+}
+
+
+int DocIterator::find(MathData const & cell) const
+{
+ for (size_t l = 0; l != slices_.size(); ++l) {
+ if (slices_[l].asInsetMath() && &slices_[l].cell() == &cell)
+ return l;
+ }
+ return -1;
+}
+
+
+int DocIterator::find(InsetMath const * inset) const
+{
+ for (size_t l = 0; l != slices_.size(); ++l) {
+ if (slices_[l].asInsetMath() == inset)
+ return l;
+ }
+ return -1;
+}
+
+
+void DocIterator::cutOff(int above, vector<CursorSlice> & cut)
+{
+ cut = vector<CursorSlice>(slices_.begin() + above + 1, slices_.end());
+ slices_.resize(above + 1);
+}
+
+
+void DocIterator::cutOff(int above)
+{
+ slices_.resize(above + 1);
+}
+
+
+void DocIterator::append(vector<CursorSlice> const & x)
+{
+ slices_.insert(slices_.end(), x.begin(), x.end());
+}
+
+
+void DocIterator::append(DocIterator::idx_type idx, pos_type pos)
+{
+ slices_.push_back(CursorSlice());
+ top().idx() = idx;
+ top().pos() = pos;
+}
+
+
+ostream & operator<<(ostream & os, DocIterator const & dit)