| File: Microsoft\Windows\Controls\Ribbon\Primitives\StarLayoutInfo.cs | Web Access |
| Project: src\wpf\src\Microsoft.DotNet.Wpf\src\System.Windows.Controls.Ribbon\System.Windows.Controls.Ribbon.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. 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 } }