From 080f1697e97e13461ec6df4d31c8924d01257a1b Mon Sep 17 00:00:00 2001 From: Roy Ben Shabat Date: Tue, 9 Apr 2019 01:47:48 +0300 Subject: MERGE --- .../Rendering/VisualLineText.cs | 122 +++++++++++++++++++++ 1 file changed, 122 insertions(+) create mode 100644 Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Rendering/VisualLineText.cs (limited to 'Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Rendering/VisualLineText.cs') diff --git a/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Rendering/VisualLineText.cs b/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Rendering/VisualLineText.cs new file mode 100644 index 000000000..85b0a9ac4 --- /dev/null +++ b/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Rendering/VisualLineText.cs @@ -0,0 +1,122 @@ +// 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.Windows.Documents; +using System.Windows.Media.TextFormatting; + +using Tango.Scripting.Editors.Document; +using Tango.Scripting.Editors.Utils; + +namespace Tango.Scripting.Editors.Rendering +{ + /// + /// VisualLineElement that represents a piece of text. + /// + public class VisualLineText : VisualLineElement + { + VisualLine parentVisualLine; + + /// + /// Gets the parent visual line. + /// + public VisualLine ParentVisualLine { + get { return parentVisualLine; } + } + + /// + /// Creates a visual line text element with the specified length. + /// It uses the and its + /// to find the actual text string. + /// + public VisualLineText(VisualLine parentVisualLine, int length) : base(length, length) + { + if (parentVisualLine == null) + throw new ArgumentNullException("parentVisualLine"); + this.parentVisualLine = parentVisualLine; + } + + /// + /// Override this method to control the type of new VisualLineText instances when + /// the visual line is split due to syntax highlighting. + /// + protected virtual VisualLineText CreateInstance(int length) + { + return new VisualLineText(parentVisualLine, length); + } + + /// + public override TextRun CreateTextRun(int startVisualColumn, ITextRunConstructionContext context) + { + if (context == null) + throw new ArgumentNullException("context"); + + int relativeOffset = startVisualColumn - VisualColumn; + StringSegment text = context.GetText(context.VisualLine.FirstDocumentLine.Offset + RelativeTextOffset + relativeOffset, DocumentLength - relativeOffset); + return new TextCharacters(text.Text, text.Offset, text.Count, this.TextRunProperties); + } + + /// + public override bool IsWhitespace(int visualColumn) + { + int offset = visualColumn - this.VisualColumn + parentVisualLine.FirstDocumentLine.Offset + this.RelativeTextOffset; + return char.IsWhiteSpace(parentVisualLine.Document.GetCharAt(offset)); + } + + /// + public override TextSpan GetPrecedingText(int visualColumnLimit, ITextRunConstructionContext context) + { + if (context == null) + throw new ArgumentNullException("context"); + + int relativeOffset = visualColumnLimit - VisualColumn; + StringSegment text = context.GetText(context.VisualLine.FirstDocumentLine.Offset + RelativeTextOffset, relativeOffset); + CharacterBufferRange range = new CharacterBufferRange(text.Text, text.Offset, text.Count); + return new TextSpan(range.Length, new CultureSpecificCharacterBufferRange(this.TextRunProperties.CultureInfo, range)); + } + + /// + public override bool CanSplit { + get { return true; } + } + + /// + public override void Split(int splitVisualColumn, IList elements, int elementIndex) + { + if (splitVisualColumn <= VisualColumn || splitVisualColumn >= VisualColumn + VisualLength) + throw new ArgumentOutOfRangeException("splitVisualColumn", splitVisualColumn, "Value must be between " + (VisualColumn + 1) + " and " + (VisualColumn + VisualLength - 1)); + if (elements == null) + throw new ArgumentNullException("elements"); + if (elements[elementIndex] != this) + throw new ArgumentException("Invalid elementIndex - couldn't find this element at the index"); + int relativeSplitPos = splitVisualColumn - VisualColumn; + VisualLineText splitPart = CreateInstance(DocumentLength - relativeSplitPos); + SplitHelper(this, splitPart, splitVisualColumn, relativeSplitPos + RelativeTextOffset); + elements.Insert(elementIndex + 1, splitPart); + } + + /// + public override int GetRelativeOffset(int visualColumn) + { + return this.RelativeTextOffset + visualColumn - this.VisualColumn; + } + + /// + public override int GetVisualColumn(int relativeTextOffset) + { + return this.VisualColumn + relativeTextOffset - this.RelativeTextOffset; + } + + /// + public override int GetNextCaretPosition(int visualColumn, LogicalDirection direction, CaretPositioningMode mode) + { + int textOffset = parentVisualLine.StartOffset + this.RelativeTextOffset; + int pos = TextUtilities.GetNextCaretPosition(parentVisualLine.Document, textOffset + visualColumn - this.VisualColumn, direction, mode); + if (pos < textOffset || pos > textOffset + this.DocumentLength) + return -1; + else + return this.VisualColumn + pos - textOffset; + } + } +} -- cgit v1.3.1