From: Alfredo Braunstein Date: Thu, 6 Nov 2003 09:51:08 +0000 (+0000) Subject: a PosIterator-based ParIterator ctor and 1 user X-Git-Tag: 1.6.10~15825 X-Git-Url: https://git.lyx.org/gitweb/?a=commitdiff_plain;h=18b2090a3f84d89fd22c353c2c5262912342ead8;p=features.git a PosIterator-based ParIterator ctor and 1 user git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@8051 a592a061-630c-0410-9148-cb99ea01b6c8 --- diff --git a/src/ChangeLog b/src/ChangeLog index 116e76b48d..89714a822e 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,8 @@ +2003-11-06 Alfredo Braunstein + + * iterators.[Ch] (ParIterator): new PosIterator-based ctor + * bufferview_funcs.C (put_selection_at): use the above + 2003-11-05 Alfredo Braunstein * text2.C (deleteEmptyParagraphMechanism): fix n-th crash diff --git a/src/PosIterator.h b/src/PosIterator.h index e42ddb4681..6b32ed10c6 100644 --- a/src/PosIterator.h +++ b/src/PosIterator.h @@ -52,6 +52,7 @@ public: lyx::pos_type pos() const { return stack_.top().pos; } bool at_end() const; friend PosIterator ParIterator::asPosIterator(lyx::pos_type) const; + friend ParIterator::ParIterator(PosIterator const &); private: PosIterator() {}; diff --git a/src/bufferview_funcs.C b/src/bufferview_funcs.C index a2f1b8f328..3a0b79de35 100644 --- a/src/bufferview_funcs.C +++ b/src/bufferview_funcs.C @@ -428,9 +428,7 @@ void replaceSelection(LyXText * text) void put_selection_at(BufferView * bv, PosIterator const & cur, int length, bool backwards) { - ParIterator par = bv->buffer()->par_iterator_begin(); - for (; par.pit() != cur.pit(); ++par) - ; + ParIterator par(cur); bv->getLyXText()->clearSelection(); diff --git a/src/iterators.C b/src/iterators.C index 2eccf985a5..49ce762af4 100644 --- a/src/iterators.C +++ b/src/iterators.C @@ -363,6 +363,31 @@ PosIterator ParIterator::asPosIterator(lyx::pos_type pos) const } +ParIterator::ParIterator(PosIterator const & pos) + : pimpl_(new Pimpl) +{ + PosIterator copy = pos; + int const size = copy.stack_.size(); + + for (int i = 0; i < size; ++i) { + PosIteratorItem & it = copy.stack_.top(); + ParPosition pp(it.pit, *it.pl); + if (i > 0) { + InsetOld * inset = it.pit->getInset(it.pos); + BOOST_ASSERT(inset); + InsetList::iterator beg = it.pit->insetlist.begin(); + InsetList::iterator end = it.pit->insetlist.end(); + for (; beg != end && beg->inset != inset; ++beg); + BOOST_ASSERT(beg != end); + pp.it.reset(beg); + pp.index.reset(it.index - 1); + } + pimpl_->positions.insert(pimpl_->positions.begin(), pp); + copy.stack_.pop(); + } +} + + void ParIterator::lockPath(BufferView * bv) const { bv->insetUnlock(); diff --git a/src/iterators.h b/src/iterators.h index 1f23dbf494..bb3288ce8a 100644 --- a/src/iterators.h +++ b/src/iterators.h @@ -33,6 +33,8 @@ public: /// ParIterator(ParIterator const &); /// + ParIterator(PosIterator const &); + /// void operator=(ParIterator const &); /// ParIterator & operator++(); @@ -46,8 +48,7 @@ public: ParagraphList::iterator pit() const; /// ParagraphList & plist() const; - /// returns 'innermost' LyXText if in an inset or '0' instead of - //bv->text + /// returns 'innermost' LyXText LyXText * text(BufferView *) const; /// returns innermost inset InsetOld * inset() const;