// Copyright (c) 2014 AlphaSierraPapa for the SharpDevelop Team // // Permission is hereby granted, free of charge, to any person obtaining a copy of this // software and associated documentation files (the "Software"), to deal in the Software // without restriction, including without limitation the rights to use, copy, modify, merge, // publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons // to whom the Software is furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all copies or // substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR // PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE // FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // DEALINGS IN THE SOFTWARE. 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) { } } }