2
//// <copyright see="prj:///doc/copyright.txt"/>
3
//// <license see="prj:///doc/license.txt"/>
4
//// <owner name="Mike Krüger" email="mike@icsharpcode.net"/>
5
//// <version value="$version"/>
9
//using System.Collections;
10
//using System.Drawing;
11
//using System.Drawing.Text;
13
//using MonoDevelop.TextEditor.Document;
14
//using MonoDevelop.Core;
15
//using MonoDevelop.Core.Gui;
16
//using MonoDevelop.TextEditor;
18
//namespace MonoDevelop.DefaultEditor.Gui.Editor
21
// /// reperesents a visual error, this class is needed by the errordrawer.
23
// public class VisualError
27
// string description;
29
// public int Offset {
38
// public int Length {
47
// public string Description {
49
// return description;
53
// public VisualError(int offset, int length, string description)
55
// this.offset = offset;
56
// this.length = length;
57
// this.description = description;
62
// /// This class draws error underlines.
64
// public class ErrorDrawer
66
// ArrayList errors = new ArrayList();
67
// TextAreaControl textarea;
69
// public ErrorDrawer(TextAreaControl textarea)
71
// this.textarea = textarea;
72
// textarea.Document.DocumentChanged += new DocumentAggregatorEventHandler(MoveIndices);
73
// textarea.TextAreaPainter.ToolTipEvent += new ToolTipEvent(ToolTip);
74
// textarea.TextAreaPainter.LinePainter += new LinePainter(ErrorPainter);
76
// TaskService taskService = (TaskService)MonoDevelop.Core.ServiceManager.Services.GetService(typeof(TaskService));
77
// taskService.TasksChanged += new EventHandler(SetErrors);
78
// textarea.FileNameChanged += new EventHandler(SetErrors);
81
// public void MoveIndices(object sender, DocumentAggregatorEventArgs e)
83
// ArrayList newerrors = new ArrayList();
84
// bool redraw = false;
86
// foreach (VisualError error in errors) {
87
// if (e.Length == -1) { // insert
88
// if (e.Offset <= error.Offset) {
89
// error.Offset += e.Text.Length;
91
// } else if (e.Offset < error.Offset + error.Length) {
92
// error.Length += e.Text.Length;
95
// } else if (e.Text == null) { // remove
96
// if (e.Offset < error.Offset) {
97
// error.Offset -= e.Length;
99
// } else if (e.Offset == error.Offset) {
100
// error.Length -= e.Length;
101
// } else if (e.Offset <= error.Offset + error.Length) {
102
// if (e.Offset + e.Length <= error.Offset + error.Length) {
103
// error.Length = error.Length - e.Length;
105
// error.Length = e.Offset - error.Offset;
108
// } else { // replace
109
// if (e.Offset <= error.Offset) {
110
// error.Offset -= e.Length;
111
// error.Offset += e.Text.Length;
115
// if (error.Offset > 0 && error.Offset + error.Length < e.Document.TextLength) {
116
// newerrors.Add(error);
119
// errors = newerrors;
123
// textarea.Refresh();
127
// void ClearErrors()
129
// ArrayList lines = new ArrayList();
130
// foreach (VisualError error in errors) {
131
// lines.Add(textarea.Document.GetLineNumberForOffset(error.Offset));
136
// foreach (int line in lines) {
137
// textarea.Document.RequestUpdate(new TextAreaUpdate(TextAreaUpdateType.SingleLine, new Point(0, line)));
139
// textarea.Document.CommitUpdate();
142
// void SetErrors(object sender, EventArgs e)
145
// TaskService taskService = (TaskService)MonoDevelop.Core.ServiceManager.Services.GetService(typeof(TaskService));
146
// foreach (Task task in taskService.Tasks) {
147
// if (task.FileName == textarea.FileName && (task.TaskType == TaskType.Warning ||
148
// task.TaskType == TaskType.Error)) {
149
// if (task.Line >= 0 && task.Line < textarea.Document.TotalNumberOfLines) {
150
// LineSegment line = textarea.Document.GetLineSegment(task.Line);
151
// int offset = Math.Min(textarea.Document.TextLength, line.Offset + task.Column);
152
// int length = Math.Max(1, TextUtilities.FindWordEnd(textarea.Document, offset) - offset);
153
// AddError(new VisualError(offset, length, task.Description));
158
// textarea.Refresh();
161
// bool AddError(VisualError newerror)
163
//// Console.WriteLine("Add Error");
166
// foreach (VisualError error in errors) {
167
// if (error.Offset == newerror.Offset && error.Length == newerror.Length) {
172
// errors.Add(newerror);
175
// int lineNr = textarea.Document.GetLineNumberForOffset(newerror.Offset);
176
// textarea.Document.RequestUpdate(new TextAreaUpdate(TextAreaUpdateType.SingleLine, new Point(0, lineNr)));
177
// textarea.Document.CommitUpdate();
178
//// Console.WriteLine("Add Error .DONE");
182
// void ToolTip(int xpos, int ypos, ref bool toolTipSet)
184
//// Console.WriteLine("Tool Tip");
187
// foreach (VisualError error in errors) {
188
// Point errorpos = textarea.Document.OffsetToView(error.Offset);
189
// Rectangle r = new Rectangle((int)(errorpos.X * textarea.TextAreaPainter.FontWidth),
190
// (int)(errorpos.Y * textarea.TextAreaPainter.FontHeight),
191
// (int)(error.Length * textarea.TextAreaPainter.FontWidth),
192
// (int)textarea.TextAreaPainter.FontHeight);
193
// if (r.Contains(xpos, ypos)) {
194
// textarea.TextAreaPainter.ToolTip.SetToolTip(textarea.TextAreaPainter, error.Description);
195
// toolTipSet = true;
200
//// Console.WriteLine("Tool Tip .DONE");
203
// void DrawWaveLine(Graphics g, int from, int to, int ypos)
205
// Pen pen = Pens.Red;
206
// for (int i = from; i < to; i+= 6) {
207
// g.DrawLine(pen, i, ypos + 3, i + 3, ypos + 1);
208
// g.DrawLine(pen, i + 3, ypos + 1, i + 6, ypos + 3);
212
// void ErrorPainter(Graphics g, int line, RectangleF rect, PointF pos, int virtualLeft, int virtualTop)
214
//// Console.WriteLine("Paint");
215
// if (textarea.Properties.GetProperty("ShowErrors", true)) {
217
// foreach (VisualError error in errors) {
219
// int offsetLineNumber = textarea.Document.GetLineNumberForOffset(error.Offset);
221
// if (offsetLineNumber == line) {
222
// LineSegment lineSegment = textarea.Document.GetLineSegment(offsetLineNumber);
223
// int xPos = error.Offset - lineSegment.Offset;
225
// (int)(pos.X + textarea.TextAreaPainter.CalculateVisualXPos(offsetLineNumber, xPos) - virtualLeft),
226
// (int)(pos.X + textarea.TextAreaPainter.CalculateVisualXPos(offsetLineNumber, xPos + error.Length) - virtualLeft),
227
// (int)(pos.Y + textarea.TextAreaPainter.FontHeight - 3) - virtualTop);
229
// } catch (Exception) {}
233
//// Console.WriteLine("Paint .DONE");