// 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 ICSharpCode.AvalonEdit.Rendering { /// /// A inline UIElement in the document. /// public class InlineObjectElement : VisualLineElement { /// /// Gets the inline element that is displayed. /// public UIElement Element { get; private set; } /// /// Creates a new InlineObjectElement. /// /// The length of the element in the document. Must be non-negative. /// The element to display. public InlineObjectElement(int documentLength, UIElement element) : base(1, documentLength) { if (element == null) throw new ArgumentNullException("element"); this.Element = element; } /// public override TextRun CreateTextRun(int startVisualColumn, ITextRunConstructionContext context) { if (context == null) throw new ArgumentNullException("context"); return new InlineObjectRun(1, this.TextRunProperties, this.Element); } } /// /// A text run with an embedded UIElement. /// public class InlineObjectRun : TextEmbeddedObject { UIElement element; int length; TextRunProperties properties; internal Size desiredSize; /// /// Creates a new InlineObjectRun instance. /// /// The length of the TextRun. /// The to use. /// The to display. 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; } /// /// Gets the element displayed by the InlineObjectRun. /// public UIElement Element { get { return element; } } /// /// Gets the VisualLine that contains this object. This property is only available after the object /// was added to the text view. /// public VisualLine VisualLine { get; internal set; } /// public override LineBreakCondition BreakBefore { get { return LineBreakCondition.BreakDesired; } } /// public override LineBreakCondition BreakAfter { get { return LineBreakCondition.BreakDesired; } } /// public override bool HasFixedSize { get { return true; } } /// public override CharacterBufferReference CharacterBufferReference { get { return new CharacterBufferReference(); } } /// public override int Length { get { return length; } } /// public override TextRunProperties Properties { get { return properties; } } /// 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); } /// 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; } } /// public override void Draw(DrawingContext drawingContext, Point origin, bool rightToLeft, bool sideways) { } } }