File: src\Framework\System\Windows\Documents\ITextPointer.cs
Project: wpf\PresentationFramework.csproj (PresentationFramework)
//---------------------------------------------------------------------------
//
// File: ITextPointer.cs
//
// Copyright (C) Microsoft Corporation.  All rights reserved.
//
// Description: Abstract version of TextPointer.
//
//---------------------------------------------------------------------------
 
namespace System.Windows.Documents
{
    using System;
 
    // Abstract version of TextPointer.  It has full read-only support for
    // rich content, but only supports plain text editing.
    internal interface ITextPointer
    {
        //------------------------------------------------------
        //
        //  Internal Methods
        //
        //------------------------------------------------------
 
        #region Internal Methods
 
        // Constructor.
        ITextPointer CreatePointer();
 
        // Constructor.
        StaticTextPointer CreateStaticPointer();
 
        // Constructor.
        ITextPointer CreatePointer(int offset);
 
        // Constructor.
        ITextPointer CreatePointer(LogicalDirection gravity);
 
        // Constructor.
        ITextPointer CreatePointer(int offset, LogicalDirection gravity);
 
        // Property accessor.
        void SetLogicalDirection(LogicalDirection direction);
 
        // Returns
        //  -1 if this ITextPointer is positioned before position.
        //   0 if this ITextPointer is positioned at position.
        //  +1 if this ITextPointer is positioned after position.
        int CompareTo(ITextPointer position);
        int CompareTo(StaticTextPointer position);
 
        // Returns true if this ITextPointer has the same logical parent has position.
        bool HasEqualScope(ITextPointer position);
 
        // <see cref="TextPointer.GetPointerContext"/>
        TextPointerContext GetPointerContext(LogicalDirection direction);
 
        // <see cref="TextPointer.GetOffsetToPosition"/>
        int GetOffsetToPosition(ITextPointer position);
 
        // <see cref="TextPointer.GetTextRunLength"/>
        int GetTextRunLength(LogicalDirection direction);
 
        // <see cref="TextPointer.GetTextInRun"/>
        string GetTextInRun(LogicalDirection direction);
 
        // <see cref="TextPointer.GetTextInRun"/>
        int GetTextInRun(LogicalDirection direction, char[] textBuffer, int startIndex, int count);
 
        // <see cref="TextPointer.GetAdjacentElement"/>
        // TODO:benwest:11/17/2004: this should return DependencyObject (which is
        // either ContentElement or UIElement) for consistency with TextPointer.GetAdjacentElement.
        // Blocking issue: DocumentSequenceTextPointer returns an object to break
        // pages.
        object GetAdjacentElement(LogicalDirection direction);
 
        // <see cref="TextPointer.MoveToPosition"/>
        void MoveToPosition(ITextPointer position);
 
        // <see cref="TextPointer.MoveByOffset"/>
        int MoveByOffset(int offset);
 
        // <see cref="TextPointer.MoveToNextContextPosition"/>
        bool MoveToNextContextPosition(LogicalDirection direction);
 
        // <see cref="TextPointer.GetNextContextPosition"/>
        ITextPointer GetNextContextPosition(LogicalDirection direction);
 
        // <see cref="TextPointer.MoveToInsertionPosition"/>
        bool MoveToInsertionPosition(LogicalDirection direction);
 
        // <see cref="TextPointer.GetInsertionPosition"/>
        ITextPointer GetInsertionPosition(LogicalDirection direction);
 
        // <see cref="TextPointer.GetFormatNormalizedPosition"/>
        ITextPointer GetFormatNormalizedPosition(LogicalDirection direction);
 
        // <see cref="TextPointer.MoveToNextInsertionPosition"/>
        bool MoveToNextInsertionPosition(LogicalDirection direction);
 
        // <see cref="TextPointer.GetNextInsertionPosition"/>
        ITextPointer GetNextInsertionPosition(LogicalDirection direction);
 
        // Moves this ITextPointer to the specified edge of the parent text element.
        void MoveToElementEdge(ElementEdge edge);
 
        // <see cref="TextPointer.MoveToLineStart"/>
        int MoveToLineBoundary(int count);
 
        // <see cref="TextPointer.GetCharacterRect"/>
        Rect GetCharacterRect(LogicalDirection direction);
 
        // <see cref="TextPointer.Freeze"/>
        void Freeze();
 
        // <see cref="TextPointer.GetFrozenPointer"/>
        ITextPointer GetFrozenPointer(LogicalDirection logicalDirection);
 
        // <see cref="TextPointer.InsertText"/>
        void InsertTextInRun(string textData);
 
        // <see cref="TextPointer.DeleteContentToPosition"/>
        void DeleteContentToPosition(ITextPointer limit);
 
        // <see cref="TextPointer.GetTextElement"/>
        // TODO: rename this method to match eventual TextPointer equivalent.
        Type GetElementType(LogicalDirection direction);
 
        // Returns a DP value on this ITextPointer's logical parent.
        object GetValue(DependencyProperty formattingProperty);
 
        // Returns a local DP value on this ITextPointer's logical parent.
        object ReadLocalValue(DependencyProperty formattingProperty);
 
        // Returns all local values on this ITextPointer's logical parent.
        LocalValueEnumerator GetLocalValueEnumerator();
 
        /// <summary>
        /// Ensures layout information is available at this position.
        /// </summary>
        /// <returns>
        /// True if the position is validated, false otherwise.
        /// </returns>
        /// <remarks>
        /// Use this method before calling GetCharacterRect, MoveToLineBoundary,
        /// IsAtLineStartPosition.
        ///
        /// This method can be very expensive.  To detect an invalid layout
        /// without actually doing any work, use the HasValidLayout property.
        /// </remarks>
        bool ValidateLayout();
 
        #endregion Internal Methods
 
        //------------------------------------------------------
        //
        //  Internal Properties
        //
        //------------------------------------------------------
 
        #region Internal Properties
 
        // Associated TextContainer.
        ITextContainer TextContainer { get; }
 
        // <see cref="TextPointer.HasValidLayout"/>
        bool HasValidLayout { get; }
 
        // Returns true if this pointer is at a caret unit boundary.
        // Logically equivalent to this.TextContainer.TextView.IsAtCaretUnitBoundary(this),
        // but some implementations may have better performance.
        //
        // This method must not be called unless HasValidLayout == true.
        bool IsAtCaretUnitBoundary { get; }
 
        // <see cref="TextPointer.LogicalDirection"/>
        LogicalDirection LogicalDirection { get; }
 
        // <see cref="TextPointer.Parent"/>
        Type ParentType { get; }
 
        // <see cref="TextPointer.ParentContentStart"/>
        //ITextPointer ParentContentStart { get; }
 
        // <see cref="TextPointer.ParentContentEnd"/>
        //ITextPointer ParentContentEnd { get; }
 
        // <see cref="TextPointer.ContainerContentStart"/>
        //ITextPointer ContainerContentStart { get; }
 
        // <see cref="TextPointer.ContainerContentEnd"/>
        //ITextPointer ContainerContentEnd { get; }
 
        // <see cref="TextPointer.IsAtInsertionPosition"/>
        bool IsAtInsertionPosition { get; }
 
        // <see cref="TextPointer.IsFrozen"/>
        bool IsFrozen { get; }
 
        // Offset from the TextContainer.Start position.
        // Equivalent to this.TextContainer.Start.GetOffsetToPosition(this),
        // but doesn't necessarily allocate anything.
        int Offset { get; }
 
        // Offset in unicode chars within the document.
        // TODO:benwest: this should probably be refactored out of ITextPointer
        // since only TextStore supports it.
        int CharOffset { get; }
 
        #endregion Internal Properties
    }
}