diff options
author | Lluis Sanchez <lluis@xamarin.com> | 2019-09-16 18:48:06 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-09-16 18:48:06 +0300 |
commit | b7bf2893f20b01603c139a1b0573a4d50c00bf80 (patch) | |
tree | fe1e7a781e4c0540c9c41cfb4a0df2bc68d67b9b /main/src/core/MonoDevelop.Ide | |
parent | d737ffb8a720e53595866642586cf7360214ee4e (diff) | |
parent | ddf702ccbcb1646593f2008a1ad953cbe9a5f34c (diff) |
Merge pull request #8726 from mono/fix-all-hangs
Fix all hangs
Diffstat (limited to 'main/src/core/MonoDevelop.Ide')
2 files changed, 46 insertions, 20 deletions
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ProjectPad/ProjectNodeBuilder.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ProjectPad/ProjectNodeBuilder.cs index b6f322ebc4..c1a3a7a2c2 100644 --- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ProjectPad/ProjectNodeBuilder.cs +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui.Pads.ProjectPad/ProjectNodeBuilder.cs @@ -41,6 +41,7 @@ using MonoDevelop.Ide.Gui.Dialogs; using System.Linq; using MonoDevelop.Ide.Tasks; using MonoDevelop.Ide.Projects.FileNesting; +using System.Diagnostics; namespace MonoDevelop.Ide.Gui.Pads.ProjectPad { @@ -249,10 +250,20 @@ namespace MonoDevelop.Ide.Gui.Pads.ProjectPad } } - void OnFileNestingRulesChanged (Project obj) + void OnFileNestingRulesChanged (ProjectFile fileToUpdate, ProjectFile newParent) { - ITreeBuilder tb = Context.GetTreeBuilder (obj); - tb?.UpdateAll (); + Debug.Assert (fileToUpdate != null); + + ITreeBuilder tb = Context.GetTreeBuilder (fileToUpdate); + if (tb != null) { + tb.MoveToParent (); + tb.UpdateAll (); + } + + if (newParent != null) { + tb = Context.GetTreeBuilder (newParent); + tb?.UpdateAll (); + } } void AddFile (ProjectFile file, Project project) diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Projects.FileNesting/FileNestingService.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Projects.FileNesting/FileNestingService.cs index 516d2e55d9..53536d493d 100644 --- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Projects.FileNesting/FileNestingService.cs +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Projects.FileNesting/FileNestingService.cs @@ -76,9 +76,12 @@ namespace MonoDevelop.Ide.Projects.FileNesting return null; } - public static event Action<Project> NestingRulesChanged; + /// <summary> + /// The project file which had modifications, in most cases, the parent of the added/removed projectfile + /// </summary> + public static event Action<ProjectFile, ProjectFile> NestingRulesChanged; - internal static void NotifyNestingRulesChanged (Project project) => NestingRulesChanged?.Invoke (project); + internal static void NotifyNestingRulesChanged (ProjectFile toUpdate, ProjectFile newParent) => NestingRulesChanged?.Invoke (toUpdate, newParent); public static bool IsEnabledForProject (Project project) { @@ -148,7 +151,7 @@ namespace MonoDevelop.Ide.Projects.FileNesting } } - void AddFile (ProjectFile projectFile) + ProjectFileNestingInfo AddFile (ProjectFile projectFile) { var tmp = projectFiles.GetOrAdd (projectFile, new ProjectFileNestingInfo (projectFile)); tmp.Parent = FileNestingService.InternalGetParentFile (projectFile); @@ -163,9 +166,10 @@ namespace MonoDevelop.Ide.Projects.FileNesting } projectFiles [projectFile] = tmp; + return tmp; } - void RemoveFile (ProjectFile projectFile, List<ProjectFile> originalFilesToRemove = null) + ProjectFileNestingInfo RemoveFile (ProjectFile projectFile, List<ProjectFile> originalFilesToRemove = null) { bool actuallyRemoveFiles = originalFilesToRemove == null; @@ -192,37 +196,43 @@ namespace MonoDevelop.Ide.Projects.FileNesting if (actuallyRemoveFiles && originalFilesToRemove != null) { Project.Files.RemoveRange (originalFilesToRemove); } + + return nestingInfo; } void OnFileAddedToProject (object sender, ProjectFileEventArgs e) { foreach (var file in e) { - AddFile (file.ProjectFile); + var nestingInfo = AddFile (file.ProjectFile); + NotifyNestingRulesChanged (nestingInfo); } - - if (fileNestingEnabled) - FileNestingService.NotifyNestingRulesChanged (Project); } void OnFileRemovedFromProject (object sender, ProjectFileEventArgs e) { foreach (var file in e) { - RemoveFile (file.ProjectFile); + var nestingInfo = RemoveFile (file.ProjectFile); + NotifyNestingRulesChanged (nestingInfo); } - - if (fileNestingEnabled) - FileNestingService.NotifyNestingRulesChanged (Project); } void OnFileRenamedInProject (object sender, ProjectFileRenamedEventArgs e) { foreach (var file in e) { - RemoveFile (file.ProjectFile); - AddFile (file.ProjectFile); + var oldNestingInfo = RemoveFile (file.ProjectFile); + NotifyNestingRulesChanged (oldNestingInfo); + + var nestingInfo = AddFile (file.ProjectFile); + NotifyNestingRulesChanged (nestingInfo); } + } - if (fileNestingEnabled) - FileNestingService.NotifyNestingRulesChanged (Project); + void NotifyNestingRulesChanged (ProjectFileNestingInfo nestingInfo) + { + if (nestingInfo == null || !FileNestingService.AppliesToProject (nestingInfo.File.Project)) + return; + + FileNestingService.NotifyNestingRulesChanged (nestingInfo.File, nestingInfo.Parent); } void OnUserPropertiesChanged (object sender, Core.PropertyBagChangedEventArgs e) @@ -230,7 +240,12 @@ namespace MonoDevelop.Ide.Projects.FileNesting bool newValue = FileNestingService.IsEnabledForProject (Project); if (fileNestingEnabled != newValue) { fileNestingEnabled = newValue; - FileNestingService.NotifyNestingRulesChanged (Project); + foreach (var kvp in projectFiles) { + var nestingInfo = kvp.Value; + if (nestingInfo.Children != null) { + FileNestingService.NotifyNestingRulesChanged (nestingInfo.File, null); + } + } } } |