diff options
author | Lluis Sanchez <lluis@novell.com> | 2008-05-21 13:53:44 +0400 |
---|---|---|
committer | Lluis Sanchez <lluis@novell.com> | 2008-05-21 13:53:44 +0400 |
commit | 62810d6a1a4fce86c5a11d7e117eca1016ae27c7 (patch) | |
tree | b8eed82327cbc0119b3dd738a50ff3e3529fa9d1 /main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Tasks | |
parent | e060377e505e523a829be000914fe617de0b5a22 (diff) |
New project model changes.
svn path=/trunk/monodevelop/; revision=103657
Diffstat (limited to 'main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Tasks')
5 files changed, 205 insertions, 167 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 7132fd6dbe..64543e4bda 100644 --- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Tasks/CommentTasksView.cs +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Tasks/CommentTasksView.cs @@ -110,7 +110,6 @@ namespace MonoDevelop.Ide.Tasks LoadColumnsVisibility (); - Services.TaskService.TasksCleared += (EventHandler) DispatchService.GuiDispatch (new EventHandler (GeneratedTasksCleared)); Services.TaskService.TaskAdded += (TaskEventHandler) DispatchService.GuiDispatch (new TaskEventHandler (GeneratedTaskAdded)); Services.TaskService.TaskRemoved += (TaskEventHandler) DispatchService.GuiDispatch (new TaskEventHandler (GeneratedTaskRemoved)); @@ -148,12 +147,6 @@ namespace MonoDevelop.Ide.Tasks PropertyService.Set ("Monodevelop.CommentTasksColumns", columns); } - void GeneratedTasksCleared (object sender, EventArgs e) - { - store.Clear (); - tasks.Clear (); - } - void GeneratedTaskAdded (object sender, TaskEventArgs e) { foreach (Task t in e.Tasks) { diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Tasks/Task.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Tasks/Task.cs index 4ecd087dda..6bef77a124 100644 --- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Tasks/Task.cs +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Tasks/Task.cs @@ -48,6 +48,7 @@ namespace MonoDevelop.Ide.Tasks int savedLine = -1; string errorNumber; + object owner; public override string ToString () { @@ -114,10 +115,10 @@ namespace MonoDevelop.Ide.Tasks return fileName; } set { - if (System.IO.File.Exists (fileName)) + if (!string.IsNullOrEmpty (value)) fileName = System.IO.Path.GetFullPath (value); else - fileName = value; + fileName = null; } } @@ -132,6 +133,15 @@ namespace MonoDevelop.Ide.Tasks return errorNumber; } } + + public object OwnerItem { + get { + return owner; + } + internal set { + owner = value; + } + } // public Task (string fileName, string description, int column, int line) // { diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Tasks/TaskService.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Tasks/TaskService.cs index 031483d606..06730ecc9a 100644 --- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Tasks/TaskService.cs +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Tasks/TaskService.cs @@ -36,23 +36,23 @@ namespace MonoDevelop.Ide.Tasks public class TaskService : GuiSyncObject { - List<Task> tasks = new List<Task> (); + Dictionary<object,List<Task>> tasks = new Dictionary<object,List<Task>> (); Dictionary<TaskType, int> taskCount = new Dictionary<TaskType, int> (); Dictionary<string, TaskPriority> priorities = new Dictionary<string, TaskPriority> (); - List<UserTask> userTasks = new List<UserTask> (); + Dictionary<object,List<UserTask>> userTasks = new Dictionary<object,List<UserTask>> (); string compilerOutput = String.Empty; - Combine combine; public TaskService () { ReloadPriories (); - IdeApp.ProjectOperations.CombineOpened += new CombineEventHandler (ProjectServiceSolutionOpened); - IdeApp.ProjectOperations.CombineClosed += new CombineEventHandler (ProjectServiceSolutionClosed); - IdeApp.ProjectOperations.FileRenamedInProject += new ProjectFileRenamedEventHandler (ProjectFileRenamed); - IdeApp.ProjectOperations.FileRemovedFromProject += new ProjectFileEventHandler (ProjectFileRemoved); + IdeApp.Workspace.WorkspaceItemLoaded += ProjectServiceSolutionOpened; + IdeApp.Workspace.WorkspaceItemUnloaded += ProjectServiceSolutionClosed; + IdeApp.Workspace.FileRenamedInProject += new ProjectFileRenamedEventHandler (ProjectFileRenamed); + IdeApp.Workspace.FileRemovedFromProject += new ProjectFileEventHandler (ProjectFileRemoved); PropertyService.PropertyChanged += (EventHandler<PropertyChangedEventArgs>) DispatchService.GuiDispatch (new EventHandler<PropertyChangedEventArgs> (OnPropertyUpdated)); + IdeApp.Workspace.ParserDatabase.CommentTasksChanged += new CommentTasksChangedEventHandler (OnCommentTasksChanged); MonoDevelop.Projects.Text.TextFileService.CommitCountChanges += delegate (object sender, MonoDevelop.Projects.Text.TextFileEventArgs args) { foreach (Task task in this.Tasks) { @@ -97,36 +97,46 @@ namespace MonoDevelop.Ide.Tasks } OnTaskChanged (new TaskEventArgs (tasks)); }; + + this.tasks [this] = new List<Task> (); } - void ProjectServiceSolutionOpened (object sender, CombineEventArgs e) + void ProjectServiceSolutionOpened (object sender, WorkspaceItemEventArgs e) { - combine = e.Combine; - IdeApp.ProjectOperations.ParserDatabase.CommentTasksChanged += new CommentTasksChangedEventHandler (OnCommentTasksChanged); + Solution sol = e.Item as Solution; + if (sol != null) { + // Load all tags that are stored in pidb files + foreach (Project p in sol.GetAllProjects ()) + { + IProjectParserContext pContext = IdeApp.Workspace.ParserDatabase.GetProjectParserContext (p); + if (pContext == null) + continue; + foreach (ProjectFile file in p.Files) + { + TagCollection tags = pContext.GetFileSpecialComments (file.Name); + if (tags !=null) + UpdateCommentTags (sol, file.Name, tags); + } + } + } + + List<UserTask> utasks = new List<UserTask> (); + userTasks [e.Item] = utasks; + + List<Task> stasks = new List<Task> (); + tasks [e.Item] = stasks; - // Load all tags that are stored in pidb files - foreach (Project p in IdeApp.ProjectOperations.CurrentOpenCombine.GetAllProjects ()) - { - IProjectParserContext pContext = IdeApp.ProjectOperations.ParserDatabase.GetProjectParserContext (p); - foreach (ProjectFile file in p.ProjectFiles) - { - TagCollection tags = pContext.GetFileSpecialComments (file.Name); - if (tags !=null) - UpdateCommentTags (file.Name, tags); - } - } - // Load User Tasks from xml file - string fileToLoad = GetUserTasksFilename (e.Combine); + string fileToLoad = GetUserTasksFilename (e.Item); if (File.Exists (fileToLoad)) { try { - XmlSerializer serializer = new XmlSerializer (userTasks.GetType ()); + XmlSerializer serializer = new XmlSerializer (utasks.GetType ()); Stream stream = new FileStream (fileToLoad, FileMode.Open, FileAccess.Read, FileShare.None); - userTasks = new List<UserTask>((IEnumerable<UserTask>)serializer.Deserialize (stream)); + utasks.AddRange ((IEnumerable<UserTask>)serializer.Deserialize (stream)); stream.Close (); - if (userTasks.Count > 0 && UserTasksChanged != null) + if (utasks.Count > 0 && UserTasksChanged != null) UserTasksChanged (this, EventArgs.Empty); } catch (Exception ex) @@ -136,28 +146,36 @@ namespace MonoDevelop.Ide.Tasks } } - void ProjectServiceSolutionClosed (object sender, CombineEventArgs e)
+ void ProjectServiceSolutionClosed (object sender, WorkspaceItemEventArgs e)
{
- combine = null; - IdeApp.ProjectOperations.ParserDatabase.CommentTasksChanged -= new CommentTasksChangedEventHandler (OnCommentTasksChanged); - // Save UserTasks to xml file - string fileToSave = GetUserTasksFilename (e.Combine); + string fileToSave = GetUserTasksFilename (e.Item); try { - XmlSerializer serializer = new XmlSerializer (userTasks.GetType ()); + List<UserTask> utasks = userTasks [e.Item]; + XmlSerializer serializer = new XmlSerializer (utasks.GetType ()); Stream stream = new FileStream (fileToSave, FileMode.Create, FileAccess.Write, FileShare.None); - serializer.Serialize (stream, userTasks); + serializer.Serialize (stream, utasks); stream.Close (); } catch (Exception ex) { LoggingService.LogWarning ("Could not save user tasks: " + fileToSave, ex); } + + // Remove solution tasks + + List<Task> ttasks; + if (tasks.TryGetValue (e.Item, out ttasks)) { + tasks.Remove (e.Item); + + foreach (Task t in ttasks) + taskCount [t.TaskType]--;
+ + OnTaskRemoved (new TaskEventArgs (ttasks.ToArray ())); + } - //Cleanup - Clear (); - userTasks.Clear (); + userTasks.Remove (e.Item); if (UserTasksChanged != null) UserTasksChanged (this, EventArgs.Empty);
} @@ -167,47 +185,36 @@ namespace MonoDevelop.Ide.Tasks if (e.Key == "Monodevelop.TaskListTokens" && e.NewValue != e.OldValue) { ReloadPriories (); - if (combine != null) - { - // update priorities - foreach (Project p in IdeApp.ProjectOperations.CurrentOpenCombine.GetAllProjects ()) - { - IProjectParserContext pContext = IdeApp.ProjectOperations.ParserDatabase.GetProjectParserContext (p); - foreach (ProjectFile file in p.ProjectFiles) - { - TagCollection tags = pContext.GetFileSpecialComments (file.Name); - if (tags !=null) - UpdateCommentTags (file.Name, tags); - } - } - } + // update priorities + foreach (Project p in IdeApp.Workspace.GetAllProjects ()) + { + IProjectParserContext pContext = IdeApp.Workspace.ParserDatabase.GetProjectParserContext (p); + foreach (ProjectFile file in p.Files) + { + TagCollection tags = pContext.GetFileSpecialComments (file.Name); + if (tags !=null) + UpdateCommentTags (p.ParentSolution, file.Name, tags); + } + } } } void ProjectFileRemoved (object sender, ProjectFileEventArgs e) { - for (int i = 0; i < tasks.Count; ++i) {
- Task curTask = tasks[i]; - string fname = e.ProjectFile.Name; - // The method GetFullPath only works if the file exists - if (File.Exists (fname)) - fname = Path.GetFullPath (fname); - if (curTask.FileName == fname) {
- Remove (curTask);
- --i;
- }
+ foreach (Task curTask in new List<Task> (Tasks)) {
+ if (curTask.FileName == e.ProjectFile.FilePath) + Remove (curTask); } } void ProjectFileRenamed (object sender, ProjectFileRenamedEventArgs e) { - for (int i = 0; i < tasks.Count; ++i) {
- Task curTask = tasks[i];
- if (Path.GetFullPath (curTask.FileName) == Path.GetFullPath (e.OldName)) {
+ List<Task> ctasks = new List<Task> (Tasks); + foreach (Task curTask in ctasks) {
+ if (curTask.FileName == e.OldName) {
Remove (curTask); - curTask.FileName = Path.GetFullPath (e.NewName);
- Add (curTask);
- --i;
+ curTask.FileName = e.NewName;
+ Add (curTask, curTask.OwnerItem);
}
} } @@ -215,12 +222,27 @@ namespace MonoDevelop.Ide.Tasks [AsyncDispatch] void OnCommentTasksChanged (object sender, CommentTasksChangedEventArgs e) { - UpdateCommentTags (e.FileName, e.TagComments); + Project p = IdeApp.Workspace.GetProjectContainingFile (e.FileName); + if (p != null) + UpdateCommentTags (p.ParentSolution, e.FileName, e.TagComments); } - - string GetUserTasksFilename (Combine combine) + + public void ClearExceptCommentTasks ()
{ - string combineFilename = combine.FileName; + List<Task> tlist = new List<Task> (); + foreach (Task t in Tasks) { + if (t.TaskType != TaskType.Comment) + tlist.Add (t); + } + foreach (Task t in tlist) + InternalRemove (t); + + OnTaskRemoved (new TaskEventArgs (tlist.ToArray ())); + } + + string GetUserTasksFilename (WorkspaceItem item) + { + string combineFilename = item.FileName; string combinePath = Path.GetDirectoryName (combineFilename); string userTasksFilename = Path.Combine(combinePath, Path.GetFileNameWithoutExtension(combineFilename) + ".usertasks"); return userTasksFilename; @@ -229,36 +251,40 @@ namespace MonoDevelop.Ide.Tasks void ReloadPriories () { priorities.Clear (); - string tokens = (string)PropertyService.Get ("Monodevelop.TaskListTokens", "FIXME:2;TODO:1;HACK:1;UNDONE:0"); - foreach (string token in tokens.Split (new char[] {';'}, StringSplitOptions.RemoveEmptyEntries)) + string tokens = (string)PropertyService.Get ("Monodevelop.TaskListTokens", "FIXME:2;TODO:1;HACK:1;UNDONE:0"); + foreach (string token in tokens.Split (new char[] {';'}, StringSplitOptions.RemoveEmptyEntries)) + { + int pos = token.IndexOf (':'); + if (pos != -1) { - int pos = token.IndexOf (':'); - if (pos != -1) - { - int priority; - if (! int.TryParse (token.Substring (pos + 1), out priority)) - priority = 1; - priorities.Add (token.Substring (0, pos), (TaskPriority)priority); - } else - { - priorities.Add (token, TaskPriority.Normal); - } + int priority; + if (! int.TryParse (token.Substring (pos + 1), out priority)) + priority = 1; + priorities.Add (token.Substring (0, pos), (TaskPriority)priority); + } else + { + priorities.Add (token, TaskPriority.Normal); } + } } public int TaskCount {
- get {
- return tasks.Count - GetCount (TaskType.Comment);
+ get { + int c = 0; + foreach (List<Task> tt in tasks.Values) + c += tt.Count;
+ return c - GetCount (TaskType.Comment);
}
} public List<Task> Tasks {
get {
List<Task> retTasks = new List<Task> (); - foreach (Task task in tasks) {
- if (task.TaskType != TaskType.Comment) {
- retTasks.Add (task);
- }
+ foreach (List<Task> tt in tasks.Values) { + foreach (Task task in tt) {
+ if (task.TaskType != TaskType.Comment)
+ retTasks.Add (task);
+ } } return retTasks;
}
@@ -267,16 +293,25 @@ namespace MonoDevelop.Ide.Tasks public List<Task> CommentTasks {
get {
List<Task> retTasks = new List<Task> (); - foreach (Task task in tasks) {
- if (task.TaskType == TaskType.Comment) {
- retTasks.Add (task);
- }
+ foreach (List<Task> tt in tasks.Values) { + foreach (Task task in tt) {
+ if (task.TaskType == TaskType.Comment) {
+ retTasks.Add (task);
+ }
+ } } return retTasks;
}
} - public List<UserTask> UserTasks { get { return userTasks; } } + public List<UserTask> UserTasks { + get { + List<UserTask> retTasks = new List<UserTask> (); + foreach (List<UserTask> tt in userTasks.Values) + retTasks.AddRange (tt); + return retTasks; + } + } int GetCount (TaskType type)
{
@@ -319,73 +354,76 @@ namespace MonoDevelop.Ide.Tasks }
} - public string CompilerOutput { - get { - return compilerOutput; - } - set { - compilerOutput = value; - OnCompilerOutputChanged (null); - } + public void Add (Task task)
+ { + Add (task, this); } - public void Add (Task task)
+ public void Add (Task task, object owner)
{ + task.OwnerItem = owner; AddInternal (task);
OnTaskAdded (new TaskEventArgs (new Task[] {task}));
}
public void AddRange (IEnumerable<Task> tasks)
- {
- foreach (Task task in tasks) {
+ { + AddRange (tasks, this); + } +
+ public void AddRange (IEnumerable<Task> tasks, object owner)
+ { + foreach (Task task in tasks) { + task.OwnerItem = owner;
AddInternal (task);
}
OnTaskAdded (new TaskEventArgs (tasks));
} void AddInternal (Task task)
- {
- tasks.Add (task);
+ { + if (task.OwnerItem == null) + throw new InvalidOperationException (); + + List<Task> tlist; + if (!tasks.TryGetValue (task.OwnerItem, out tlist)) + return; + tlist.Add (task);
if (!taskCount.ContainsKey (task.TaskType)) {
taskCount[task.TaskType] = 1;
} else {
taskCount[task.TaskType]++;
- }
+ } }
- public void AddUserTasksRange (IEnumerable<UserTask> tasks) +/* public void AddUserTasksRange (IEnumerable<UserTask> tasks) { userTasks.AddRange (tasks); if (UserTasksChanged != null) UserTasksChanged (this, EventArgs.Empty); } +*/ public void Remove (Task task)
- {
- if (tasks.Contains (task)) {
- tasks.Remove (task);
- taskCount[task.TaskType]--;
+ { + if (InternalRemove (task)) OnTaskRemoved (new TaskEventArgs (new Task[] {task})); - }
} - public void Clear ()
- {
- taskCount.Clear ();
- tasks.Clear ();
- OnTasksCleared (EventArgs.Empty);
+ bool InternalRemove (Task task)
+ { + if (task.OwnerItem != null) { + List<Task> tlist; + if (tasks.TryGetValue (task.OwnerItem, out tlist) && tlist.Contains (task)) { + tlist.Remove (task);
+ taskCount[task.TaskType]--; + return true;
+ } + } + return false;
} - public void ClearExceptCommentTasks ()
- {
- List<Task> commentTasks = new List<Task> (CommentTasks);
- Clear ();
- foreach (Task t in commentTasks) {
- Add (t);
- }
- } - - public void UpdateCommentTags (string fileName, TagCollection tagComments)
+ public void UpdateCommentTags (Solution sol, string fileName, TagCollection tagComments)
{
if (fileName == null) {
return;
@@ -395,12 +433,14 @@ namespace MonoDevelop.Ide.Tasks if (tagComments != null) { foreach (MonoDevelop.Projects.Parser.Tag tag in tagComments) { if (!priorities.ContainsKey (tag.Key)) - continue;
- newTasks.Add (new Task (fileName,
+ continue; + Task t = new Task (fileName,
tag.Key + tag.CommentString,
tag.Region.BeginColumn - 1,
tag.Region.BeginLine,
- TaskType.Comment, priorities[tag.Key]));
+ TaskType.Comment, priorities[tag.Key]); + t.OwnerItem = sol; + newTasks.Add (t);
} }
List<Task> oldTasks = new List<Task> ();
@@ -428,7 +468,7 @@ namespace MonoDevelop.Ide.Tasks foreach (Task task in newTasks) {
if (task != null) {
- Add (task);
+ Add (task, sol);
}
}
@@ -451,46 +491,30 @@ namespace MonoDevelop.Ide.Tasks pad.BringToFront (); } - protected virtual void OnCompilerOutputChanged (EventArgs e) - { - if (CompilerOutputChanged != null) { - CompilerOutputChanged (this, e); - } - } - - protected virtual void OnTaskAdded (TaskEventArgs e) + protected void OnTaskAdded (TaskEventArgs e) { if (TaskAdded != null) { TaskAdded (this, e); } } - protected virtual void OnTaskRemoved (TaskEventArgs e) + protected void OnTaskRemoved (TaskEventArgs e) { if (TaskRemoved != null) { TaskRemoved (this, e); } } - protected virtual void OnTaskChanged (TaskEventArgs e) + protected void OnTaskChanged (TaskEventArgs e) { if (TaskChanged != null) { TaskChanged (this, e); } } - protected virtual void OnTasksCleared (EventArgs e) - { - if (TasksCleared != null) { - TasksCleared (this, e); - } - } - public event TaskEventHandler TaskAdded; public event TaskEventHandler TaskRemoved; public event TaskEventHandler TaskChanged; - public event EventHandler TasksCleared; - public event EventHandler CompilerOutputChanged; public event EventHandler UserTasksChanged; } diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Tasks/UserTask.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Tasks/UserTask.cs index bbeee9e7f7..40c53b34c5 100644 --- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Tasks/UserTask.cs +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Tasks/UserTask.cs @@ -31,15 +31,16 @@ using System.Collections.Generic; using System.Runtime.Serialization; using System.Xml.Serialization; using MonoDevelop.Core; +using MonoDevelop.Projects; namespace MonoDevelop.Ide.Tasks { public class UserTask - { - + { TaskPriority priority = TaskPriority.Normal; bool completed = false; string description; + Solution solution; public TaskPriority Priority { @@ -58,6 +59,16 @@ namespace MonoDevelop.Ide.Tasks get { return description; } set { description = value; } } + + [System.Xml.Serialization.XmlIgnoreAttribute] + public Solution Solution { + get { + return solution; + } + internal set { + solution = value; + } + } public override string ToString () { diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Tasks/UserTasksView.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Tasks/UserTasksView.cs index bfcafe77bf..01d948a35f 100644 --- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Tasks/UserTasksView.cs +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Tasks/UserTasksView.cs @@ -130,21 +130,21 @@ namespace MonoDevelop.Ide.Tasks delButton.SetTooltip (tips, GettextCatalog.GetString ("Delete Task"), GettextCatalog.GetString ("Delete Task")); Services.TaskService.UserTasksChanged += (EventHandler) DispatchService.GuiDispatch (new EventHandler (UserTasksChanged)); - IdeApp.ProjectOperations.CombineOpened += (CombineEventHandler) DispatchService.GuiDispatch (new CombineEventHandler (CombineOpened)); - IdeApp.ProjectOperations.CombineClosed += (CombineEventHandler) DispatchService.GuiDispatch (new CombineEventHandler (CombineClosed)); + IdeApp.Workspace.FirstWorkspaceItemOpened += CombineOpened; + IdeApp.Workspace.LastWorkspaceItemClosed += CombineClosed; PropertyService.PropertyChanged += (EventHandler<PropertyChangedEventArgs>) DispatchService.GuiDispatch (new EventHandler<PropertyChangedEventArgs> (OnPropertyUpdated)); ValidateButtons (); // Initialize with existing tags. UserTasksChanged (this, EventArgs.Empty); } - void CombineOpened (object sender, CombineEventArgs e) + void CombineOpened (object sender, EventArgs e) { solutionLoaded = true; ValidateButtons (); } - void CombineClosed (object sender, CombineEventArgs e) + void CombineClosed (object sender, EventArgs e) { solutionLoaded = true; ValidateButtons (); |