diff options
Diffstat (limited to 'main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Tasks/CommentTasksView.cs')
-rw-r--r-- | main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Tasks/CommentTasksView.cs | 142 |
1 files changed, 81 insertions, 61 deletions
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Tasks/CommentTasksView.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Tasks/CommentTasksView.cs index b01e917033..509f2998b7 100644 --- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Tasks/CommentTasksView.cs +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Tasks/CommentTasksView.cs @@ -36,10 +36,11 @@ using MonoDevelop.Core; using MonoDevelop.Projects; using MonoDevelop.Ide; using MonoDevelop.Ide.Gui; -using MonoDevelop.Projects.Text; using MonoDevelop.Ide.TypeSystem; -using ICSharpCode.NRefactory.TypeSystem; using System.Linq; +using MonoDevelop.Ide.Editor; +using System.Threading; +using System.Threading.Tasks; namespace MonoDevelop.Ide.Tasks { @@ -83,9 +84,12 @@ namespace MonoDevelop.Ide.Tasks TaskService.CommentTasksChanged += OnCommentTasksChanged; CommentTag.SpecialCommentTagsChanged += OnCommentTagsChanged; - IdeApp.Workspace.WorkspaceItemLoaded += OnWorkspaceItemLoaded; + + MonoDevelopWorkspace.LoadingFinished += OnWorkspaceItemLoaded; IdeApp.Workspace.WorkspaceItemUnloaded += OnWorkspaceItemUnloaded; - + IdeApp.Workbench.DocumentOpened += WorkbenchDocumentOpened; + IdeApp.Workbench.DocumentClosed += WorkbenchDocumentClosed;; + highPrioColor = StringToColor ((string)PropertyService.Get ("Monodevelop.UserTasksHighPrioColor", "")); normalPrioColor = StringToColor ((string)PropertyService.Get ("Monodevelop.UserTasksNormalPrioColor", "")); lowPrioColor = StringToColor ((string)PropertyService.Get ("Monodevelop.UserTasksLowPrioColor", "")); @@ -124,15 +128,8 @@ namespace MonoDevelop.Ide.Tasks col.Resizable = true; LoadColumnsVisibility (); - - comments.BeginTaskUpdates (); - try { - foreach (var item in IdeApp.Workspace.Items) { - LoadWorkspaceItemContents (item); - } - } finally { - comments.EndTaskUpdates (); - } + + OnWorkspaceItemLoaded (null, EventArgs.Empty); comments.TasksAdded += GeneratedTaskAdded; comments.TasksRemoved += GeneratedTaskRemoved; @@ -147,7 +144,7 @@ namespace MonoDevelop.Ide.Tasks view.RowActivated -= OnRowActivated; TaskService.CommentTasksChanged -= OnCommentTasksChanged; CommentTag.SpecialCommentTagsChanged -= OnCommentTagsChanged; - IdeApp.Workspace.WorkspaceItemLoaded -= OnWorkspaceItemLoaded; + MonoDevelopWorkspace.LoadingFinished -= OnWorkspaceItemLoaded; IdeApp.Workspace.WorkspaceItemUnloaded -= OnWorkspaceItemUnloaded; comments.TasksAdded -= GeneratedTaskAdded; comments.TasksRemoved -= GeneratedTaskRemoved; @@ -156,6 +153,38 @@ namespace MonoDevelop.Ide.Tasks }; } + void WorkbenchDocumentClosed (object sender, DocumentEventArgs e) + { + e.Document.DocumentParsed -= HandleDocumentParsed; + } + + void WorkbenchDocumentOpened (object sender, DocumentEventArgs e) + { + e.Document.DocumentParsed += HandleDocumentParsed; + } + + void HandleDocumentParsed (object sender, EventArgs e) + { + var doc = (Document)sender; + var pd = doc.ParsedDocument; + var project = doc.Project; + if (pd == null || project == null) + return; + ProjectCommentTags tags; + if (!projectTags.TryGetValue (project, out tags)) + return; + var token = src.Token; + var file = doc.FileName; + Task.Run (async () => { + try { + tags.UpdateTags (project, file, await pd.GetTagCommentsAsync (token)); + } catch (TaskCanceledException) { + } catch (AggregateException ae) { + ae.Flatten ().Handle (x => x is TaskCanceledException); + } + }); + } + void LoadColumnsVisibility () { string columns = (string)PropertyService.Get ("Monodevelop.CommentTasksColumns", "TRUE;TRUE;TRUE;TRUE"); @@ -181,76 +210,66 @@ namespace MonoDevelop.Ide.Tasks PropertyService.Set ("Monodevelop.CommentTasksColumns", columns); } - void OnWorkspaceItemLoaded (object sender, WorkspaceItemEventArgs e) + void OnWorkspaceItemLoaded (object sender, EventArgs e) { comments.BeginTaskUpdates (); try { - LoadWorkspaceItemContents (e.Item); + foreach (var sln in IdeApp.Workspace.GetAllSolutions ()) + LoadSolutionContents (sln); } finally { comments.EndTaskUpdates (); } } - - void LoadWorkspaceItemContents (WorkspaceItem wob) - { - foreach (var sln in wob.GetAllItems<Solution> ()) - LoadSolutionContents (sln); - } - void UpdateCommentTagsForProject (Solution solution, Project project) + Dictionary<Project, ProjectCommentTags> projectTags = new Dictionary<Project, ProjectCommentTags> (); + CancellationTokenSource src = new CancellationTokenSource (); + void UpdateCommentTagsForProject (Solution solution, Project project, CancellationToken token) { - var ctx = TypeSystemService.GetProjectContentWrapper (project); - if (ctx == null) + if (token.IsCancellationRequested) return; - var tags = ctx.GetExtensionObject<ProjectCommentTags> (); - if (tags == null) { + ProjectCommentTags tags; + if (!projectTags.TryGetValue (project, out tags)) { tags = new ProjectCommentTags (); - ctx.UpdateExtensionObject (tags); - tags.Update (ctx.Project); - } else { - foreach (var kv in tags.Tags) { - UpdateCommentTags (solution, kv.Key, kv.Value); - } + projectTags [project] = tags; } - } - - void HandleSolutionItemAdded (object sender, SolutionItemChangeEventArgs e) - { - var newProject = e.SolutionItem as Project; - if (newProject == null) - return; - UpdateCommentTagsForProject (e.Solution, newProject); + var files = project.Files.ToArray (); + Task.Run (async () => { + try { + await tags.UpdateAsync (project, files, token); + } catch (TaskCanceledException) { + } catch (AggregateException ae) { + ae.Flatten ().Handle (x => x is TaskCanceledException); + } catch (Exception e) { + LoggingService.LogError ("Error while updating comment tags.", e); + } + }); } void LoadSolutionContents (Solution sln) { + src.Cancel (); + src = new CancellationTokenSource (); + var token = src.Token; + loadedSlns.Add (sln); - System.Threading.ThreadPool.QueueUserWorkItem (delegate { - sln.SolutionItemAdded += HandleSolutionItemAdded; + Task.Run (delegate { + sln.SolutionItemAdded += delegate(object sender, SolutionItemChangeEventArgs e) { + var newProject = e.SolutionItem as Project; + if (newProject == null) + return; + UpdateCommentTagsForProject (sln, newProject, token); + }; // Load all tags that are stored in pidb files foreach (Project p in sln.GetAllProjects ()) { - UpdateCommentTagsForProject (sln, p); + UpdateCommentTagsForProject (sln, p, token); } }); } - - static IEnumerable<Tag> GetSpecialComments (IProjectContent ctx, string name) - { - var doc = ctx.GetFile (name) as ParsedDocument; - if (doc == null) - return Enumerable.Empty<Tag> (); - return (IEnumerable<Tag>)doc.TagComments; - } - void OnWorkspaceItemUnloaded (object sender, WorkspaceItemEventArgs e) { - foreach (var sln in e.Item.GetAllItems<Solution>()) { - if (loadedSlns.Remove (sln)) - sln.SolutionItemAdded -= HandleSolutionItemAdded; - } comments.RemoveItemTasks (e.Item, true); } @@ -506,7 +525,7 @@ namespace MonoDevelop.Ide.Tasks { TaskListEntry task = SelectedTask; if (task != null && ! String.IsNullOrEmpty (task.FileName)) { - Document doc = IdeApp.Workbench.OpenDocument (task.FileName, Math.Max (1, task.Line), Math.Max (1, task.Column)); + var doc = IdeApp.Workbench.OpenDocument (task.FileName, Math.Max (1, task.Line), Math.Max (1, task.Column)); if (doc != null && doc.HasProject && doc.Project is DotNetProject) { string[] commentTags = doc.CommentTags; if (commentTags != null && commentTags.Length == 1) { @@ -515,10 +534,11 @@ namespace MonoDevelop.Ide.Tasks string line = doc.Editor.GetLineText (task.Line); int index = line.IndexOf (commentTags[0]); if (index != -1) { - doc.Editor.SetCaretTo (task.Line, task.Column); + doc.Editor.CaretLocation = new DocumentLocation (task.Line, task.Column); + doc.Editor.StartCaretPulseAnimation (); line = line.Substring (0, index); - var ls = doc.Editor.Document.GetLine (task.Line); - doc.Editor.Replace (ls.Offset, ls.Length, line); + var ls = doc.Editor.GetLine (task.Line); + doc.Editor.ReplaceText (ls.Offset, ls.Length, line); comments.Remove (task); } }); |