* 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
This commit is contained in:
Stefan Schimanski 2007-11-01 10:56:18 +00:00
parent 6408f99b31
commit 6fa7710506
2 changed files with 65 additions and 6 deletions

View File

@ -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<CursorSlice> & cut)
{
cut = std::vector<CursorSlice>(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<CursorSlice> 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)

View File

@ -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<CursorSlice> & cut);
/// cut off CursorSlices with index > above
void cutOff(idx_type above);
/// push CursorSlices on top
void append(std::vector<CursorSlice> 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