/// <summary> /// Performs the actual enumeration and factory invocation. /// </summary> private static IEnumerable <IVsSolutionHierarchyNode> Enumerate(VsSolutionHierarchyNode parent, bool isSolution) { int hr; object pVar; hr = parent.VsHierarchy.GetProperty(parent.ItemId, (int)(isSolution ? __VSHPROPID.VSHPROPID_FirstVisibleChild : __VSHPROPID.VSHPROPID_FirstChild), out pVar); Microsoft.VisualStudio.ErrorHandler.ThrowOnFailure(hr); if (VSConstants.S_OK == hr) { uint siblingId = GetItemId(pVar); while (siblingId != VSConstants.VSITEMID_NIL) { yield return(new VsSolutionHierarchyNode(parent.VsHierarchy, siblingId, new System.Lazy <VsSolutionHierarchyNode>(() => parent))); hr = parent.VsHierarchy.GetProperty(siblingId, (int)(isSolution ? __VSHPROPID.VSHPROPID_NextVisibleSibling : __VSHPROPID.VSHPROPID_NextSibling), out pVar); if (VSConstants.S_OK == hr) { siblingId = GetItemId(pVar); } else { Microsoft.VisualStudio.ErrorHandler.ThrowOnFailure(hr); break; } } } }
public void WhenGettingParentForSolutionNode_ThenReturnsNull() { var solution = ServiceProvider.GetService<IVsSolution>(); var hierarchy = solution as IVsHierarchy; var node = new VsSolutionHierarchyNode(hierarchy, VSConstants.VSITEMID_ROOT); Assert.Null(node.Parent); }
public void WhenIteratingSolutionFolder1_ThenGetsTwoNodes() { var solution = ServiceProvider.GetService<IVsSolution>(); var hierarchy = solution as IVsHierarchy; var solutionFolder1 = new VsSolutionHierarchyNode(hierarchy, VSConstants.VSITEMID_ROOT).Children .FirstOrDefault(n => n.VsHierarchy.Properties(n.ItemId).DisplayName == "SolutionFolder1"); Assert.Equal(2, solutionFolder1.Children.Count()); }
public void WhenIteratingTopLevelNodes_ThenGetsTwoFolders() { var solution = ServiceProvider.GetService<IVsSolution>(); var hierarchy = solution as IVsHierarchy; var nodes = new VsSolutionHierarchyNode(hierarchy, VSConstants.VSITEMID_ROOT).Children.Select(n => n.VsHierarchy.Properties(n.ItemId).DisplayName).ToList(); Assert.Equal(2, nodes.Count); }
public void WhenGettingParentForSolutionFolder1_ThenReturnsSolution() { var solution = ServiceProvider.GetService<IVsSolution>(); var hierarchy = solution as IVsHierarchy; var solutionFolder1 = new VsSolutionHierarchyNode(hierarchy, VSConstants.VSITEMID_ROOT).Children .FirstOrDefault(n => n.VsHierarchy.Properties(n.ItemId).DisplayName == "SolutionFolder1"); Assert.NotNull(solutionFolder1.Parent); Assert.Equal("SampleSolution", solutionFolder1.Parent.VsHierarchy.Properties(solutionFolder1.ItemId).DisplayName); }
public void WhenGettingAncestorSolutionFolder2_ThenReturnsNull() { var solution = ServiceProvider.GetService<IVsSolution>(); var hierarchy = solution as IVsHierarchy; var solutionFolder1 = new VsSolutionHierarchyNode(hierarchy, VSConstants.VSITEMID_ROOT).Children .FirstOrDefault(n => n.VsHierarchy.Properties(n.ItemId).DisplayName == "SolutionFolder1"); var solutionFolder2 = solutionFolder1.Children .FirstOrDefault(n => n.VsHierarchy.Properties(n.ItemId).DisplayName == "SolutionFolder2"); Assert.Null(solutionFolder2.Parent.Parent.Parent); }
/// <summary> /// Initializes a new instance of the <see cref="ProjectItemNode"/> class. /// </summary> /// <param name="kind">The kind of project node.</param> /// <param name="hierarchyNode">The underlying hierarchy represented by this node.</param> /// <param name="parentNode">The parent node accessor.</param> /// <param name="nodeFactory">The factory for child nodes.</param> /// <param name="adapter">The adapter service that implements the smart cast <see cref="ITreeNode.As{T}"/>.</param> public ProjectItemNode( SolutionNodeKind kind, IVsSolutionHierarchyNode hierarchyNode, Lazy<ITreeNode> parentNode, ITreeNodeFactory<IVsSolutionHierarchyNode> nodeFactory, IAdapterService adapter) : base(kind, hierarchyNode, parentNode, nodeFactory, adapter) { this.nodeFactory = nodeFactory; this.owningProject = new Lazy<IProjectNode>(() => { var owningHierarchy = new VsSolutionHierarchyNode(hierarchyNode.VsHierarchy, VSConstants.VSITEMID_ROOT); return this.nodeFactory.CreateNode(GetParent(owningHierarchy), owningHierarchy) as IProjectNode; }); }
public void WhenIteratingClassLibraryProject_ThenGetsFourNodes() { var solution = ServiceProvider.GetService<IVsSolution>(); var hierarchy = solution as IVsHierarchy; var solutionFolder1 = new VsSolutionHierarchyNode(hierarchy, VSConstants.VSITEMID_ROOT).Children .FirstOrDefault(n => n.VsHierarchy.Properties(n.ItemId).DisplayName == "SolutionFolder1"); var solutionFolder2 = solutionFolder1.Children .FirstOrDefault(n => n.VsHierarchy.Properties(n.ItemId).DisplayName == "SolutionFolder2"); var project = solutionFolder2.Children .FirstOrDefault(n => n.VsHierarchy.Properties(n.ItemId).DisplayName == "ClassLibrary"); var count = project.Children.Count(); Assert.Equal(4, count, "Expected 4 child nodes for project, but instead got {0}: {1}", count, string.Join(", ", project.Children.Select(x => x.DisplayName).ToArray())); }
public void WhenGettingIdFromExtension_ThenAlwaysReturnsSameValue() { var solution = ServiceProvider.GetService<IVsSolution>(); var hierarchy = solution as IVsHierarchy; var solutionFolder1 = new VsSolutionHierarchyNode(hierarchy, VSConstants.VSITEMID_ROOT).Children.FirstOrDefault(n => n.VsHierarchy.Properties(n.ItemId).DisplayName == "SolutionFolder1"); Assert.Equal(solutionFolder1.ItemId, solutionFolder1.VsHierarchy.Properties(solutionFolder1.ItemId).ItemId); var solutionFolder2 = solutionFolder1.Children.FirstOrDefault(n => n.VsHierarchy.Properties(n.ItemId).DisplayName == "SolutionFolder2"); var project = solutionFolder2.Children.FirstOrDefault(n => n.VsHierarchy.Properties(n.ItemId).DisplayName == "ClassLibrary"); Assert.Equal(solutionFolder2.ItemId, solutionFolder2.VsHierarchy.Properties(solutionFolder2.ItemId).ItemId); Assert.Equal(project.ItemId, project.VsHierarchy.Properties(project.ItemId).ItemId); }
public void WhenGettingOwningHierarchyForItem_ThenReturnsProject() { var solution = ServiceProvider.GetService<IVsSolution>(); var hierarchy = solution as IVsHierarchy; var item = new VsSolutionHierarchyNode(hierarchy, VSConstants.VSITEMID_ROOT) .Children .Traverse(TraverseKind.DepthFirst, node => node.Children) .First(node => node.DisplayName == "SolutionItem.txt"); Assert.NotNull(item); Console.WriteLine("Owning hierarchy is project? {0}", (item.VsHierarchy is IVsProject)); Console.WriteLine("Parent display name: {0}", item.Parent.DisplayName); Console.WriteLine("Owning hierarchy project kind: {0}", ((EnvDTE.Project)item.Parent.ExtensibilityObject).Kind); Console.WriteLine("Owning hierarchy is solution folder? {0}", ((EnvDTE.Project)item.Parent.ExtensibilityObject).Kind.Equals(EnvDTE80.ProjectKinds.vsProjectKindSolutionFolder, StringComparison.OrdinalIgnoreCase)); }
public void WhenIteratingClassLibraryProjectFolderFolder_ThenGetsOneNode() { var solution = ServiceProvider.GetService<IVsSolution>(); var hierarchy = solution as IVsHierarchy; var solutionFolder1 = new VsSolutionHierarchyNode(hierarchy, VSConstants.VSITEMID_ROOT).Children .FirstOrDefault(n => n.VsHierarchy.Properties(n.ItemId).DisplayName == "SolutionFolder1"); var solutionFolder2 = solutionFolder1.Children .FirstOrDefault(n => n.VsHierarchy.Properties(n.ItemId).DisplayName == "SolutionFolder2"); var project = solutionFolder2.Children .FirstOrDefault(n => n.VsHierarchy.Properties(n.ItemId).DisplayName == "ClassLibrary"); var folder = project.Children.FirstOrDefault(n => n.VsHierarchy.Properties(n.ItemId).DisplayName == "Folder"); folder = folder.Children.FirstOrDefault(n => n.VsHierarchy.Properties(n.ItemId).DisplayName == "Folder"); Assert.Equal(1, folder.Children.Count()); }
public VsSolutionHierarchyNodeIterator(VsSolutionHierarchyNode parent) { this.parent = parent; }
int IVsSolutionEvents.OnBeforeCloseProject(IVsHierarchy pHierarchy, int fRemoved) { // Quickly exit if there are no subscribers. if (this.ProjectClosing == null) return VSConstants.S_OK; var project = GetProject(pHierarchy); //This event is also fired when a solution folder is added/loaded if (project != null && !(project.Object is SolutionFolder)) { var node = new VsSolutionHierarchyNode(pHierarchy, VSConstants.VSITEMID_ROOT); if (this.nodeFactory.Value.Supports(node)) { this.ProjectClosing(this, new ProjectEventArgs(new Lazy<IProjectNode>(() => GetNode(node).As<IProjectNode>()))); } } return VSConstants.S_OK; }