From 21ce4e59a45333b8b4d1f03d47dd862bc7b75245 Mon Sep 17 00:00:00 2001
From: Eike Ziller <eike.ziller@digia.com>
Date: Thu, 25 Apr 2013 19:19:22 +0200
Subject: [PATCH] EditorManager: Replace another root-to-leaf search by
 leaf-to-root.

For finding the "parent" SplitterOrView it's much easier to go up the
parent hierarchy than doing a depth-first search from the root.

Change-Id: I4c8e195dae2d1f834fb89ab3c213bad5a0fa7d2a
Reviewed-by: David Schulz <david.schulz@digia.com>
---
 .../coreplugin/editormanager/editormanager.cpp   |  2 +-
 .../coreplugin/editormanager/editorview.cpp      | 16 +++++++---------
 .../coreplugin/editormanager/editorview.h        |  2 +-
 3 files changed, 9 insertions(+), 11 deletions(-)

diff --git a/src/plugins/coreplugin/editormanager/editormanager.cpp b/src/plugins/coreplugin/editormanager/editormanager.cpp
index 92cd6348273..bbde9d6414f 100644
--- a/src/plugins/coreplugin/editormanager/editormanager.cpp
+++ b/src/plugins/coreplugin/editormanager/editormanager.cpp
@@ -644,7 +644,7 @@ void EditorManager::closeView(Core::Internal::EditorView *view)
     SplitterOrView *splitterOrView = view->parentSplitterOrView();
     Q_ASSERT(splitterOrView);
     Q_ASSERT(splitterOrView->view() == view);
-    SplitterOrView *splitter = d->m_splitter->findSplitter(splitterOrView);
+    SplitterOrView *splitter = splitterOrView->findParentSplitter();
     Q_ASSERT(splitterOrView->hasEditors() == false);
     splitterOrView->hide();
     delete splitterOrView;
diff --git a/src/plugins/coreplugin/editormanager/editorview.cpp b/src/plugins/coreplugin/editormanager/editorview.cpp
index 04f3fd91c85..bbaff3a5ab9 100644
--- a/src/plugins/coreplugin/editormanager/editorview.cpp
+++ b/src/plugins/coreplugin/editormanager/editorview.cpp
@@ -514,17 +514,15 @@ EditorView *SplitterOrView::findFirstView()
     return m_view;
 }
 
-SplitterOrView *SplitterOrView::findSplitter(SplitterOrView *child)
+SplitterOrView *SplitterOrView::findParentSplitter() const
 {
-    if (m_splitter) {
-        for (int i = 0; i < m_splitter->count(); ++i) {
-            if (SplitterOrView *splitterOrView = qobject_cast<SplitterOrView*>(m_splitter->widget(i))) {
-                if (splitterOrView == child)
-                    return this;
-                if (SplitterOrView *result = splitterOrView->findSplitter(child))
-                    return result;
-            }
+    QWidget *w = parentWidget();
+    while (w) {
+        if (SplitterOrView *splitter = qobject_cast<SplitterOrView *>(w)) {
+            QTC_CHECK(splitter->splitter());
+            return splitter;
         }
+        w = w->parentWidget();
     }
     return 0;
 }
diff --git a/src/plugins/coreplugin/editormanager/editorview.h b/src/plugins/coreplugin/editormanager/editorview.h
index 74009d04f05..cb90be3482a 100644
--- a/src/plugins/coreplugin/editormanager/editorview.h
+++ b/src/plugins/coreplugin/editormanager/editorview.h
@@ -182,7 +182,7 @@ public:
     void restoreState(const QByteArray &);
 
     EditorView *findFirstView();
-    SplitterOrView *findSplitter(SplitterOrView *child);
+    SplitterOrView *findParentSplitter() const;
 
     EditorView *findNextView(EditorView *view);
 
-- 
GitLab