#include "DocIterator.h"
-#include "support/debug.h"
#include "InsetList.h"
#include "Paragraph.h"
#include "Text.h"
#include "insets/InsetTabular.h"
+#include "support/debug.h"
+
#include <boost/assert.hpp>
#include <ostream>
CursorSlice & tip = top();
//lyxerr << "XXX\n" << *this << endl;
- // this is used twice and shows up in the profiler!
- pos_type const lastp = lastpos();
-
- // move into an inset to the right if possible
- Inset * n = 0;
-
- if (tip.pos() != lastp) {
- // this is impossible for pos() == size()
+ // not at cell/paragraph end?
+ if (tip.pos() != tip.lastpos()) {
+ // move into an inset to the right if possible
+ Inset * n = 0;
if (inMathed())
n = (tip.cell().begin() + tip.pos())->nucleus();
else
n = paragraph().getInset(tip.pos());
+ if (n && n->isActive()) {
+ //lyxerr << "... descend" << endl;
+ push_back(CursorSlice(*n));
+ return;
+ }
}
- if (n && n->isActive()) {
- //lyxerr << "... descend" << endl;
- push_back(CursorSlice(*n));
- return;
- }
-
+ // jump to the next cell/paragraph if possible
if (!tip.at_end()) {
tip.forwardPos();
return;
}
+
// otherwise leave inset and jump over inset as a whole
pop_back();
// 'tip' is invalid now...
return;
}
+ // at inset beginning?
if (top().at_begin()) {
pop_back();
return;
top().backwardPos();
+ // entered another cell/paragraph from the right?
+ if (top().pos() == top().lastpos())
+ return;
+
// move into an inset to the left if possible
Inset * n = 0;
-
if (inMathed())
n = (top().cell().begin() + top().pos())->nucleus();
else
n = paragraph().getInset(top().pos());
-
if (n && n->isActive()) {
push_back(CursorSlice(*n));
top().idx() = lastidx();
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
}
-DocIterator::idx_type DocIterator::find(MathData const & cell) const
+int DocIterator::find(MathData const & cell) const
{
for (size_t l = 0; l != slices_.size(); ++l) {
if (slices_[l].asInsetMath() && &slices_[l].cell() == &cell)
}
-DocIterator::idx_type DocIterator::find(InsetMath const * inset) const
+int DocIterator::find(Inset const * inset) const
{
for (size_t l = 0; l != slices_.size(); ++l) {
- if (slices_[l].asInsetMath() == inset)
+ if (&slices_[l].inset() == inset)
return l;
}
return -1;
}
-void DocIterator::cutOff(DocIterator::idx_type above, vector<CursorSlice> & cut)
+void DocIterator::cutOff(int above, vector<CursorSlice> & cut)
{
cut = vector<CursorSlice>(slices_.begin() + above + 1, slices_.end());
slices_.resize(above + 1);
}
-void DocIterator::cutOff(DocIterator::idx_type above)
+void DocIterator::cutOff(int above)
{
slices_.resize(above + 1);
}