File: src\Framework\System\Windows\Documents\FixedSOMElement.cs
Project: wpf\PresentationFramework.csproj (PresentationFramework)
/*++
 
    File: FixedSOMElement.cs
 
    Copyright (C) 2005 Microsoft Corporation. All rights reserved.
 
    Description:
       Abstract class that provides a common base class for all non-container semantic elements.
       These elements have a fixed node and start and end symbol indices associated with them.
 
    History:
       05/17/2005: agurcan - Created
 
--*/
 
namespace System.Windows.Documents
{
    using System.Collections.Generic;
    using System.Diagnostics;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Shapes;
    using System.Windows.Controls;
 
    internal abstract class FixedSOMElement : FixedSOMSemanticBox
    {
        //--------------------------------------------------------------------
        //
        // Constructors
        //
        //---------------------------------------------------------------------
 
        #region Constructors
        protected FixedSOMElement(FixedNode fixedNode, int startIndex, int endIndex, GeneralTransform transform)
        {
            _fixedNode = fixedNode;
            _startIndex = startIndex;
            _endIndex = endIndex;
            Transform trans = transform.AffineTransform;
            if (trans != null)
            {
                _mat = trans.Value;
            }
            else
            {
                _mat = Transform.Identity.Value;
            }
        }
        
        protected FixedSOMElement(FixedNode fixedNode, GeneralTransform transform)
        {
            _fixedNode = fixedNode;
 
            Transform trans = transform.AffineTransform;
            if (trans != null)
            {
                _mat = trans.Value;
            }
            else
            {
                _mat = Transform.Identity.Value;
            }
        }
        
        #endregion Constructors
 
 
        //--------------------------------------------------------------------
        //
        // Public Properties
        //
        //---------------------------------------------------------------------
 
        #region Static methods
 
        public static FixedSOMElement CreateFixedSOMElement(FixedPage page, UIElement uiElement, FixedNode fixedNode, int startIndex, int endIndex)
        {
            FixedSOMElement element = null;
            if (uiElement is Glyphs)
            {
                Glyphs glyphs = uiElement as Glyphs;
                if (glyphs.UnicodeString.Length > 0)
                {
                    GlyphRun glyphRun = glyphs.ToGlyphRun();
                    Rect alignmentBox = glyphRun.ComputeAlignmentBox();
                    alignmentBox.Offset(glyphs.OriginX, glyphs.OriginY);
                    GeneralTransform transform = glyphs.TransformToAncestor(page);
                    
                    if (startIndex < 0)
                    {
                        startIndex = 0;
                    }
                    if (endIndex < 0)
                    {
                        endIndex = glyphRun.Characters == null ? 0 : glyphRun.Characters.Count;
                    }
                    element = FixedSOMTextRun.Create(alignmentBox, transform, glyphs, fixedNode, startIndex, endIndex, false);
                }
            }
            else if (uiElement is Image)
            {
                element = FixedSOMImage.Create(page, uiElement as Image, fixedNode);
            }
            else if (uiElement is Path)
            {
                element = FixedSOMImage.Create(page, uiElement as Path, fixedNode);
            }
            return element;
        }
 
        #endregion Static methods
 
 
        //--------------------------------------------------------------------
        //
        // Public Properties
        //
        //---------------------------------------------------------------------
 
        #region Public Properties
 
        public FixedNode FixedNode
        {
            get
            {
                return _fixedNode;
            }
        }
 
        public int StartIndex
        {
            get
            {
                return _startIndex;
            }
        }
 
        public int EndIndex
        {
            get
            {
                return _endIndex;
            }
        }
 
        #endregion Public Properties
 
        //--------------------------------------------------------------------
        //
        // Internal Properties
        //
        //---------------------------------------------------------------------
 
        #region Internal Properties
 
        internal FlowNode FlowNode
        {
            get
            {
                return _flowNode;
            }
            set
            {
                _flowNode = value;
            }
        }
 
        internal int OffsetInFlowNode
        {
            get
            {
                return _offsetInFlowNode;
            }
            set
            {
                _offsetInFlowNode = value;
            }
        }
 
        internal Matrix Matrix
        {
            get
            {
                return _mat;
            }
        }
 
        #endregion Internal Properties
 
 
        //--------------------------------------------------------------------
        //
        // Protected Fields
        //
        //---------------------------------------------------------------------
 
        #region Protected Fields
        protected FixedNode _fixedNode ;
        protected int _startIndex;
        protected int _endIndex;
        protected Matrix _mat;
        #endregion Protected Fields
 
        #region Private Fields
        private FlowNode _flowNode;
        private int _offsetInFlowNode;
        #endregion Private Fields
 
    }
 
}