File: src\Framework\System\Windows\Automation\Peers\DataGridColumnHeaderItemAutomationPeer.cs
Project: wpf\PresentationFramework.csproj (PresentationFramework)
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Windows;
using System.Windows.Automation;
using System.Windows.Automation.Provider;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Data;
 
namespace System.Windows.Automation.Peers
{
    /// <summary>
    /// Automation Peer for DataGridHeader
    /// </summary>
    public class DataGridColumnHeaderItemAutomationPeer : ItemAutomationPeer,
        IInvokeProvider, IScrollItemProvider, ITransformProvider, IVirtualizedItemProvider
    {
        public DataGridColumnHeaderItemAutomationPeer(object item, DataGridColumn column, DataGridColumnHeadersPresenterAutomationPeer peer)
            :base(item, peer)
        {
            _column = column;
        }
                
        #region AutomationPeer Overrides
 
        /// <summary>
        /// Gets the control type for the element that is associated with the UI Automation peer.
        /// </summary>
        /// <returns>The control type.</returns>
        protected override AutomationControlType GetAutomationControlTypeCore()
        {
            return AutomationControlType.HeaderItem;
        }
 
        /// <summary>
        /// Called by GetClassName that gets a human readable name that, in addition to AutomationControlType, 
        /// differentiates the control represented by this AutomationPeer.
        /// </summary>
        /// <returns>The string that contains the name.</returns>
        protected override string GetClassNameCore()
        {
            AutomationPeer wrapperPeer = GetWrapperPeer();
            if (wrapperPeer != null)
            {
                return wrapperPeer.GetClassName();
            }
            else
            {
                ThrowElementNotAvailableException();
            }
            return String.Empty;
        }
 
        /// <summary>
        /// Gets the control pattern that is associated with the specified System.Windows.Automation.Peers.PatternInterface.
        /// </summary>
        /// <param name="patternInterface">A value from the System.Windows.Automation.Peers.PatternInterface enumeration.</param>
        /// <returns>The object that supports the specified pattern, or null if unsupported.</returns>
        public override object GetPattern(PatternInterface patternInterface)
        {
            switch (patternInterface)
            {
                case PatternInterface.Invoke:
                    {
                        if (Column != null && Column.CanUserSort)
                        {
                            return this;
                        }
 
                        break;
                    }
 
                case PatternInterface.ScrollItem:
                    {
                        if (Column != null)
                        {
                            return this;
                        }
                        break;
                    }
 
                case PatternInterface.Transform:
                    {
                        if (Column != null && Column.CanUserResize)
                        {
                            return this;
                        }
                        
                        break;
                    }
                case PatternInterface.VirtualizedItem:
                    {
                        if (Column != null)
                        {
                            return this;
                        }
 
                        break;
                    }
            }
 
            return null;
        }
 
        // AutomationControlType.HeaderItem must return IsContentElement false.
        // See http://msdn.microsoft.com/en-us/library/ms742202.aspx
        protected override bool IsContentElementCore()
        {
            return false;
        }
        #endregion
 
        #region IInvokeProvider
        void IInvokeProvider.Invoke()
        {
            UIElementAutomationPeer wrapperPeer = GetWrapperPeer() as UIElementAutomationPeer;
            if (wrapperPeer != null)
            {
                ((DataGridColumnHeader)wrapperPeer.Owner).Invoke();
            }
            else
                ThrowElementNotAvailableException();
        }
        #endregion
 
        #region IScrollItemProvider
 
        void IScrollItemProvider.ScrollIntoView()
        {
            if (Column != null && this.OwningDataGrid != null)
            {
                this.OwningDataGrid.ScrollIntoView(null, Column);
            }
        }
 
        #endregion
 
        #region ITransformProvider
 
        bool ITransformProvider.CanMove 
        { 
            get 
            { 
                return false; 
            } 
        }
 
        bool ITransformProvider.CanResize 
        { 
            get 
            { 
                if (this.Column != null)
                    return Column.CanUserResize;
                return false;
            } 
        }
 
        bool ITransformProvider.CanRotate 
        { 
            get 
            { 
                return false; 
            } 
        }
 
        void ITransformProvider.Move(double x, double y)
        {
            throw new InvalidOperationException(SR.Get(SRID.DataGridColumnHeaderItemAutomationPeer_Unsupported));
        } 
 
        void ITransformProvider.Resize(double width, double height)
        {
            if (this.OwningDataGrid != null && Column.CanUserResize)
            {
                Column.Width = new DataGridLength(width);
            }
            else
            {
                throw new InvalidOperationException(SR.Get(SRID.DataGridColumnHeaderItemAutomationPeer_Unresizable));
            }
        }
 
        void ITransformProvider.Rotate(double degrees)
        {
            throw new InvalidOperationException(SR.Get(SRID.DataGridColumnHeaderItemAutomationPeer_Unsupported));
        }
 
        #endregion
 
        #region IVirtualizedItemProvider
        void IVirtualizedItemProvider.Realize()
        {
            if (this.OwningDataGrid != null)
                OwningDataGrid.ScrollIntoView(null,Column);
        }
 
        #endregion
 
        #region Properties
 
        internal override bool AncestorsInvalid
        {
            get { return base.AncestorsInvalid; }
            set
            {
                base.AncestorsInvalid = value;
                if (value)
                    return;
                AutomationPeer wrapperPeer = OwningColumnHeaderPeer;
                if (wrapperPeer != null)
                {
                    wrapperPeer.AncestorsInvalid = false;
                }
            }
        }
 
        internal DataGridColumnHeader OwningHeader
        {
            get
            {
                return GetWrapper() as DataGridColumnHeader;
            }
        }
 
        internal DataGrid OwningDataGrid
        {
            get
            {
                return Column.DataGridOwner;
            }
        }
 
        internal DataGridColumn Column
        {
            get { return _column; }
        }
 
        internal DataGridColumnHeaderAutomationPeer OwningColumnHeaderPeer
        {
            get
            {
                return GetWrapperPeer() as DataGridColumnHeaderAutomationPeer;
            }
        }
 
        #endregion
 
        #region Private Variables
        DataGridColumn _column;
        #endregion
    }
}