1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
|
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.Collections.Generic;
using System.Linq;
using ICSharpCode.AvalonEdit.Document;
using ICSharpCode.AvalonEdit.Utils;
namespace ICSharpCode.AvalonEdit.Editing
{
/// <summary>
/// A simple selection.
/// </summary>
sealed class SimpleSelection : Selection
{
readonly TextViewPosition start, end;
readonly int startOffset, endOffset;
/// <summary>
/// Creates a new SimpleSelection instance.
/// </summary>
internal SimpleSelection(TextArea textArea, TextViewPosition start, TextViewPosition end)
: base(textArea)
{
this.start = start;
this.end = end;
this.startOffset = textArea.Document.GetOffset(start.Location);
this.endOffset = textArea.Document.GetOffset(end.Location);
}
/// <inheritdoc/>
public override IEnumerable<SelectionSegment> Segments {
get {
return ExtensionMethods.Sequence<SelectionSegment>(new SelectionSegment(startOffset, start.VisualColumn, endOffset, end.VisualColumn));
}
}
/// <inheritdoc/>
public override ISegment SurroundingSegment {
get {
return new SelectionSegment(startOffset, endOffset);
}
}
/// <inheritdoc/>
public override void ReplaceSelectionWithText(string newText)
{
if (newText == null)
throw new ArgumentNullException("newText");
using (textArea.Document.RunUpdate()) {
ISegment[] segmentsToDelete = textArea.GetDeletableSegments(this.SurroundingSegment);
for (int i = segmentsToDelete.Length - 1; i >= 0; i--) {
if (i == segmentsToDelete.Length - 1) {
if (segmentsToDelete[i].Offset == SurroundingSegment.Offset && segmentsToDelete[i].Length == SurroundingSegment.Length) {
newText = AddSpacesIfRequired(newText, start, end);
}
int vc = textArea.Caret.VisualColumn;
textArea.Caret.Offset = segmentsToDelete[i].EndOffset;
if (string.IsNullOrEmpty(newText))
textArea.Caret.VisualColumn = vc;
textArea.Document.Replace(segmentsToDelete[i], newText);
} else {
textArea.Document.Remove(segmentsToDelete[i]);
}
}
if (segmentsToDelete.Length != 0) {
textArea.ClearSelection();
}
}
}
public override TextViewPosition StartPosition {
get { return start; }
}
public override TextViewPosition EndPosition {
get { return end; }
}
/// <inheritdoc/>
public override Selection UpdateOnDocumentChange(DocumentChangeEventArgs e)
{
if (e == null)
throw new ArgumentNullException("e");
return Selection.Create(
textArea,
new TextViewPosition(textArea.Document.GetLocation(e.GetNewOffset(startOffset, AnchorMovementType.Default)), start.VisualColumn),
new TextViewPosition(textArea.Document.GetLocation(e.GetNewOffset(endOffset, AnchorMovementType.Default)), end.VisualColumn)
);
}
/// <inheritdoc/>
public override bool IsEmpty {
get { return startOffset == endOffset; }
}
/// <inheritdoc/>
public override int Length {
get {
return Math.Abs(endOffset - startOffset);
}
}
/// <inheritdoc/>
public override Selection SetEndpoint(TextViewPosition endPosition)
{
return Create(textArea, start, endPosition);
}
public override Selection StartSelectionOrSetEndpoint(TextViewPosition startPosition, TextViewPosition endPosition)
{
var document = textArea.Document;
if (document == null)
throw ThrowUtil.NoDocumentAssigned();
return Create(textArea, start, endPosition);
}
/// <inheritdoc/>
public override int GetHashCode()
{
unchecked {
return startOffset * 27811 + endOffset + textArea.GetHashCode();
}
}
/// <inheritdoc/>
public override bool Equals(object obj)
{
SimpleSelection other = obj as SimpleSelection;
if (other == null) return false;
return this.start.Equals(other.start) && this.end.Equals(other.end)
&& this.startOffset == other.startOffset && this.endOffset == other.endOffset
&& this.textArea == other.textArea;
}
/// <inheritdoc/>
public override string ToString()
{
return "[SimpleSelection Start=" + start + " End=" + end + "]";
}
}
}
|