File: System\Windows\Documents\FixedSOMGroup.cs
Web Access
Project: src\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.
// See the LICENSE file in the project root for more information.
 
using System.Windows.Media;
 
/*++                                                               
    Description:
       A concrete container that can be used to put together to group different or same types of containers         
--*/
 
namespace System.Windows.Documents
{
    internal class FixedSOMGroup :FixedSOMPageElement, IComparable
    {
        //--------------------------------------------------------------------
        //
        // Constructors
        //
        //---------------------------------------------------------------------
        
        #region Constructors
        public FixedSOMGroup(FixedSOMPage page) : base(page)
        {
        }
        #endregion Constructors        
 
        #region IComparable
 
        int IComparable.CompareTo(object comparedObj)
        {
            int result = Int32.MinValue;
 
            FixedSOMGroup compared = comparedObj as FixedSOMGroup;
            
            Debug.Assert(compared != null);
            
            if (compared == null)
            {
                throw new ArgumentException(SR.Format(SR.UnexpectedParameterType, comparedObj.GetType(), typeof(FixedSOMGroup)), "comparedObj");
            }
 
            bool RTL = this.IsRTL && compared.IsRTL;
            SpatialComparison compareHor = base._CompareHorizontal(compared, RTL);
            SpatialComparison compareVer = base._CompareVertical(compared);
 
            Debug.Assert(compareHor != SpatialComparison.None);
            Debug.Assert(compareVer != SpatialComparison.None);
 
            switch (compareVer)
            {
            case SpatialComparison.Before:
                result = -1;
                break;
 
            case SpatialComparison.After:
                result = 1;
                break;
 
            case SpatialComparison.OverlapBefore:
                if ((int)compareHor <= (int)SpatialComparison.Equal)
                {
                    result = -1;
                }
                else
                {
                    result = 1;
                }
                break;
 
            case SpatialComparison.OverlapAfter:
                if ((int)compareHor >= (int)SpatialComparison.Equal)
                {
                    result = 1;
                }
                else 
                {
                    result = -1;
                }
                break;
 
 
            case SpatialComparison.Equal:
                switch (compareHor)
                {
                case SpatialComparison.After:
                case SpatialComparison.OverlapAfter:
                    result = 1;
                    break;
                case SpatialComparison.Before:
                case SpatialComparison.OverlapBefore:
                    result = -1;
                    break;
                case SpatialComparison.Equal:
                    result = 0;
                    break;
                default:
                    Debug.Assert(false);
                    break;
                }
                break;
 
            default:
                //Shouldn't happen
                Debug.Assert(false);
                break;
            }
 
            return result;
        }
 
        #endregion
        
 
        #region Public methods
        //--------------------------------------------------------------------
        //
        // Public methods
        //
        //---------------------------------------------------------------------
 
        public void AddContainer(FixedSOMPageElement pageElement)
        {
            FixedSOMFixedBlock block = pageElement as FixedSOMFixedBlock;
            if (block == null || (!block.IsFloatingImage && !block.IsWhiteSpace))
            {
                if (pageElement.IsRTL)
                {
                    _RTLCount++;
                }
                else
                {
                    _LTRCount++;
                }
            }
           
            _semanticBoxes.Add(pageElement);
            
            if (_boundingRect.IsEmpty)
            {
                _boundingRect = pageElement.BoundingRect;
            }
            else
            {
                _boundingRect.Union(pageElement.BoundingRect);
            }
        }
        
#if DEBUG      
        public override void Render(DrawingContext dc, string label, DrawDebugVisual debugVisual)
        {
            Pen pen = new Pen(Brushes.Maroon, 3);
            Rect rect = _boundingRect;
            rect.Inflate(5,5);
            dc.DrawRectangle(null, pen , rect);
            
            if (label != null)
            {
                if (this.IsRTL)
                {
                    label += "R";
                }
                base.RenderLabel(dc, label);
            }
            
            foreach (FixedSOMSemanticBox box in _semanticBoxes)
            {
                box.Render(dc, "", debugVisual);
            }
 
        }
 
#endif
 
        #endregion Public methods
 
        #region Public Properties
        public override bool IsRTL
        {
            get
            {
                return _RTLCount > _LTRCount;
            }
        }
        #endregion Public Properties
 
        #region Private fields
        private int _RTLCount;
        private int _LTRCount;        
        #endregion Private fields
        
 
    }
}