From c3363f110df7441596dfee27cc7e813c139fda74 Mon Sep 17 00:00:00 2001 From: Stefan Schimanski Date: Sat, 9 Jun 2007 12:39:46 +0000 Subject: [PATCH] * reverting r18516, so no signals anymore in CursorSlices * Alfredo Braunstein's patch to fix cursors properly * CursorSlice::lastpit() added git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@18723 a592a061-630c-0410-9148-cb99ea01b6c8 --- src/CursorSlice.cpp | 22 ++++------- src/CursorSlice.h | 8 ++-- src/DocIterator.cpp | 93 +++++++++++++++++++++++---------------------- 3 files changed, 59 insertions(+), 64 deletions(-) diff --git a/src/CursorSlice.cpp b/src/CursorSlice.cpp index 2b1164e99d..1b4b8ca862 100644 --- a/src/CursorSlice.cpp +++ b/src/CursorSlice.cpp @@ -42,10 +42,6 @@ CursorSlice::CursorSlice(Inset & p) : inset_(&p), idx_(0), pit_(0), pos_(0) { BOOST_ASSERT(inset_); - boost::signal * destroyed_signal = inset_->destroyedSignal(); - if (destroyed_signal) - inset_connection_ = destroyed_signal->connect( - boost::bind(&CursorSlice::invalidate, this)); } @@ -55,22 +51,12 @@ CursorSlice::CursorSlice(CursorSlice const & cs) } -CursorSlice::~CursorSlice() -{ - inset_connection_.disconnect(); -} - - CursorSlice & CursorSlice::operator=(CursorSlice const & cs) { inset_ = cs.inset_; idx_ = cs.idx_; pit_ = cs.pit_; pos_ = cs.pos_; - if (inset_ && inset_->destroyedSignal()) { - inset_connection_ = inset_->destroyedSignal()->connect( - boost::bind(&CursorSlice::invalidate, this)); - } return *this; } @@ -112,6 +98,14 @@ pos_type CursorSlice::lastpos() const } +pit_type CursorSlice::lastpit() const +{ + if (inset().inMathed()) + return 0; + return text()->paragraphs().size() - 1; +} + + CursorSlice::row_type CursorSlice::row() const { BOOST_ASSERT(asInsetMath()); diff --git a/src/CursorSlice.h b/src/CursorSlice.h index 89fd6f5219..daa2dc5815 100644 --- a/src/CursorSlice.h +++ b/src/CursorSlice.h @@ -41,7 +41,7 @@ class Paragraph; // that of MathData and Text should vanish. They are conceptually the // same (now...) -class CursorSlice : public boost::signals::trackable { +class CursorSlice { public: /// Those needs inset_ access. ///@{ @@ -63,8 +63,6 @@ public: /// explicit CursorSlice(Inset &); /// - virtual ~CursorSlice(); - /// CursorSlice & operator=(CursorSlice const &); /// bool isValid() const; @@ -81,6 +79,8 @@ public: pit_type pit() const { return pit_; } /// set the offset of the paragraph this cursor is in pit_type & pit() { return pit_; } + /// return the last paragraph offset this cursor is in + pit_type lastpit() const; /// increments the paragraph this cursor is in void incrementPar(); /// decrements the paragraph this cursor is in @@ -158,8 +158,6 @@ private: bool pit_valid_; /// position in this cell pos_type pos_; - /// connection to referred \c inset_ destruction signal. - boost::signals::connection inset_connection_; }; /// test for equality diff --git a/src/DocIterator.cpp b/src/DocIterator.cpp index bdeff6980a..d3db75d1fd 100644 --- a/src/DocIterator.cpp +++ b/src/DocIterator.cpp @@ -4,6 +4,7 @@ * Licence details can be found in the file COPYING. * * \author André Pönitz + * \author Alfredo Braunstein * * Full author contact details are available in file CREDITS. */ @@ -560,53 +561,55 @@ void DocIterator::updateInsets(Inset * inset) bool DocIterator::fixIfBroken() { - bool fixed = false; - - for (size_t i = slices_.size() - 1; i != 0; --i) - if (!slices_[i].isValid()) { - pop_back(); - fixed = true; + // Go through the slice stack from the bottom. + // Check that all coordinates (idx, pit, pos) are correct and + // that the inset is the one which is claimed to be there + Inset * inset = &slices_[0].inset(); + size_t i = 0; + size_t n = slices_.size(); + for (; i != n; ++i) { + CursorSlice & cs = slices_[i]; + if (&cs.inset() != inset) { + // the whole slice is wrong, chop off this as well + --i; + LYXERR(Debug::DEBUG) << "fixIfBroken(): inset changed" << endl; + break; + } else if (cs.idx() > cs.lastidx()) { + cs.idx() = cs.lastidx(); + cs.pit() = cs.lastpit(); + cs.pos() = cs.lastpos(); + LYXERR(Debug::DEBUG) << "fixIfBroken(): idx fixed" << endl; + break; + } else if (cs.pit() > cs.lastpit()) { + cs.pit() = cs.lastpit(); + cs.pos() = cs.lastpos(); + LYXERR(Debug::DEBUG) << "fixIfBroken(): pit fixed" << endl; + break; + } else if (cs.pos() > cs.lastpos()) { + cs.pos() = cs.lastpos(); + LYXERR(Debug::DEBUG) << "fixIfBroken(): pos fixed" << endl; + break; + } else if (i != n - 1 && cs.pos() != cs.lastpos()) { + // get inset which is supposed to be in the next slice + if (cs.inset().inMathed()) + inset = (cs.cell().begin() + cs.pos())->nucleus(); + else if (cs.paragraph().isInset(cs.pos())) + inset = cs.paragraph().getInset(cs.pos()); + else { + // there are slices left, so there must be another inset + break; + } } + } - // The top level CursorSlice should always be valid. - BOOST_ASSERT(slices_[0].isValid()); - - if (idx() > lastidx()) { - lyxerr << "wrong idx " << idx() - << ", max is " << lastidx() - << " at level " << depth() - << ". Trying to correct this." << endl; - lyxerr << "old: " << *this << endl; - for (size_t i = idx(); i != lastidx(); --i) - pop_back(); - idx() = lastidx(); - pit() = lastpit(); - pos() = lastpos(); - fixed = true; - } - else if (pit() > lastpit()) { - lyxerr << "wrong pit " << pit() - << ", max is " << lastpit() - << " at level " << depth() - << ". Trying to correct this." << endl; - lyxerr << "old: " << *this << endl; - pit() = lastpit(); - pos() = 0; - fixed = true; - } - else if (pos() > lastpos()) { - lyxerr << "wrong pos " << pos() - << ", max is " << lastpos() - << " at level " << depth() - << ". Trying to correct this." << endl; - lyxerr << "old: " << *this << endl; - pos() = lastpos(); - fixed = true; - } - if (fixed) { - lyxerr << "new: " << *this << endl; - } - return fixed; + // Did we make it through the whole slice stack? Otherwise there + // was a problem at slice i, and we have to chop off above + if (i < n) { + LYXERR(Debug::DEBUG) << "fixIfBroken(): cursor chopped at " << i << endl; + resize(i + 1); + return true; + } else + return false; }