Browse Source

add mouse navigation mode to InsertWithCursor

pull/331/head
Siegfried Pammer 12 years ago
parent
commit
d482cd4a73
  1. 71
      src/AddIns/BackendBindings/CSharpBinding/Project/Src/Refactoring/EditorScript.cs

71
src/AddIns/BackendBindings/CSharpBinding/Project/Src/Refactoring/EditorScript.cs

@ -282,6 +282,7 @@ namespace CSharpBinding.Refactoring
readonly TextArea editor; readonly TextArea editor;
public int CurrentInsertionPoint { get; set; } public int CurrentInsertionPoint { get; set; }
int insertionPointNextToMouse = -1;
public event EventHandler<InsertionCursorEventArgs> Exited; public event EventHandler<InsertionCursorEventArgs> Exited;
@ -305,14 +306,70 @@ namespace CSharpBinding.Refactoring
} }
static readonly Pen markerPen = new Pen(Brushes.Blue, 1); static readonly Pen markerPen = new Pen(Brushes.Blue, 1);
static readonly Pen tempMarkerPen = new Pen(Brushes.Gray, 1);
protected override void OnRender(DrawingContext drawingContext) protected override void OnRender(DrawingContext drawingContext)
{ {
var currentInsertionPoint = insertionPoints[CurrentInsertionPoint]; DrawLineForInserionPoint(CurrentInsertionPoint, markerPen, drawingContext);
if (insertionPointNextToMouse > -1 && insertionPointNextToMouse != CurrentInsertionPoint)
DrawLineForInserionPoint(insertionPointNextToMouse, tempMarkerPen, drawingContext);
SetGroupBoxPosition(); // HACK
}
void DrawLineForInserionPoint(int index, Pen pen, DrawingContext drawingContext)
{
var currentInsertionPoint = insertionPoints[index];
var pos = editor.TextView.GetVisualPosition(new TextViewPosition(currentInsertionPoint.Location), VisualYPosition.LineMiddle); var pos = editor.TextView.GetVisualPosition(new TextViewPosition(currentInsertionPoint.Location), VisualYPosition.LineMiddle);
var endPos = new Point(pos.X + editor.TextView.ActualWidth * 0.6, pos.Y); var endPos = new Point(pos.X + editor.TextView.ActualWidth * 0.6, pos.Y);
drawingContext.DrawLine(markerPen, pos - editor.TextView.ScrollOffset, endPos - editor.TextView.ScrollOffset); drawingContext.DrawLine(pen, pos - editor.TextView.ScrollOffset, endPos - editor.TextView.ScrollOffset);
SetGroupBoxPosition(); // HACK }
protected override HitTestResult HitTestCore(PointHitTestParameters hitTestParameters)
{
return new PointHitTestResult(this, hitTestParameters.HitPoint);
}
protected override void OnMouseMove(MouseEventArgs e)
{
insertionPointNextToMouse = FindNextInsertionPoint(e.GetPosition(this));
e.Handled = true;
InvalidateVisual();
base.OnMouseMove(e);
}
protected override void OnMouseDown(MouseButtonEventArgs e)
{
if (e.LeftButton == MouseButtonState.Pressed) {
if (e.ClickCount > 1) {
FireExited(true);
} else {
CurrentInsertionPoint = insertionPointNextToMouse;
InvalidateVisual();
}
e.Handled = true;
}
base.OnMouseDown(e);
}
int FindNextInsertionPoint(Point point)
{
var position = editor.TextView.GetPosition(point + editor.TextView.ScrollOffset);
if (position == null) return -1;
int insertionPoint = CurrentInsertionPoint;
int mouseLocationLine = position.Value.Location.Line;
int currentLocationLine = insertionPoints[insertionPoint].Location.Line;
for (int i = 0; i < insertionPoints.Length; i++) {
var line = insertionPoints[i].Location.Line;
var diff = Math.Abs(line - mouseLocationLine);
if (Math.Abs(currentLocationLine - mouseLocationLine) > diff && diff < 2) {
insertionPoint = i;
currentLocationLine = line;
}
}
return insertionPoint;
} }
void TextViewScrollOffsetChanged(object sender, EventArgs e) void TextViewScrollOffsetChanged(object sender, EventArgs e)
@ -426,14 +483,6 @@ namespace CSharpBinding.Refactoring
FireExited(false); FireExited(false);
} }
/// <summary>
/// call this somewhere useful, please... :)
/// </summary>
public void EndMode()
{
FireExited(false);
}
void FireExited(bool success) void FireExited(bool success)
{ {
if (Exited != null) { if (Exited != null) {

Loading…
Cancel
Save