From 3006495403061a9e90636616049247b8dc55325f Mon Sep 17 00:00:00 2001
From: dt <qtc-committer@nokia.com>
Date: Fri, 13 Mar 2009 13:55:59 +0100
Subject: [PATCH] Fixes:    Make opening complex projects 6 times faster.

Details:  Optimize addFileNodes and addFolderNodes. Probably has no
effect for qt4projectmanager.
---
 .../cmakeprojectmanager/cmakeproject.cpp      |  3 +-
 src/plugins/projectexplorer/projectnodes.cpp  | 42 ++++++++++++++++---
 2 files changed, 39 insertions(+), 6 deletions(-)

diff --git a/src/plugins/cmakeprojectmanager/cmakeproject.cpp b/src/plugins/cmakeprojectmanager/cmakeproject.cpp
index 05ae4c52b44..28ccae16958 100644
--- a/src/plugins/cmakeprojectmanager/cmakeproject.cpp
+++ b/src/plugins/cmakeprojectmanager/cmakeproject.cpp
@@ -112,6 +112,7 @@ void CMakeProject::parseCMakeLists()
         QList<ProjectExplorer::FileNode *> fileList = cbpparser.fileList();
         // Manually add the CMakeLists.txt file
         fileList.append(new ProjectExplorer::FileNode(sourceDirectory + "/CMakeLists.txt", ProjectExplorer::ProjectFileType, false));
+
         buildTree(m_rootNode, fileList);
         foreach (ProjectExplorer::FileNode *fn, fileList)
             m_files.append(fn->path());
@@ -309,6 +310,7 @@ MakeStep *CMakeProject::makeStep() const
     return 0;
 }
 
+
 void CMakeProject::restoreSettingsImpl(ProjectExplorer::PersistentSettingsReader &reader)
 {
     Project::restoreSettingsImpl(reader);
@@ -341,7 +343,6 @@ void CMakeProject::restoreSettingsImpl(ProjectExplorer::PersistentSettingsReader
 
     }
 
-
     parseCMakeLists(); // Gets the directory from the active buildconfiguration
 
     if (!hasUserFile) {
diff --git a/src/plugins/projectexplorer/projectnodes.cpp b/src/plugins/projectexplorer/projectnodes.cpp
index 05d962fc052..e0958b3abe4 100644
--- a/src/plugins/projectexplorer/projectnodes.cpp
+++ b/src/plugins/projectexplorer/projectnodes.cpp
@@ -386,14 +386,30 @@ void ProjectNode::addFolderNodes(const QList<FolderNode*> &subFolders, FolderNod
                 qDebug("Project node has already a parent folder"));
             folder->setParentFolderNode(parentFolder);
             folder->setProjectNode(this);
-            parentFolder->m_subFolderNodes.append(folder);
+
+            // Find the correct place to insert
+            if (parentFolder->m_subFolderNodes.count() == 0 || sortNodesByPath(parentFolder->m_subFolderNodes.last(), folder)) {
+                // empty list or greater then last node
+                parentFolder->m_subFolderNodes.append(folder);
+            } else {
+                // Binary Search for insertion point
+                int l = 0;
+                int r = parentFolder->m_subFolderNodes.count();
+                while (l != r) {
+                    int i = (l + r) / 2;
+                    if (sortNodesByPath(folder, parentFolder->m_subFolderNodes.at(i))) {
+                        r = i;
+                    } else {
+                        l = i + 1;
+                    }
+                }
+                parentFolder->m_subFolderNodes.insert(l, folder);
+            }
 
             // project nodes have to be added via addProjectNodes
             QTC_ASSERT(folder->nodeType() != ProjectNodeType,
                 qDebug("project nodes have to be added via addProjectNodes"));
         }
-        qSort(parentFolder->m_subFolderNodes.begin(), parentFolder->m_subFolderNodes.end(),
-              sortNodesByPath);
 
         if (emitSignals)
             foreach (NodesWatcher *watcher, m_watchers)
@@ -461,9 +477,25 @@ void ProjectNode::addFileNodes(const QList<FileNode*> &files, FolderNode *folder
 
             file->setParentFolderNode(folder);
             file->setProjectNode(this);
-            folder->m_fileNodes.append(file);
+            // Now find the correct place to insert file
+            if (folder->m_fileNodes.count() == 0 || sortNodesByPath(folder->m_fileNodes.last(), file)) {
+                // empty list or greater then last node
+                folder->m_fileNodes.append(file);
+            } else {
+                // Binary Search for insertion point
+                int l = 0;
+                int r = folder->m_fileNodes.count();
+                while (l != r) {
+                    int i = (l + r) / 2;
+                    if (sortNodesByPath(file, folder->m_fileNodes.at(i))) {
+                        r = i;
+                    } else {
+                        l = i + 1;
+                    }
+                }
+                folder->m_fileNodes.insert(l, file);
+            }
         }
-        qSort(folder->m_fileNodes.begin(), folder->m_fileNodes.end(), sortNodesByPath);
 
         if (emitSignals)
             foreach (NodesWatcher *watcher, m_watchers)
-- 
GitLab