Browse Source

Overstrike mode visual effects

pull/289/head
Patryk Mikos 12 years ago
parent
commit
02e0b97157
  1. 32
      src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/Caret.cs
  2. 15
      src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/CaretLayer.cs
  3. 6
      src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/TextArea.cs

32
src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/Caret.cs

@ -32,7 +32,7 @@ namespace ICSharpCode.AvalonEdit.Editing
this.textView = textArea.TextView; this.textView = textArea.TextView;
position = new TextViewPosition(1, 1, 0); position = new TextViewPosition(1, 1, 0);
caretAdorner = new CaretLayer(textView); caretAdorner = new CaretLayer(textArea);
textView.InsertLayer(caretAdorner, KnownLayer.Caret, LayerInsertionPosition.Replace); textView.InsertLayer(caretAdorner, KnownLayer.Caret, LayerInsertionPosition.Replace);
textView.VisualLinesChanged += TextView_VisualLinesChanged; textView.VisualLinesChanged += TextView_VisualLinesChanged;
textView.ScrollOffsetChanged += TextView_ScrollOffsetChanged; textView.ScrollOffsetChanged += TextView_ScrollOffsetChanged;
@ -367,6 +367,26 @@ namespace ICSharpCode.AvalonEdit.Editing
lineBottom - lineTop); lineBottom - lineTop);
} }
Rect CalcCaretOverstrikeRectangle(VisualLine visualLine)
{
if (!visualColumnValid) {
RevalidateVisualColumn(visualLine);
}
TextLine textLine = visualLine.GetTextLine(position.VisualColumn, position.IsAtEndOfLine);
double xPos = visualLine.GetTextLineVisualXPosition(textLine, position.VisualColumn);
double lineTop = visualLine.GetTextLineVisualYPosition(textLine, VisualYPosition.TextTop);
double lineBottom = visualLine.GetTextLineVisualYPosition(textLine, VisualYPosition.TextBottom);
double charSize =
visualLine.GetTextLineVisualXPosition(textLine, VisualColumn + 1) -
visualLine.GetTextLineVisualXPosition(textLine, VisualColumn);
return new Rect(xPos,
lineTop,
charSize,
lineBottom - lineTop);
}
/// <summary> /// <summary>
/// Returns the caret rectangle. The coordinate system is in device-independent pixels from the top of the document. /// Returns the caret rectangle. The coordinate system is in device-independent pixels from the top of the document.
/// </summary> /// </summary>
@ -374,7 +394,8 @@ namespace ICSharpCode.AvalonEdit.Editing
{ {
if (textView != null && textView.Document != null) { if (textView != null && textView.Document != null) {
VisualLine visualLine = textView.GetOrConstructVisualLine(textView.Document.GetLineByNumber(position.Line)); VisualLine visualLine = textView.GetOrConstructVisualLine(textView.Document.GetLineByNumber(position.Line));
return CalcCaretRectangle(visualLine); return (this.textView.Options.UseOverstrikeMode && this.textArea.OverstrikeMode)
? CalcCaretOverstrikeRectangle(visualLine) : CalcCaretRectangle(visualLine);
} else { } else {
return Rect.Empty; return Rect.Empty;
} }
@ -429,7 +450,12 @@ namespace ICSharpCode.AvalonEdit.Editing
if (caretAdorner != null && textView != null) { if (caretAdorner != null && textView != null) {
VisualLine visualLine = textView.GetVisualLine(position.Line); VisualLine visualLine = textView.GetVisualLine(position.Line);
if (visualLine != null) { if (visualLine != null) {
Rect caretRect = CalcCaretRectangle(visualLine); Rect caretRect;
if (this.textView.Options.UseOverstrikeMode && this.textArea.OverstrikeMode) {
caretRect = CalcCaretOverstrikeRectangle(visualLine);
} else {
caretRect = CalcCaretRectangle(visualLine);
}
// Create Win32 caret so that Windows knows where our managed caret is. This is necessary for // Create Win32 caret so that Windows knows where our managed caret is. This is necessary for
// features like 'Follow text editing' in the Windows Magnifier. // features like 'Follow text editing' in the Windows Magnifier.
if (!hasWin32Caret) { if (!hasWin32Caret) {

15
src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/CaretLayer.cs

@ -15,14 +15,17 @@ namespace ICSharpCode.AvalonEdit.Editing
{ {
sealed class CaretLayer : Layer sealed class CaretLayer : Layer
{ {
TextArea textArea;
bool isVisible; bool isVisible;
Rect caretRectangle; Rect caretRectangle;
DispatcherTimer caretBlinkTimer = new DispatcherTimer(); DispatcherTimer caretBlinkTimer = new DispatcherTimer();
bool blink; bool blink;
public CaretLayer(TextView textView) : base(textView, KnownLayer.Caret) public CaretLayer(TextArea textArea) : base(textArea.TextView, KnownLayer.Caret)
{ {
this.textArea = textArea;
this.IsHitTestVisible = false; this.IsHitTestVisible = false;
caretBlinkTimer.Tick += new EventHandler(caretBlinkTimer_Tick); caretBlinkTimer.Tick += new EventHandler(caretBlinkTimer_Tick);
} }
@ -75,6 +78,16 @@ namespace ICSharpCode.AvalonEdit.Editing
Brush caretBrush = this.CaretBrush; Brush caretBrush = this.CaretBrush;
if (caretBrush == null) if (caretBrush == null)
caretBrush = (Brush)textView.GetValue(TextBlock.ForegroundProperty); caretBrush = (Brush)textView.GetValue(TextBlock.ForegroundProperty);
if (this.textArea.Options.UseOverstrikeMode && this.textArea.OverstrikeMode) {
SolidColorBrush scBrush = caretBrush as SolidColorBrush;
if (scBrush != null) {
Color brushColor = scBrush.Color;
Color newColor = Color.FromArgb(100, brushColor.R, brushColor.G, brushColor.B);
caretBrush = new SolidColorBrush(newColor);
}
}
Rect r = new Rect(caretRectangle.X - textView.HorizontalOffset, Rect r = new Rect(caretRectangle.X - textView.HorizontalOffset,
caretRectangle.Y - textView.VerticalOffset, caretRectangle.Y - textView.VerticalOffset,
caretRectangle.Width, caretRectangle.Width,

6
src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/TextArea.cs

@ -960,6 +960,7 @@ namespace ICSharpCode.AvalonEdit.Editing
this.overstrikeMode = false; this.overstrikeMode = false;
} else if (!e.Handled && e.Key == Key.Insert) { } else if (!e.Handled && e.Key == Key.Insert) {
this.overstrikeMode = !this.overstrikeMode; this.overstrikeMode = !this.overstrikeMode;
this.caret.Show();
e.Handled = true; e.Handled = true;
return; return;
} }
@ -1033,6 +1034,11 @@ namespace ICSharpCode.AvalonEdit.Editing
bool overstrikeMode = false; bool overstrikeMode = false;
public bool OverstrikeMode
{
get { return this.overstrikeMode; }
}
#endregion #endregion
/// <inheritdoc/> /// <inheritdoc/>

Loading…
Cancel
Save