diff --git a/src/Main/Base/Project/Src/Dom/NRefactoryResolver/NRefactoryResolver.cs b/src/Main/Base/Project/Src/Dom/NRefactoryResolver/NRefactoryResolver.cs
index c12e0bc1e3..c94b51b1d4 100644
--- a/src/Main/Base/Project/Src/Dom/NRefactoryResolver/NRefactoryResolver.cs
+++ b/src/Main/Base/Project/Src/Dom/NRefactoryResolver/NRefactoryResolver.cs
@@ -739,7 +739,7 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver
}
result.AddRange(projectContent.GetNamespaceContents(""));
foreach (IUsing u in cu.Usings) {
- if (u != null && (u.Region == null || u.Region.IsInside(caretLine, caretColumn))) {
+ if (u != null) {
foreach (string name in u.Usings) {
result.AddRange(projectContent.GetNamespaceContents(name));
}
diff --git a/src/Main/Base/Project/Src/Services/ParserService/CaseSensitiveProjectContent.cs b/src/Main/Base/Project/Src/Services/ParserService/CaseSensitiveProjectContent.cs
index 827ee5a40d..6ee56cfbc9 100644
--- a/src/Main/Base/Project/Src/Services/ParserService/CaseSensitiveProjectContent.cs
+++ b/src/Main/Base/Project/Src/Services/ParserService/CaseSensitiveProjectContent.cs
@@ -318,7 +318,7 @@ namespace ICSharpCode.Core
}
foreach (IUsing u in unit.Usings) {
- if (u != null && (u.Region == null || u.Region.IsInside(caretLine, caretColumn))) {
+ if (u != null) {
string nameSpace = u.SearchNamespace(name);
if (nameSpace != null) {
return nameSpace;
diff --git a/src/Main/Base/Project/Src/Services/Tasks/TaskService.cs b/src/Main/Base/Project/Src/Services/Tasks/TaskService.cs
index bff54db538..ada87cd1e4 100644
--- a/src/Main/Base/Project/Src/Services/Tasks/TaskService.cs
+++ b/src/Main/Base/Project/Src/Services/Tasks/TaskService.cs
@@ -177,15 +177,14 @@ namespace ICSharpCode.Core
for (int i = 0; i < newTasks.Count; ++i) {
for (int j = 0; j < oldTasks.Count; ++j) {
- if (newTasks[i].Line == oldTasks[j].Line &&
+ if (oldTasks[j] != null &&
+ newTasks[i].Line == oldTasks[j].Line &&
newTasks[i].Column == oldTasks[j].Column &&
- newTasks[i].Description == oldTasks[j].Description) {
+ newTasks[i].Description == oldTasks[j].Description)
+ {
newTasks[i] = null;
oldTasks[j] = null;
- ++i;
- if (i >= newTasks.Count) {
- break;
- }
+ break;
}
}
}
diff --git a/src/Main/Base/Project/Src/TextEditor/Gui/Editor/ErrorDrawer.cs b/src/Main/Base/Project/Src/TextEditor/Gui/Editor/ErrorDrawer.cs
index fa312a20cc..0f33f89891 100644
--- a/src/Main/Base/Project/Src/TextEditor/Gui/Editor/ErrorDrawer.cs
+++ b/src/Main/Base/Project/Src/TextEditor/Gui/Editor/ErrorDrawer.cs
@@ -24,16 +24,26 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor
///
public class VisualError : TextMarker
{
- public VisualError(int offset, int length, string description, bool isError) : base(offset, length, TextMarkerType.WaveLine, isError ? Color.Red : Color.Orange)
+ Task task;
+
+ public Task Task {
+ get {
+ return task;
+ }
+ }
+
+ public VisualError(int offset, int length, Task task)
+ : base(offset, length, TextMarkerType.WaveLine, (task.TaskType == TaskType.Error) ? Color.Red : Color.Orange)
{
- base.ToolTip = description.Replace("&", "&&&");
+ this.task = task;
+ base.ToolTip = task.Description.Replace("&", "&&&");
}
}
///
/// This class draws error underlines.
///
- public class ErrorDrawer
+ public class ErrorDrawer : IDisposable
{
ArrayList errors = new ArrayList();
TextEditorControl textEditor;
@@ -42,55 +52,111 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor
{
this.textEditor = textEditor;
-// TODO: Tasks Changed!!!
-// TaskService.TasksChanged += new EventHandler(SetErrors);
-
+ TaskService.Added += new TaskEventHandler(OnAdded);
+ TaskService.Removed += new TaskEventHandler(OnRemoved);
+ TaskService.Cleared += new EventHandler(OnCleared);
textEditor.FileNameChanged += new EventHandler(SetErrors);
}
- void ClearErrors()
+ ///
+ /// Deregisters the event handlers so the error drawer (and associated TextEditorControl)
+ /// can be garbage collected.
+ ///
+ public void Dispose()
+ {
+ TaskService.Added -= new TaskEventHandler(OnAdded);
+ TaskService.Removed -= new TaskEventHandler(OnRemoved);
+ TaskService.Cleared -= new EventHandler(OnCleared);
+ textEditor.FileNameChanged -= new EventHandler(SetErrors);
+ ClearErrors();
+ }
+
+ void OnAdded(object sender, TaskEventArgs e)
+ {
+ AddTask(e.Task, true);
+ }
+
+ void OnRemoved(object sender, TaskEventArgs e)
+ {
+ Task t = e.Task;
+ List markers = textEditor.Document.MarkerStrategy.TextMarker;
+ for (int i = 0; i < markers.Count; ++i) {
+ VisualError ve = markers[i] as VisualError;
+ if (ve != null && ve.Task == t) {
+ markers.RemoveAt(i);
+ textEditor.Refresh();
+ break;
+ }
+ }
+ }
+
+ void OnCleared(object sender, EventArgs e)
+ {
+ if (ClearErrors()) {
+ textEditor.Refresh();
+ }
+ }
+
+ ///
+ /// Clears all TextMarkers representing errors.
+ ///
+ /// Returns true when there were markers deleted, false when there were no error markers.
+ bool ClearErrors()
{
+ bool removed = false;
List markers = textEditor.Document.MarkerStrategy.TextMarker;
for (int i = 0; i < markers.Count;) {
if (markers[i] is VisualError) {
+ removed = true;
markers.RemoveAt(i);
} else {
i++; // Check next one
}
}
+ return removed;
}
- void SetErrors(object sender, EventArgs e)
+ bool CheckTask(Task task)
{
- ClearErrors();
- if (textEditor.FileName == null) {
- return;
- }
-
- foreach (Task task in TaskService.Tasks) {
- if (task.FileName == null || task.FileName.Length == 0 || task.Column < 0) {
- continue;
- }
- if (Path.GetFullPath(task.FileName).ToLower() == Path.GetFullPath(textEditor.FileName).ToLower() && (task.TaskType == TaskType.Warning || task.TaskType == TaskType.Error)) {
- if (task.Line >= 0 && task.Line < textEditor.Document.TotalNumberOfLines) {
- LineSegment line = textEditor.Document.GetLineSegment(task.Line);
- if (line.Words != null) {
- int offset = line.Offset + task.Column;
- foreach (TextWord tw in line.Words) {
- if (task.Column >= tw.Offset && task.Column < (tw.Offset + tw.Length)) {
- textEditor.Document.MarkerStrategy.TextMarker.Add(new VisualError(offset, tw.Length, task.Description, task.TaskType == TaskType.Error));
- break;
- }
+ if (textEditor.FileName == null)
+ return false;
+ if (task.FileName == null || task.FileName.Length == 0 || task.Column < 0)
+ return false;
+ if (task.TaskType != TaskType.Warning && task.TaskType != TaskType.Error)
+ return false;
+ return string.Equals(Path.GetFullPath(task.FileName), Path.GetFullPath(textEditor.FileName), StringComparison.CurrentCultureIgnoreCase);
+ }
+
+ void AddTask(Task task, bool refresh)
+ {
+ if (!CheckTask(task)) return;
+ if (task.Line >= 0 && task.Line < textEditor.Document.TotalNumberOfLines) {
+ LineSegment line = textEditor.Document.GetLineSegment(task.Line);
+ if (line.Words != null) {
+ int offset = line.Offset + task.Column;
+ foreach (TextWord tw in line.Words) {
+ if (task.Column >= tw.Offset && task.Column < (tw.Offset + tw.Length)) {
+ textEditor.Document.MarkerStrategy.TextMarker.Add(new VisualError(offset, tw.Length, task));
+ if (refresh) {
+ textEditor.Refresh();
}
+ return;
}
- /*
+ }
+ }
+ /*
int startOffset = offset;//Math.Min(textEditor.Document.TextLength, TextUtilities.FindWordStart(textEditor.Document, offset));
int endOffset = Math.Max(1, TextUtilities.FindWordEnd(textEditor.Document, offset));
textEditor.Document.MarkerStrategy.TextMarker.Add(new VisualError(startOffset, endOffset - startOffset + 1, task.Description, task.TaskType == TaskType.Error));*/
- }
- }
}
-
+ }
+
+ void SetErrors(object sender, EventArgs e)
+ {
+ ClearErrors();
+ foreach (Task task in TaskService.Tasks) {
+ AddTask(task, false);
+ }
textEditor.Refresh();
}
}
diff --git a/src/Main/Base/Project/Src/TextEditor/Gui/Editor/InsightWindow/IndexerInsightDataProvider.cs b/src/Main/Base/Project/Src/TextEditor/Gui/Editor/InsightWindow/IndexerInsightDataProvider.cs
index cca9854ec4..47abfc6e9c 100644
--- a/src/Main/Base/Project/Src/TextEditor/Gui/Editor/InsightWindow/IndexerInsightDataProvider.cs
+++ b/src/Main/Base/Project/Src/TextEditor/Gui/Editor/InsightWindow/IndexerInsightDataProvider.cs
@@ -75,9 +75,9 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor
if (projectContent == null)
return;
IClass c = projectContent.GetClass(type.FullyQualifiedName);
- bool canViewProtected = c.IsTypeInInheritanceTree(result.CallingClass);
if (c == null)
return;
+ bool canViewProtected = c.IsTypeInInheritanceTree(result.CallingClass);
foreach (IIndexer i in c.Indexer) {
if (i.IsAccessible(result.CallingClass, canViewProtected)) {
methods.Add(i);
diff --git a/src/Main/Base/Project/Src/TextEditor/Gui/Editor/SharpDevelopTextAreaControl.cs b/src/Main/Base/Project/Src/TextEditor/Gui/Editor/SharpDevelopTextAreaControl.cs
index a6b1664bdf..ebc664c0e4 100644
--- a/src/Main/Base/Project/Src/TextEditor/Gui/Editor/SharpDevelopTextAreaControl.cs
+++ b/src/Main/Base/Project/Src/TextEditor/Gui/Editor/SharpDevelopTextAreaControl.cs
@@ -92,6 +92,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor
{
base.Dispose(Disposing);
if (disposing) {
+ errorDrawer.Dispose();
CloseCodeCompletionWindow(this, EventArgs.Empty);
CloseInsightWindow(this, EventArgs.Empty);
}