From fb056b1a731b3a3c5137ee10797a0feaa0dc8598 Mon Sep 17 00:00:00 2001
From: con <qtc-committer@nokia.com>
Date: Wed, 8 Apr 2009 15:58:08 +0200
Subject: [PATCH] Don't crash when unsplitting more complicated editor splits.

Whenever we want to re-use widgets from the former child SplitterOrView,
we must make sure that this doesn't delete it later on.
---
 .../coreplugin/editormanager/editorview.cpp   | 24 +++++++++++++++----
 .../coreplugin/editormanager/editorview.h     |  2 ++
 2 files changed, 22 insertions(+), 4 deletions(-)

diff --git a/src/plugins/coreplugin/editormanager/editorview.cpp b/src/plugins/coreplugin/editormanager/editorview.cpp
index 930a20c2dfd..48edfc1a009 100644
--- a/src/plugins/coreplugin/editormanager/editorview.cpp
+++ b/src/plugins/coreplugin/editormanager/editorview.cpp
@@ -835,6 +835,24 @@ QSize SplitterOrView::minimumSizeHint() const
     return QSize(64, 64);
 }
 
+QSplitter *SplitterOrView::takeSplitter()
+{
+    QSplitter *oldSplitter = m_splitter;
+    if (m_splitter)
+        m_layout->removeWidget(m_splitter);
+    m_splitter = 0;
+    return oldSplitter;
+}
+
+EditorView *SplitterOrView::takeView()
+{
+    EditorView *oldView = m_view;
+    if (m_view)
+        m_layout->removeWidget(m_view);
+    m_view = 0;
+    return oldView;
+}
+
 void SplitterOrView::split(Qt::Orientation orientation)
 {
     Q_ASSERT(m_view && m_splitter == 0);
@@ -903,13 +921,12 @@ void SplitterOrView::unsplit()
     Q_ASSERT(m_splitter->count() == 1);
     EditorManager *em = CoreImpl::instance()->editorManager();
     SplitterOrView *childSplitterOrView = qobject_cast<SplitterOrView*>(m_splitter->widget(0));
-
     QSplitter *oldSplitter = m_splitter;
     m_splitter = 0;
 
     if (childSplitterOrView->isSplitter()) {
         Q_ASSERT(childSplitterOrView->view() == 0);
-        m_splitter = childSplitterOrView->splitter();
+        m_splitter = childSplitterOrView->takeSplitter();
         m_layout->addWidget(m_splitter);
         m_layout->setCurrentWidget(m_splitter);
     } else {
@@ -923,8 +940,7 @@ void SplitterOrView::unsplit()
             }
             em->emptyView(childView);
         } else {
-            m_view = childView;
-            childSplitterOrView->m_layout->removeWidget(m_view);
+            m_view = childSplitterOrView->takeView();
             m_layout->addWidget(m_view);
         }
         m_layout->setCurrentWidget(m_view);
diff --git a/src/plugins/coreplugin/editormanager/editorview.h b/src/plugins/coreplugin/editormanager/editorview.h
index d198155ca3d..13eb957b299 100644
--- a/src/plugins/coreplugin/editormanager/editorview.h
+++ b/src/plugins/coreplugin/editormanager/editorview.h
@@ -197,6 +197,8 @@ public:
     inline bool hasEditors() const { return m_view && m_view->editorCount() != 0; }
     inline EditorView *view() const { return m_view; }
     inline QSplitter *splitter() const { return m_splitter; }
+    QSplitter *takeSplitter();
+    EditorView *takeView();
 
 
     SplitterOrView *findView(Core::IEditor *editor);
-- 
GitLab