internal static void AddFooterPeer( DataGridContext dataGridContext, HeadersFootersGeneratorNode node, List<AutomationPeer> list, Hashtable children, Hashtable oldChildren ) { int headersCount = node.ItemCount; for( int i = 0; i < headersCount; i++ ) { // We use GetAt since it does not return the same thing as .Items. // We need to get a GroupHeaderFooterItem. object item = node.GetAt( i ); if( item != null ) { HeaderFooterItemAutomationPeer automationPeer = oldChildren[ item ] as HeaderFooterItemAutomationPeer; if( automationPeer == null ) { automationPeer = new HeaderFooterItemAutomationPeer( dataGridContext, item ); } Debug.Assert( automationPeer != null ); // we set ExtraInfo even if the header was already created since the position can change. automationPeer.SetExtraInfo( HeaderFooterItemAutomationPeer.HeaderFooterType.Footer, i ); // Force EventsSource to be updated automationPeer.GetWrapperPeer(); list.Add( automationPeer ); children[ item ] = automationPeer; } } }
private void AddChildrenFooters( HeadersFootersGeneratorNode footerNode, Hashtable oldHeaderFooterChildren, List<AutomationPeer> list ) { if( m_parentDataGridContext == null ) { // Add fixed header to the children list Panel fixedFooterPanel = m_dataGridControl.FixedFootersHostPanel; if( fixedFooterPanel != null ) { int index = 0; foreach( DependencyObject headerFooter in fixedFooterPanel.Children ) { HeaderFooterItem headerFooterItem = headerFooter as HeaderFooterItem; if( headerFooterItem != null ) { HeaderFooterItemAutomationPeer automationPeer = oldHeaderFooterChildren[ headerFooter ] as HeaderFooterItemAutomationPeer; if( automationPeer == null ) { automationPeer = new HeaderFooterItemAutomationPeer( m_dataGridContext, headerFooter ); } automationPeer.SetExtraInfo( HeaderFooterItemAutomationPeer.HeaderFooterType.FixedFooter, index ); m_headerFooterChildren[ headerFooter ] = automationPeer; list.Add( automationPeer ); } index++; } } } if( footerNode != null ) { DataGridGroupAutomationPeer.AddFooterPeer( m_dataGridContext, footerNode, list, m_headerFooterChildren, oldHeaderFooterChildren ); } }
private AutomationPeer GetPeerForChildrenIndex(int index) { int fixedHeadersCount = 0; Panel fixedHeadersPanel = null; int fixedFootersCount = 0; Panel fixedFootersPanel = null; if (m_parentDataGridContext == null) { fixedHeadersPanel = m_dataGridControl.FixedHeadersHostPanel; fixedHeadersCount = (fixedHeadersPanel != null) ? fixedHeadersPanel.Children.Count : 0; fixedFootersPanel = m_dataGridControl.FixedFootersHostPanel; fixedFootersCount = (fixedFootersPanel != null) ? fixedFootersPanel.Children.Count : 0; } if (index < fixedHeadersCount) { UIElement element = fixedHeadersPanel.Children[index]; AutomationPeer automationPeer = m_headerFooterChildren[element] as AutomationPeer; Debug.Assert(automationPeer != null); if (automationPeer == null) { return(null); } return(automationPeer); } else { index -= fixedHeadersCount; HeadersFootersGeneratorNode headerNode = m_dataGridContext.CustomItemContainerGenerator.Header; int headersCount = (headerNode == null) ? 0 : headerNode.ItemCount; if (index < headersCount) { object item = headerNode.GetAt(index); AutomationPeer automationPeer = m_headerFooterChildren[item] as AutomationPeer; Debug.Assert(automationPeer != null); return(automationPeer); } else { index -= headersCount; CollectionView items = m_dataGridContext.Items; int itemsCount = (items == null) ? 0 : items.Count; if (index < itemsCount) { return(this.FindOrCreateItemAutomationPeer(items.GetItemAt(index), index)); } else { index -= itemsCount; HeadersFootersGeneratorNode footerNode = m_dataGridContext.CustomItemContainerGenerator.Footer; int footersCount = (footerNode == null) ? 0 : footerNode.ItemCount; if (index < footersCount) { object item = footerNode.GetAt(index); AutomationPeer automationPeer = m_headerFooterChildren[item] as AutomationPeer; Debug.Assert(automationPeer != null); return(automationPeer); } else { index -= footersCount; if (index < fixedFootersCount) { UIElement element = fixedFootersPanel.Children[index]; AutomationPeer automationPeer = m_headerFooterChildren[element] as AutomationPeer; Debug.Assert(automationPeer != null); return(automationPeer); } } } } } return(null); }
protected override List <AutomationPeer> GetChildrenCore() { if (m_dataGridContext == null) { return(null); } if (m_oldColumnCount == -1) { m_oldColumnCount = m_dataGridContext.VisibleColumns.Count; m_dataGridContext.Columns.VisibleColumnsUpdated += new EventHandler(Columns_VisibleColumnsUpdated); } CustomItemContainerGenerator itemGenerator = m_dataGridContext.CustomItemContainerGenerator; IEnumerable items; int itemsCount; bool itemsIsAllItems = false; // The way Microsoft check if we are called by an automation that support Virtualization. if ((ItemContainerPatternIdentifiers.Pattern != null) && (m_dataGridControl.ItemsHost is DataGridItemsHost)) { List <object> realizedItems = itemGenerator.GetRealizedDataItems(); items = realizedItems; itemsCount = realizedItems.Count; } else { CollectionView viewItems = m_dataGridContext.Items; items = viewItems; itemsCount = viewItems.Count; itemsIsAllItems = true; } Hashtable oldDataChildren = m_dataChildren; Hashtable oldHeaderFooterChildren = m_headerFooterChildren; // Get header count HeadersFootersGeneratorNode headerNode = itemGenerator.Header; int headersCount = (headerNode == null) ? 0 : headerNode.ItemCount; // Get footer count HeadersFootersGeneratorNode footerNode = itemGenerator.Footer; int footersCount = (footerNode == null) ? 0 : footerNode.ItemCount; int childrenCount = headersCount + footersCount; if (m_parentDataGridContext == null) { // Add the fixed header / footer count to the children Panel fixedPanel = m_dataGridControl.FixedHeadersHostPanel; if (fixedPanel != null) { childrenCount += fixedPanel.Children.Count; } fixedPanel = m_dataGridControl.FixedFootersHostPanel; if (fixedPanel != null) { childrenCount += fixedPanel.Children.Count; } } ReadOnlyObservableCollection <object> groups = m_dataGridContext.Items.Groups; if (groups != null) { // Add the group count to the children childrenCount += groups.Count; } else { childrenCount += itemsCount; } m_dataChildren = new Hashtable(itemsCount); m_headerFooterChildren = new Hashtable(headersCount + footersCount); if (childrenCount == 0) { return(null); } List <AutomationPeer> list = new List <AutomationPeer>(childrenCount); this.AddChildrenHeaders(headerNode, oldHeaderFooterChildren, list); if (groups != null) { CustomItemContainerGenerator customItemContainerGenerator = m_dataGridContext.CustomItemContainerGenerator; DataGridGroupAutomationPeer peer; itemsCount = groups.Count; for (int i = 0; i < itemsCount; i++) { CollectionViewGroup collectionViewGroup = groups[i] as CollectionViewGroup; if (collectionViewGroup != null) { Group uiGroup = customItemContainerGenerator.GetGroupFromCollectionViewGroup(null, collectionViewGroup); if (uiGroup != null) { peer = uiGroup.CreateAutomationPeer() as DataGridGroupAutomationPeer; if (peer != null) { list.Add(peer); } } } } } else { int index = 0; foreach (object item in ( IEnumerable )items) { DataGridItemAutomationPeer itemAutomationPeer = oldDataChildren[item] as DataGridItemAutomationPeer; if (itemAutomationPeer == null) { if (itemsIsAllItems) { itemAutomationPeer = this.CreateItemAutomationPeer(item, index); index++; } else { itemAutomationPeer = this.CreateItemAutomationPeer(item, -1); } } else { if (itemsIsAllItems) { itemAutomationPeer.SetIndex(index); index++; } else { itemAutomationPeer.SetIndex(-1); } } // Force EventsSource to be updated itemAutomationPeer.GetWrapperPeer(); if (m_dataChildren[item] == null) { list.Add(itemAutomationPeer); m_dataChildren[item] = itemAutomationPeer; } } } this.AddChildrenFooters(footerNode, oldHeaderFooterChildren, list); return(list); }
public IRawElementProviderSimple FindItemByProperty(IRawElementProviderSimple startAfter, int propertyId, object value) { if ((propertyId != 0) && (!DataGridContextAutomationPeer.IsPropertySupportedForFindItem(propertyId))) { throw new ArgumentException("Property not supported"); } if (m_dataGridContext == null) { return(null); } CollectionView items = m_dataGridContext.Items; int itemsCount = (items == null) ? 0 : items.Count; DataGridItemAutomationPeer startAfterItemPeer = null; HeaderFooterItemAutomationPeer startAfterHeaderFooterPeer = null; if (startAfter != null) { AutomationPeer startAfterPeer = this.PeerFromProvider(startAfter); if (startAfterPeer == null) { return(null); } startAfterItemPeer = startAfterPeer as DataGridItemAutomationPeer; startAfterHeaderFooterPeer = startAfterPeer as HeaderFooterItemAutomationPeer; } int startIndex = 0; // Get header count HeadersFootersGeneratorNode headerNode = m_dataGridContext.CustomItemContainerGenerator.Header; int headersCount = (headerNode == null) ? 0 : headerNode.ItemCount; int fixedHeadersCount = 0; Panel fixedHeadersPanel = null; // Get footer count HeadersFootersGeneratorNode footerNode = m_dataGridContext.CustomItemContainerGenerator.Footer; int footersCount = (footerNode == null) ? 0 : footerNode.ItemCount; int fixedFootersCount = 0; Panel fixedFootersPanel = null; if (m_parentDataGridContext == null) { // Add the fixed header / footer count to the children fixedHeadersPanel = m_dataGridControl.FixedHeadersHostPanel; fixedHeadersCount = (fixedHeadersPanel != null) ? fixedHeadersPanel.Children.Count : 0; fixedFootersPanel = m_dataGridControl.FixedFootersHostPanel; fixedFootersCount = (fixedFootersPanel != null) ? fixedFootersPanel.Children.Count : 0; } int childrenCount = headersCount + fixedHeadersCount + footersCount + fixedFootersCount + itemsCount; if (startAfterItemPeer != null) { startIndex = fixedHeadersCount + headersCount + startAfterItemPeer.Index + 1; } else if (startAfterHeaderFooterPeer != null) { startIndex = startAfterHeaderFooterPeer.Index + 1; switch (startAfterHeaderFooterPeer.Type) { case HeaderFooterItemAutomationPeer.HeaderFooterType.FixedHeader: { break; } case HeaderFooterItemAutomationPeer.HeaderFooterType.Header: { startIndex += fixedHeadersCount; break; } case HeaderFooterItemAutomationPeer.HeaderFooterType.Footer: { startIndex += fixedHeadersCount + headersCount + itemsCount; break; } case HeaderFooterItemAutomationPeer.HeaderFooterType.FixedFooter: { startIndex += fixedHeadersCount + headersCount + footersCount + itemsCount; break; } } } // Force a children refresh and update our inner caching this.GetChildren(); if (propertyId == 0) { AutomationPeer peer = this.GetPeerForChildrenIndex(startIndex); if (peer == null) { return(null); } return(this.ProviderFromPeer(peer)); } object propertyValue = null; // Search in footer/Fixed footer first if (footersCount + fixedFootersCount > 0) { int footerStartIndex = System.Math.Max(startIndex, childrenCount - footersCount - fixedFootersCount); for (int i = startIndex; i < childrenCount; i++) { AutomationPeer peer = this.GetPeerForChildrenIndex(i); if (peer != null) { try { propertyValue = peer.GetPropertyValue(propertyId); } catch (Exception exception) { if (exception is ElementNotAvailableException) { continue; } } if (object.Equals(value, propertyValue)) { return(this.ProviderFromPeer(peer)); } } } childrenCount -= footersCount + fixedFootersCount; } // Search in the header/Fixed header and data item for (int i = startIndex; i < childrenCount; i++) { AutomationPeer peer = this.GetPeerForChildrenIndex(i); if (peer != null) { try { propertyValue = peer.GetPropertyValue(propertyId); } catch (Exception exception) { if (exception is ElementNotAvailableException) { continue; } } if (object.Equals(value, propertyValue)) { return(this.ProviderFromPeer(peer)); } } } return(null); }