/// <summary> /// Shows DTOs target options in tree view control. /// </summary> /// <param name="solution">Source solution.</param> private void ShowTargetOptions(Solution solution) { // Get solution name string solutionName = VisualStudioHelper.GetSolutionName(solution); // Create solution node var solutionNodeDTOs = new TreeNodeExtended(solutionName); solutionNodeDTOs.Value = solution; var solutionNodeAssemblers = new TreeNodeExtended(solutionName); solutionNodeAssemblers.Value = solution; // Loop through solution projects foreach (Project project in this.Projects) { // Create project node var projectNodeDTOs = new TreeNodeExtended(project.Name); projectNodeDTOs.Value = project; var projectNodeAssemblers = new TreeNodeExtended(project.Name); projectNodeAssemblers.Value = project; // Get first level folders and add them to project node List<ProjectItem> folders = VisualStudioHelper.GetFirstLevelFoldersFromProject(project); this.AddFoldersToTreeNode(projectNodeDTOs, folders); this.AddFoldersToTreeNode(projectNodeAssemblers, folders); // Add project node to solution node solutionNodeDTOs.Nodes.Add(projectNodeDTOs); solutionNodeAssemblers.Nodes.Add(projectNodeAssemblers); } // Add solution node to tree targets and expand the node this.treeTargetDTOs.Nodes.Add(solutionNodeDTOs); this.treeTargetAssemblers.Nodes.Add(solutionNodeAssemblers); solutionNodeDTOs.Expand(); solutionNodeAssemblers.Expand(); }
/// <summary> /// Adds the received folders to the received tree node. /// </summary> /// <param name="treeNode">Target tree node.</param> /// <param name="folders">Source folders.</param> private void AddFoldersToTreeNode(TreeNodeExtended treeNode, List<ProjectItem> folders) { // Loop through folders foreach (ProjectItem objFolder in folders) { // Create folder node var folderNode = new TreeNodeExtended(objFolder.Name); folderNode.Value = objFolder; // Get sub folders List<ProjectItem> subFolders = VisualStudioHelper.GetFirstLevelFoldersFromFolder(objFolder); // Add sub folders this.AddFoldersToTreeNode(folderNode, subFolders); // Add folder node to target node treeNode.Nodes.Add(folderNode); } }
/// <summary> /// Searches the target inside the received node and is set as selected if found. /// </summary> /// <param name="node">Node where to perform the search.</param> /// <param name="targetType">Target type.</param> /// <param name="targetProjectName">Target project name.</param> /// <param name="targetName">Target name (if targetType is Project then it should be the same as targetProjectName).</param> /// <param name="targetContainer">Object where to set target reference once found.</param> /// <param name="currentFolderLevel">(Optional) Current folder level. Do not pass value on first invocation.</param> /// <returns>Boolean indicating if the target was found.</returns> private bool SetTarget(TreeNodeExtended node, TargetType targetType, string targetProjectName, string targetName, dynamic targetContainer, int currentFolderLevel = -1) { bool found = false; if (node.Nodes != null && node.Nodes.Count > 0) { // Indicates the real target name to search string realTargetName = targetName; // Indicates if there are any more folder levels to search bool pendingFolderLevels = true; if (targetType == TargetType.ProjectFolder && currentFolderLevel >= 0) { // Split target name by levels string[] folderLevels = targetName.Split( new string[] { Resources.ProjectFolderLevelSeparator }, StringSplitOptions.None); // Tagret is a folder, get current level folder name realTargetName = folderLevels[currentFolderLevel]; if ((currentFolderLevel + 1) == folderLevels.Count()) { // Searched folder name reached pendingFolderLevels = false; } } // Loop through childs foreach (TreeNodeExtended childNode in node.Nodes) { if ((targetType == TargetType.Project) && (childNode.Value is Project) && (childNode.Value as Project).Name == targetProjectName) { // Found target project childNode.TreeView.SelectedNode = childNode; childNode.TreeView.SelectedNode.EnsureVisible(); found = true; // Set project reference targetContainer.TargetProject = (childNode.Value as Project); break; } else if (targetType == TargetType.ProjectFolder) { // First search, project level if (currentFolderLevel == -1) { // Is it a project and the one containing the target folder? if (childNode.Value is Project && (childNode.Value as Project).Name == targetProjectName) { // Project found, search target folder inside found = this.SetTarget(childNode, targetType, targetProjectName, targetName, targetContainer, (currentFolderLevel + 1)); // Target folder found? if (found == true) { // Set project reference targetContainer.TargetProject = (childNode.Value as Project); break; } } } else if (childNode.Value is ProjectItem && (childNode.Value as ProjectItem).Name == realTargetName) { if (pendingFolderLevels == true) { // Found a folder that contains at some level the target folder, keep searching found = this.SetTarget(childNode, targetType, targetProjectName, targetName, targetContainer, (currentFolderLevel + 1)); // Target folder found? if (found == true) { break; } } else { // Found target folder childNode.TreeView.SelectedNode = childNode; childNode.TreeView.SelectedNode.EnsureVisible(); found = true; // Set folder reference targetContainer.TargetProjectFolder = (childNode.Value as ProjectItem); break; } } // END else } // END else } // END foreach } // END if return found; }