]> git.lyx.org Git - features.git/commitdiff
Fix bug 4096. Don't disconnect the buffer until we're ready to connect again.
authorRichard Heck <rgheck@comcast.net>
Fri, 3 Aug 2007 14:07:39 +0000 (14:07 +0000)
committerRichard Heck <rgheck@comcast.net>
Fri, 3 Aug 2007 14:07:39 +0000 (14:07 +0000)
Also, clean up the code a little.

git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@19287 a592a061-630c-0410-9148-cb99ea01b6c8

src/BufferView.cpp
src/BufferView.h
src/frontends/LyXView.cpp
src/frontends/LyXView.h

index ba9be957aada167799202bfa4bf290154f9e8fa8..390b62e01d88a96a02455291e8caea33bbb50c34 100644 (file)
@@ -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_;
 }
 
 
index da216279640438be70b5b936bf50500bac7b70cb..93a4ae9be474f5be2838cee6d2a61bdfb9241bbc 100644 (file)
@@ -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;
 
index 2f8898a6fb9c3730b5047948faca5c06b04ba8c9..773231394d86f743628918c62c07bc359dab5269 100644 (file)
@@ -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;
index f2def70078f20769770a9aef75ae7f32cb6cfdcb..adf88d0ec3ca601f799694766419e776720c6a69 100644 (file)
@@ -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