//===================================================================== /// <summary> /// This can be called after all additional content has been added /// to create the <b>Folder</b> build items in the project. /// </summary> protected void CreateFolderItems() { List <string> buildActions = new List <string>(Enum.GetNames( typeof(BuildAction))); HashSet <string> folderNames = new HashSet <string>(); buildActions.Remove("Folder"); foreach (ProjectItem item in project.MSBuildProject.AllEvaluatedItems) { if (buildActions.Contains(item.ItemType)) { string name = Path.GetDirectoryName(item.EvaluatedInclude); if (name.Length > 0) { folderNames.Add(name); } } } foreach (string folder in folderNames) { project.AddFolderToProject(folder); } }
//===================================================================== /// <summary> /// This can be called after all additional content has been added /// to create the <b>Folder</b> build items in the project. /// </summary> protected void CreateFolderItems() { List <string> buildActions = new List <string>(Enum.GetNames(typeof(BuildAction))); List <string> folderNames = new List <string>(); string name; buildActions.Remove("Folder"); foreach (ProjectItem item in project.MSBuildProject.AllEvaluatedItems) { if (buildActions.IndexOf(item.ItemType) != -1) { if (!Path.IsPathRooted(item.EvaluatedInclude)) { name = Path.GetDirectoryName(item.EvaluatedInclude); } else { // Convert fully qualified paths to relative paths name = FolderPath.TerminatePath(Path.GetDirectoryName(item.EvaluatedInclude)); // Ignore fully qualified paths outside of the project folder if (!name.StartsWith(projectFolder, StringComparison.OrdinalIgnoreCase)) { continue; } name = name.Substring(projectFolder.Length); } if (name.Length > 0 && folderNames.IndexOf(name) == -1) { folderNames.Add(name); } } } foreach (string folder in folderNames) { project.AddFolderToProject(folder); } }
//===================================================================== /// <summary> /// Load the tree with the folder and file items /// </summary> /// <param name="files">The folder and file build items from the /// project</param> public void LoadTree(Collection <FileItem> files) { SortedDictionary <string, FileItem> fileItems = new SortedDictionary <string, FileItem>(); List <string> folderNames = new List <string>(), additionalFolders = new List <string>(); SandcastleProject project = null; FileItem fileItem; TreeNode root, itemNode; TreeNode[] matches; string name; string[] parts; if (files.Count > 0) { project = files[0].ProjectElement.Project; } try { treeView.SuspendLayout(); // First, get a list of all folders and files in sorted order foreach (FileItem item in files) { name = item.Link.PersistablePath; // Resolve MSBuild and environment variable references if (name.IndexOf("$(", StringComparison.Ordinal) != -1 || name.IndexOf('%') != -1) { name = FilePath.AbsoluteToRelativePath(item.Link.BasePath, item.Link); } // Ignore duplicate items if any are found if (!fileItems.ContainsKey(name)) { fileItems.Add(name, item); if (item.BuildAction != BuildAction.Folder) { name = Path.GetDirectoryName(name); if (name.Length != 0) { name = FolderPath.TerminatePath(name); } } else { name = FolderPath.TerminatePath(name); } if (folderNames.IndexOf(name) == -1) { folderNames.Add(name); // Note all paths leading up to this item as well parts = name.Split('\\'); name = String.Empty; for (int idx = 0; idx < parts.Length - 2; idx++) { name += parts[idx] + @"\"; if (additionalFolders.IndexOf(name) == -1) { additionalFolders.Add(name); } } } } } foreach (string folder in additionalFolders) { if (folderNames.IndexOf(folder) == -1) { folderNames.Add(folder); } } folderNames.Sort(); // Create a tree node hierarchy for all folders foreach (string folder in folderNames) { // Ignore the root folder if (folder.Length == 0) { continue; } name = folder.Substring(0, folder.Length - 1); root = treeView.Nodes[0]; // Ignore it if the folder is already present if (treeView.Nodes.Find(folder, true).Length != 0) { continue; } if (name.IndexOf('\\') != -1) { matches = treeView.Nodes.Find(name.Substring(0, name.LastIndexOf('\\') + 1), true); if (matches.Length == 1) { root = matches[0]; name = name.Substring(root.Name.Length); } } fileItems.TryGetValue(folder, out fileItem); // Add a folder node if one doesn't exist if (fileItem == null) { fileItem = project.AddFolderToProject(folder); } itemNode = new TreeNode(name); itemNode.Name = folder; itemNode.Tag = new NodeData(BuildAction.Folder, fileItem, null); itemNode.ImageIndex = itemNode.SelectedImageIndex = (int)NodeIcon.GeneralFolder; AddNode(root.Nodes, itemNode); } // Add each file node in the appropriate folder node foreach (string key in fileItems.Keys) { name = Path.GetDirectoryName(key); fileItem = fileItems[key]; if (fileItem.BuildAction == BuildAction.Folder) { continue; } // Ignore it if the file is already present if (treeView.Nodes.Find(key, true).Length != 0) { continue; } if (name.Length != 0) { name = FolderPath.TerminatePath(name); } matches = treeView.Nodes.Find(name, true); if (matches.Length == 1) { root = matches[0]; } else { root = treeView.Nodes[0]; } itemNode = new TreeNode(Path.GetFileName(key)); itemNode.Name = key; itemNode.Tag = new NodeData(fileItem.BuildAction, fileItem, null); itemNode.ImageIndex = itemNode.SelectedImageIndex = (int)NodeIconFromFilename(key); AddNode(root.Nodes, itemNode); } } finally { treeView.ResumeLayout(); } }