]> git.lyx.org Git - features.git/commitdiff
more privacy for CursorSlice members
authorAndré Pönitz <poenitz@gmx.net>
Thu, 18 Mar 2004 16:41:45 +0000 (16:41 +0000)
committerAndré Pönitz <poenitz@gmx.net>
Thu, 18 Mar 2004 16:41:45 +0000 (16:41 +0000)
git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@8505 a592a061-630c-0410-9148-cb99ea01b6c8

src/cursor.C
src/cursor_slice.C
src/cursor_slice.h
src/dociterator.C
src/dociterator.h
src/lyxfunc.C
src/undo.C

index 3f209657a186cba2a642aed28e03ac4e9e35605c..adc8c6a0d4495344f69b8cbe6827b2d2b23b65ff 100644 (file)
@@ -67,12 +67,12 @@ void region(CursorSlice const & i1, CursorSlice const & i2,
        LCursor::col_type & c1, LCursor::col_type & c2)
 {
        InsetBase & p = i1.inset();
-       c1 = p.col(i1.idx_);
-       c2 = p.col(i2.idx_);
+       c1 = p.col(i1.idx());
+       c2 = p.col(i2.idx());
        if (c1 > c2)
                swap(c1, c2);
-       r1 = p.row(i1.idx_);
-       r2 = p.row(i2.idx_);
+       r1 = p.row(i1.idx());
+       r2 = p.row(i2.idx());
        if (r1 > r2)
                swap(r1, r2);
 }
@@ -418,10 +418,10 @@ string LCursor::grabSelection()
        CursorSlice i1 = selBegin();
        CursorSlice i2 = selEnd();
 
-       if (i1.idx_ == i2.idx_) {
+       if (i1.idx() == i2.idx()) {
                if (i1.inset().asMathInset()) {
                        MathArray::const_iterator it = i1.cell().begin();
-                       return asString(MathArray(it + i1.pos_, it + i2.pos_));
+                       return asString(MathArray(it + i1.pos(), it + i2.pos()));
                } else {
                        return "unknown selection 1";
                }
@@ -456,8 +456,8 @@ void LCursor::eraseSelection()
        CursorSlice const & i2 = selEnd();
 #warning FIXME
        if (i1.inset().asMathInset()) {
-               if (i1.idx_ == i2.idx_) {
-                       i1.cell().erase(i1.pos_, i2.pos_);
+               if (i1.idx() == i2.idx()) {
+                       i1.cell().erase(i1.pos(), i2.pos());
                } else {
                        MathInset * p = i1.asMathInset();
                        row_type r1, r2;
@@ -895,8 +895,8 @@ void LCursor::adjust(pos_type from, int diff)
 {
        if (pos() > from)
                pos() += diff;
-       if (anchor().pos_ > from)
-               anchor().pos_ += diff;
+       if (anchor().pos() > from)
+               anchor().pos() += diff;
        // just to be on the safe side
        // theoretically unecessary
        normalize();
@@ -932,7 +932,7 @@ MathGridInset * LCursor::enclosingGrid(idx_type & idx) const
                        return 0;
                MathGridInset * p = m->asGridInset();
                if (p) {
-                       idx = operator[](i).idx_;
+                       idx = operator[](i).idx();
                        return p;
                }
        }
@@ -1100,7 +1100,7 @@ bool LCursor::bruteFind(int x, int y, int xlow, int xhigh, int ylow, int yhigh)
        BOOST_ASSERT(text);
        getParsInRange(text->paragraphs(), ylow, yhigh, beg, end);
 
-       DocumentIterator it = insetBegin(bv().buffer()->inset());
+       DocumentIterator it(bv().buffer()->inset());
        DocumentIterator et;
        lyxerr << "x: " << x << " y: " << y << endl;
        lyxerr << "xlow: " << xlow << " ylow: " << ylow << endl;
@@ -1146,7 +1146,7 @@ void LCursor::bruteFind2(int x, int y)
        DocumentIterator it = *this;
        it.back().pos() = 0;
        DocumentIterator et = *this;
-       et.back().pos() = et.back().asMathInset()->cell(et.back().idx_).size();
+       et.back().pos() = et.back().asMathInset()->cell(et.back().idx()).size();
        for (int i = 0; ; ++i) {
                int xo, yo;
                CursorSlice & cur = it.back();
index 7528be9d4337a6248f5777747a4065cb43748148..3cf9cdffa9bf1b1c0150946004217dc9c5d10575 100644 (file)
@@ -37,7 +37,7 @@ CursorSlice::CursorSlice()
 CursorSlice::CursorSlice(InsetBase & p)
        : inset_(&p), idx_(0), par_(0), pos_(0), boundary_(false)
 {
-       ///BOOST_ASSERT(inset_);
+       BOOST_ASSERT(inset_);
 }
 
 
@@ -177,34 +177,34 @@ Paragraph const & CursorSlice::paragraph() const
 
 bool operator==(CursorSlice const & p, CursorSlice const & q)
 {
-       return p.inset_ == q.inset_
-              && p.idx_ == q.idx_
-              && p.par_ == q.par_
-              && p.pos_ == q.pos_;
+       return &p.inset() == &q.inset()
+              && p.idx() == q.idx()
+              && p.par() == q.par()
+              && p.pos() == q.pos();
 }
 
 
 bool operator!=(CursorSlice const & p, CursorSlice const & q)
 {
-       return p.inset_ != q.inset_
-              || p.idx_ != q.idx_
-              || p.par_ != q.par_
-              || p.pos_ != q.pos_;
+       return &p.inset() != &q.inset()
+              || p.idx() != q.idx()
+              || p.par() != q.par()
+              || p.pos() != q.pos();
 }
 
 
 bool operator<(CursorSlice const & p, CursorSlice const & q)
 {
-       if (p.inset_ != q.inset_) {
+       if (&p.inset() != &q.inset()) {
                lyxerr << "can't compare cursor and anchor in different insets\n"
                       << "p: " << p << '\n' << "q: " << q << endl;
                return true;
        }
-       if (p.idx_ != q.idx_)
-               return p.idx_ < q.idx_;
-       if (p.par_ != q.par_)
-               return p.par_ < q.par_;
-       return p.pos_ < q.pos_;
+       if (p.idx() != q.idx())
+               return p.idx() < q.idx();
+       if (p.par() != q.par())
+               return p.par() < q.par();
+       return p.pos() < q.pos();
 }
 
 
@@ -217,12 +217,12 @@ bool operator>(CursorSlice const & p, CursorSlice const & q)
 std::ostream & operator<<(std::ostream & os, CursorSlice const & item)
 {
        return os
-          << "inset: " << item.inset_
+          << "inset: " << &item.inset()
 //        << " text: " << item.text()
-          << " idx: " << item.idx_
-          << " par: " << item.par_
-          << " pos: " << item.pos_
-//        << " x: " << item.inset_->x()
-//        << " y: " << item.inset_->y()
+          << " idx: " << item.idx()
+          << " par: " << item.par()
+          << " pos: " << item.pos()
+//        << " x: " << item.inset().x()
+//        << " y: " << item.inset().y()
 ;
 }
index d3a24aef6c362bd5d3c42127c74cafafc898ed2b..298e0d836c3c779088b08b5e701cae13d7e1f717 100644 (file)
 #ifndef CURSORSLICE_H
 #define CURSORSLICE_H
 
-#include <cstddef>
-#include <iosfwd>
+#include "ParagraphList_fwd.h"
 
 #include "support/types.h"
 
+#include <cstddef>
+#include <iosfwd>
+
 class BufferView;
 class InsetBase;
 class MathInset;
@@ -66,8 +68,12 @@ public:
        idx_type lastidx() const { return nargs() - 1; }
        /// return the paragraph this cursor is in
        par_type par() const;
-       /// return the paragraph this cursor is in
+       /// set the paragraph this cursor is in
        par_type & par();
+       /// increments the paragraph this cursor is in
+       void incrementPar();
+       /// increments the paragraph this cursor is in
+       void decrementPar();
        /// return the position within the paragraph
        pos_type pos() const;
        /// return the position within the paragraph
@@ -112,12 +118,15 @@ public:
        ///
        friend std::ostream & operator<<(std::ostream &, CursorSlice const &);
 public:
-       /// pointer to 'owning' inset
+       /// pointer to 'owning' inset. This is some kind of cache.
        InsetBase * inset_;
+private:
        /// cell index of a position in this inset
        idx_type idx_;
        /// paragraph in this cell (used by texted)
        par_type par_;
+       /// true of 'pit' was properly initialized
+       bool pit_valid_;
        /// position in this cell
        pos_type pos_;
        /**
index b8baa1a28e48b5450f3d470d8cdaa1eb3072353b..e1667ec91489f884a6c4a40aa6aa3ea6907b4f46 100644 (file)
 #include <boost/assert.hpp>
 
 
+DocumentIterator::DocumentIterator()
+{}
+
+
+DocumentIterator::DocumentIterator(InsetBase & inset)
+{
+       push_back(CursorSlice(inset));
+}
+
+
 InsetBase * DocumentIterator::nextInset()
 {
        if (pos() == lastpos())
@@ -270,7 +280,7 @@ void DocumentIterator::forwardPos()
        pop_back();
        // 'top' is invalid now...
        if (size())
-               ++back().pos_;
+               ++back().pos();
        //else
        //      lyxerr << "... no slice left" << std::endl;
 }
@@ -332,21 +342,7 @@ void DocumentIterator::forwardPar()
        pop_back();
        // 'top' is invalid now...
        if (size())
-               ++back().pos_;
-}
-
-
-DocumentIterator insetBegin(InsetBase & inset)
-{
-       DocumentIterator it;
-       it.push_back(CursorSlice(inset));
-       return it;
-}
-
-
-DocumentIterator insetEnd()
-{
-       return DocumentIterator();
+               ++back().pos();
 }
 
 
index baff5c690e86b8153b620e215d36fd3df1723d09..e44c8fd1e8e175a743c09fda78085b3fa23676eb 100644 (file)
@@ -49,6 +49,11 @@ public:
        typedef CursorSlice::col_type col_type;
 
 public:
+       ///
+       DocumentIterator();
+       ///
+       explicit DocumentIterator(InsetBase & inset);
+
        //
        // access to slice at tip
        //
@@ -164,12 +169,6 @@ public:
 };
 
 
-///
-DocumentIterator insetBegin(InsetBase & inset);
-///
-DocumentIterator insetEnd();
-
-
 // The difference to a ('non stable') DocumentIterator is the removed
 // (overwritte by 0...) part of the CursorSlice data items. So this thing
 // is suitable for external storage, but not for iteration as such.
index 2394391649eb3a0f02a077d5674a4ce482aca910..8f99aa2aa8f99f22a4bca42d97e354fd32957b34 100644 (file)
@@ -695,6 +695,14 @@ void LyXFunc::dispatch(FuncRequest const & cmd, bool verbose)
                        break;
 
                case LFUN_QUIT:
+#if 0
+                       // test speed of DocumentIterator
+                       lyxerr << "start" << endl;
+                       for (DocumentIterator it(owner->buffer()->inset()), end;
+                               it != end; it.forwardPos())
+                               ;
+                       lyxerr << "end" << endl;
+#endif
                        QuitLyX();
                        break;
 
index 24c1f39a3dc5e60ecc03576dbf2126c5984aefe0..b3e3334d37420cba3e79a337687062885afeefe0 100644 (file)
@@ -32,9 +32,6 @@ using lyx::paroffset_type;
 
 namespace {
 
-/// Whether actions are not added to the undo stacks.
-bool undo_frozen;
-
 /// The flag used by finishUndo().
 bool undo_finished;
 
@@ -153,32 +150,28 @@ bool textUndoOrRedo(BufferView & bv,
        finishUndo();
 
        // this implements redo
-       if (!undo_frozen) {
-               otherstack.push(undo);
-               DocumentIterator dit =
-                       undo.cursor.asDocumentIterator(&bv.buffer()->inset());
-               if (dit.inMathed()) {
-                       // not much to be done
-               } else {
-                       otherstack.top().pars.clear();
-                       LyXText * text = dit.text();
-                       BOOST_ASSERT(text);
-                       ParagraphList & plist = text->paragraphs();
-                       if (undo.from + undo.end <= int(plist.size())) {
-                               ParagraphList::iterator first = plist.begin();
-                               advance(first, undo.from);
-                               ParagraphList::iterator last = plist.begin();
-                               advance(last, plist.size() - undo.end);
-                               otherstack.top().pars.insert(otherstack.top().pars.begin(), first, last);
-                       }
+       otherstack.push(undo);
+       DocumentIterator dit =
+               undo.cursor.asDocumentIterator(&bv.buffer()->inset());
+       if (dit.inMathed()) {
+               // not much to be done
+       } else {
+               otherstack.top().pars.clear();
+               LyXText * text = dit.text();
+               BOOST_ASSERT(text);
+               ParagraphList & plist = text->paragraphs();
+               if (undo.from + undo.end <= int(plist.size())) {
+                       ParagraphList::iterator first = plist.begin();
+                       advance(first, undo.from);
+                       ParagraphList::iterator last = plist.begin();
+                       advance(last, plist.size() - undo.end);
+                       otherstack.top().pars.insert(otherstack.top().pars.begin(), first, last);
                }
-               otherstack.top().cursor = bv.cursor();
-               //lyxerr << " undo other: " << otherstack.top() << std::endl;
        }
+       otherstack.top().cursor = bv.cursor();
+       //lyxerr << " undo other: " << otherstack.top() << std::endl;
 
-       undo_frozen = true;
        performUndoOrRedo(bv, undo);
-       undo_frozen = false;
        return true;
 }
 
@@ -209,8 +202,6 @@ bool textRedo(BufferView & bv)
 void recordUndo(Undo::undo_kind kind,
        LCursor & cur, paroffset_type first, paroffset_type last)
 {
-       if (undo_frozen)
-               return;
        Buffer * buf = cur.bv().buffer();
        recordUndo(kind, cur, first, last, buf->undostack());
        buf->redostack().clear();