Browse Source
git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@4828 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61shortcuts
8 changed files with 285 additions and 15 deletions
@ -0,0 +1,151 @@
@@ -0,0 +1,151 @@
|
||||
// <file>
|
||||
// <copyright see="prj:///doc/copyright.txt"/>
|
||||
// <license see="prj:///doc/license.txt"/>
|
||||
// <owner name="Siegfried Pammer" email="siegfriedpammer@gmail.com"/>
|
||||
// <version>$Revision$</version>
|
||||
// </file>
|
||||
using ICSharpCode.Core; |
||||
using System; |
||||
using System.Windows.Media; |
||||
using ICSharpCode.SharpDevelop.Debugging; |
||||
using ICSharpCode.SharpDevelop.Editor; |
||||
|
||||
namespace ICSharpCode.SharpDevelop |
||||
{ |
||||
/// <summary>
|
||||
/// Synchronizes the ITextEditors with the TaskService. It adds and removes error markers.
|
||||
/// </summary>
|
||||
public class ErrorDrawer : IDisposable |
||||
{ |
||||
ITextEditor textEditor; |
||||
ITextMarkerService markerService; |
||||
|
||||
public ErrorDrawer(ITextEditor textEditor) |
||||
{ |
||||
this.textEditor = textEditor; |
||||
this.markerService = this.textEditor.GetService(typeof(ITextMarkerService)) as ITextMarkerService; |
||||
|
||||
if (this.markerService == null) |
||||
throw new InvalidOperationException("this ITextEditor has no text marker service!"); |
||||
|
||||
TaskService.Added += new TaskEventHandler(OnAdded); |
||||
TaskService.Removed += new TaskEventHandler(OnRemoved); |
||||
TaskService.Cleared += new EventHandler(OnCleared); |
||||
DebuggerService.DebugStarted += OnDebugStarted; |
||||
DebuggerService.DebugStopped += OnDebugStopped; |
||||
} |
||||
|
||||
bool isDisposed; |
||||
|
||||
/// <summary>
|
||||
/// Deregisters the event handlers so the error drawer (and associated TextEditorControl)
|
||||
/// can be garbage collected.
|
||||
/// </summary>
|
||||
public void Dispose() |
||||
{ |
||||
if (isDisposed) |
||||
return; |
||||
isDisposed = true; |
||||
TaskService.Added -= new TaskEventHandler(OnAdded); |
||||
TaskService.Removed -= new TaskEventHandler(OnRemoved); |
||||
TaskService.Cleared -= new EventHandler(OnCleared); |
||||
DebuggerService.DebugStarted -= OnDebugStarted; |
||||
DebuggerService.DebugStopped -= OnDebugStopped; |
||||
ClearErrors(); |
||||
} |
||||
|
||||
void OnDebugStarted(object sender, EventArgs e) |
||||
{ |
||||
ClearErrors(); |
||||
} |
||||
|
||||
void OnDebugStopped(object sender, EventArgs e) |
||||
{ |
||||
foreach (Task task in TaskService.Tasks) { |
||||
AddTask(task); |
||||
} |
||||
} |
||||
|
||||
void OnAdded(object sender, TaskEventArgs e) |
||||
{ |
||||
AddTask(e.Task); |
||||
} |
||||
|
||||
void OnRemoved(object sender, TaskEventArgs e) |
||||
{ |
||||
markerService.RemoveAll(marker => marker.Tag == e.Task); |
||||
} |
||||
|
||||
void OnCleared(object sender, EventArgs e) |
||||
{ |
||||
ClearErrors(); |
||||
} |
||||
|
||||
/// <summary>
|
||||
/// Clears all TextMarkers representing errors.
|
||||
/// </summary>
|
||||
/// <returns>Returns true when there were markers deleted, false when there were no error markers.</returns>
|
||||
void ClearErrors() |
||||
{ |
||||
markerService.RemoveAll(marker => marker.Tag is Task); |
||||
} |
||||
|
||||
bool CheckTask(Task task) |
||||
{ |
||||
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 FileUtility.IsEqualFileName(task.FileName, textEditor.FileName); |
||||
} |
||||
|
||||
void AddTask(Task task) |
||||
{ |
||||
if (!CheckTask(task)) return; |
||||
|
||||
if (task.Line >= 0 && task.Line < textEditor.Document.TotalNumberOfLines) { |
||||
int offset = textEditor.Document.PositionToOffset(task.Line, task.Column); |
||||
int length = textEditor.Document.GetWordAt(offset).Length; |
||||
|
||||
if (length < 2) |
||||
length = 2; |
||||
|
||||
ITextMarker marker = this.markerService.Create(offset, length); |
||||
|
||||
Color markerColor = Colors.Transparent; |
||||
|
||||
switch (task.TaskType) { |
||||
case TaskType.Error: |
||||
markerColor = Colors.Red; |
||||
break; |
||||
case TaskType.Message: |
||||
markerColor = Colors.Blue; |
||||
break; |
||||
case TaskType.Warning: |
||||
markerColor = Colors.Yellow; |
||||
break; |
||||
} |
||||
|
||||
marker.MarkerColor = markerColor; |
||||
marker.MarkerType = TextMarkerType.SquigglyUnderline; |
||||
|
||||
marker.ToolTip = task.Description; |
||||
|
||||
marker.Tag = task; |
||||
} |
||||
} |
||||
|
||||
/// <summary>
|
||||
/// Clears all errors and adds them again.
|
||||
/// </summary>
|
||||
public void UpdateErrors() |
||||
{ |
||||
ClearErrors(); |
||||
foreach (Task task in TaskService.Tasks) { |
||||
AddTask(task); |
||||
} |
||||
} |
||||
} |
||||
} |
Loading…
Reference in new issue