File: Microsoft\Windows\Controls\Ribbon\Primitives\StarLayoutInfo.cs
Web Access
Project: src\src\Microsoft.DotNet.Wpf\src\System.Windows.Controls.Ribbon\System.Windows.Controls.Ribbon_dxtfdo3u_wpftmp.csproj (System.Windows.Controls.Ribbon)
// 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.Collections;
using System.Collections.Generic;
using MS.Internal;
 
#if RIBBON_IN_FRAMEWORK
namespace System.Windows.Controls.Ribbon.Primitives
#else
namespace Microsoft.Windows.Controls.Ribbon.Primitives
#endif
{
    public class StarLayoutInfo : DependencyObject
    {
        #region Properties
 
        public double RequestedStarWeight
        {
            get { return (double)GetValue(RequestedStarWeightProperty); }
            set { SetValue(RequestedStarWeightProperty, value); }
        }
 
        // Using a DependencyProperty as the backing store for RequestedStarWeight.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty RequestedStarWeightProperty =
            DependencyProperty.Register("RequestedStarWeight",
                typeof(double),
                typeof(StarLayoutInfo),
                new UIPropertyMetadata(0.0),
                new ValidateValueCallback(ValidateRequestedStarWeight));
 
        public double RequestedStarMinWidth
        {
            get { return (double)GetValue(RequestedStarMinWidthProperty); }
            set { SetValue(RequestedStarMinWidthProperty, value); }
        }
 
        // Using a DependencyProperty as the backing store for RequestedStarMinWidth.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty RequestedStarMinWidthProperty =
            DependencyProperty.Register("RequestedStarMinWidth",
            typeof(double),
            typeof(StarLayoutInfo),
            new UIPropertyMetadata(0.0, new PropertyChangedCallback(OnRequestedStarMinWidthChanged)),
            new ValidateValueCallback(ValidateRequestedStarMinWidth));
 
        public double RequestedStarMaxWidth
        {
            get { return (double)GetValue(RequestedStarMaxWidthProperty); }
            set { SetValue(RequestedStarMaxWidthProperty, value); }
        }
 
        // Using a DependencyProperty as the backing store for RequestedStarMaxWidth.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty RequestedStarMaxWidthProperty =
            DependencyProperty.Register("RequestedStarMaxWidth",
                typeof(double),
                typeof(StarLayoutInfo),
                new UIPropertyMetadata(double.PositiveInfinity, null, new CoerceValueCallback(OnCoerceRequestedStarMaxWidth)),
                new ValidateValueCallback(ValidateRequestedStarMaxWidth));
 
        public double AllocatedStarWidth
        {
            get { return (double)GetValue(AllocatedStarWidthProperty); }
            set { SetValue(AllocatedStarWidthProperty, value); }
        }
 
        // Using a DependencyProperty as the backing store for AllocatedStarWidth.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty AllocatedStarWidthProperty =
            DependencyProperty.Register("AllocatedStarWidth",
                typeof(double),
                typeof(StarLayoutInfo),
                new UIPropertyMetadata(0.0, null, new CoerceValueCallback(OnCoerceAllocatedStarWidth)));
 
        internal static IComparer<StarLayoutInfo> PerStarValueComparer
        {
            get
            {
                if (_perStarValueComparer == null)
                {
                    _perStarValueComparer = new PerStarComparerImpl();
                }
                return _perStarValueComparer;
            }
        }
 
        internal static IComparer<StarLayoutInfo> PotentialPerStarValueComparer
        {
            get
            {
                if (_potentialPerStarValueComparer == null)
                {
                    _potentialPerStarValueComparer = new PotentialPerStarComparerImpl();
                }
                return _potentialPerStarValueComparer;
            }
        }
 
        #endregion
 
        #region Private Methods
 
        private static bool ValidateRequestedStarWeight(object value)
        {
            double starWeight = (double)value;
            return (!double.IsNaN(starWeight) &&
                !double.IsInfinity(starWeight) &&
                DoubleUtil.GreaterThanOrClose(starWeight, 0.0));
        }
 
        private static void OnRequestedStarMinWidthChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            d.CoerceValue(RequestedStarMaxWidthProperty);
            d.CoerceValue(AllocatedStarWidthProperty);
        }
 
        private static bool ValidateRequestedStarMinWidth(object value)
        {
            double starMinWidth = (double)value;
            return (!double.IsNaN(starMinWidth) &&
                !double.IsInfinity(starMinWidth) &&
                DoubleUtil.GreaterThanOrClose(starMinWidth, 0.0));
        }
 
        private static object OnCoerceRequestedStarMaxWidth(DependencyObject d, object baseValue)
        {
            double maxWidth = (double)baseValue;
            StarLayoutInfo starLayoutInfo = (StarLayoutInfo)d;
            double minWidth = starLayoutInfo.RequestedStarMinWidth;
            if (DoubleUtil.LessThan(maxWidth, minWidth))
            {
                return minWidth;
            }
            return baseValue;
        }
 
        private static bool ValidateRequestedStarMaxWidth(object value)
        {
            double starMaxWidth = (double)value;
            return (!double.IsNaN(starMaxWidth) &&
                DoubleUtil.GreaterThan(starMaxWidth, 0.0));
        }
 
        private static object OnCoerceAllocatedStarWidth(DependencyObject d, object baseValue)
        {
            double allocatedWidth = (double)baseValue;
            StarLayoutInfo layoutInfo = (StarLayoutInfo)d;
            if (DoubleUtil.LessThan(allocatedWidth, layoutInfo.RequestedStarMinWidth))
            {
                return layoutInfo.RequestedStarMinWidth;
            }
            return baseValue;
        }
 
        #endregion
 
        #region Comparers
 
        private class PerStarComparerImpl : IComparer<StarLayoutInfo>
        {
            #region IComparer<StarLayoutInfo> Members
 
            public int Compare(StarLayoutInfo x, StarLayoutInfo y)
            {
                return Comparer.Default.Compare(x.AllocatedStarWidth / x.RequestedStarWeight,
                                                y.AllocatedStarWidth / y.RequestedStarWeight);
            }
 
            #endregion
        }
 
        private class PotentialPerStarComparerImpl : IComparer<StarLayoutInfo>
        {
            #region IComparer<StarLayoutInfo> Members
 
            public int Compare(StarLayoutInfo x, StarLayoutInfo y)
            {
                return Comparer.Default.Compare((x.RequestedStarMaxWidth - x.AllocatedStarWidth) / x.RequestedStarWeight,
                                                (y.RequestedStarMaxWidth - y.AllocatedStarWidth) / y.RequestedStarWeight);
            }
 
            #endregion
        }
 
        #endregion
 
        #region Private Data
 
        private static PerStarComparerImpl _perStarValueComparer;
        private static PotentialPerStarComparerImpl _potentialPerStarValueComparer;
 
        #endregion
    }
}