From 36f3f096895f278df21ebdb40c862ec03550b392 Mon Sep 17 00:00:00 2001 From: Boris Kozorovitzky Date: Wed, 3 Nov 2010 17:57:14 +0200 Subject: [PATCH] Allow custom find logic for treenodes --- .../ProjectBrowser/ProjectBrowserControl.cs | 38 ++----------------- .../AbstractProjectBrowserTreeNode.cs | 38 +++++++++++++++++++ .../Pads/ProjectBrowser/TreeNodes/FileNode.cs | 16 ++++++++ .../ProjectBrowser/TreeNodes/ProjectNode.cs | 12 ++++++ 4 files changed, 69 insertions(+), 35 deletions(-) diff --git a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/ProjectBrowserControl.cs b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/ProjectBrowserControl.cs index e07b162933..fabe7e2119 100644 --- a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/ProjectBrowserControl.cs +++ b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/ProjectBrowserControl.cs @@ -292,7 +292,7 @@ namespace ICSharpCode.SharpDevelop.Project } string relativePath = String.Empty; - TreeNode targetNode = FindProjectNode(project); + AbstractProjectBrowserTreeNode targetNode = FindProjectNode(project); if (targetNode == null) { @@ -304,7 +304,7 @@ namespace ICSharpCode.SharpDevelop.Project return null; } else { - targetNode = treeView.Nodes[0]; + targetNode = treeView.Nodes[0] as AbstractProjectBrowserTreeNode; if (fileName.StartsWith(solution.Directory)) { relativePath = fileName.Replace(solution.Directory, ""); } @@ -337,39 +337,7 @@ namespace ICSharpCode.SharpDevelop.Project } - if (!targetNode.IsExpanded) { - // the targetNode is not expanded so it's as deep as we can go - //LoggingService.DebugFormatted("target node '{0};{1}' is not expanded.", targetNode, targetNode.Text); - return targetNode; - } - - //LoggingService.Debug("entering depth loop..."); - //LoggingService.DebugFormatted(@"\- looking for '{0}'", relativePath); - //LoggingService.DebugFormatted(@"\- starting at '{0}'", targetNode != null ? targetNode.Text : "null"); - - string[] targets = relativePath.Trim('/','\\').Split('/', '\\'); - TreeNode nextNode = null; - foreach (string target in targets) { - //LoggingService.Debug("-- looking for: "+target); - nextNode = null; - foreach (TreeNode node in targetNode.Nodes) { - if (node == null) { - // can happen when the node is currently expanding - continue; - } - if (node.Text == target) { - nextNode = node; - break; - } - } - if (nextNode == null) { - // targetNode is as deep as we can find - break; - } else { - targetNode = nextNode; - } - } - return targetNode; + return targetNode.GetNodeByRelativePath(relativePath); } ProjectNode FindProjectNode(IProject project) diff --git a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/AbstractProjectBrowserTreeNode.cs b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/AbstractProjectBrowserTreeNode.cs index 429b76ba44..75ab003073 100644 --- a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/AbstractProjectBrowserTreeNode.cs +++ b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/AbstractProjectBrowserTreeNode.cs @@ -160,5 +160,43 @@ namespace ICSharpCode.SharpDevelop.Project { return StringParser.Parse(question, new string[,] {{"FileName", Text}}); } + + public virtual AbstractProjectBrowserTreeNode GetNodeByRelativePath(string relativePath) + { + + if (relativePath == Text) + return this; + + string[] targets = relativePath.Trim('/', '\\').Split('/', '\\'); + if (targets[0] != Text) + return null; + + if (!this.IsExpanded) + { + // the targetNode is not expanded so it's as deep as we can go + //LoggingService.DebugFormatted("target node '{0};{1}' is not expanded.", targetNode, targetNode.Text); + return this; + } + + string currentPath = relativePath.Trim('/', '\\').RemoveStart(targets[0]).Trim('/', '\\'); + //LoggingService.Debug("entering depth loop..."); + //LoggingService.DebugFormatted(@"\- looking for '{0}'", relativePath); + //LoggingService.DebugFormatted(@"\- starting at '{0}'", targetNode != null ? targetNode.Text : "null"); + + //LoggingService.Debug("-- looking for: "+target); + foreach (AbstractProjectBrowserTreeNode node in this.Nodes) + { + if (node == null) + { + // can happen when the node is currently expanding + continue; + } + AbstractProjectBrowserTreeNode tempNode = node.GetNodeByRelativePath(currentPath); + if (tempNode != null) + return tempNode; + } + + return null; + } } } diff --git a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/FileNode.cs b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/FileNode.cs index 31aeb274fc..c7ed3c8a38 100644 --- a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/FileNode.cs +++ b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/FileNode.cs @@ -330,5 +330,21 @@ namespace ICSharpCode.SharpDevelop.Project FileService.RemoveFile(fileNode.FileName, false); } } + + public override AbstractProjectBrowserTreeNode GetNodeByRelativePath(string relativePath) + { + if (relativePath == Text) + return this; + + foreach (AbstractProjectBrowserTreeNode node in Nodes) + { + AbstractProjectBrowserTreeNode returnedNode = node.GetNodeByRelativePath(relativePath); + if (returnedNode != null) + return returnedNode; + } + + return this; + + } } } diff --git a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/ProjectNode.cs b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/ProjectNode.cs index 636aa333d4..05eeae2e9b 100644 --- a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/ProjectNode.cs +++ b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/ProjectNode.cs @@ -225,5 +225,17 @@ namespace ICSharpCode.SharpDevelop.Project new Project.Commands.AddNewItemsToProject().Run(); return; } + + public override AbstractProjectBrowserTreeNode GetNodeByRelativePath(string relativePath) + { + foreach (AbstractProjectBrowserTreeNode node in Nodes) + { + AbstractProjectBrowserTreeNode returnedNode = node.GetNodeByRelativePath(relativePath); + if (returnedNode != null) + return returnedNode; + } + + return this; + } } }