From 6fa7710506497fb65a0fd3d6eb4942f6041be85f Mon Sep 17 00:00:00 2001 From: Stefan Schimanski Date: Thu, 1 Nov 2007 10:56:18 +0000 Subject: [PATCH] * methods to cut off DocIterators and to append vectors of CursorSlices. This is used to keep the visual cursor position when folding/unfolding macros with the cursor in a parameter. git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@21323 a592a061-630c-0410-9148-cb99ea01b6c8 --- src/DocIterator.cpp | 58 ++++++++++++++++++++++++++++++++++++++++----- src/DocIterator.h | 13 ++++++++++ 2 files changed, 65 insertions(+), 6 deletions(-) diff --git a/src/DocIterator.cpp b/src/DocIterator.cpp index 7b7a59d201..a9769ff8a5 100644 --- a/src/DocIterator.cpp +++ b/src/DocIterator.cpp @@ -401,19 +401,18 @@ bool DocIterator::hasPart(DocIterator const & it) const void DocIterator::updateInsets(Inset * inset) { // this function re-creates the cache of inset pointers. - // code taken in part from StableDocIterator::asDocIterator. //lyxerr << "converting:\n" << *this << endl; - DocIterator dit = DocIterator(*inset); + DocIterator dit = *this; size_t const n = slices_.size(); + slices_.resize(0); for (size_t i = 0 ; i < n; ++i) { BOOST_ASSERT(inset); - dit.push_back(slices_[i]); - dit.top().inset_ = inset; + push_back(dit[i]); + top().inset_ = inset; if (i + 1 != n) - inset = dit.nextInset(); + inset = nextInset(); } //lyxerr << "converted:\n" << *this << endl; - operator=(dit); } @@ -471,6 +470,53 @@ bool DocIterator::fixIfBroken() } +DocIterator::idx_type DocIterator::find(MathData const & cell) const +{ + for (size_t l = 0; l != slices_.size(); ++l) { + if (slices_[l].asInsetMath() && &slices_[l].cell() == &cell) + return l; + } + return -1; +} + + +DocIterator::idx_type DocIterator::find(InsetMath const * inset) const +{ + for (size_t l = 0; l != slices_.size(); ++l) { + if (slices_[l].asInsetMath() == inset) + return l; + } + return -1; +} + + +void DocIterator::cutOff(DocIterator::idx_type above, std::vector & cut) +{ + cut = std::vector(slices_.begin() + above + 1, slices_.end()); + slices_.resize(above + 1); +} + + +void DocIterator::cutOff(DocIterator::idx_type above) +{ + slices_.resize(above + 1); +} + + +void DocIterator::append(std::vector const & x) +{ + slices_.insert(slices_.end(), x.begin(), x.end()); +} + + +void DocIterator::append(DocIterator::idx_type idx, pos_type pos) +{ + slices_.push_back(CursorSlice()); + top().idx() = idx; + top().pos() = pos; +} + + std::ostream & operator<<(std::ostream & os, DocIterator const & dit) { for (size_t i = 0, n = dit.depth(); i != n; ++i) diff --git a/src/DocIterator.h b/src/DocIterator.h index fe05e398c8..1ffc262a4e 100644 --- a/src/DocIterator.h +++ b/src/DocIterator.h @@ -212,6 +212,19 @@ public: /// \return true if the DocIterator was fixed. bool fixIfBroken(); + /// find index of CursorSlice with &cell() == &cell (or -1 if not found) + idx_type find(MathData const & cell) const; + /// find index of CursorSlice with inset() == inset (or -1 of not found) + idx_type find(InsetMath const * inset) const; + /// cut off CursorSlices with index > above and store cut off slices in cut + void cutOff(idx_type above, std::vector & cut); + /// cut off CursorSlices with index > above + void cutOff(idx_type above); + /// push CursorSlices on top + void append(std::vector const & x); + /// push one CursorSlice on top and set its index and position + void append(idx_type idx, pos_type pos); + private: /** * When the cursor position is i, is the cursor after the i-th char