private AutomationPeer GetPeerForChildrenIndex(int index)
        {
            Group owner = this.Owner;
            GroupGeneratorNode generatorNode = owner.GeneratorNode;

            if (generatorNode == null)
            {
                return(null);
            }

            DataGridContext dataGridContext = owner.DataGridContext;

            if (dataGridContext == null)
            {
                return(null);
            }

            DataGridContextAutomationPeer dataGridContextAutomationPeer = dataGridContext.Peer;
            HeadersFootersGeneratorNode   headerNode = generatorNode.GetHeaderNode();
            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;
                IList <object> items      = owner.GetItems();
                int            itemsCount = (items == null) ? 0 : items.Count;

                if (index < itemsCount)
                {
                    return(dataGridContextAutomationPeer.FindOrCreateItemAutomationPeer(items[index], -1));
                }
                else
                {
                    index -= itemsCount;
                    HeadersFootersGeneratorNode footerNode = generatorNode.GetFooterNode();
                    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);
                    }
                }
            }

            return(null);
        }
        static internal 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;
                }
            }
        }
    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 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);
        }