]> git.lyx.org Git - lyx.git/blobdiff - src/DocIterator.cpp
Allow using \binom without amsmath and add support for \brace and \brack
[lyx.git] / src / DocIterator.cpp
index 54f54fa5f228a45edbda27596822c683c18422fd..6130db53c4e10f5e80542c48727aa10ea589204a 100644 (file)
@@ -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 <boost/assert.hpp>
 
 #include <ostream>
@@ -260,30 +261,27 @@ void DocIterator::forwardPos()
        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...
@@ -372,6 +370,7 @@ void DocIterator::backwardPos()
                return;
        }
 
+       // at inset beginning?
        if (top().at_begin()) {
                pop_back();
                return;
@@ -379,14 +378,16 @@ void DocIterator::backwardPos()
 
        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();
@@ -427,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
@@ -479,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)
@@ -489,24 +493,24 @@ DocIterator::idx_type DocIterator::find(MathData const & cell) const
 }
 
 
-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);
 }