Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/monodevelop.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
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.cs142
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);
}
});