File: Base\System\ComponentModel\SortDescription.cs
Project: wpf\src\WindowsBase.csproj (WindowsBase)
//---------------------------------------------------------------------------
//
// <copyright file="SortDescription.cs" company="Microsoft">
//    Copyright (C) 2003 by Microsoft Corporation.  All rights reserved.
// </copyright>
//
//
// Description: Defines property and direction to sort.
//
// See spec at http://avalon/connecteddata/M5%20Specs/IDataCollection.mht
//
// History:
//  06/02/2003 : Microsoft - Created
//
//---------------------------------------------------------------------------
 
using System;
using System.ComponentModel;
using System.Windows;           // SR
using MS.Internal.WindowsBase;
 
namespace System.ComponentModel
{
    /// <summary>
    /// Defines a property and direction to sort a list by.
    /// </summary>
    public struct SortDescription
    {
        //------------------------------------------------------
        //
        //  Public Constructors
        //
        //------------------------------------------------------
 
        #region Public Constructors
 
        /// <summary>
        /// Create a sort description.
        /// </summary>
        /// <param name="propertyName">Property to sort by</param>
        /// <param name="direction">Specifies the direction of sort operation</param>
        /// <exception cref="InvalidEnumArgumentException"> direction is not a valid value for ListSortDirection </exception>
        public SortDescription(string propertyName, ListSortDirection direction)
        {
            if (direction != ListSortDirection.Ascending && direction != ListSortDirection.Descending)
                throw new InvalidEnumArgumentException("direction", (int)direction, typeof(ListSortDirection));
 
            _propertyName = propertyName;
            _direction = direction;
            _sealed = false;
        }
 
        #endregion Public Constructors
 
 
        //------------------------------------------------------
        //
        //  Public Properties
        //
        //------------------------------------------------------
 
        #region Public Properties
 
        /// <summary>
        /// Property name to sort by.
        /// </summary>
        public string PropertyName
        {
            get { return _propertyName; }
            set
            {
                if (_sealed)
                    throw new InvalidOperationException(SR.Get(SRID.CannotChangeAfterSealed, "SortDescription"));
 
                _propertyName = value;
            }
        }
 
        /// <summary>
        /// Sort direction.
        /// </summary>
        public ListSortDirection Direction
        {
            get { return _direction; }
            set
            {
                if (_sealed)
                    throw new InvalidOperationException(SR.Get(SRID.CannotChangeAfterSealed, "SortDescription"));
 
                if (value < ListSortDirection.Ascending || value > ListSortDirection.Descending)
                    throw new InvalidEnumArgumentException("value", (int) value, typeof(ListSortDirection));
 
                _direction = value;
            }
        }
 
        /// <summary>
        /// Returns true if the SortDescription is in use (sealed).
        /// </summary>
        public bool IsSealed
        {
            get { return _sealed; }
        }
 
        #endregion Public Properties
 
        //------------------------------------------------------
        //
        //  Public methods
        //
        //------------------------------------------------------
 
        #region Public Methods
 
        /// <summary> Override of Object.Equals </summary>
        public override bool Equals(object obj)
        {
            return (obj is SortDescription) ? (this == (SortDescription)obj) : false;
        }
 
        /// <summary> Equality operator for SortDescription. </summary>
        public static bool operator==(SortDescription sd1, SortDescription sd2)
        {
            return  sd1.PropertyName == sd2.PropertyName &&
                    sd1.Direction == sd2.Direction;
        }
 
        /// <summary> Inequality operator for SortDescription. </summary>
        public static bool operator!=(SortDescription sd1, SortDescription sd2)
        {
            return !(sd1 == sd2);
        }
 
        /// <summary> Override of Object.GetHashCode </summary>
        public override int GetHashCode()
        {
            int result = Direction.GetHashCode();
            if (PropertyName != null)
            {
                result = unchecked(PropertyName.GetHashCode() + result);
            }
            return result;
        }
 
        #endregion Public Methods
 
        //------------------------------------------------------
        //
        //  Internal methods
        //
        //------------------------------------------------------
 
        #region Internal Methods
 
        internal void Seal()
        {
            _sealed = true;
        }
 
        #endregion Internal Methods
 
        //------------------------------------------------------
        //
        //  Private Fields
        //
        //------------------------------------------------------
 
        #region Private Fields
 
        private string              _propertyName;
        private ListSortDirection   _direction;
        bool                        _sealed;
 
        #endregion Private Fields
    }
}