From 080f1697e97e13461ec6df4d31c8924d01257a1b Mon Sep 17 00:00:00 2001 From: Roy Ben Shabat Date: Tue, 9 Apr 2019 01:47:48 +0300 Subject: MERGE --- .../Editing/SimpleSelection.cs | 144 +++++++++++++++++++++ 1 file changed, 144 insertions(+) create mode 100644 Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Editing/SimpleSelection.cs (limited to 'Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Editing/SimpleSelection.cs') diff --git a/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Editing/SimpleSelection.cs b/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Editing/SimpleSelection.cs new file mode 100644 index 000000000..132b09e20 --- /dev/null +++ b/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Editing/SimpleSelection.cs @@ -0,0 +1,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 Tango.Scripting.Editors.Document; +using Tango.Scripting.Editors.Utils; + +namespace Tango.Scripting.Editors.Editing +{ + /// + /// A simple selection. + /// + sealed class SimpleSelection : Selection + { + readonly TextViewPosition start, end; + readonly int startOffset, endOffset; + + /// + /// Creates a new SimpleSelection instance. + /// + 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); + } + + /// + public override IEnumerable Segments { + get { + return ExtensionMethods.Sequence(new SelectionSegment(startOffset, start.VisualColumn, endOffset, end.VisualColumn)); + } + } + + /// + public override ISegment SurroundingSegment { + get { + return new SelectionSegment(startOffset, endOffset); + } + } + + /// + 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; } + } + + /// + 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) + ); + } + + /// + public override bool IsEmpty { + get { return startOffset == endOffset; } + } + + /// + public override int Length { + get { + return Math.Abs(endOffset - startOffset); + } + } + + /// + 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); + } + + /// + public override int GetHashCode() + { + unchecked { + return startOffset * 27811 + endOffset + textArea.GetHashCode(); + } + } + + /// + 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; + } + + /// + public override string ToString() + { + return "[SimpleSelection Start=" + start + " End=" + end + "]"; + } + } +} -- cgit v1.3.1