]> git.lyx.org Git - lyx.git/blobdiff - src/iterators.C
include sys/time.h
[lyx.git] / src / iterators.C
index e94479dd049e60c8ed05430734ffe06bfaaa8e4c..6622fd31ac481531374a231325e57a163318f43e 100644 (file)
@@ -2,28 +2,75 @@
 
 #include "iterators.h"
 
-ParIterator  & ParIterator::operator++()
+ParIterator & ParIterator::operator++()
 {
        while (!positions.empty()) {
-               ParPosition & p = positions.back();
+               ParPosition & p = positions.top();
 
                // Does the current inset contain more "cells" ?
                if (p.index >= 0) {
                        ++p.index;
-                       Paragraph * par = (*p.it)->getFirstParagraph(p.index);
+                       Paragraph * par = p.it.getInset()->getFirstParagraph(p.index);
                        if (par) {
-                               positions.push_back(ParPosition(par));
+                               positions.push(ParPosition(par));
                                return *this;
                        }
                        ++p.it;
+               } else
+                       // The following line is needed because the value of
+                       // p.it may be invalid if inset was added/removed to
+                       // the paragraph pointed by the iterator
+                       p.it = p.par->insetlist.begin();
+
+               // Try to find the next inset that contains paragraphs
+               InsetList::iterator end = p.par->insetlist.end();
+               for (; p.it != end; ++p.it) {
+                       Paragraph * par = p.it.getInset()->getFirstParagraph(0);
+                       if (par) {
+                               p.index = 0;
+                               positions.push(ParPosition(par));
+                               return *this;
+                       }
+               }
+               // Try to go to the next paragarph
+               if (p.par->next()) {
+                       p = ParPosition(p.par->next());
+                       return *this;
                }
 
+               positions.pop();
+       }
+       return *this;
+}
+
+
+ParConstIterator & ParConstIterator::operator++()
+{
+       while (!positions.empty()) {
+               ParPosition & p = positions.top();
+
+               // Does the current inset contain more "cells" ?
+               if (p.index >= 0) {
+                       ++p.index;
+                       Paragraph * par = p.it.getInset()->getFirstParagraph(p.index);
+                       if (par) {
+                               positions.push(ParPosition(par));
+                               return *this;
+                       }
+                       ++p.it;
+               } else
+                       // The following line is needed because the value of
+                       // p.it may be invalid if inset was added/removed to
+                       // the paragraph pointed by the iterator
+                       p.it = p.par->insetlist.begin();
+
                // Try to find the next inset that contains paragraphs
-               for ( ; p.it != p.par->inset_iterator_end(); ++p.it) {
-                       Paragraph * par = (*p.it)->getFirstParagraph(0);
+               InsetList::iterator end = p.par->insetlist.end();
+               for (; p.it != end; ++p.it) {
+                       Paragraph * par = p.it.getInset()->getFirstParagraph(0);
                        if (par) {
                                p.index = 0;
-                               positions.push_back(ParPosition(par));
+                               positions.push(ParPosition(par));
                                return *this;
                        }
                }
@@ -33,7 +80,7 @@ ParIterator  & ParIterator::operator++()
                        return *this;
                }
 
-               positions.pop_back();
+               positions.pop();
        }
        return *this;
 }