From 35b9dbc8099833ca8245f70fe05a8170110bdd37 Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Thu, 24 Nov 2005 17:59:21 +0000 Subject: [PATCH] Fixed SD2-515. Project or assembly reference added to the project when a custom component from the toolbox is added to a form. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@793 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Src/FormDesigner/ToolboxProvider.cs | 154 ++++++++++++------ .../ProjectBrowser/ProjectBrowserControl.cs | 4 +- 2 files changed, 110 insertions(+), 48 deletions(-) diff --git a/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/ToolboxProvider.cs b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/ToolboxProvider.cs index 604513447b..d3be716ade 100644 --- a/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/ToolboxProvider.cs +++ b/src/AddIns/DisplayBindings/FormDesigner/Project/Src/FormDesigner/ToolboxProvider.cs @@ -137,57 +137,37 @@ namespace ICSharpCode.FormDesigner static void SelectedToolUsedHandler(object sender, EventArgs e) { + LoggingService.Debug("SelectedToolUsedHandler"); AxSideTab tab = SharpDevelopSideBar.SideBar.ActiveTab; - + // try to add project reference - if (sender != null && sender is ICSharpCode.FormDesigner.Services.ToolboxService && !(tab is CustomComponentsSideTab)) { + if (sender != null && sender is ICSharpCode.FormDesigner.Services.ToolboxService) { ToolboxItem selectedItem = (sender as IToolboxService).GetSelectedToolboxItem(); - if (selectedItem != null) { - if (selectedItem.AssemblyName != null) { -// TODO: Project system... -// //We Put the assembly reference into the reference project folder -// IProject currentProject = ProjectService.CurrentProject; -// -// if (currentProject != null) { -// bool isAlreadyInRefFolder = false; -// -// if (currentProject.ProjectType == "C#" || currentProject.ProjectType == "VBNET") { -// foreach (string assembly in DefaultParserService.AssemblyList) { -// if (selectedItem.AssemblyName.FullName.StartsWith(assembly + ",")) { -// isAlreadyInRefFolder = true; -// break; -// } -// } -// } -// -// foreach (ProjectReference refproj in currentProject.ProjectReferences) { -// if (refproj.ReferenceType == ReferenceType.Assembly) { -// AssemblyName assemblyName = AssemblyName.GetAssemblyName(refproj.Reference); -// if (assemblyName != null && assemblyName.FullName == selectedItem.AssemblyName.FullName) { -// isAlreadyInRefFolder = true; -// break; -// } -// } else if (refproj.ReferenceType == ReferenceType.Gac) { -// if (refproj.Reference == selectedItem.AssemblyName.FullName) { -// isAlreadyInRefFolder = true; -// break; -// } -// } -// } -// -// if (!isAlreadyInRefFolder && !selectedItem.AssemblyName.FullName.StartsWith("System.")) { -// ToolComponent toolComponent = ToolboxProvider.ComponentLibraryLoader.GetToolComponent(selectedItem.AssemblyName.FullName); -// if (toolComponent == null || toolComponent.HintPath == null) { -// currentProject.ProjectReferences.Add(new ProjectReference(ReferenceType.Gac, selectedItem.AssemblyName.FullName)); -// } else { -// currentProject.ProjectReferences.Add(new ProjectReference(ReferenceType.Assembly, toolComponent.FileName)); -// } -// ICSharpCode.SharpDevelop.Gui.ProjectBrowser.ProjectBrowserView pbv = (ICSharpCode.SharpDevelop.Gui.ProjectBrowser.ProjectBrowserView)WorkbenchSingleton.Workbench.GetPad(typeof(ICSharpCode.SharpDevelop.Gui.ProjectBrowser.ProjectBrowserView)); -// pbv.UpdateCombineTree(); -// projectService.SaveCombine(); -// } -// } + if (tab is CustomComponentsSideTab) { + if (selectedItem != null && selectedItem.TypeName != null) { + LoggingService.Debug("Checking for reference to CustomComponent: " + selectedItem.TypeName); + // Check current project has the custom component first. + IProjectContent currentProjectContent = ParserService.CurrentProjectContent; + if (currentProjectContent != null) { + if (currentProjectContent.GetClass(selectedItem.TypeName) == null) { + // Check other projects in the solution. + LoggingService.Debug("Checking other projects in the solution."); + IProject projectContainingType = FindProjectContainingType(selectedItem.TypeName); + if (projectContainingType != null) { + AddProjectReferenceToProject(ProjectService.CurrentProject, projectContainingType); + } + } + } } + } else { + if (selectedItem != null && selectedItem.AssemblyName != null) { + IProject currentProject = ProjectService.CurrentProject; + if (currentProject != null) { + if (!ProjectContainsReference(currentProject, selectedItem.AssemblyName)) { + AddReferenceToProject(currentProject, selectedItem.AssemblyName); + } + } + } } } @@ -196,5 +176,85 @@ namespace ICSharpCode.FormDesigner } SharpDevelopSideBar.SideBar.Refresh(); } + + static bool ProjectContainsReference(IProject project, AssemblyName referenceName) + { + LoggingService.Debug("Checking project has reference: " + referenceName.FullName); + bool isAlreadyInRefFolder = false; + + foreach (ProjectItem projectItem in project.Items) { + ReferenceProjectItem referenceItem = projectItem as ReferenceProjectItem; + if (referenceItem != null) { + if (referenceItem.ItemType == ItemType.Reference) { + LoggingService.Debug("Checking project reference: " + referenceItem.Include); + if (referenceItem.HintPath.Length > 0) { + LoggingService.Debug("Checking assembly reference"); + AssemblyName assemblyName = AssemblyName.GetAssemblyName(referenceItem.FileName); + if (assemblyName != null && assemblyName.FullName == referenceName.FullName) { + isAlreadyInRefFolder = true; + break; + } + } else { // GAC reference. + LoggingService.Debug("Checking GAC reference"); + if (referenceItem.Include == referenceName.FullName || referenceItem.Include == referenceName.Name) { + LoggingService.Debug("Found existing GAC reference"); + isAlreadyInRefFolder = true; + break; + } + } + } + } + } + return isAlreadyInRefFolder; + } + + static void AddReferenceToProject(IProject project, AssemblyName referenceName) + { + LoggingService.Debug("Adding reference to project: " + referenceName.FullName); + ReferenceProjectItem reference = new ReferenceProjectItem(project, "Reference"); + ToolComponent toolComponent = ToolboxProvider.ComponentLibraryLoader.GetToolComponent(referenceName.FullName); + if (toolComponent == null || toolComponent.HintPath == null) { + reference.Include = referenceName.FullName; + LoggingService.Debug("Added GAC reference to project: " + reference.Include); + } else { + reference.Include = referenceName.FullName; + reference.HintPath = FileUtility.GetRelativePath(project.Directory, toolComponent.FileName); + reference.SpecificVersion = false; + LoggingService.Debug("Added assembly reference to project: " + reference.Include); + } + ProjectService.AddProjectItem(project, reference); + ProjectBrowserPad.Instance.ProjectBrowserControl.RefreshView(); + project.Save(); + } + + /// + /// Looks for the specified type in all the projects in the open solution + /// excluding the current project. + /// + static IProject FindProjectContainingType(string type) + { + IProject currentProject = ProjectService.CurrentProject; + foreach (IProject project in ProjectService.OpenSolution.Projects) { + if (project != currentProject) { + IProjectContent projectContent = ParserService.GetProjectContent(project); + if (projectContent != null) { + if (projectContent.GetClass(type) != null) { + LoggingService.Debug("Found project containing type: " + project.FileName); + return project; + } + } + } + } + return null; + } + + static void AddProjectReferenceToProject(IProject project, IProject referenceTo) + { + LoggingService.Debug("Adding project reference to project."); + ProjectReferenceProjectItem reference = new ProjectReferenceProjectItem(project, referenceTo); + ProjectService.AddProjectItem(project, reference); + ProjectBrowserPad.Instance.ProjectBrowserControl.RefreshView(); + project.Save(); + } } } diff --git a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/ProjectBrowserControl.cs b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/ProjectBrowserControl.cs index ed902ba97a..f067fed56c 100644 --- a/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/ProjectBrowserControl.cs +++ b/src/Main/Base/Project/Src/Gui/Pads/ProjectBrowser/ProjectBrowserControl.cs @@ -108,7 +108,9 @@ namespace ICSharpCode.SharpDevelop.Project public void RefreshView() { - // TODO implement refresh. + if (treeView.Nodes.Count > 0) { + ViewSolution(((AbstractProjectBrowserTreeNode)treeView.Nodes[0]).Solution); + } } FileNode FindFileNode(TreeNodeCollection nodes, string fileName)