From d77090270c9569b7725be7628d151862cbdbef50 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Tue, 5 Apr 2011 21:54:12 +0200 Subject: [PATCH] Fixed ObjectDisposedException on MSBuildBasedProject in OptionPanels.ApplicationSettings.b__1: - close project options view when the project is removed from the solution - use an event on MSBuildBasedProject to detect a changed tools version, instead of querying it whenever the option page becomes visible --- .../ProjectOptions/ApplicationSettings.cs | 17 ++++++++++++++--- .../Src/Gui/Dialogs/ProjectOptionsView.cs | 9 +++++++++ .../Project/Src/Project/MSBuildBasedProject.cs | 4 ++++ .../Services/ProjectService/ProjectService.cs | 16 ++++++++++++++++ 4 files changed, 43 insertions(+), 3 deletions(-) diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/ApplicationSettings.cs b/src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/ApplicationSettings.cs index d56899fafc..05c63241fc 100644 --- a/src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/ApplicationSettings.cs +++ b/src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/ProjectOptions/ApplicationSettings.cs @@ -75,11 +75,10 @@ namespace ICSharpCode.SharpDevelop.Gui.OptionPanels applicationManifestComboBox.TextChanged += delegate { helper.IsDirty = true; }; // embedding manifests requires the project to target MSBuild 3.5 or higher + project_MinimumSolutionVersionChanged(null, null); // re-evaluate if the project has the minimum version whenever this options page gets visible // because the "convert project" button on the compiling tab page might have updated the MSBuild version. - applicationManifestComboBox.VisibleChanged += delegate { - applicationManifestComboBox.Enabled = project.MinimumSolutionVersion >= Solution.SolutionVersionVS2008; - }; + project.MinimumSolutionVersionChanged += project_MinimumSolutionVersionChanged; Get("projectFolder").Text = project.Directory; Get("projectFile").Text = Path.GetFileName(project.FileName); @@ -93,6 +92,18 @@ namespace ICSharpCode.SharpDevelop.Gui.OptionPanels helper.AddConfigurationSelector(this); } + void project_MinimumSolutionVersionChanged(object sender, EventArgs e) + { + // embedding manifests requires the project to target MSBuild 3.5 or higher + applicationManifestComboBox.Enabled = project.MinimumSolutionVersion >= Solution.SolutionVersionVS2008; + } + + protected override void Dispose(bool disposing) + { + project.MinimumSolutionVersionChanged -= project_MinimumSolutionVersionChanged; + base.Dispose(disposing); + } + void ApplicationManifestComboBox_SelectedIndexChanged(object sender, EventArgs e) { if (applicationManifestComboBox.SelectedIndex == applicationManifestComboBox.Items.Count - 2) { diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/ProjectOptionsView.cs b/src/Main/Base/Project/Src/Gui/Dialogs/ProjectOptionsView.cs index f9ba70e29e..04ce3cb9ec 100644 --- a/src/Main/Base/Project/Src/Gui/Dialogs/ProjectOptionsView.cs +++ b/src/Main/Base/Project/Src/Gui/Dialogs/ProjectOptionsView.cs @@ -39,6 +39,14 @@ namespace ICSharpCode.SharpDevelop.Project.Dialogs tabControl.IsDirtyChanged += delegate { RaiseIsDirtyChanged(); }; tabControl.AddOptionPanels(node.BuildChildItems(project)); + + ProjectService.ProjectRemoved += ProjectService_ProjectRemoved; + } + + void ProjectService_ProjectRemoved(object sender, ProjectEventArgs e) + { + if (e.Project == project && this.WorkbenchWindow != null) + WorkbenchWindow.CloseWindow(true); } public override bool IsDirty { @@ -67,6 +75,7 @@ namespace ICSharpCode.SharpDevelop.Project.Dialogs public override void Dispose() { + ProjectService.ProjectRemoved -= ProjectService_ProjectRemoved; foreach (IDisposable op in tabControl.OptionPanels.OfType()) { op.Dispose(); } diff --git a/src/Main/Base/Project/Src/Project/MSBuildBasedProject.cs b/src/Main/Base/Project/Src/Project/MSBuildBasedProject.cs index d5282385f5..80243a4717 100644 --- a/src/Main/Base/Project/Src/Project/MSBuildBasedProject.cs +++ b/src/Main/Base/Project/Src/Project/MSBuildBasedProject.cs @@ -114,6 +114,8 @@ namespace ICSharpCode.SharpDevelop.Project } } + public event EventHandler MinimumSolutionVersionChanged; + protected void SetToolsVersion(string newToolsVersion) { PerformUpdateOnProjectFile( @@ -121,6 +123,8 @@ namespace ICSharpCode.SharpDevelop.Project projectFile.ToolsVersion = newToolsVersion; userProjectFile.ToolsVersion = newToolsVersion; }); + if (MinimumSolutionVersionChanged != null) + MinimumSolutionVersionChanged(this, EventArgs.Empty); } public void PerformUpdateOnProjectFile(Action action) diff --git a/src/Main/Base/Project/Src/Services/ProjectService/ProjectService.cs b/src/Main/Base/Project/Src/Services/ProjectService/ProjectService.cs index dd3790f82f..acbebe16b7 100644 --- a/src/Main/Base/Project/Src/Services/ProjectService/ProjectService.cs +++ b/src/Main/Base/Project/Src/Services/ProjectService/ProjectService.cs @@ -628,6 +628,7 @@ namespace ICSharpCode.SharpDevelop.Project if (project != null) { OpenSolution.RemoveProjectConfigurations(project.IdGuid); ParserService.RemoveProjectContentForRemovedProject(project); + OnProjectRemoved(new ProjectEventArgs(project)); project.Dispose(); } if (folder is ISolutionFolderContainer) { @@ -661,6 +662,12 @@ namespace ICSharpCode.SharpDevelop.Project ProjectAdded(null, e); } } + static void OnProjectRemoved(ProjectEventArgs e) + { + if (ProjectRemoved != null) { + ProjectRemoved(null, e); + } + } internal static void OnProjectCreated(ProjectEventArgs e) { if (ProjectCreated != null) { @@ -682,6 +689,15 @@ namespace ICSharpCode.SharpDevelop.Project /// Is raised when a new or existing project is added to the solution. /// public static event ProjectEventHandler ProjectAdded; + /// + /// Is raised when a project is removed from the solution. + /// + public static event ProjectEventHandler ProjectRemoved; + + /// + /// Is raised when a solution folder is removed from the solution. + /// This might remove multiple projects from the solution. + /// public static event SolutionFolderEventHandler SolutionFolderRemoved; public static event EventHandler BuildStarted;