Browse Source

AvalonEdit perf optimization: when the selection changes, don't redraw the whole selection but only the text added/removed from the selection.

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@6167 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
pull/1/head
Daniel Grunwald 16 years ago
parent
commit
31d7fcb8f1
  1. 25
      src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/TextArea.cs

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

@ -385,8 +385,29 @@ namespace ICSharpCode.AvalonEdit.Editing @@ -385,8 +385,29 @@ namespace ICSharpCode.AvalonEdit.Editing
if (!object.Equals(selection, value)) {
Debug.WriteLine("Selection change from " + selection + " to " + value);
if (textView != null) {
textView.Redraw(selection.SurroundingSegment, DispatcherPriority.Background);
textView.Redraw(value.SurroundingSegment, DispatcherPriority.Background);
ISegment oldSegment = selection.SurroundingSegment;
ISegment newSegment = value.SurroundingSegment;
if (selection is SimpleSelection && value is SimpleSelection && oldSegment != null && newSegment != null) {
// perf optimization:
// When a simple selection changes, don't redraw the whole selection, but only the changed parts.
int oldSegmentOffset = oldSegment.Offset;
int newSegmentOffset = newSegment.Offset;
if (oldSegmentOffset != newSegmentOffset) {
textView.Redraw(Math.Min(oldSegmentOffset, newSegmentOffset),
Math.Abs(oldSegmentOffset - newSegmentOffset),
DispatcherPriority.Background);
}
int oldSegmentEndOffset = oldSegment.EndOffset;
int newSegmentEndOffset = newSegment.EndOffset;
if (oldSegmentEndOffset != newSegmentEndOffset) {
textView.Redraw(Math.Min(oldSegmentEndOffset, newSegmentEndOffset),
Math.Abs(oldSegmentEndOffset - newSegmentEndOffset),
DispatcherPriority.Background);
}
} else {
textView.Redraw(oldSegment, DispatcherPriority.Background);
textView.Redraw(newSegment, DispatcherPriority.Background);
}
}
selection = value;
if (SelectionChanged != null)

Loading…
Cancel
Save