X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FDocIterator.cpp;h=a29f364aa3deab5f974dc6adcb64f25a646bca12;hb=0362c6aae73c293d1c20277c12d362acfe0b2ef6;hp=51d21921a0990be19c59106f7823b209b5b3f9f9;hpb=36dbec45069bf3d9db923200835e44f44d904eb8;p=lyx.git diff --git a/src/DocIterator.cpp b/src/DocIterator.cpp index 51d21921a0..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,6 +23,8 @@ #include "insets/InsetTabular.h" +#include "support/debug.h" + #include #include @@ -77,7 +78,7 @@ Inset * DocIterator::nextInset() const } if (inMathed()) return nextAtom().nucleus(); - return paragraph().isInset(pos()) ? paragraph().getInset(pos()) : 0; + return paragraph().getInset(pos()); } @@ -95,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); } @@ -247,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; @@ -276,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()) { @@ -302,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(); @@ -378,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)); @@ -425,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 @@ -457,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; @@ -477,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) @@ -487,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) @@ -497,14 +503,14 @@ DocIterator::idx_type DocIterator::find(InsetMath const * inset) const } -void DocIterator::cutOff(DocIterator::idx_type above, vector & cut) +void DocIterator::cutOff(int above, vector & cut) { 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); }