public static bool MaybeMapToNested(HierarchyItemPair outerInfo, out HierarchyItemPair nestedInfo) { Guid IID_IVsHierarchy = typeof(IVsHierarchy).GUID; IVsHierarchy nestedHierarchy; uint nestedItemId; IntPtr nestedHierarchyPtr; if (ErrorHandler.Succeeded(outerInfo.Hierarchy.GetNestedHierarchy(outerInfo.ItemID, ref IID_IVsHierarchy, out nestedHierarchyPtr, out nestedItemId)) && nestedHierarchyPtr != IntPtr.Zero) // For items in solution folders, it succeeds with a returned null ptr! { try { nestedHierarchy = Marshal.GetObjectForIUnknown(nestedHierarchyPtr) as IVsHierarchy; } finally { Marshal.Release(nestedHierarchyPtr); } nestedInfo = new HierarchyItemPair(nestedHierarchy, nestedItemId); return(true); } else { nestedInfo = outerInfo; return(false); } }
private void EnsureNestedInfo() { if (!_isNestedInfoValid) { _isNestedItem = HierarchyItemPair.MaybeMapToNested(_hierarchyInfo, out _nestedInfo); _isNestedInfoValid = true; } }
public HierarchyItemIdentity(IVsHierarchy hierarchy, uint itemid) { // see if this hierarchy/itemid pair is equal to a node in a parent hierarchy IVsHierarchy parentHierarchy; uint parentItemid; if (itemid == (uint)VSConstants.VSITEMID.Root && TryGetHierarchyProperty(hierarchy, itemid, (int)__VSHPROPID.VSHPROPID_ParentHierarchy, out parentHierarchy) && TryGetHierarchyProperty(hierarchy, itemid, (int)__VSHPROPID.VSHPROPID_ParentHierarchyItemid, UnboxAsUInt32, out parentItemid)) { _isNestedInfoValid = true; _isNestedItem = true; _hierarchyInfo = new HierarchyItemPair(parentHierarchy, parentItemid); _nestedInfo = new HierarchyItemPair(hierarchy, itemid); } else { _hierarchyInfo = new HierarchyItemPair(hierarchy, itemid); } }