From 42b4743835b22572217b4ac4cd39075e93eb09bd Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Thu, 5 May 2005 21:23:52 +0000 Subject: [PATCH] Fixed some bugs in code completion and error drawing. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@122 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../NRefactoryResolver/NRefactoryResolver.cs | 2 +- .../CaseSensitiveProjectContent.cs | 2 +- .../Project/Src/Services/Tasks/TaskService.cs | 11 +- .../Src/TextEditor/Gui/Editor/ErrorDrawer.cs | 128 +++++++++++++----- .../IndexerInsightDataProvider.cs | 2 +- .../Gui/Editor/SharpDevelopTextAreaControl.cs | 1 + 6 files changed, 106 insertions(+), 40 deletions(-) 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); }