Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / wpf / src / Framework / System / Windows / Automation / Peers / DataGridColumnHeadersPresenterAutomationPeer.cs / 1477467 / DataGridColumnHeadersPresenterAutomationPeer.cs
using System;
using System.Collections;
using System.Collections.Generic;
using System.Windows.Automation.Provider;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
namespace System.Windows.Automation.Peers
{
///
/// AutomationPeer for DataGridColumnHeadersPresenter
///
public sealed class DataGridColumnHeadersPresenterAutomationPeer : ItemsControlAutomationPeer, IItemContainerProvider
{
#region Constructors
///
/// AutomationPeer for DataGridColumnHeadersPresenter
///
/// DataGridColumnHeadersPresenter
public DataGridColumnHeadersPresenterAutomationPeer(DataGridColumnHeadersPresenter owner)
: base(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.Header;
}
///
/// 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;
}
///
/// Creates Children peers.
///
/// GetChildrenCore and FindItemByProperty are almost straight copies of the
/// ItemControlAutomationPeer code; however since DataGridColumHeaderPresenter
/// returns the Column.Header's as the items some specialized code was needed to
/// create and store peers.
///
protected override List GetChildrenCore()
{
List children = null;
ItemPeersStorage oldChildren = ItemPeers; //cache the old ones for possible reuse
ItemPeers = new ItemPeersStorage();
ItemsControl owner = (ItemsControl)Owner;
if (OwningDataGrid.Columns.Count > 0)
{
IList childItems = null;
Panel itemHost = owner.ItemsHost;
// To avoid the situation on legacy systems which may not have new unmanaged core. this check with old unmanaged core
// ensures the older behavior as ItemContainer pattern won't be available.
if (ItemContainerPatternIdentifiers.Pattern != null)
{
if (itemHost == null)
return null;
childItems = itemHost.Children;
}
else
{
childItems = OwningDataGrid.Columns;
}
children = new List(childItems.Count);
foreach (object item in childItems)
{
DataGridColumn dataItem;
if (item is DataGridColumnHeader)
{
dataItem = ((DataGridColumnHeader) item).Column;
}
else
{
dataItem = item as DataGridColumn;
}
// try to reuse old peer if it exists either in Current AT or in WeakRefStorage of Peers being sent to Client
ItemAutomationPeer peer = oldChildren[dataItem];
if (peer == null)
{
peer = GetPeerFromWeakRefStorage(dataItem);
// As cached peer is getting used it must be invalidated.
if (peer != null)
{
peer.AncestorsInvalid = false;
peer.ChildrenValid = false;
}
}
if (peer == null)
{
peer = CreateItemAutomationPeer(dataItem);
}
// perform hookup so the events sourced from wrapper peer are fired as if from the data item
if (peer != null)
{
AutomationPeer wrapperPeer = peer.GetWrapperPeer();
if (wrapperPeer != null)
{
wrapperPeer.EventsSource = peer;
}
}
// protection from indistinguishable items - for example, 2 strings with same value
// this scenario does not work in ItemsControl however is not checked for.
if (ItemPeers[dataItem] == null)
{
children.Add(peer);
ItemPeers[dataItem] = peer;
}
}
return children;
}
return null;
}
///
/// Find Childrend Peers based on Automation Properties.
/// Used to enable virtualization with automation.
///
/// GetChildrenCore and FindItemByProperty are almost straight copies of the
/// ItemControlAutomationPeer code; however since DataGridColumHeaderPresenter
/// returns the Column.Header's as the items some specialized code was needed to
/// create and store peers.
///
IRawElementProviderSimple IItemContainerProvider.FindItemByProperty(IRawElementProviderSimple startAfter, int propertyId, object value)
{
ResetChildrenCache();
// Checks if propertyId is valid else throws ArgumentException to notify it as invalid argument is being passed
if (propertyId != 0)
{
if (!IsPropertySupportedByControlForFindItem(propertyId))
{
throw new ArgumentException(SR.Get(SRID.PropertyNotSupported));
}
}
ItemsControl owner = (ItemsControl)Owner;
IList items = null;
if (owner != null)
items = OwningDataGrid.Columns;
if (items != null && items.Count > 0)
{
DataGridColumnHeaderItemAutomationPeer startAfterItem = null;
if (startAfter != null)
{
// get the peer corresponding to this provider
startAfterItem = PeerFromProvider(startAfter) as DataGridColumnHeaderItemAutomationPeer;
if (startAfterItem == null)
return null;
}
// startIndex refers to the index of the item just after startAfterItem
int startIndex = 0;
if (startAfterItem != null)
{
if (startAfterItem.Item == null)
{
throw new InvalidOperationException(SR.Get(SRID.InavalidStartItem));
}
// To find the index of the column items collection which occurs
// immidiately after startAfterItem.Item
startIndex = items.IndexOf(startAfterItem.Column) + 1;
if (startIndex == 0 || startIndex == items.Count)
return null;
}
if (propertyId == 0)
{
for (int i = startIndex; i < items.Count; i++)
{
// This is to handle the case of when dataItems are just plain strings and have duplicates,
// only the first occurence of duplicate Items will be returned. It has also been used couple more times below.
if (items.IndexOf(items[i]) != i)
continue;
return (ProviderFromPeer(FindOrCreateItemAutomationPeer(items[i])));
}
}
ItemAutomationPeer currentItemPeer;
object currentValue = null;
for (int i = startIndex; i < items.Count; i++)
{
currentItemPeer = FindOrCreateItemAutomationPeer(items[i]);
if (currentItemPeer == null)
continue;
try
{
currentValue = GetSupportedPropertyValue(currentItemPeer, propertyId);
}
catch (Exception ex)
{
if (ex is ElementNotAvailableException)
continue;
}
if (value == null || currentValue == null)
{
// Accept null as value corresponding to the property if it finds an item with null as the value of corresponding property else ignore.
if (currentValue == null && value == null && items.IndexOf(items[i]) == i)
return (ProviderFromPeer(currentItemPeer));
else
continue;
}
// Match is found within the specified criterion of search
if (value.Equals(currentValue) && items.IndexOf(items[i]) == i)
return (ProviderFromPeer(currentItemPeer));
}
}
return null;
}
///
/// Gets a value that specifies whether the element is a content element.
///
/// true if the element is a content element; otherwise false
protected override bool IsContentElementCore()
{
return false;
}
protected override ItemAutomationPeer CreateItemAutomationPeer(object column)
{
DataGridColumn dataGridColumn = column as DataGridColumn;
if (column != null)
{
// Pass in the column and the Header in so that ItemsContainerGenerator will give a container
// when ItemAutomationPeer.GetWrapper is called.
return new DataGridColumnHeaderItemAutomationPeer(dataGridColumn.Header, dataGridColumn, this) as ItemAutomationPeer;
}
return null;
}
#endregion
#region Private Methods
private DataGrid OwningDataGrid
{
get
{
return ((DataGridColumnHeadersPresenter)Owner).ParentDataGrid;
}
}
#endregion
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- DesignerAttributeInfo.cs
- CompareValidator.cs
- SHA256.cs
- WebFaultClientMessageInspector.cs
- CodeArrayCreateExpression.cs
- DoubleAnimationBase.cs
- WebPartVerb.cs
- MemoryStream.cs
- NetStream.cs
- XmlSchemaFacet.cs
- KeyInterop.cs
- Stack.cs
- RequestResizeEvent.cs
- FunctionOverloadResolver.cs
- SelectionPattern.cs
- FormsAuthenticationUser.cs
- MemberAccessException.cs
- DbException.cs
- DurationConverter.cs
- CurrencyWrapper.cs
- GlyphCache.cs
- DataKey.cs
- BStrWrapper.cs
- EditorAttributeInfo.cs
- LinkLabel.cs
- TextCollapsingProperties.cs
- BindStream.cs
- SystemIPv4InterfaceProperties.cs
- ObservableCollection.cs
- OfTypeExpression.cs
- Int16.cs
- DataGridViewElement.cs
- PresentationTraceSources.cs
- RegistryConfigurationProvider.cs
- SymmetricKeyWrap.cs
- SmiEventStream.cs
- BamlRecordReader.cs
- XmlSchemaAnnotation.cs
- SettingsPropertyIsReadOnlyException.cs
- ContainerSelectorActiveEvent.cs
- TypeTypeConverter.cs
- DbDataAdapter.cs
- FontInfo.cs
- WindowsGraphicsWrapper.cs
- WriteFileContext.cs
- BindingContext.cs
- ConfigXmlElement.cs
- Stylesheet.cs
- PropertyItem.cs
- SendMailErrorEventArgs.cs
- PropertyDescriptor.cs
- UnaryOperationBinder.cs
- CodeMethodReturnStatement.cs
- HwndMouseInputProvider.cs
- OperationCanceledException.cs
- GenericArgumentsUpdater.cs
- PageBuildProvider.cs
- UpdateCommand.cs
- BulletChrome.cs
- SamlAuthenticationClaimResource.cs
- ExpressionLink.cs
- SqlRowUpdatedEvent.cs
- CapacityStreamGeometryContext.cs
- CharEnumerator.cs
- WebSysDefaultValueAttribute.cs
- UserNamePasswordValidator.cs
- StrokeCollectionConverter.cs
- CodeLabeledStatement.cs
- RoleServiceManager.cs
- ConfigXmlDocument.cs
- CommentAction.cs
- VisualBasicSettings.cs
- PointLightBase.cs
- StyleCollection.cs
- DetailsViewInsertedEventArgs.cs
- BidPrivateBase.cs
- LocalizabilityAttribute.cs
- BinaryOperationBinder.cs
- UpdatePanelTriggerCollection.cs
- CountAggregationOperator.cs
- TraceListeners.cs
- DataStorage.cs
- TypedAsyncResult.cs
- PlainXmlDeserializer.cs
- FontInfo.cs
- ManagementEventWatcher.cs
- BitmapDecoder.cs
- ValueChangedEventManager.cs
- ConstraintManager.cs
- ParallelTimeline.cs
- ExpressionList.cs
- serverconfig.cs
- Animatable.cs
- CodeSnippetStatement.cs
- RequestCacheManager.cs
- AssemblySettingAttributes.cs
- MailMessage.cs
- AnonymousIdentificationModule.cs
- shaperfactoryquerycachekey.cs
- ImportedNamespaceContextItem.cs