]> git.lyx.org Git - lyx.git/blobdiff - src/PosIterator.C
more cursor dispatch
[lyx.git] / src / PosIterator.C
index ef53d4a64b45e37913de1d6f7382229fb7d3960e..0dba637dd0c6fd41f587adcaeabbbd81b03f82f5 100644 (file)
@@ -14,6 +14,7 @@
 
 #include "buffer.h"
 #include "BufferView.h"
+#include "cursor.h"
 #include "iterators.h"
 #include "lyxtext.h"
 #include "paragraph.h"
 
 #include <boost/next_prior.hpp>
 
+
 using boost::prior;
 
+
+PosIterator::PosIterator(ParagraphList * pl, ParagraphList::iterator pit,
+                        lyx::pos_type pos)
+{
+       stack_.push_back(PosIteratorItem(pl, pit, pos));
+}
+
+
+PosIterator::PosIterator(BufferView & bv)
+{
+       LyXText * text = bv.getLyXText();
+       lyx::pos_type pos = text->cursor().pos();
+       ParagraphList::iterator pit = text->cursorPar();
+
+       ParIterator par = bv.buffer()->par_iterator_begin();
+       ParIterator end = bv.buffer()->par_iterator_end();
+       for (; par != end; ++par) {
+               if (par.pit() == pit)
+                       break;
+       }
+       setFrom(par, pos);
+}
+
+
+PosIterator::PosIterator(ParIterator const & par, lyx::pos_type pos)
+{
+       setFrom(par, pos);
+}
+
+
+void PosIterator::setFrom(ParIterator const & par, lyx::pos_type pos)
+{
+       BOOST_ASSERT(par.size() > 0);
+
+       ParIterator::PosHolder const & ph = par.positions();
+
+       int const last = par.size() - 1;
+       for (int i = 0; i < last; ++i) {
+               ParPosition const & pp = ph[i];
+               stack_.push_back(
+                       PosIteratorItem(const_cast<ParagraphList *>(pp.plist),
+                                       pp.pit, (*pp.it)->pos, *pp.index + 1));
+       }
+       ParPosition const & pp = ph[last];
+       stack_.push_back(
+               PosIteratorItem(const_cast<ParagraphList *>(pp.plist), pp.pit, pos, 0));
+}
+
+
 PosIterator & PosIterator::operator++()
 {
        BOOST_ASSERT(!stack_.empty());
        while (true) {
                PosIteratorItem & p = stack_.back();
-               
+
                if (p.pos < p.pit->size()) {
-                       InsetOld * inset = p.pit->getInset(p.pos);
-                       if (inset) {
-                               ParagraphList * pl = inset->getParagraphs(p.index);
-                               if (pl) {
+                       if (InsetBase * inset = p.pit->getInset(p.pos)) {
+                               if (LyXText * text = inset->getText(p.index)) {
+                                       ParagraphList & pl = text->paragraphs();
                                        p.index++;
-                                       stack_.push_back(PosIteratorItem(pl, pl->begin(), 0));
+                                       stack_.push_back(PosIteratorItem(&pl, pl.begin(), 0));
                                        return *this;
                                }
                        }
@@ -48,10 +98,10 @@ PosIterator & PosIterator::operator++()
                        ++p.pit;
                        p.pos = 0;
                }
-               
+
                if (p.pit != p.pl->end() || stack_.size() == 1)
                        return *this;
-               
+
                stack_.pop_back();
        }
        return *this;
@@ -61,13 +111,13 @@ PosIterator & PosIterator::operator++()
 PosIterator & PosIterator::operator--()
 {
        BOOST_ASSERT(!stack_.empty());
-       
+
        // try to go one position backwards: if on the start of the
-       // ParagraphList, pops an item 
+       // ParagraphList, pops an item
        PosIteratorItem & p = stack_.back();
        if (p.pos > 0) {
                --p.pos;
-               InsetOld * inset = p.pit->getInset(p.pos);
+               InsetBase * inset = p.pit->getInset(p.pos);
                if (inset)
                        p.index = inset->numParagraphs();
        } else {
@@ -84,30 +134,23 @@ PosIterator & PosIterator::operator--()
        // try to push an item if there is some left unexplored
        PosIteratorItem & q = stack_.back();
        if (q.pos < q.pit->size()) {
-               InsetOld * inset = q.pit->getInset(q.pos);
+               InsetBase * inset = q.pit->getInset(q.pos);
                if (inset && q.index > 0) {
-                       ParagraphList *
-                               pl = inset->getParagraphs(q.index - 1);
-                       BOOST_ASSERT(pl);
-                       stack_.push_back(PosIteratorItem(pl, prior(pl->end()), pl->back().size()));
+                       LyXText * text = inset->getText(q.index - 1);
+                       BOOST_ASSERT(text);
+                       ParagraphList & pl = text->paragraphs();
+                       stack_.push_back(PosIteratorItem(&pl, prior(pl.end()), pl.back().size()));
                }
        }
        return *this;
 }
 
 
-bool operator!=(PosIterator const & lhs, PosIterator const & rhs)
-{
-       return !(lhs == rhs);
-}
-
-
 bool operator==(PosIterator const & lhs, PosIterator const & rhs)
 {
-       
        PosIteratorItem const & li = lhs.stack_.back();
        PosIteratorItem const & ri = rhs.stack_.back();
-       
+
        return (li.pl == ri.pl && li.pit == ri.pit &&
                (li.pit == li.pl->end() || li.pos == ri.pos));
 }
@@ -119,52 +162,10 @@ bool PosIterator::at_end() const
 }
 
 
-PosIterator::PosIterator(ParagraphList * pl, ParagraphList::iterator pit,
-                        lyx::pos_type pos)
-{
-       stack_.push_back(PosIteratorItem(pl, pit, pos));
-}
-
-
-PosIterator::PosIterator(BufferView & bv)
-{
-       LyXText * text = bv.getLyXText();
-       lyx::pos_type pos = text->cursor.pos();
-       ParagraphList::iterator pit = text->cursorPar();
-       
-       ParIterator par = bv.buffer()->par_iterator_begin();
-       ParIterator end = bv.buffer()->par_iterator_end();
-       for ( ; par != end; ++par) {
-               if (par.pit() == pit)
-                       break;
-       }
-
-       operator=(par.asPosIterator(pos));
-}
-
-
-InsetOld * PosIterator::inset() const
+InsetBase * PosIterator::inset() const
 {
        if (stack_.size() == 1)
                return 0;
        PosIteratorItem const & pi = stack_[stack_.size() - 2];
        return pi.pit->getInset(pi.pos);
 }
-
-
-int distance(PosIterator const & cur, PosIterator const & end)
-{
-       PosIterator p = cur;
-       int count = 0;
-       for (; p != end; ++p, ++count);
-       return count;
-}
-
-
-void advance(PosIterator & cur, int howmuch)
-{
-       for (int i = 0; i < howmuch; ++i)
-               ++cur;
-       for (int i = 0; i > howmuch; --i)
-               --cur;
-}