diff options
| author | Roy Ben Shabat <Roy.mail.net@gmail.com> | 2019-04-09 01:47:48 +0300 |
|---|---|---|
| committer | Roy Ben Shabat <Roy.mail.net@gmail.com> | 2019-04-09 01:47:48 +0300 |
| commit | 080f1697e97e13461ec6df4d31c8924d01257a1b (patch) | |
| tree | b1fe0285de7bc9bc52e9e2195e66fe022bf8f5b3 /Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Rendering/VisualLineText.cs | |
| parent | 1608e69a417bc5e40a607c3958c4a60f19f66f1a (diff) | |
| download | Tango-080f1697e97e13461ec6df4d31c8924d01257a1b.tar.gz Tango-080f1697e97e13461ec6df4d31c8924d01257a1b.zip | |
MERGE
Diffstat (limited to 'Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Rendering/VisualLineText.cs')
| -rw-r--r-- | Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Rendering/VisualLineText.cs | 122 |
1 files changed, 122 insertions, 0 deletions
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 +{ + /// <summary> + /// VisualLineElement that represents a piece of text. + /// </summary> + public class VisualLineText : VisualLineElement + { + VisualLine parentVisualLine; + + /// <summary> + /// Gets the parent visual line. + /// </summary> + public VisualLine ParentVisualLine { + get { return parentVisualLine; } + } + + /// <summary> + /// Creates a visual line text element with the specified length. + /// It uses the <see cref="ITextRunConstructionContext.VisualLine"/> and its + /// <see cref="VisualLineElement.RelativeTextOffset"/> to find the actual text string. + /// </summary> + public VisualLineText(VisualLine parentVisualLine, int length) : base(length, length) + { + if (parentVisualLine == null) + throw new ArgumentNullException("parentVisualLine"); + this.parentVisualLine = parentVisualLine; + } + + /// <summary> + /// Override this method to control the type of new VisualLineText instances when + /// the visual line is split due to syntax highlighting. + /// </summary> + protected virtual VisualLineText CreateInstance(int length) + { + return new VisualLineText(parentVisualLine, length); + } + + /// <inheritdoc/> + 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); + } + + /// <inheritdoc/> + public override bool IsWhitespace(int visualColumn) + { + int offset = visualColumn - this.VisualColumn + parentVisualLine.FirstDocumentLine.Offset + this.RelativeTextOffset; + return char.IsWhiteSpace(parentVisualLine.Document.GetCharAt(offset)); + } + + /// <inheritdoc/> + public override TextSpan<CultureSpecificCharacterBufferRange> 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<CultureSpecificCharacterBufferRange>(range.Length, new CultureSpecificCharacterBufferRange(this.TextRunProperties.CultureInfo, range)); + } + + /// <inheritdoc/> + public override bool CanSplit { + get { return true; } + } + + /// <inheritdoc/> + public override void Split(int splitVisualColumn, IList<VisualLineElement> 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); + } + + /// <inheritdoc/> + public override int GetRelativeOffset(int visualColumn) + { + return this.RelativeTextOffset + visualColumn - this.VisualColumn; + } + + /// <inheritdoc/> + public override int GetVisualColumn(int relativeTextOffset) + { + return this.VisualColumn + relativeTextOffset - this.RelativeTextOffset; + } + + /// <inheritdoc/> + 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; + } + } +} |
