X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FDocIterator.cpp;h=a29f364aa3deab5f974dc6adcb64f25a646bca12;hb=0362c6aae73c293d1c20277c12d362acfe0b2ef6;hp=174dec29bfd97e1e3543ee9880a3563fea43187d;hpb=9d0ea8aeff32833a90b3fe64df0c5518a9e241be;p=lyx.git diff --git a/src/DocIterator.cpp b/src/DocIterator.cpp index 174dec29bf..a29f364aa3 100644 --- a/src/DocIterator.cpp +++ b/src/DocIterator.cpp @@ -14,7 +14,6 @@ #include "DocIterator.h" -#include "support/debug.h" #include "InsetList.h" #include "Paragraph.h" #include "Text.h" @@ -24,10 +23,13 @@ #include "insets/InsetTabular.h" +#include "support/debug.h" + #include #include +using namespace std; namespace lyx { @@ -76,7 +78,7 @@ Inset * DocIterator::nextInset() const } if (inMathed()) return nextAtom().nucleus(); - return paragraph().isInset(pos()) ? paragraph().getInset(pos()) : 0; + return paragraph().getInset(pos()); } @@ -94,7 +96,7 @@ Inset * DocIterator::prevInset() const else return prevAtom().nucleus(); } - return paragraph().isInset(pos() - 1) ? paragraph().getInset(pos() - 1) : 0; + return paragraph().getInset(pos() - 1); } @@ -246,24 +248,16 @@ Inset * DocIterator::innerInsetOfType(int code) const } -void DocIterator::forwardPos(bool ignorecollapsed) +// This duplicates code above, but is in the critical path. +// So please think twice before adding stuff +void DocIterator::forwardPos() { - //this dog bites his tail + // this dog bites his tail if (empty()) { push_back(CursorSlice(*inset_)); return; } - Inset * const nextinset = nextInset(); - // jump over collapsables if they are collapsed - // FIXME: the check for asInsetMath() shouldn't be necessary - // but math insets do not return a sensible editable() state yet. - if (ignorecollapsed && nextinset && (!nextinset->asInsetMath() - && nextinset->editable() != Inset::HIGHLY_EDITABLE)) { - ++top().pos(); - return; - } - CursorSlice & tip = top(); //lyxerr << "XXX\n" << *this << endl; @@ -275,12 +269,10 @@ void DocIterator::forwardPos(bool ignorecollapsed) if (tip.pos() != lastp) { // this is impossible for pos() == size() - if (inMathed()) { + if (inMathed()) n = (tip.cell().begin() + tip.pos())->nucleus(); - } else { - if (paragraph().isInset(tip.pos())) - n = paragraph().getInset(tip.pos()); - } + else + n = paragraph().getInset(tip.pos()); } if (n && n->isActive()) { @@ -301,6 +293,20 @@ void DocIterator::forwardPos(bool ignorecollapsed) } +void DocIterator::forwardPosIgnoreCollapsed() +{ + Inset * const nextinset = nextInset(); + // FIXME: the check for asInsetMath() shouldn't be necessary + // but math insets do not return a sensible editable() state yet. + if (nextinset && !nextinset->asInsetMath() + && nextinset->editable() != Inset::HIGHLY_EDITABLE) { + ++top().pos(); + return; + } + forwardPos(); +} + + void DocIterator::forwardPar() { forwardPos(); @@ -377,12 +383,10 @@ void DocIterator::backwardPos() // move into an inset to the left if possible Inset * n = 0; - if (inMathed()) { + if (inMathed()) n = (top().cell().begin() + top().pos())->nucleus(); - } else { - if (paragraph().isInset(top().pos())) - n = paragraph().getInset(top().pos()); - } + else + n = paragraph().getInset(top().pos()); if (n && n->isActive()) { push_back(CursorSlice(*n)); @@ -424,6 +428,9 @@ void DocIterator::updateInsets(Inset * inset) 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 @@ -456,8 +463,8 @@ bool DocIterator::fixIfBroken() // get inset which is supposed to be in the next slice if (cs.inset().inMathed()) inset = (cs.cell().begin() + cs.pos())->nucleus(); - else if (cs.paragraph().isInset(cs.pos())) - inset = cs.paragraph().getInset(cs.pos()); + else if (Inset * csInset = cs.paragraph().getInset(cs.pos())) + inset = csInset; else { // there are slices left, so there must be another inset break; @@ -476,7 +483,7 @@ bool DocIterator::fixIfBroken() } -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) @@ -486,7 +493,7 @@ DocIterator::idx_type DocIterator::find(MathData const & cell) const } -DocIterator::idx_type DocIterator::find(InsetMath const * inset) const +int DocIterator::find(InsetMath const * inset) const { for (size_t l = 0; l != slices_.size(); ++l) { if (slices_[l].asInsetMath() == inset) @@ -496,20 +503,20 @@ DocIterator::idx_type DocIterator::find(InsetMath const * inset) const } -void DocIterator::cutOff(DocIterator::idx_type above, std::vector & cut) +void DocIterator::cutOff(int above, vector & cut) { - cut = std::vector(slices_.begin() + above + 1, slices_.end()); + cut = vector(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); } -void DocIterator::append(std::vector const & x) +void DocIterator::append(vector const & x) { slices_.insert(slices_.end(), x.begin(), x.end()); } @@ -523,7 +530,7 @@ void DocIterator::append(DocIterator::idx_type idx, pos_type pos) } -std::ostream & operator<<(std::ostream & os, DocIterator const & dit) +ostream & operator<<(ostream & os, DocIterator const & dit) { for (size_t i = 0, n = dit.depth(); i != n; ++i) os << " " << dit[i] << "\n"; @@ -531,29 +538,6 @@ std::ostream & operator<<(std::ostream & os, DocIterator const & dit) } -bool operator<(DocIterator const & p, DocIterator const & q) -{ - size_t depth = std::min(p.depth(), q.depth()); - for (size_t i = 0 ; i < depth ; ++i) { - if (p[i] != q[i]) - return p[i] < q[i]; - } - return p.depth() < q.depth(); -} - - -bool operator>(DocIterator const & p, DocIterator const & q) -{ - return q < p; -} - - -bool operator<=(DocIterator const & p, DocIterator const & q) -{ - return !(q < p); -} - - /////////////////////////////////////////////////////// StableDocIterator::StableDocIterator(DocIterator const & dit) @@ -592,7 +576,7 @@ DocIterator StableDocIterator::asDocIterator(Inset * inset) const } -std::ostream & operator<<(std::ostream & os, StableDocIterator const & dit) +ostream & operator<<(ostream & os, StableDocIterator const & dit) { for (size_t i = 0, n = dit.data_.size(); i != n; ++i) os << " " << dit.data_[i] << "\n";