From 067aa30c5c33bcfafc1a87ab6fa043dac0e43967 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Fri, 12 Aug 2011 19:48:16 +0200 Subject: [PATCH] Fix "Solution was modified externally" message when SharpDevelop itself modifies the solution. This was caused because the ProjectChangeWatcher didn't dispose the FileSystemChangeWatcher, so we got reload notifications for unloaded projects when the project was re-loaded and modified. --- .../Src/Project/ProjectChangeWatcher.cs | 25 ++++++++++++++++--- .../Src/Services/File/FileChangeWatcher.cs | 6 +++++ 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/src/Main/Base/Project/Src/Project/ProjectChangeWatcher.cs b/src/Main/Base/Project/Src/Project/ProjectChangeWatcher.cs index 5a3aae20ea..789bb0f255 100644 --- a/src/Main/Base/Project/Src/Project/ProjectChangeWatcher.cs +++ b/src/Main/Base/Project/Src/Project/ProjectChangeWatcher.cs @@ -1,6 +1,7 @@ // Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) // This code is distributed under the GNU LGPL (for details please see \doc\license.txt) using System; +using System.Collections.Generic; using System.IO; using ICSharpCode.Core; using ICSharpCode.SharpDevelop.Gui; @@ -9,6 +10,14 @@ namespace ICSharpCode.SharpDevelop.Project { public sealed class ProjectChangeWatcher : IProjectChangeWatcher { + static readonly HashSet activeWatchers = new HashSet(); + + internal static void OnAllChangeWatchersDisabledChanged() + { + foreach (ProjectChangeWatcher watcher in activeWatchers) + watcher.SetWatcher(); + } + FileSystemWatcher watcher; string fileName; bool enabled = true; @@ -16,9 +25,13 @@ namespace ICSharpCode.SharpDevelop.Project public ProjectChangeWatcher(string fileName) { this.fileName = fileName; + + WorkbenchSingleton.AssertMainThread(); + activeWatchers.Add(this); + WorkbenchSingleton.MainWindow.Activated += MainFormActivated; } - + public void Enable() { enabled = true; @@ -44,7 +57,7 @@ namespace ICSharpCode.SharpDevelop.Project watcher.EnableRaisingEvents = false; } - if (!enabled) + if (!enabled || FileChangeWatcher.AllChangeWatchersDisabled) return; if (string.IsNullOrEmpty(fileName)) @@ -90,7 +103,7 @@ namespace ICSharpCode.SharpDevelop.Project void OnFileChangedEvent(object sender, FileSystemEventArgs e) { - LoggingService.Debug("Solution was changed externally: " + e.ChangeType); + LoggingService.Debug("Project file " + e.Name + " was changed externally: {1}" + e.ChangeType); if (!wasChangedExternally) { wasChangedExternally = true; if (WorkbenchSingleton.Workbench.IsActiveWindow) { @@ -117,8 +130,14 @@ namespace ICSharpCode.SharpDevelop.Project public void Dispose() { + WorkbenchSingleton.AssertMainThread(); if (!disposed) { WorkbenchSingleton.MainWindow.Activated -= MainFormActivated; + activeWatchers.Remove(this); + } + if (watcher != null) { + watcher.Dispose(); + watcher = null; } disposed = true; } diff --git a/src/Main/Base/Project/Src/Services/File/FileChangeWatcher.cs b/src/Main/Base/Project/Src/Services/File/FileChangeWatcher.cs index 5d87d5309c..47b476c502 100644 --- a/src/Main/Base/Project/Src/Services/File/FileChangeWatcher.cs +++ b/src/Main/Base/Project/Src/Services/File/FileChangeWatcher.cs @@ -44,12 +44,17 @@ namespace ICSharpCode.SharpDevelop static int globalDisableCount; + public static bool AllChangeWatchersDisabled { + get { return globalDisableCount > 0; } + } + public static void DisableAllChangeWatchers() { WorkbenchSingleton.AssertMainThread(); globalDisableCount++; foreach (FileChangeWatcher w in activeWatchers) w.SetWatcher(); + Project.ProjectChangeWatcher.OnAllChangeWatchersDisabledChanged(); } public static void EnableAllChangeWatchers() @@ -60,6 +65,7 @@ namespace ICSharpCode.SharpDevelop globalDisableCount--; foreach (FileChangeWatcher w in activeWatchers) w.SetWatcher(); + Project.ProjectChangeWatcher.OnAllChangeWatchersDisabledChanged(); } public event EventHandler FileChanged;