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 @@ -32,7 +32,7 @@ namespace ICSharpCode.AvalonEdit.Editing
this.textView = textArea.TextView;
position = new TextViewPosition(1, 1, 0);
caretAdorner = new CaretLayer(textView);
caretAdorner = new CaretLayer(textArea);
textView.InsertLayer(caretAdorner, KnownLayer.Caret, LayerInsertionPosition.Replace);
textView.VisualLinesChanged += TextView_VisualLinesChanged;
textView.ScrollOffsetChanged += TextView_ScrollOffsetChanged;
@ -367,6 +367,26 @@ namespace ICSharpCode.AvalonEdit.Editing @@ -367,6 +367,26 @@ namespace ICSharpCode.AvalonEdit.Editing
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>
/// Returns the caret rectangle. The coordinate system is in device-independent pixels from the top of the document.
/// </summary>
@ -374,7 +394,8 @@ namespace ICSharpCode.AvalonEdit.Editing @@ -374,7 +394,8 @@ namespace ICSharpCode.AvalonEdit.Editing
{
if (textView != null && textView.Document != null) {
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 {
return Rect.Empty;
}
@ -429,7 +450,12 @@ namespace ICSharpCode.AvalonEdit.Editing @@ -429,7 +450,12 @@ namespace ICSharpCode.AvalonEdit.Editing
if (caretAdorner != null && textView != null) {
VisualLine visualLine = textView.GetVisualLine(position.Line);
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
// features like 'Follow text editing' in the Windows Magnifier.
if (!hasWin32Caret) {

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

@ -15,14 +15,17 @@ namespace ICSharpCode.AvalonEdit.Editing @@ -15,14 +15,17 @@ namespace ICSharpCode.AvalonEdit.Editing
{
sealed class CaretLayer : Layer
{
TextArea textArea;
bool isVisible;
Rect caretRectangle;
DispatcherTimer caretBlinkTimer = new DispatcherTimer();
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;
caretBlinkTimer.Tick += new EventHandler(caretBlinkTimer_Tick);
}
@ -75,6 +78,16 @@ namespace ICSharpCode.AvalonEdit.Editing @@ -75,6 +78,16 @@ namespace ICSharpCode.AvalonEdit.Editing
Brush caretBrush = this.CaretBrush;
if (caretBrush == null)
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,
caretRectangle.Y - textView.VerticalOffset,
caretRectangle.Width,

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

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

Loading…
Cancel
Save