From bddfd8ff662d7c9e750f6d7713e4b3d62f92efc4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20P=C3=B6nitz?= Date: Thu, 18 Mar 2004 16:41:45 +0000 Subject: [PATCH] more privacy for CursorSlice members git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@8505 a592a061-630c-0410-9148-cb99ea01b6c8 --- src/cursor.C | 26 +++++++++++++------------- src/cursor_slice.C | 42 +++++++++++++++++++++--------------------- src/cursor_slice.h | 17 +++++++++++++---- src/dociterator.C | 28 ++++++++++++---------------- src/dociterator.h | 11 +++++------ src/lyxfunc.C | 8 ++++++++ src/undo.C | 45 ++++++++++++++++++--------------------------- 7 files changed, 90 insertions(+), 87 deletions(-) diff --git a/src/cursor.C b/src/cursor.C index 3f209657a1..adc8c6a0d4 100644 --- a/src/cursor.C +++ b/src/cursor.C @@ -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(); diff --git a/src/cursor_slice.C b/src/cursor_slice.C index 7528be9d43..3cf9cdffa9 100644 --- a/src/cursor_slice.C +++ b/src/cursor_slice.C @@ -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() ; } diff --git a/src/cursor_slice.h b/src/cursor_slice.h index d3a24aef6c..298e0d836c 100644 --- a/src/cursor_slice.h +++ b/src/cursor_slice.h @@ -17,11 +17,13 @@ #ifndef CURSORSLICE_H #define CURSORSLICE_H -#include -#include +#include "ParagraphList_fwd.h" #include "support/types.h" +#include +#include + 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_; /** diff --git a/src/dociterator.C b/src/dociterator.C index b8baa1a28e..e1667ec914 100644 --- a/src/dociterator.C +++ b/src/dociterator.C @@ -12,6 +12,16 @@ #include +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(); } diff --git a/src/dociterator.h b/src/dociterator.h index baff5c690e..e44c8fd1e8 100644 --- a/src/dociterator.h +++ b/src/dociterator.h @@ -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. diff --git a/src/lyxfunc.C b/src/lyxfunc.C index 2394391649..8f99aa2aa8 100644 --- a/src/lyxfunc.C +++ b/src/lyxfunc.C @@ -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; diff --git a/src/undo.C b/src/undo.C index 24c1f39a3d..b3e3334d37 100644 --- a/src/undo.C +++ b/src/undo.C @@ -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();