diff options
| author | Victoria Plitt <Victoria.Plitt@twine-s.com> | 2019-04-08 13:49:55 +0300 |
|---|---|---|
| committer | Victoria Plitt <Victoria.Plitt@twine-s.com> | 2019-04-08 13:49:55 +0300 |
| commit | fc8a05358a92cc3c77c5f1e30d536807ef0614fd (patch) | |
| tree | c65f696ebd60f3790145721307c255e5a339923f /Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Rendering/VisualLineText.cs | |
| parent | b4a71931ea52636c6b36376aa9d71697ccf73524 (diff) | |
| download | Tango-fc8a05358a92cc3c77c5f1e30d536807ef0614fd.tar.gz Tango-fc8a05358a92cc3c77c5f1e30d536807ef0614fd.zip | |
were added scripting projects
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; + } + } +} |
