From 02fb80e579db155e20ec345bdd89639117d7094d Mon Sep 17 00:00:00 2001 From: Richard Heck Date: Fri, 3 Aug 2007 14:10:02 +0000 Subject: [PATCH] Fix bug 4096. Don't disconnect the buffer until we're ready to connect again. Also, clean up the code a little. git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/branches/BRANCH_1_5_X@19288 a592a061-630c-0410-9148-cb99ea01b6c8 --- src/BufferView.cpp | 7 ++++--- src/BufferView.h | 3 ++- src/frontends/LyXView.cpp | 31 ++++++++++++++++--------------- src/frontends/LyXView.h | 6 ++++++ 4 files changed, 28 insertions(+), 19 deletions(-) diff --git a/src/BufferView.cpp b/src/BufferView.cpp index ba9be957aa..390b62e01d 100644 --- a/src/BufferView.cpp +++ b/src/BufferView.cpp @@ -143,7 +143,7 @@ Buffer * BufferView::buffer() const } -void BufferView::setBuffer(Buffer * b) +Buffer * BufferView::setBuffer(Buffer * b) { LYXERR(Debug::INFO) << BOOST_CURRENT_FUNCTION << "[ b = " << b << "]" << endl; @@ -182,7 +182,7 @@ void BufferView::setBuffer(Buffer * b) // If we're quitting lyx, don't bother updating stuff if (quitting) { buffer_ = 0; - return; + return 0; } //FIXME Fix for bug 3440 is here. @@ -209,7 +209,7 @@ void BufferView::setBuffer(Buffer * b) offset_ref_ = 0; if (!buffer_) - return; + return 0; LYXERR(Debug::INFO) << BOOST_CURRENT_FUNCTION << "Buffer addr: " << buffer_ << endl; @@ -243,6 +243,7 @@ void BufferView::setBuffer(Buffer * b) if (graphics::Previews::status() != LyXRC::PREVIEW_OFF) graphics::Previews::get().generateBufferPreviews(*buffer_); + return buffer_; } diff --git a/src/BufferView.h b/src/BufferView.h index da21627964..93a4ae9be4 100644 --- a/src/BufferView.h +++ b/src/BufferView.h @@ -86,7 +86,8 @@ public: /// set the buffer we are viewing. /// \todo FIXME: eventually, we will create a new BufferView /// when switching Buffers, so this method should go. - void setBuffer(Buffer * b); + /// returns the buffer currently set + Buffer * setBuffer(Buffer * b); /// return the buffer being viewed. Buffer * buffer() const; diff --git a/src/frontends/LyXView.cpp b/src/frontends/LyXView.cpp index 2f8898a6fb..773231394d 100644 --- a/src/frontends/LyXView.cpp +++ b/src/frontends/LyXView.cpp @@ -133,20 +133,21 @@ void LyXView::setBuffer(Buffer * b, bool child_document) // parentfilename will be used in case when we switch to a child // document (hence when child_document is true) string parentfilename; - if (oldBuffer) { + if (oldBuffer) parentfilename = oldBuffer->fileName(); - disconnectBuffer(); - } if (!b && theBufferList().empty()) getDialogs().hideBufferDependent(); - work_area_->bufferView().setBuffer(b); + Buffer * newBuffer = work_area_->bufferView().setBuffer(b); - //FIXME This would be a little simpler if setBuffer returned the buffer. - Buffer * newBuffer = work_area_->bufferView().buffer(); if (newBuffer) { - if (child_document && newBuffer->getMasterBuffer() != oldBuffer) { + //Are we closing an oldBuffer which was a child document? + if (!b && oldBuffer && oldBuffer->getMasterBuffer() != oldBuffer) + // Update the labels and section numbering of its master Buffer. + updateLabels(*oldBuffer->getMasterBuffer()); + //Are we opening a new child document? + else if (child_document && newBuffer->getMasterBuffer() != oldBuffer) { // Set the parent name of the child document. // This makes insertion of citations and references in the child work, // when the target is in the parent or another child document. @@ -154,13 +155,11 @@ void LyXView::setBuffer(Buffer * b, bool child_document) // Update the labels and section numbering to the new master Buffer. updateLabels(*newBuffer->getMasterBuffer()); } - - if (!b && oldBuffer && oldBuffer->getMasterBuffer() != oldBuffer) - // We are closing oldBuffer which was a child document so we - // must update the labels and section numbering of its master - // Buffer. - updateLabels(*oldBuffer->getMasterBuffer()); - + //Now that all the updating of the old buffer has been done, we can + //connect the new buffer. Note that this will also disconnect the old + //buffer, if such there is. + //FIXME Is it clear that this should go right here? Or should it go + //earlier before the previous if (in which case we'd remove the "else")? connectBuffer(*newBuffer); /* FIXME: We need to rebuild the Toc dialog before the others even @@ -178,7 +177,9 @@ void LyXView::setBuffer(Buffer * b, bool child_document) // hidden. This should go here because some dialogs (eg ToC) // require bv_->text. getDialogs().updateBufferDependent(true); - } + } else + //Disconnect the old buffer...there's no new one. + disconnectBuffer(); if (quitting) return; diff --git a/src/frontends/LyXView.h b/src/frontends/LyXView.h index f2def70078..adf88d0ec3 100644 --- a/src/frontends/LyXView.h +++ b/src/frontends/LyXView.h @@ -254,6 +254,12 @@ private: /// connect to signals in the given buffer void connectBuffer(Buffer & buf); /// disconnect from signals in the given buffer + /// NOTE: Do not call this unless you really want no buffer + /// to be connected---for example, when closing the last open + /// buffer. If you are switching buffers, just call + /// connectBuffer(), and the old buffer will be disconnected + /// automatically. This ensures that we do not leave LyX in a + /// state in which no buffer is connected. void disconnectBuffer(); /// BufferView messages signal connection