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 );
      }
    }
Ejemplo n.º 3
0
        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);
        }
Ejemplo n.º 4
0
        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);
        }
Ejemplo n.º 5
0
        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);
        }