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/InlineObjectRun.cs | |
| parent | 1608e69a417bc5e40a607c3958c4a60f19f66f1a (diff) | |
| download | Tango-080f1697e97e13461ec6df4d31c8924d01257a1b.tar.gz Tango-080f1697e97e13461ec6df4d31c8924d01257a1b.zip | |
MERGE
Diffstat (limited to 'Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Rendering/InlineObjectRun.cs')
| -rw-r--r-- | Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Rendering/InlineObjectRun.cs | 145 |
1 files changed, 145 insertions, 0 deletions
diff --git a/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Rendering/InlineObjectRun.cs b/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Rendering/InlineObjectRun.cs new file mode 100644 index 000000000..7448a8007 --- /dev/null +++ b/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/Rendering/InlineObjectRun.cs @@ -0,0 +1,145 @@ +// 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.Windows; +using System.Windows.Controls; +using System.Windows.Media; +using System.Windows.Media.TextFormatting; + +namespace Tango.Scripting.Editors.Rendering +{ + /// <summary> + /// A inline UIElement in the document. + /// </summary> + public class InlineObjectElement : VisualLineElement + { + /// <summary> + /// Gets the inline element that is displayed. + /// </summary> + public UIElement Element { get; private set; } + + /// <summary> + /// Creates a new InlineObjectElement. + /// </summary> + /// <param name="documentLength">The length of the element in the document. Must be non-negative.</param> + /// <param name="element">The element to display.</param> + public InlineObjectElement(int documentLength, UIElement element) + : base(1, documentLength) + { + if (element == null) + throw new ArgumentNullException("element"); + this.Element = element; + } + + /// <inheritdoc/> + public override TextRun CreateTextRun(int startVisualColumn, ITextRunConstructionContext context) + { + if (context == null) + throw new ArgumentNullException("context"); + + return new InlineObjectRun(1, this.TextRunProperties, this.Element); + } + } + + /// <summary> + /// A text run with an embedded UIElement. + /// </summary> + public class InlineObjectRun : TextEmbeddedObject + { + UIElement element; + int length; + TextRunProperties properties; + internal Size desiredSize; + + /// <summary> + /// Creates a new InlineObjectRun instance. + /// </summary> + /// <param name="length">The length of the TextRun.</param> + /// <param name="properties">The <see cref="TextRunProperties"/> to use.</param> + /// <param name="element">The <see cref="UIElement"/> to display.</param> + public InlineObjectRun(int length, TextRunProperties properties, UIElement element) + { + if (length <= 0) + throw new ArgumentOutOfRangeException("length", length, "Value must be positive"); + if (properties == null) + throw new ArgumentNullException("properties"); + if (element == null) + throw new ArgumentNullException("element"); + + this.length = length; + this.properties = properties; + this.element = element; + } + + /// <summary> + /// Gets the element displayed by the InlineObjectRun. + /// </summary> + public UIElement Element { + get { return element; } + } + + /// <summary> + /// Gets the VisualLine that contains this object. This property is only available after the object + /// was added to the text view. + /// </summary> + public VisualLine VisualLine { get; internal set; } + + /// <inheritdoc/> + public override LineBreakCondition BreakBefore { + get { return LineBreakCondition.BreakDesired; } + } + + /// <inheritdoc/> + public override LineBreakCondition BreakAfter { + get { return LineBreakCondition.BreakDesired; } + } + + /// <inheritdoc/> + public override bool HasFixedSize { + get { return true; } + } + + /// <inheritdoc/> + public override CharacterBufferReference CharacterBufferReference { + get { return new CharacterBufferReference(); } + } + + /// <inheritdoc/> + public override int Length { + get { return length; } + } + + /// <inheritdoc/> + public override TextRunProperties Properties { + get { return properties; } + } + + /// <inheritdoc/> + public override TextEmbeddedObjectMetrics Format(double remainingParagraphWidth) + { + double baseline = TextBlock.GetBaselineOffset(element); + if (double.IsNaN(baseline)) + baseline = desiredSize.Height; + return new TextEmbeddedObjectMetrics(desiredSize.Width, desiredSize.Height, baseline); + } + + /// <inheritdoc/> + public override Rect ComputeBoundingBox(bool rightToLeft, bool sideways) + { + if (this.element.IsArrangeValid) { + double baseline = TextBlock.GetBaselineOffset(element); + if (double.IsNaN(baseline)) + baseline = desiredSize.Height; + return new Rect(new Point(0, -baseline), desiredSize); + } else { + return Rect.Empty; + } + } + + /// <inheritdoc/> + public override void Draw(DrawingContext drawingContext, Point origin, bool rightToLeft, bool sideways) + { + } + } +} |
