using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Windows.Automation;
using System.Windows.Automation.Peers;
using System.Windows.Automation.Provider;
using System.Windows.Controls;
using System.Windows.Media;
using EGC = ExtendedGrid.Microsoft.Windows.Controls;
namespace ExtendedGrid.Microsoft.Windows.Controls
{
///
/// AutomationPeer for DataGrid
/// Supports Grid, Table, Selection and Scroll patters
///
public sealed class DataGridAutomationPeer : FrameworkElementAutomationPeer,
IGridProvider, ISelectionProvider, ITableProvider
{
#region Constructors
///
/// Default contructor
///
/// DataGrid
public DataGridAutomationPeer(EGC.DataGrid owner)
: base(owner)
{
if (owner == null)
{
throw new ArgumentNullException("owner");
}
}
#endregion
#region AutomationPeer Overrides
///
/// Gets the control type for the element that is associated with the UI Automation peer.
///
/// The control type.
protected override AutomationControlType GetAutomationControlTypeCore()
{
return AutomationControlType.DataGrid;
}
///
/// Called by GetClassName that gets a human readable name that, in addition to AutomationControlType,
/// differentiates the control represented by this AutomationPeer.
///
/// The string that contains the name.
protected override string GetClassNameCore()
{
return Owner.GetType().Name;
}
///
/// Gets the control pattern that is associated with the specified System.Windows.Automation.Peers.PatternInterface.
///
/// A value from the System.Windows.Automation.Peers.PatternInterface enumeration.
/// The object that supports the specified pattern, or null if unsupported.
public override object GetPattern(PatternInterface patternInterface)
{
switch (patternInterface)
{
case PatternInterface.Grid:
case PatternInterface.Selection:
case PatternInterface.Table:
return this;
case PatternInterface.Scroll:
{
ScrollViewer scrollViewer = this.OwningDataGrid.InternalScrollHost;
if (scrollViewer != null)
{
AutomationPeer scrollPeer = UIElementAutomationPeer.CreatePeerForElement(scrollViewer);
IScrollProvider scrollProvider = scrollPeer as IScrollProvider;
if (scrollPeer != null && scrollProvider != null)
{
scrollPeer.EventsSource = this;
return scrollProvider;
}
}
break;
}
}
return base.GetPattern(patternInterface);
}
#endregion
#region IGridProvider
int IGridProvider.ColumnCount
{
get
{
return this.OwningDataGrid.Columns.Count;
}
}
int IGridProvider.RowCount
{
get
{
return this.OwningDataGrid.Items.Count;
}
}
IRawElementProviderSimple IGridProvider.GetItem(int row, int column)
{
if (row >= 0 && row < this.OwningDataGrid.Items.Count &&
column >= 0 && column < this.OwningDataGrid.Columns.Count)
{
object item = this.OwningDataGrid.Items[row];
EGC.DataGridColumn dataGridColumn = this.OwningDataGrid.Columns[column];
this.OwningDataGrid.ScrollIntoView(item, dataGridColumn);
this.OwningDataGrid.UpdateLayout();
EGC.DataGridItemAutomationPeer itemPeer = this.GetOrCreateItemPeer(item);
if (itemPeer != null)
{
EGC.DataGridCellItemAutomationPeer cellItemPeer = itemPeer.GetOrCreateCellItemPeer(dataGridColumn);
if (cellItemPeer != null)
{
return ProviderFromPeer(cellItemPeer);
}
}
}
return null;
}
#endregion
#region ISelectionProvider
IRawElementProviderSimple[] ISelectionProvider.GetSelection()
{
List selectedProviders = new List();
switch (this.OwningDataGrid.SelectionUnit)
{
case EGC.DataGridSelectionUnit.Cell:
{
AddSelectedCells(selectedProviders);
break;
}
case EGC.DataGridSelectionUnit.FullRow:
{
AddSelectedRows(selectedProviders);
break;
}
case EGC.DataGridSelectionUnit.CellOrRowHeader:
{
AddSelectedRows(selectedProviders);
AddSelectedCells(selectedProviders);
break;
}
default:
{
Debug.Assert(false);
break;
}
}
return selectedProviders.ToArray();
}
bool ISelectionProvider.CanSelectMultiple
{
get
{
return this.OwningDataGrid.SelectionMode == EGC.DataGridSelectionMode.Extended;
}
}
bool ISelectionProvider.IsSelectionRequired
{
get
{
return false;
}
}
#endregion
#region ITableProvider
RowOrColumnMajor ITableProvider.RowOrColumnMajor
{
get
{
return RowOrColumnMajor.RowMajor;
}
}
IRawElementProviderSimple[] ITableProvider.GetColumnHeaders()
{
if ((this.OwningDataGrid.HeadersVisibility & EGC.DataGridHeadersVisibility.Column) == EGC.DataGridHeadersVisibility.Column)
{
List providers = new List();
EGC.DataGridColumnHeadersPresenter dataGridColumnHeadersPresenter = this.OwningDataGrid.ColumnHeadersPresenter;
for (int i = 0; i < this.OwningDataGrid.Columns.Count; i++)
{
EGC.DataGridColumnHeader dataGridColumnHeader = dataGridColumnHeadersPresenter.ItemContainerGenerator.ContainerFromIndex(i) as EGC.DataGridColumnHeader;
if (dataGridColumnHeader != null)
{
AutomationPeer peer = CreatePeerForElement(dataGridColumnHeader);
if (peer != null)
{
providers.Add(ProviderFromPeer(peer));
}
}
}
if (providers.Count > 0)
{
return providers.ToArray();
}
}
return null;
}
// Row virtualization does not allow us to enumerate all the row headers because
// Their visual and bindings cannot be predicted before the row is devirtualized
// This method will return only the list of devirtualized rows headers.
IRawElementProviderSimple[] ITableProvider.GetRowHeaders()
{
if ((this.OwningDataGrid.HeadersVisibility & EGC.DataGridHeadersVisibility.Row) == EGC.DataGridHeadersVisibility.Row)
{
List providers = new List();
foreach (object item in this.OwningDataGrid.Items)
{
EGC.DataGridItemAutomationPeer dataGridItemAutomationPeer = GetOrCreateItemPeer(item);
AutomationPeer rowHeaderAutomationPeer = dataGridItemAutomationPeer.RowHeaderAutomationPeer;
if (rowHeaderAutomationPeer != null)
{
providers.Add(ProviderFromPeer(rowHeaderAutomationPeer));
}
}
if (providers.Count > 0)
{
return providers.ToArray();
}
}
return null;
}
#endregion
#region Private Helpers
private EGC.DataGrid OwningDataGrid
{
get
{
return (EGC.DataGrid)Owner;
}
}
// Return a list of automation peer corresponding to all rows in the DataGrid
// Called from DataGridRowsPresenterAutomationPeer.GetChildrenCore to populate its children
internal List GetItemPeers()
{
List peers = new List();
Dictionary