diff --git a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/DirectoryNode.cs b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/DirectoryNode.cs index bc348eef6f..a968c2bd96 100644 --- a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/DirectoryNode.cs +++ b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/DirectoryNode.cs @@ -215,18 +215,27 @@ namespace ICSharpCode.SharpDevelop.Project canLabelEdit = true; } - public DirectoryNode(string directory) : this(directory, FileNodeStatus.None) + public DirectoryNode(string directory) + : this(directory, FileNodeStatus.None) { sortOrder = 1; canLabelEdit = true; } - CustomNode removeMe = null; + public DirectoryNode(string directory, FileNodeStatus fileNodeStatus) + : this(directory, fileNodeStatus, null) + { + } + + CustomNode removeMe = null; + + public DirectoryNode(string directory, FileNodeStatus fileNodeStatus, ProjectItem projectItem) { sortOrder = 1; ContextmenuAddinTreePath = "/SharpDevelop/Pads/ProjectBrowser/ContextMenu/FolderNode"; - this.Directory = directory; + this.Directory = directory.Trim('\\', '/'); this.fileNodeStatus = fileNodeStatus; + this.ProjectItem = projectItem; removeMe = new CustomNode(); removeMe.AddTo(this); @@ -235,24 +244,6 @@ namespace ICSharpCode.SharpDevelop.Project canLabelEdit = true; } - /// - /// Determines if the specified is a - /// web reference folder in the specified . - /// - /// The project. - /// The full folder path. - public static bool IsWebReferencesFolder(IProject project, string folder) - { - foreach (ProjectItem item in project.Items) { - if (item.ItemType == ItemType.WebReferences) { - if (FileUtility.IsEqualFileName(Path.Combine(project.Directory, item.Include), folder)) { - return true; - } - } - } - return false; - } - public void RecreateSubNodes() { invisibleNodes.Clear(); diff --git a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/DirectoryNodeFactory.cs b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/DirectoryNodeFactory.cs index 19dc2939db..a811d33c94 100644 --- a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/DirectoryNodeFactory.cs +++ b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/DirectoryNodeFactory.cs @@ -18,36 +18,34 @@ namespace ICSharpCode.SharpDevelop.Project { public static DirectoryNode CreateDirectoryNode(TreeNode parent, IProject project, string directory) { - DirectoryNode node = new DirectoryNode(directory); - if (!string.IsNullOrEmpty(project.AppDesignerFolder) - && directory == Path.Combine(project.Directory, project.AppDesignerFolder)) - { - node.SpecialFolder = SpecialFolder.AppDesigner; - } else if (DirectoryNode.IsWebReferencesFolder(project, directory)) { - node = new WebReferencesFolderNode(directory); - } else if (parent != null && parent is WebReferencesFolderNode) { - node = new WebReferenceNode(directory); + if (IsAppDesignerFolder(project, directory)) { + return new DirectoryNode(directory) { SpecialFolder = SpecialFolder.AppDesigner }; + } else if (WebReferencesProjectItem.IsWebReferencesFolder(project, directory)) { + return new WebReferencesFolderNode(directory); + } else if (parent is WebReferencesFolderNode) { + return new WebReferenceNode(directory); } else if (ServiceReferencesProjectItem.IsServiceReferencesFolder(project, directory)) { - node = new ServiceReferencesFolderNode(directory); + return new ServiceReferencesFolderNode(directory); } else if (parent is ServiceReferencesFolderNode) { - node = new ServiceReferenceNode(directory); + return new ServiceReferenceNode(directory); } - return node; + return new DirectoryNode(directory); + } + + static bool IsAppDesignerFolder(IProject project, string directory) + { + return !String.IsNullOrEmpty(project.AppDesignerFolder) && + directory == Path.Combine(project.Directory, project.AppDesignerFolder); } public static DirectoryNode CreateDirectoryNode(ProjectItem item, FileNodeStatus status) { - DirectoryNode node; if (item is WebReferencesProjectItem) { - node = new WebReferencesFolderNode((WebReferencesProjectItem)item); - node.FileNodeStatus = status; + return new WebReferencesFolderNode((WebReferencesProjectItem)item, status); } else if (item is ServiceReferencesProjectItem) { - node = new ServiceReferencesFolderNode(item, status); - } else { - node = new DirectoryNode(item.FileName.Trim('\\', '/'), status); - node.ProjectItem = item; + return new ServiceReferencesFolderNode(item, status); } - return node; + return new DirectoryNode(item.FileName, status, item); } } } diff --git a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/WebReferencesFolderNode.cs b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/WebReferencesFolderNode.cs index 5b5966aa39..cd8ddead0f 100644 --- a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/WebReferencesFolderNode.cs +++ b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/TreeNodes/WebReferencesFolderNode.cs @@ -7,16 +7,29 @@ namespace ICSharpCode.SharpDevelop.Project { public class WebReferencesFolderNode : DirectoryNode { - public WebReferencesFolderNode(WebReferencesProjectItem projectItem) : this(projectItem.Directory) + public WebReferencesFolderNode(WebReferencesProjectItem projectItem) + : this(projectItem, FileNodeStatus.None) + { + } + + public WebReferencesFolderNode(WebReferencesProjectItem projectItem, FileNodeStatus status) + : this(projectItem.Directory, status) { ProjectItem = projectItem; } - public WebReferencesFolderNode(string directory) : base(directory) + public WebReferencesFolderNode(string directory) + : this(directory, FileNodeStatus.None) + { + } + + public WebReferencesFolderNode(string directory, FileNodeStatus status) + : base(directory) { + ContextmenuAddinTreePath = "/SharpDevelop/Pads/ProjectBrowser/ContextMenu/WebReferencesFolderNode"; + FileNodeStatus = status; sortOrder = 0; SpecialFolder = SpecialFolder.WebReferencesFolder; - ContextmenuAddinTreePath = "/SharpDevelop/Pads/ProjectBrowser/ContextMenu/WebReferencesFolderNode"; } } } diff --git a/src/Main/Base/Project/Src/Project/Items/WebReferencesProjectItem.cs b/src/Main/Base/Project/Src/Project/Items/WebReferencesProjectItem.cs index 82b3cc4472..60570be9d2 100644 --- a/src/Main/Base/Project/Src/Project/Items/WebReferencesProjectItem.cs +++ b/src/Main/Base/Project/Src/Project/Items/WebReferencesProjectItem.cs @@ -5,11 +5,14 @@ using System; using System.ComponentModel; using System.IO; +using ICSharpCode.Core; + namespace ICSharpCode.SharpDevelop.Project { public sealed class WebReferencesProjectItem : FileProjectItem { - public WebReferencesProjectItem(IProject project) : base(project, ItemType.WebReferences) + public WebReferencesProjectItem(IProject project) + : base(project, ItemType.WebReferences) { } @@ -20,9 +23,29 @@ namespace ICSharpCode.SharpDevelop.Project [Browsable(false)] public string Directory { - get { - return Path.Combine(Project.Directory, Include).Trim('\\', '/'); + get { return Path.Combine(Project.Directory, Include).Trim('\\', '/'); } + } + + /// + /// Determines if the specified is a + /// web reference folder in the specified . + /// + /// The project. + /// The full folder path. + public static bool IsWebReferencesFolder(IProject project, string folder) + { + foreach (ProjectItem item in project.GetItemsOfType(ItemType.WebReferences)) { + var webReference = item as WebReferencesProjectItem; + if (webReference.IsDirectoryMatch(folder)) { + return true; + } } + return false; + } + + public bool IsDirectoryMatch(string directory) + { + return FileUtility.IsEqualFileName(this.Directory, directory); } } } diff --git a/src/Main/Base/Test/ICSharpCode.SharpDevelop.Tests.csproj b/src/Main/Base/Test/ICSharpCode.SharpDevelop.Tests.csproj index 6d1e1eeb0d..1b4da9d50d 100644 --- a/src/Main/Base/Test/ICSharpCode.SharpDevelop.Tests.csproj +++ b/src/Main/Base/Test/ICSharpCode.SharpDevelop.Tests.csproj @@ -118,14 +118,14 @@ - + - + diff --git a/src/Main/Base/Test/ServiceReferences/DirectoryNodeFactoryTests.cs b/src/Main/Base/Test/ServiceReferences/DirectoryNodeFactoryTests.cs index 558c78a193..dfb79287b4 100644 --- a/src/Main/Base/Test/ServiceReferences/DirectoryNodeFactoryTests.cs +++ b/src/Main/Base/Test/ServiceReferences/DirectoryNodeFactoryTests.cs @@ -27,6 +27,11 @@ namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences return projectItem; } + FileProjectItem CreateFileProjectItem(string include) + { + return new FileProjectItem(project, ItemType.None, include); + } + [Test] public void CreateDirectoryNode_WCFMetadataProjectItem_CreatesServiceReferencesFolderNode() { @@ -91,5 +96,29 @@ namespace ICSharpCode.SharpDevelop.Tests.ServiceReferences Assert.AreEqual(directory, referencesNode.Directory); } + + [Test] + public void CreateDirectoryNode_FileProjectItemThatEndsWithForwardSlash_DirectoryNodeCreatedWithForwardSlashRemoved() + { + CreateProject(); + project.FileName = @"d:\projects\MyProject\MyProject.csproj"; + FileProjectItem projectItem = CreateFileProjectItem(@"MyFolder/"); + + DirectoryNode node = DirectoryNodeFactory.CreateDirectoryNode(projectItem, FileNodeStatus.None); + + Assert.AreEqual(@"d:\projects\MyProject\MyFolder", node.Directory); + } + + [Test] + public void CreateDirectoryNode_FileProjectItemThatEndsWithBackSlash_DirectoryNodeCreatedWithBackSlashRemoved() + { + CreateProject(); + project.FileName = @"d:\projects\MyProject\MyProject.csproj"; + FileProjectItem projectItem = CreateFileProjectItem(@"MyFolder\"); + + DirectoryNode node = DirectoryNodeFactory.CreateDirectoryNode(projectItem, FileNodeStatus.None); + + Assert.AreEqual(@"d:\projects\MyProject\MyFolder", node.Directory); + } } } diff --git a/src/Main/Base/Test/WebReferences/DirectoryNodeFactoryTests.cs b/src/Main/Base/Test/WebReferences/DirectoryNodeFactoryTests.cs index 2810dcb442..1edb1b5e0b 100644 --- a/src/Main/Base/Test/WebReferences/DirectoryNodeFactoryTests.cs +++ b/src/Main/Base/Test/WebReferences/DirectoryNodeFactoryTests.cs @@ -91,7 +91,7 @@ namespace ICSharpCode.SharpDevelop.Tests.WebReferences [Test] public void WebReferencesFolderNodeDirectory() { - Assert.AreEqual(Path.Combine(projectDirectory, "Web References\\"), webReferencesFolderNode.Directory); + Assert.AreEqual(Path.Combine(projectDirectory, "Web References"), webReferencesFolderNode.Directory); } [Test] diff --git a/src/Main/Base/Test/WebReferences/IsWebReferencesFolderTests.cs b/src/Main/Base/Test/WebReferences/IsWebReferencesFolderTests.cs deleted file mode 100644 index 514e8cb0a6..0000000000 --- a/src/Main/Base/Test/WebReferences/IsWebReferencesFolderTests.cs +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) -// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) - -using ICSharpCode.SharpDevelop.Gui; -using ICSharpCode.SharpDevelop.Project; -using NUnit.Framework; -using System; - -namespace ICSharpCode.SharpDevelop.Tests.WebReferences -{ - /// - /// Tests the DirectoryNode.IsWebReferencesFolder method. - /// - [TestFixture] - public class IsWebReferencesFolderTests - { - [Test] - public void IsWebReferencesFolder1() - { - MSBuildBasedProject p = WebReferenceTestHelper.CreateTestProject("C#"); - p.FileName = "C:\\projects\\test\\foo.csproj"; - WebReferencesProjectItem item = new WebReferencesProjectItem(p); - item.Include = "Web References\\"; - ProjectService.AddProjectItem(p, item); - - Assert.IsTrue(DirectoryNode.IsWebReferencesFolder(p, "C:\\projects\\test\\Web References")); - } - - [Test] - public void IsNotWebReferencesFolder1() - { - MSBuildBasedProject p = WebReferenceTestHelper.CreateTestProject("C#"); - p.FileName = "C:\\projects\\test\\foo.csproj"; - WebReferencesProjectItem item = new WebReferencesProjectItem(p); - item.Include = "Web References\\"; - ProjectService.AddProjectItem(p, item); - - Assert.IsFalse(DirectoryNode.IsWebReferencesFolder(p, "C:\\projects\\test\\foo")); - } - - } -} diff --git a/src/Main/Base/Test/WebReferences/WebReferenceProjectItemsTest.cs b/src/Main/Base/Test/WebReferences/WebReferenceTests.cs similarity index 99% rename from src/Main/Base/Test/WebReferences/WebReferenceProjectItemsTest.cs rename to src/Main/Base/Test/WebReferences/WebReferenceTests.cs index b3d7f24d38..0525b71424 100644 --- a/src/Main/Base/Test/WebReferences/WebReferenceProjectItemsTest.cs +++ b/src/Main/Base/Test/WebReferences/WebReferenceTests.cs @@ -17,7 +17,7 @@ namespace ICSharpCode.SharpDevelop.Tests.WebReferences /// Tests the generated project items for a web reference. /// [TestFixture] - public class WebReferenceProjectItemsTest + public class WebReferenceTests { SD.WebReference webReference; DiscoveryClientProtocol protocol; diff --git a/src/Main/Base/Test/WebReferences/WebReferencesProjectItemTests.cs b/src/Main/Base/Test/WebReferences/WebReferencesProjectItemTests.cs new file mode 100644 index 0000000000..928ccbb9a6 --- /dev/null +++ b/src/Main/Base/Test/WebReferences/WebReferencesProjectItemTests.cs @@ -0,0 +1,53 @@ +// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) +// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) + +using ICSharpCode.SharpDevelop.Gui; +using ICSharpCode.SharpDevelop.Project; +using NUnit.Framework; +using System; + +namespace ICSharpCode.SharpDevelop.Tests.WebReferences +{ + [TestFixture] + public class WebReferencesProjectItemTests + { + MSBuildBasedProject project; + + void CreateProject() + { + project = WebReferenceTestHelper.CreateTestProject("C#"); + } + + WebReferencesProjectItem AddWebReferencesToProject(string include) + { + var item = new WebReferencesProjectItem(project); + item.Include = @"Web References\"; + ProjectService.AddProjectItem(project, item); + return item; + } + + [Test] + public void IsWebReferencesFolder_FolderMatchesWebReferencesProjectItemFolder_ReturnsTrue() + { + CreateProject(); + project.FileName = @"C:\projects\test\foo.csproj"; + AddWebReferencesToProject(@"Web References\"); + + bool result = WebReferencesProjectItem.IsWebReferencesFolder(project, @"C:\projects\test\Web References"); + + Assert.IsTrue(result); + } + + [Test] + public void IsWebReferencesFolder_FolderDoesNotMatchWebReferencesProjectItemFolder_ReturnsFalse() + { + CreateProject(); + project.FileName = @"C:\projects\test\foo.csproj"; + AddWebReferencesToProject(@"Web References\"); + + bool result = WebReferencesProjectItem.IsWebReferencesFolder(project, @"C:\projects\test\foo"); + + Assert.IsFalse(result); + } + } +}