| File: MS\Internal\Text\TextLineResult.cs | Web Access |
| Project: src\wpf\src\Microsoft.DotNet.Wpf\src\PresentationFramework\PresentationFramework.csproj (PresentationFramework) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. // // Description: Access to calculated information of a line of text created // by TextBlock. // using System.Collections.ObjectModel; using System.Windows; using System.Windows.Documents; using System.Windows.Media; using MS.Internal.Documents; namespace MS.Internal.Text { /// <summary> /// Provides access to calculated information of a line of text created /// by TextBlock. /// </summary> internal sealed class TextLineResult : LineResult { //------------------------------------------------------------------- // // LineResult Methods // //------------------------------------------------------------------- #region LineResult Methods /// <summary> /// Retrieves a position matching distance within the line. /// </summary> /// <param name="distance">Distance within the line.</param> /// <returns> /// A text position and its orientation matching or closest to the distance. /// </returns> internal override ITextPointer GetTextPositionFromDistance(double distance) { return _owner.GetTextPositionFromDistance(_dcp, distance, _layoutBox.Top, _index); } /// <summary> /// /// </summary> /// <param name="position"></param> /// <returns></returns> internal override bool IsAtCaretUnitBoundary(ITextPointer position) { Debug.Assert(false); return false; } /// <summary> /// /// </summary> /// <param name="position"></param> /// <param name="direction"></param> /// <returns></returns> internal override ITextPointer GetNextCaretUnitPosition(ITextPointer position, LogicalDirection direction) { Debug.Assert(false); return null; } /// <summary> /// /// </summary> /// <param name="position"></param> /// <returns></returns> internal override ITextPointer GetBackspaceCaretUnitPosition(ITextPointer position) { Debug.Assert(false); return null; } /// <summary> /// /// </summary> /// <param name="start"></param> /// <param name="end"></param> /// <returns></returns> internal override ReadOnlyCollection<GlyphRun> GetGlyphRuns(ITextPointer start, ITextPointer end) { Debug.Assert(false); return null; } /// <summary> /// Retrieves the position after last content character of the line, /// not including any line breaks. /// </summary> /// <returns> /// The position after last content character of the line, /// not including any line breaks. /// </returns> internal override ITextPointer GetContentEndPosition() { EnsureComplexData(); return _owner.TextContainer.CreatePointerAtOffset(_dcp + _cchContent, LogicalDirection.Backward); } /// <summary> /// Retrieves the position in the line pointing to the beginning of content /// hidden by ellipses. /// </summary> /// <returns> /// The position in the line pointing to the beginning of content /// hidden by ellipses. /// </returns> internal override ITextPointer GetEllipsesPosition() { EnsureComplexData(); if (_cchEllipses != 0) { return _owner.TextContainer.CreatePointerAtOffset(_dcp + _cch - _cchEllipses, LogicalDirection.Forward); } return null; } /// <summary> /// Retrieves the position after last content character of the line, /// not including any line breaks. /// </summary> /// <returns> /// The position after last content character of the line, /// not including any line breaks. /// </returns> internal override int GetContentEndPositionCP() { EnsureComplexData(); return _dcp + _cchContent; } /// <summary> /// Retrieves the position in the line pointing to the beginning of content /// hidden by ellipses. /// </summary> /// <returns> /// The position in the line pointing to the beginning of content /// hidden by ellipses. /// </returns> internal override int GetEllipsesPositionCP() { EnsureComplexData(); return _dcp + _cch - _cchEllipses; } #endregion LineResult Methods //------------------------------------------------------------------- // // LineResult Properties // //------------------------------------------------------------------- #region LineResult Properties /// <summary> /// ITextPointer representing the beginning of the Line's contents. /// </summary> internal override ITextPointer StartPosition { get { if (_startPosition == null) { _startPosition = _owner.TextContainer.CreatePointerAtOffset(_dcp, LogicalDirection.Forward); } return _startPosition; } } /// <summary> /// ITextPointer representing the end of the Line's contents. /// </summary> internal override ITextPointer EndPosition { get { if (_endPosition == null) { _endPosition = _owner.TextContainer.CreatePointerAtOffset(_dcp + _cch, LogicalDirection.Backward); } return _endPosition; } } /// <summary> /// Character position representing the beginning of the Line's contents. /// </summary> internal override int StartPositionCP { get { return _dcp; } } /// <summary> /// Character position representing the end of the Line's contents. /// </summary> internal override int EndPositionCP { get { return _dcp + _cch; } } /// <summary> /// The bounding rectangle of the line. /// </summary> internal override Rect LayoutBox { get { return _layoutBox; } } /// <summary> /// The dominant baseline of the line. /// Distance from the top of the line to the baseline. /// </summary> internal override double Baseline { get { return _baseline; } } #endregion LineResult Properties //------------------------------------------------------------------- // // Constructors // //------------------------------------------------------------------- #region Constructors /// <summary> /// Constructor. /// </summary> /// <param name="owner">Owner of the line.</param> /// <param name="dcp">Index of the first character in the line.</param> /// <param name="cch">Number of all characters in the line.</param> /// <param name="layoutBox">Rectangle of the line within a text paragraph.</param> /// <param name="baseline">Distance from the top of the line to the baseline.</param> /// <param name="index">Index of the line within the text block</param> internal TextLineResult(System.Windows.Controls.TextBlock owner, int dcp, int cch, Rect layoutBox, double baseline, int index) { _owner = owner; _dcp = dcp; _cch = cch; _layoutBox = layoutBox; _baseline = baseline; _index = index; _cchContent = _cchEllipses = -1; } #endregion Constructors //------------------------------------------------------------------- // // Private Methods // //------------------------------------------------------------------- #region Private Methods private void EnsureComplexData() { if (_cchContent == -1) { _owner.GetLineDetails(_dcp, _index, _layoutBox.Top, out _cchContent, out _cchEllipses); } } #endregion Private Methods //------------------------------------------------------------------- // // Private Fields // //------------------------------------------------------------------- #region Private Fields /// <summary> /// Owner of the line. /// </summary> private readonly System.Windows.Controls.TextBlock _owner; /// <summary> /// Index of the first character in the line. /// </summary> private readonly int _dcp; /// <summary> /// Number of all characters in the line. /// </summary> private readonly int _cch; /// <summary> /// Rectangle of the line within a text paragraph. /// </summary> private readonly Rect _layoutBox; /// <summary> /// Index of the line within the TextBlock /// </summary> private int _index; /// <summary> /// The dominant baseline of the line. Distance from the top of the /// line to the baseline. /// </summary> private readonly double _baseline; /// <summary> /// ITextPointer representing the beginning of the Line's contents. /// </summary> private ITextPointer _startPosition; /// <summary> /// ITextPointer representing the end of the Line's contents. /// </summary> private ITextPointer _endPosition; /// <summary> /// Number of characters of content of the line, not including any line breaks. /// </summary> private int _cchContent; /// <summary> /// Number of characters hidden by ellipses. /// </summary> private int _cchEllipses; #endregion Private Fields } }