1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
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 ICSharpCode.AvalonEdit.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)
{
}
}
}
|