Maintains a list of project items
The purpose of this class is to maintain a shadow list of all project items for the project When the Solution Explorer displays the project tree it traverses the project using the IVsHierarchy.GetProperty method. The ProjectExtender redirects the GetProperty method calls to provide them in the order defined by ItemList rather than the order of F# Project Manager
Inheritance: IVsHierarchyEvents
 public ShadowFileNode(ItemList items, ItemNode parent, uint itemId, string path)
     : base(items, parent, itemId, Constants.ItemNodeType.PhysicalFile, path)
 {
     //buildItem.Include for linked files OnAddFile is different from the one after save,
     //so it is better to keep canonical names too and associate 'Include' value with unique canonical name
     buildItem = Items.Project.ProjectProxy.GetBuildItem(this);
     //Admit 'Include' values for files with the same name in different folders are different-there will be no override
     Items.Project.ProjectProxy.IncludeToCanonical[buildItem.Include] = path;
 }
 protected ShadowFolderNode(ItemList items, ItemNode parent, uint itemId, Constants.ItemNodeType type, string path)
     : base(items, parent, itemId, type, path)
 {
     uint child = items.Project.GetNodeChild(itemId);
     while (child != VSConstants.VSITEMID_NIL)
     {
         CreateChildNode(child);
         child = items.Project.GetNodeSibling(child);
     }
     MapChildren();
 }
 public ShadowFileNode(ItemList items, ItemNode parent, uint itemId, string path)
     : base(items, parent, itemId, Constants.ItemNodeType.PhysicalFile, path)
 {
 }
 public RootItemNode(ItemList items, string path)
     : base(items, null, VSConstants.VSITEMID_ROOT, Constants.ItemNodeType.Root, path)
 {
 }
 public PhysicalFolderNode(ItemList items, ItemNode parent, uint itemId, string path)
     : base(items, parent, itemId, Constants.ItemNodeType.PhysicalFolder, path)
 {
 }
 public SubprojectNode(ItemList items, ItemNode parent, uint itemId, string path)
     : base(items, parent, itemId, Constants.ItemNodeType.SubProject, path)
 {
 }
 public ShadowFileNode(ItemList items, ItemNode parent, uint itemId, string path)
     : base(items, parent, itemId, Constants.ItemNodeType.PhysicalFile, path)
 {
     buildItem = Items.Project.ProjectProxy.GetBuildItem(this);
 }
 public ShadowFileNode(ItemList items, ItemNode parent, uint itemId, string path)
     : base(items, parent, itemId, Constants.ItemNodeType.PhysicalFile, path)
 {
     buildItem = Items.Project.ProjectProxy.GetBuildItem(this);
 }
 public RootItemNode(ItemList items, string path)
     : base(items, null, VSConstants.VSITEMID_ROOT, Constants.ItemNodeType.Root, path)
 {
 }
 public PhysicalFolderNode(ItemList items, ItemNode parent, uint itemId, string path)
     : base(items, parent, itemId, Constants.ItemNodeType.PhysicalFolder, path)
 {
 }
 public SubprojectNode(ItemList items, ItemNode parent, uint itemId, string path)
     : base(items, parent, itemId, Constants.ItemNodeType.SubProject, path)
 {
 }