Browse Source

Moved some code from WindowsDebugger to DebuggerService

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@70 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
David Srbecký 21 years ago
parent
commit
a9f6432c67
  1. 241
      src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Service/WindowsDebugger.cs
  2. 23
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Breakpoints/Breakpoint.cs
  3. 11
      src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Breakpoints/NDebugger-Breakpoints.cs
  4. 16
      src/Main/Base/Project/Src/Services/Debugger/DebugClasses.cs
  5. 298
      src/Main/Base/Project/Src/Services/Debugger/DebuggerService.cs

241
src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Service/WindowsDebugger.cs

@ -52,12 +52,7 @@ namespace ICSharpCode.SharpDevelop.Services @@ -52,12 +52,7 @@ namespace ICSharpCode.SharpDevelop.Services
}
class BreakpointMarker: TextMarker
{
public BreakpointMarker(int offset, int length, TextMarkerType textMarkerType, Color color, Color fgColor) : base(offset, length, textMarkerType, color, fgColor)
{
}
}
MessageViewCategory messageViewCategoryDebug;
MessageViewCategory messageViewCategoryDebuggerLog;
@ -100,9 +95,12 @@ namespace ICSharpCode.SharpDevelop.Services @@ -100,9 +95,12 @@ namespace ICSharpCode.SharpDevelop.Services
NDebugger.DebuggingResumed += new DebuggerEventHandler(DebuggingResumed);
NDebugger.DebuggingStopped += new DebuggerEventHandler(DebuggingStopped);
NDebugger.IsProcessRunningChanged += new DebuggerEventHandler(DebuggerStateChanged);
WorkbenchSingleton.WorkbenchCreated += new EventHandler(WorkspaceCreated);
NDebugger.Instance.BreakpointStateChanged += new DebuggerLibrary.BreakpointEventHandler(RestoreSharpdevelopBreakpoint);
DebuggerService.BreakPointAdded += new EventHandler(RestoreNDebuggerBreakpoints);
DebuggerService.BreakPointRemoved += new EventHandler(RestoreNDebuggerBreakpoints);
DebuggerService.BreakPointChanged += new EventHandler(RestoreNDebuggerBreakpoints);
if (Initialize != null) {
Initialize(this, null);
}
@ -115,6 +113,11 @@ namespace ICSharpCode.SharpDevelop.Services @@ -115,6 +113,11 @@ namespace ICSharpCode.SharpDevelop.Services
NDebugger.DebuggingStarted -= new DebuggerEventHandler(DebuggingStarted);
NDebugger.DebuggingPaused -= new DebuggingPausedEventHandler(DebuggingPaused);
NDebugger.IsProcessRunningChanged -= new DebuggerEventHandler(DebuggerStateChanged);
NDebugger.Instance.BreakpointStateChanged -= new DebuggerLibrary.BreakpointEventHandler(RestoreSharpdevelopBreakpoint);
DebuggerService.BreakPointAdded -= new EventHandler(RestoreNDebuggerBreakpoints);
DebuggerService.BreakPointRemoved -= new EventHandler(RestoreNDebuggerBreakpoints);
DebuggerService.BreakPointChanged -= new EventHandler(RestoreNDebuggerBreakpoints);
if (Unload != null) {
Unload(this, null);
@ -188,33 +191,26 @@ namespace ICSharpCode.SharpDevelop.Services @@ -188,33 +191,26 @@ namespace ICSharpCode.SharpDevelop.Services
}
#endregion
void WorkspaceCreated(object sender, EventArgs args)
{
WorkbenchSingleton.Workbench.ViewOpened += new ViewContentEventHandler(ViewContentOpened);
WorkbenchSingleton.Workbench.ViewClosed += new ViewContentEventHandler(ViewContentClosed);
}
void ViewContentOpened(object sender, ViewContentEventArgs e)
public void RestoreNDebuggerBreakpoints(object sender, EventArgs e)
{
if (e.Content.Control is TextEditor.TextEditorControl) {
TextArea textArea = ((TextEditor.TextEditorControl)e.Content.Control).ActiveTextAreaControl.TextArea;
textArea.IconBarMargin.MouseDown += new MarginMouseEventHandler(IconBarMouseDown);
textArea.IconBarMargin.Painted += new MarginPaintEventHandler(PaintIconBar);
textArea.MouseMove += new MouseEventHandler(TextAreaMouseMove);
RefreshBreakpointMarkersInEditor(textArea.MotherTextEditorControl);
NDebugger.Instance.ClearBreakpoints();
foreach (ICSharpCode.Core.Breakpoint b in DebuggerService.Breakpoints) {
DebuggerLibrary.Breakpoint newBreakpoint = new DebuggerLibrary.Breakpoint(b.FileName, b.LineNumber, 0, b.IsEnabled);
newBreakpoint.Tag = b;
b.Tag = newBreakpoint;
NDebugger.Instance.AddBreakpoint(newBreakpoint);
}
}
void ViewContentClosed(object sender, ViewContentEventArgs e)
public void RestoreSharpdevelopBreakpoint(object sender, BreakpointEventArgs e)
{
if (e.Content.Control is TextEditor.TextEditorControl) {
TextArea textArea = ((TextEditor.TextEditorControl)e.Content.Control).ActiveTextAreaControl.TextArea;
textArea.IconBarMargin.MouseDown -= new MarginMouseEventHandler(IconBarMouseDown);
textArea.IconBarMargin.Painted -= new MarginPaintEventHandler(PaintIconBar);
textArea.MouseMove -= new MouseEventHandler(TextAreaMouseMove);
ICSharpCode.Core.Breakpoint sdBreakpoint = e.Breakpoint.Tag as ICSharpCode.Core.Breakpoint;
if (sdBreakpoint != null) {
sdBreakpoint.IsEnabled = e.Breakpoint.Enabled;
sdBreakpoint.FileName = e.Breakpoint.SourcecodeSegment.SourceFullFilename;
sdBreakpoint.LineNumber = e.Breakpoint.SourcecodeSegment.StartLine;
}
}
@ -293,7 +289,7 @@ namespace ICSharpCode.SharpDevelop.Services @@ -293,7 +289,7 @@ namespace ICSharpCode.SharpDevelop.Services
{
selectedThread = null;
selectedFunction = null;
RemoveCurrentLineMarker();
DebuggerService.RemoveCurrentLineMarker();
}
void DebuggingStopped(object sender, DebuggerEventArgs e)
@ -319,54 +315,18 @@ namespace ICSharpCode.SharpDevelop.Services @@ -319,54 +315,18 @@ namespace ICSharpCode.SharpDevelop.Services
} catch (CurrentFunctionNotAviableException) {}
}
TextMarker currentLineMarker;
IDocument currentLineMarkerParent;
void RemoveCurrentLineMarker()
{
if (currentLineMarker != null) {
currentLineMarkerParent.MarkerStrategy.TextMarker.Remove(currentLineMarker);
currentLineMarkerParent.RequestUpdate(new TextAreaUpdate(TextAreaUpdateType.WholeTextArea));
currentLineMarkerParent.CommitUpdate();
currentLineMarkerParent = null;
currentLineMarker = null;
}
}
public void JumpToCurrentLine()
{
RemoveCurrentLineMarker();
try {
if (selectedFunction == null) {
return;
}
SourcecodeSegment nextStatement = selectedFunction.NextStatement;
FileService.OpenFile(nextStatement.SourceFullFilename);
IWorkbenchWindow window = FileService.GetOpenFile(nextStatement.SourceFullFilename);
if (window != null) {
IViewContent content = window.ViewContent;
if (content is IPositionable) {
((IPositionable)content).JumpTo((int)nextStatement.StartLine - 1, (int)nextStatement.StartColumn - 1);
}
if (content.Control is TextEditorControl) {
IDocument document = ((TextEditorControl)content.Control).Document;
LineSegment line = document.GetLineSegment((int)nextStatement.StartLine - 1);
int offset = line.Offset + (int)nextStatement.StartColumn;
currentLineMarker = new TextMarker(offset, (int)nextStatement.EndColumn - (int)nextStatement.StartColumn, TextMarkerType.SolidBlock, Color.Yellow);
currentLineMarkerParent = document;
currentLineMarkerParent.MarkerStrategy.TextMarker.Add(currentLineMarker);
document.RequestUpdate(new TextAreaUpdate(TextAreaUpdateType.WholeTextArea));
document.CommitUpdate();
}
}
DebuggerService.JumpToCurrentLine(nextStatement.SourceFullFilename, nextStatement.StartLine, nextStatement.StartColumn, nextStatement.EndLine, nextStatement.EndColumn);
} catch (NextStatementNotAviableException) {
//System.Windows.Forms.MessageBox.Show("Source code not aviable!");
System.Diagnostics.Debug.Fail("Source code not aviable!");
}
}
@ -381,145 +341,6 @@ namespace ICSharpCode.SharpDevelop.Services @@ -381,145 +341,6 @@ namespace ICSharpCode.SharpDevelop.Services
//if (WorkbenchSingleton.Workbench.ActiveWorkbenchWindow != null) {
// WorkbenchSingleton.Workbench.ActiveWorkbenchWindow.ActiveViewContent.RedrawContent();
//}
}
void IconBarMouseDown(AbstractMargin iconBar, Point mousepos, MouseButtons mouseButtons)
{
Rectangle viewRect = iconBar.TextArea.TextView.DrawingPosition;
Point logicPos = iconBar.TextArea.TextView.GetLogicalPosition(0, mousepos.Y - viewRect.Top);
if (logicPos.Y >= 0 && logicPos.Y < iconBar.TextArea.Document.TotalNumberOfLines) {
NDebugger.Instance.ToggleBreakpointAt(iconBar.TextArea.MotherTextEditorControl.FileName , logicPos.Y + 1, 0);
RefreshBreakpointMarkersInEditor(iconBar.TextArea.MotherTextEditorControl);
iconBar.TextArea.Refresh(iconBar);
}
}
public void RefreshBreakpointMarkersInEditor(TextEditorControl textEditor)
{
IDocument document = textEditor.Document;
System.Collections.Generic.List<ICSharpCode.TextEditor.Document.TextMarker> markers = textEditor.Document.MarkerStrategy.TextMarker;
// Remove all breakpoint markers
for (int i = 0; i < markers.Count;) {
if (markers[i] is BreakpointMarker) {
markers.RemoveAt(i);
} else {
i++; // Check next one
}
}
// Add breakpoint markers
foreach (DebuggerLibrary.Breakpoint b in NDebugger.Instance.Breakpoints) {
if (b.SourcecodeSegment.SourceFullFilename.ToLower() == textEditor.FileName.ToLower()) {
LineSegment lineSeg = document.GetLineSegment((int)b.SourcecodeSegment.StartLine - 1);
document.MarkerStrategy.TextMarker.Add(new BreakpointMarker(lineSeg.Offset, lineSeg.Length , TextMarkerType.SolidBlock, Color.Red, Color.White));
}
}
// Perform editor update
document.RequestUpdate(new TextAreaUpdate(TextAreaUpdateType.WholeTextArea));
document.CommitUpdate();
}
TextMarker variableMarker;
IDocument variableMarkerParent;
/// <summary>
/// This function shows variable values as tooltips
/// </summary>
void TextAreaMouseMove(object sender, MouseEventArgs args)
{
if (!IsDebugging) return;
if (IsProcessRunning) return;
TextArea textArea = (TextArea)sender;
Point mousepos = textArea.PointToClient(Control.MousePosition);
Rectangle viewRect = textArea.TextView.DrawingPosition;
if (viewRect.Contains(mousepos)) {
Point logicPos = textArea.TextView.GetLogicalPosition(mousepos.X - viewRect.Left,
mousepos.Y - viewRect.Top);
if (logicPos.Y >= 0 && logicPos.Y < textArea.Document.TotalNumberOfLines) {
IDocument doc = textArea.Document;
LineSegment seg = doc.GetLineSegment(logicPos.Y);
string line = doc.GetText(seg.Offset, seg.Length);
int startIndex = 0;
int length = 0;
string expresion = String.Empty;
for(int index = 0; index < seg.Length; index++) {
char chr = line[index];
if ((Char.IsLetterOrDigit(chr) || chr == '_' || chr == '.') == false || // invalid character
(chr == '.' && logicPos.X <= index)) { // Start of sub-expresion at the right side of cursor
// End of expresion...
if ((startIndex <= logicPos.X && logicPos.X <= index) && // Correct position
(startIndex != index)) { // Actualy something
length = index - startIndex;
expresion = line.Substring(startIndex, length);
break;
} else {
// Let's try next one...
startIndex = index + 1;
}
}
}
//Console.WriteLine("MouseMove@" + logicPos + ":" + expresion);
if (variableMarker == null || variableMarker.Offset != (seg.Offset + startIndex) || variableMarker.Length != length) {
// Needs update
if (variableMarker != null) {
// Remove old marker
variableMarkerParent.MarkerStrategy.TextMarker.Remove(variableMarker);
variableMarkerParent.RequestUpdate(new TextAreaUpdate(TextAreaUpdateType.WholeTextArea));
variableMarkerParent.CommitUpdate();
variableMarkerParent = null;
variableMarker = null;
}
if (expresion != String.Empty) {
// Look if it is variable
try {
string value;
value = selectedThread.LocalVariables[expresion].Value.ToString();
variableMarker = new TextMarker(seg.Offset + startIndex, length, TextMarkerType.Underlined, Color.Blue);
variableMarker.ToolTip = value;
variableMarkerParent = doc;
variableMarkerParent.MarkerStrategy.TextMarker.Add(variableMarker);
variableMarkerParent.RequestUpdate(new TextAreaUpdate(TextAreaUpdateType.WholeTextArea));
variableMarkerParent.CommitUpdate();
} catch {}
}
}
}
}
}
/// <summary>
/// Draw Breakpoint icon and the yellow arrow in the margin
/// </summary>
void PaintIconBar(AbstractMargin iconBar, Graphics g, Rectangle rect)
{
foreach (DebuggerLibrary.Breakpoint breakpoint in NDebugger.Instance.Breakpoints) {
if (Path.GetFullPath(breakpoint.SourcecodeSegment.SourceFullFilename) == Path.GetFullPath(iconBar.TextArea.MotherTextEditorControl.FileName)) {
int lineNumber = iconBar.TextArea.Document.GetVisibleLine((int)breakpoint.SourcecodeSegment.StartLine - 1);
int yPos = (int)(lineNumber * iconBar.TextArea.TextView.FontHeight) - iconBar.TextArea.VirtualTop.Y;
if (yPos >= rect.Y && yPos <= rect.Bottom) {
((IconBarMargin)iconBar).DrawBreakpoint(g, yPos, breakpoint.Enabled);
}
}
}
if (IsDebugging && !IsProcessRunning && selectedFunction != null) {
try {
SourcecodeSegment nextStatement = selectedFunction.NextStatement;//cache
if (Path.GetFullPath(nextStatement.SourceFullFilename).ToLower() == Path.GetFullPath(iconBar.TextArea.MotherTextEditorControl.FileName).ToLower()) {
int lineNumber = iconBar.TextArea.Document.GetVisibleLine((int)nextStatement.StartLine - 1);
int yPos = (int)(lineNumber * iconBar.TextArea.TextView.FontHeight) - iconBar.TextArea.VirtualTop.Y;
if (yPos >= rect.Y && yPos <= rect.Bottom) {
((IconBarMargin)iconBar).DrawArrow(g, yPos);
}
}
}
catch (NextStatementNotAviableException) {}
}
}
}
}
}

23
src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Breakpoints/Breakpoint.cs

@ -19,17 +19,30 @@ namespace DebuggerLibrary @@ -19,17 +19,30 @@ namespace DebuggerLibrary
bool enabled = true;
ICorDebugFunctionBreakpoint corBreakpoint;
IntPtr pBreakpoint;
object tag;
public SourcecodeSegment SourcecodeSegment {
get {
return sourcecodeSegment;
}
}
public object Tag {
get {
return tag;
}
set {
tag = value;
}
}
public bool HadBeenSet {
get {
return hadBeenSet;
}
internal set {
hadBeenSet = value;
}
}
public bool Enabled {
@ -48,6 +61,7 @@ namespace DebuggerLibrary @@ -48,6 +61,7 @@ namespace DebuggerLibrary
{
corBreakpoint.Activate(enabled?1:0);
}
OnBreakpointStateChanged();
}
}
@ -93,6 +107,15 @@ namespace DebuggerLibrary @@ -93,6 +107,15 @@ namespace DebuggerLibrary
sourcecodeSegment.StartLine = line;
sourcecodeSegment.StartColumn = column;
}
public Breakpoint(string sourceFilename, int line, int column, bool enabled)
{
sourcecodeSegment = new SourcecodeSegment();
sourcecodeSegment.SourceFullFilename = sourceFilename;
sourcecodeSegment.StartLine = line;
sourcecodeSegment.StartColumn = column;
this.enabled = enabled;
}
internal bool Equals(IntPtr ptr)
{

11
src/AddIns/Misc/Debugger/Debugger.Core/Project/Src/Breakpoints/NDebugger-Breakpoints.cs

@ -108,13 +108,22 @@ namespace DebuggerLibrary @@ -108,13 +108,22 @@ namespace DebuggerLibrary
OnBreakpointRemoved( breakpoint);
}
internal void ResetBreakpoints()
public void ResetBreakpoints()
{
foreach (Breakpoint b in breakpointCollection) {
b.HadBeenSet = false;
b.ResetBreakpoint();
}
}
public void ClearBreakpoints()
{
foreach (Breakpoint b in breakpointCollection) {
OnBreakpointRemoved(b);
}
breakpointCollection.Clear();
}
internal void SetBreakpointsInModule(object sender, ModuleEventArgs e)
{
foreach (Breakpoint b in breakpointCollection) {

16
src/Main/Base/Project/Src/Services/Debugger/DebugClasses.cs

@ -19,6 +19,7 @@ namespace ICSharpCode.Core @@ -19,6 +19,7 @@ namespace ICSharpCode.Core
{
string fileName;
int lineNumber;
object tag;
bool isEnabled = true;
@ -26,12 +27,27 @@ namespace ICSharpCode.Core @@ -26,12 +27,27 @@ namespace ICSharpCode.Core
get {
return fileName;
}
set {
fileName = value;
}
}
public int LineNumber {
get {
return lineNumber;
}
set {
lineNumber = value;
}
}
public object Tag {
get {
return tag;
}
set {
tag = value;
}
}
public bool IsEnabled {

298
src/Main/Base/Project/Src/Services/Debugger/DebuggerService.cs

@ -8,11 +8,16 @@ @@ -8,11 +8,16 @@
using System;
using System.Diagnostics;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using ICSharpCode.Core;
using ICSharpCode.SharpDevelop.Gui;
using ICSharpCode.SharpDevelop.Project;
using ICSharpCode.TextEditor.Document;
using ICSharpCode.TextEditor;
using System.Drawing;
using System.Windows.Forms;
namespace ICSharpCode.Core
{
@ -23,13 +28,13 @@ namespace ICSharpCode.Core @@ -23,13 +28,13 @@ namespace ICSharpCode.Core
static IDebugger defaultDebugger = null;
static IDebugger currentDebugger = null;
static ArrayList debugger = null;
static ArrayList breakpoints = new ArrayList();
//static ArrayList breakpoints = new ArrayList();
public static ArrayList Breakpoints {
/*public static ArrayList Breakpoints {
get {
return breakpoints;
}
}
}*/
public static IDebugger CurrentDebugger {
get {
@ -82,23 +87,10 @@ namespace ICSharpCode.Core @@ -82,23 +87,10 @@ namespace ICSharpCode.Core
static DebuggerService()
{
InitializeService();
InitializeService2();
}
public static void ToggleBreakpointAt(string fileName, int line, int column)
{
try {
for (int i = 0; i < breakpoints.Count; ++i) {
Breakpoint bp = (Breakpoint)breakpoints[i];
if (bp.FileName == fileName && bp.LineNumber == line) {
breakpoints.RemoveAt(i);
return;
}
}
breakpoints.Add(new Breakpoint(fileName, line));
} finally {
OnBreakPointChanged(EventArgs.Empty);
}
}
static MessageViewCategory debugCategory = null;
static void EnsureDebugCategory()
@ -316,13 +308,281 @@ namespace ICSharpCode.Core @@ -316,13 +308,281 @@ namespace ICSharpCode.Core
// base.OnModuleLoaded(e);
// }
public static event EventHandler BreakPointChanged;
public static event EventHandler BreakPointAdded;
public static event EventHandler BreakPointRemoved;
static void OnBreakPointChanged(EventArgs e)
{
if (BreakPointChanged != null) {
BreakPointChanged(null, e);
}
}
static void OnBreakPointAdded(EventArgs e)
{
if (BreakPointAdded != null) {
BreakPointAdded(null, e);
}
}
static void OnBreakPointRemoved(EventArgs e)
{
if (BreakPointRemoved != null) {
BreakPointRemoved(null, e);
}
}
static List<Breakpoint> breakpoints = new List<Breakpoint>();
public static IList<Breakpoint> Breakpoints {
get {
return breakpoints;
}
}
public static void ToggleBreakpointAt(string fileName, int line, int column)
{
foreach(Breakpoint b in breakpoints) {
if (b.FileName == fileName && b.LineNumber == line) {
breakpoints.Remove(b);
OnBreakPointRemoved(EventArgs.Empty);
return;
}
}
breakpoints.Add(new Breakpoint(fileName, line));
OnBreakPointAdded(EventArgs.Empty);
}
class BreakpointMarker: TextMarker
{
public BreakpointMarker(int offset, int length, TextMarkerType textMarkerType, Color color, Color foreColor):base(offset, length, textMarkerType, color, foreColor)
{
}
}
class CurrentLineMarker: TextMarker
{
public CurrentLineMarker(int offset, int length, TextMarkerType textMarkerType, Color color, Color foreColor):base(offset, length, textMarkerType, color, foreColor)
{
}
}
public static void InitializeService2()
{
WorkbenchSingleton.WorkbenchCreated += new EventHandler(WorkspaceCreated);
}
static void WorkspaceCreated(object sender, EventArgs args)
{
WorkbenchSingleton.Workbench.ViewOpened += new ViewContentEventHandler(ViewContentOpened);
WorkbenchSingleton.Workbench.ViewClosed += new ViewContentEventHandler(ViewContentClosed);
}
static void ViewContentOpened(object sender, ViewContentEventArgs e)
{
if (e.Content.Control is TextEditor.TextEditorControl) {
TextArea textArea = ((TextEditor.TextEditorControl)e.Content.Control).ActiveTextAreaControl.TextArea;
textArea.IconBarMargin.MouseDown += new MarginMouseEventHandler(IconBarMouseDown);
textArea.IconBarMargin.Painted += new MarginPaintEventHandler(PaintIconBar);
textArea.MouseMove += new MouseEventHandler(TextAreaMouseMove);
RefreshBreakpointMarkersInEditor(textArea.MotherTextEditorControl);
}
}
public static event EventHandler BreakPointChanged;
static void ViewContentClosed(object sender, ViewContentEventArgs e)
{
if (e.Content.Control is TextEditor.TextEditorControl) {
TextArea textArea = ((TextEditor.TextEditorControl)e.Content.Control).ActiveTextAreaControl.TextArea;
textArea.IconBarMargin.MouseDown -= new MarginMouseEventHandler(IconBarMouseDown);
textArea.IconBarMargin.Painted -= new MarginPaintEventHandler(PaintIconBar);
textArea.MouseMove -= new MouseEventHandler(TextAreaMouseMove);
}
}
static TextMarker currentLineMarker;
static IDocument currentLineMarkerParent;
static public void RemoveCurrentLineMarker()
{
if (currentLineMarker != null) {
currentLineMarkerParent.MarkerStrategy.TextMarker.Remove(currentLineMarker);
currentLineMarkerParent.RequestUpdate(new TextAreaUpdate(TextAreaUpdateType.WholeTextArea));
currentLineMarkerParent.CommitUpdate();
currentLineMarkerParent = null;
currentLineMarker = null;
}
}
static public void JumpToCurrentLine(string SourceFullFilename, int StartLine, int StartColumn, int EndLine, int EndColumn)
{
RemoveCurrentLineMarker();
FileService.OpenFile(SourceFullFilename);
IWorkbenchWindow window = FileService.GetOpenFile(SourceFullFilename);
if (window != null) {
IViewContent content = window.ViewContent;
if (content is IPositionable) {
((IPositionable)content).JumpTo((int)StartLine - 1, (int)StartColumn - 1);
}
if (content.Control is TextEditorControl) {
IDocument document = ((TextEditorControl)content.Control).Document;
LineSegment line = document.GetLineSegment((int)StartLine - 1);
int offset = line.Offset + (int)StartColumn;
currentLineMarker = new CurrentLineMarker(offset, (int)EndColumn - (int)StartColumn, TextMarkerType.SolidBlock, Color.Yellow, Color.Blue);
currentLineMarkerParent = document;
currentLineMarkerParent.MarkerStrategy.TextMarker.Add(currentLineMarker);
document.RequestUpdate(new TextAreaUpdate(TextAreaUpdateType.WholeTextArea));
document.CommitUpdate();
}
}
}
static void IconBarMouseDown(AbstractMargin iconBar, Point mousepos, MouseButtons mouseButtons)
{
Rectangle viewRect = iconBar.TextArea.TextView.DrawingPosition;
Point logicPos = iconBar.TextArea.TextView.GetLogicalPosition(0, mousepos.Y - viewRect.Top);
if (logicPos.Y >= 0 && logicPos.Y < iconBar.TextArea.Document.TotalNumberOfLines) {
ToggleBreakpointAt(iconBar.TextArea.MotherTextEditorControl.FileName , logicPos.Y + 1, 0);
RefreshBreakpointMarkersInEditor(iconBar.TextArea.MotherTextEditorControl);
iconBar.TextArea.Refresh(iconBar);
}
}
static void RefreshBreakpointMarkersInEditor(TextEditorControl textEditor)
{
IDocument document = textEditor.Document;
System.Collections.Generic.List<ICSharpCode.TextEditor.Document.TextMarker> markers = textEditor.Document.MarkerStrategy.TextMarker;
// Remove all breakpoint markers
for (int i = 0; i < markers.Count;) {
if (markers[i] is BreakpointMarker) {
markers.RemoveAt(i);
} else {
i++; // Check next one
}
}
// Add breakpoint markers
foreach (Breakpoint b in Breakpoints) {
if (b.FileName.ToLower() == textEditor.FileName.ToLower()) {
LineSegment lineSeg = document.GetLineSegment((int)b.LineNumber - 1);
document.MarkerStrategy.TextMarker.Add(new BreakpointMarker(lineSeg.Offset, lineSeg.Length , TextMarkerType.SolidBlock, Color.Red, Color.White));
}
}
// Perform editor update
document.RequestUpdate(new TextAreaUpdate(TextAreaUpdateType.WholeTextArea));
document.CommitUpdate();
}
/// <summary>
/// Draw Breakpoint icon and the yellow arrow in the margin
/// </summary>
static void PaintIconBar(AbstractMargin iconBar, Graphics g, Rectangle rect)
{
foreach (Breakpoint breakpoint in Breakpoints) {
if (Path.GetFullPath(breakpoint.FileName) == Path.GetFullPath(iconBar.TextArea.MotherTextEditorControl.FileName)) {
int lineNumber = iconBar.TextArea.Document.GetVisibleLine((int)breakpoint.LineNumber - 1);
int yPos = (int)(lineNumber * iconBar.TextArea.TextView.FontHeight) - iconBar.TextArea.VirtualTop.Y;
if (yPos >= rect.Y && yPos <= rect.Bottom) {
((IconBarMargin)iconBar).DrawBreakpoint(g, yPos, breakpoint.IsEnabled);
}
}
}
foreach (TextMarker textMarker in iconBar.TextArea.Document.MarkerStrategy.TextMarker) {
CurrentLineMarker currentLineMarker = textMarker as CurrentLineMarker;
if (currentLineMarker != null) {
int lineNumber = iconBar.TextArea.Document.GetVisibleLine((int)iconBar.TextArea.Document.GetLineNumberForOffset(currentLineMarker.Offset));
int yPos = (int)(lineNumber * iconBar.TextArea.TextView.FontHeight) - iconBar.TextArea.VirtualTop.Y;
if (yPos >= rect.Y && yPos <= rect.Bottom) {
((IconBarMargin)iconBar).DrawArrow(g, yPos);
}
}
}
}
static TextMarker variableMarker;
static IDocument variableMarkerParent;
/// <summary>
/// This function shows variable values as tooltips
/// </summary>
static void TextAreaMouseMove(object sender, MouseEventArgs args)
{
TextArea textArea = (TextArea)sender;
Point mousepos = textArea.PointToClient(Control.MousePosition);
Rectangle viewRect = textArea.TextView.DrawingPosition;
if (viewRect.Contains(mousepos)) {
Point logicPos = textArea.TextView.GetLogicalPosition(mousepos.X - viewRect.Left,
mousepos.Y - viewRect.Top);
if (logicPos.Y >= 0 && logicPos.Y < textArea.Document.TotalNumberOfLines) {
IDocument doc = textArea.Document;
LineSegment seg = doc.GetLineSegment(logicPos.Y);
string line = doc.GetText(seg.Offset, seg.Length);
int startIndex = 0;
int length = 0;
string expresion = String.Empty;
for(int index = 0; index < seg.Length; index++) {
char chr = line[index];
if ((Char.IsLetterOrDigit(chr) || chr == '_' || chr == '.') == false || // invalid character
(chr == '.' && logicPos.X <= index)) { // Start of sub-expresion at the right side of cursor
// End of expresion...
if ((startIndex <= logicPos.X && logicPos.X <= index) && // Correct position
(startIndex != index)) { // Actualy something
length = index - startIndex;
expresion = line.Substring(startIndex, length);
break;
} else {
// Let's try next one...
startIndex = index + 1;
}
}
}
//Console.WriteLine("MouseMove@" + logicPos + ":" + expresion);
if (variableMarker == null || variableMarker.Offset != (seg.Offset + startIndex) || variableMarker.Length != length) {
// Needs update
if (variableMarker != null) {
// Remove old marker
variableMarkerParent.MarkerStrategy.TextMarker.Remove(variableMarker);
variableMarkerParent.RequestUpdate(new TextAreaUpdate(TextAreaUpdateType.WholeTextArea));
variableMarkerParent.CommitUpdate();
variableMarkerParent = null;
variableMarker = null;
}
if (expresion != String.Empty) {
// Look if it is variable
try {
string value;
//value = selectedThread.LocalVariables[expresion].Value.ToString();
value = expresion;
variableMarker = new TextMarker(seg.Offset + startIndex, length, TextMarkerType.Underlined, Color.Blue);
variableMarker.ToolTip = value;
variableMarkerParent = doc;
variableMarkerParent.MarkerStrategy.TextMarker.Add(variableMarker);
variableMarkerParent.RequestUpdate(new TextAreaUpdate(TextAreaUpdateType.WholeTextArea));
variableMarkerParent.CommitUpdate();
} catch {}
}
}
}
}
}
}
}

Loading…
Cancel
Save