/// <summary>
        /// It returns the CellItemAutomationPeer if it exist corresponding to the item otherwise it creates
        /// one and adds the Handle and parent info by calling AddParentInfo.
        /// </summary>
        /// <param name="column"></param>
        /// <param name="addParentInfo">only required when creating peers for virtualized cells</param>
        /// <returns></returns>
        private DataGridCellItemAutomationPeer GetOrCreateCellItemPeer(DataGridColumn column, bool addParentInfo)
        {
            // try to reuse old peer if it exists either in Current AT or in WeakRefStorage of Peers being sent to Client
            DataGridCellItemAutomationPeer peer = CellItemPeers[column];

            if (peer == null)
            {
                peer = GetPeerFromWeakRefStorage(column);
                if (peer != null && !addParentInfo)
                {
                    // As cached peer is getting used it must be invalidated. addParentInfo check ensures that call is coming from GetChildrenCore
                    peer.AncestorsInvalid = false;
                    peer.ChildrenValid    = false;
                }
            }

            if (peer == null)
            {
                peer = new DataGridCellItemAutomationPeer(Item, column);
                if (addParentInfo && peer != null)
                {
                    peer.TrySetParentInfo(this);
                }
            }

            //perform hookup so the events sourced from wrapper peer are fired as if from the data item
            AutomationPeer wrapperPeer = peer.OwningCellPeer;

            if (wrapperPeer != null)
            {
                wrapperPeer.EventsSource = peer;
            }

            return(peer);
        }
        private DataGridCellItemAutomationPeer GetOrCreateCellItemPeer(DataGridColumn column, bool addParentInfo)
        {
            DataGridCellItemAutomationPeer dataGridCellItemAutomationPeer = this.CellItemPeers[column];

            if (dataGridCellItemAutomationPeer == null)
            {
                dataGridCellItemAutomationPeer = this.GetPeerFromWeakRefStorage(column);
                if (dataGridCellItemAutomationPeer != null && !addParentInfo)
                {
                    dataGridCellItemAutomationPeer.AncestorsInvalid = false;
                    dataGridCellItemAutomationPeer.ChildrenValid    = false;
                }
            }
            if (dataGridCellItemAutomationPeer == null)
            {
                dataGridCellItemAutomationPeer = new DataGridCellItemAutomationPeer(base.Item, column);
                if (addParentInfo && dataGridCellItemAutomationPeer != null)
                {
                    dataGridCellItemAutomationPeer.TrySetParentInfo(this);
                }
            }
            AutomationPeer owningCellPeer = dataGridCellItemAutomationPeer.OwningCellPeer;

            if (owningCellPeer != null)
            {
                owningCellPeer.EventsSource = dataGridCellItemAutomationPeer;
            }
            return(dataGridCellItemAutomationPeer);
        }
        /// <summary>Retrieves a UI Automation provider for each child element that is selected.</summary>
        /// <returns>A collection of UI Automation providers. </returns>
        // Token: 0x060025F3 RID: 9715 RVA: 0x000B5BC8 File Offset: 0x000B3DC8
        IRawElementProviderSimple[] ISelectionProvider.GetSelection()
        {
            DataGrid owningDataGrid = this.OwningDataGrid;

            if (owningDataGrid == null)
            {
                return(null);
            }
            int num = owningDataGrid.Items.IndexOf(base.Item);

            if (num > -1 && owningDataGrid.SelectedCellsInternal.Intersects(num))
            {
                List <IRawElementProviderSimple> list = new List <IRawElementProviderSimple>();
                for (int i = 0; i < this.OwningDataGrid.Columns.Count; i++)
                {
                    if (owningDataGrid.SelectedCellsInternal.Contains(num, i))
                    {
                        DataGridColumn column = owningDataGrid.ColumnFromDisplayIndex(i);
                        DataGridCellItemAutomationPeer orCreateCellItemPeer = this.GetOrCreateCellItemPeer(column);
                        if (orCreateCellItemPeer != null)
                        {
                            list.Add(base.ProviderFromPeer(orCreateCellItemPeer));
                        }
                    }
                }
                if (list.Count > 0)
                {
                    return(list.ToArray());
                }
            }
            return(null);
        }
        // Token: 0x060025F8 RID: 9720 RVA: 0x000B5E38 File Offset: 0x000B4038
        internal void AddProxyToWeakRefStorage(WeakReference wr, DataGridCellItemAutomationPeer cellItemPeer)
        {
            IList <DataGridColumn> columns = this.OwningDataGrid.Columns;

            if (columns != null && columns.Contains(cellItemPeer.Column) && this.GetPeerFromWeakRefStorage(cellItemPeer.Column) == null)
            {
                this.WeakRefElementProxyStorage[cellItemPeer.Column] = wr;
            }
        }
        /// <summary>
        /// Realized Columns only
        /// </summary>
        /// <returns></returns>
        internal List <AutomationPeer> GetCellItemPeers()
        {
            List <AutomationPeer> children = null;
            ItemPeersStorage <DataGridCellItemAutomationPeer> newChildren = new ItemPeersStorage <DataGridCellItemAutomationPeer>();

            IList       childItems     = null;
            bool        usingItemsHost = false;
            DataGridRow row            = GetWrapper() as DataGridRow;

            if (row != null)
            {
                if (row.CellsPresenter != null)
                {
                    Panel itemHost = row.CellsPresenter.ItemsHost;
                    if (itemHost != null)
                    {
                        childItems     = itemHost.Children;
                        usingItemsHost = true;
                    }
                }
            }

            if (!usingItemsHost)
            {
                childItems = OwningDataGrid.Columns;
            }

            if (childItems != null)
            {
                children = new List <AutomationPeer>(childItems.Count);
                foreach (object childItem in childItems)
                {
                    DataGridColumn column = null;
                    if (usingItemsHost)
                    {
                        column = (childItem as DataGridCell).Column;
                    }
                    else
                    {
                        column = childItem as DataGridColumn;
                    }

                    if (column != null)
                    {
                        DataGridCellItemAutomationPeer peer = GetOrCreateCellItemPeer(column, /*addParentInfo*/ false);
                        children.Add(peer);
                        newChildren[column] = peer;
                    }
                }
            }

            // Cache children for reuse
            CellItemPeers = newChildren;
            return(children);
        }
        // This method is called from DataGrid.OnBeginningEdit/OnCommittingEdit/OnCancelingEdit
        // Raises Invoked event when cell begin/cancel/commit edit
        internal void RaiseAutomationCellInvokeEvents(DataGridColumn column, DataGridRow row)
        {
            DataGridItemAutomationPeer dataGridItemAutomationPeer = FindOrCreateItemAutomationPeer(row.Item) as DataGridItemAutomationPeer;

            if (dataGridItemAutomationPeer != null)
            {
                DataGridCellItemAutomationPeer cellPeer = dataGridItemAutomationPeer.GetOrCreateCellItemPeer(column);
                if (cellPeer != null)
                {
                    cellPeer.RaiseAutomationEvent(AutomationEvents.InvokePatternOnInvoked);
                }
            }
        }
        // Token: 0x060025F4 RID: 9716 RVA: 0x000B5C6C File Offset: 0x000B3E6C
        internal List <AutomationPeer> GetCellItemPeers()
        {
            List <AutomationPeer> list = null;
            ItemPeersStorage <DataGridCellItemAutomationPeer> itemPeersStorage = new ItemPeersStorage <DataGridCellItemAutomationPeer>();
            IList       list2       = null;
            bool        flag        = false;
            DataGridRow dataGridRow = base.GetWrapper() as DataGridRow;

            if (dataGridRow != null && dataGridRow.CellsPresenter != null)
            {
                Panel itemsHost = dataGridRow.CellsPresenter.ItemsHost;
                if (itemsHost != null)
                {
                    list2 = itemsHost.Children;
                    flag  = true;
                }
            }
            if (!flag)
            {
                list2 = this.OwningDataGrid.Columns;
            }
            if (list2 != null)
            {
                list = new List <AutomationPeer>(list2.Count);
                foreach (object obj in list2)
                {
                    DataGridColumn dataGridColumn;
                    if (flag)
                    {
                        dataGridColumn = (obj as DataGridCell).Column;
                    }
                    else
                    {
                        dataGridColumn = (obj as DataGridColumn);
                    }
                    if (dataGridColumn != null)
                    {
                        DataGridCellItemAutomationPeer orCreateCellItemPeer = this.GetOrCreateCellItemPeer(dataGridColumn, false);
                        list.Add(orCreateCellItemPeer);
                        itemPeersStorage[dataGridColumn] = orCreateCellItemPeer;
                    }
                }
            }
            this.CellItemPeers = itemPeersStorage;
            return(list);
        }
 /// <summary>Retrieves the UI Automation provider for the specified cell.</summary>
 /// <param name="row">The ordinal number of the row of interest.</param>
 /// <param name="column">The ordinal number of the column of interest.</param>
 /// <returns>The UI Automation provider for the specified cell.</returns>
 // Token: 0x0600256F RID: 9583 RVA: 0x000B40E0 File Offset: 0x000B22E0
 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];
         DataGridColumn column2 = this.OwningDataGrid.Columns[column];
         this.OwningDataGrid.ScrollIntoView(item, column2);
         this.OwningDataGrid.UpdateLayout();
         DataGridItemAutomationPeer dataGridItemAutomationPeer = this.FindOrCreateItemAutomationPeer(item) as DataGridItemAutomationPeer;
         if (dataGridItemAutomationPeer != null)
         {
             DataGridCellItemAutomationPeer orCreateCellItemPeer = dataGridItemAutomationPeer.GetOrCreateCellItemPeer(column2);
             if (orCreateCellItemPeer != null)
             {
                 return(base.ProviderFromPeer(orCreateCellItemPeer));
             }
         }
     }
     return(null);
 }
        // This method is called from DataGrid.OnSelectedCellsChanged
        // Raises the selection events when Cell selection changes
        internal void RaiseAutomationCellSelectedEvent(SelectedCellsChangedEventArgs e)
        {
            // If the result of an AddToSelection or RemoveFromSelection is a single selected cell,
            // then all we raise is the ElementSelectedEvent for single item
            if (AutomationPeer.ListenerExists(AutomationEvents.SelectionItemPatternOnElementSelected) &&
                this.OwningDataGrid.SelectedCells.Count == 1 && e.AddedCells.Count == 1)
            {
                DataGridCellItemAutomationPeer cellPeer = GetCellItemPeer(e.AddedCells[0]);
                if (cellPeer != null)
                {
                    cellPeer.RaiseAutomationEvent(AutomationEvents.SelectionItemPatternOnElementSelected);
                }
            }
            else
            {
                int i;
                if (AutomationPeer.ListenerExists(AutomationEvents.SelectionItemPatternOnElementAddedToSelection))
                {
                    for (i = 0; i < e.AddedCells.Count; i++)
                    {
                        DataGridCellItemAutomationPeer cellPeer = GetCellItemPeer(e.AddedCells[i]);
                        if (cellPeer != null)
                        {
                            cellPeer.RaiseAutomationEvent(AutomationEvents.SelectionItemPatternOnElementAddedToSelection);
                        }
                    }
                }

                if (AutomationPeer.ListenerExists(AutomationEvents.SelectionItemPatternOnElementRemovedFromSelection))
                {
                    for (i = 0; i < e.RemovedCells.Count; i++)
                    {
                        DataGridCellItemAutomationPeer cellPeer = GetCellItemPeer(e.RemovedCells[i]);
                        if (cellPeer != null)
                        {
                            cellPeer.RaiseAutomationEvent(AutomationEvents.SelectionItemPatternOnElementRemovedFromSelection);
                        }
                    }
                }
            }
        }
        IRawElementProviderSimple[] ISelectionProvider.GetSelection()
        {
            DataGrid dataGrid = this.OwningDataGrid;

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

            int rowIndex = dataGrid.Items.IndexOf(Item);

            // If row has selection
            if (rowIndex > -1 && dataGrid.SelectedCellsInternal.Intersects(rowIndex))
            {
                List <IRawElementProviderSimple> selectedProviders = new List <IRawElementProviderSimple>();

                for (int i = 0; i < this.OwningDataGrid.Columns.Count; i++)
                {
                    // cell is selected
                    if (dataGrid.SelectedCellsInternal.Contains(rowIndex, i))
                    {
                        DataGridColumn column = dataGrid.ColumnFromDisplayIndex(i);
                        DataGridCellItemAutomationPeer peer = GetOrCreateCellItemPeer(column);
                        if (peer != null)
                        {
                            selectedProviders.Add(ProviderFromPeer(peer));
                        }
                    }
                }

                if (selectedProviders.Count > 0)
                {
                    return(selectedProviders.ToArray());
                }
            }

            return(null);
        }
        // Token: 0x060025F7 RID: 9719 RVA: 0x000B5DDC File Offset: 0x000B3FDC
        private DataGridCellItemAutomationPeer GetPeerFromWeakRefStorage(object column)
        {
            DataGridCellItemAutomationPeer dataGridCellItemAutomationPeer = null;
            WeakReference weakReference = this.WeakRefElementProxyStorage[column];

            if (weakReference != null)
            {
                ElementProxy elementProxy = weakReference.Target as ElementProxy;
                if (elementProxy != null)
                {
                    dataGridCellItemAutomationPeer = (base.PeerFromProvider(elementProxy) as DataGridCellItemAutomationPeer);
                    if (dataGridCellItemAutomationPeer == null)
                    {
                        this.WeakRefElementProxyStorage.Remove(column);
                    }
                }
                else
                {
                    this.WeakRefElementProxyStorage.Remove(column);
                }
            }
            return(dataGridCellItemAutomationPeer);
        }
 // Token: 0x06002578 RID: 9592 RVA: 0x000B4374 File Offset: 0x000B2574
 internal void RaiseAutomationCellSelectedEvent(SelectedCellsChangedEventArgs e)
 {
     if (AutomationPeer.ListenerExists(AutomationEvents.SelectionItemPatternOnElementSelected) && this.OwningDataGrid.SelectedCells.Count == 1 && e.AddedCells.Count == 1)
     {
         DataGridCellItemAutomationPeer cellItemPeer = this.GetCellItemPeer(e.AddedCells[0]);
         if (cellItemPeer != null)
         {
             cellItemPeer.RaiseAutomationEvent(AutomationEvents.SelectionItemPatternOnElementSelected);
             return;
         }
     }
     else
     {
         if (AutomationPeer.ListenerExists(AutomationEvents.SelectionItemPatternOnElementAddedToSelection))
         {
             for (int i = 0; i < e.AddedCells.Count; i++)
             {
                 DataGridCellItemAutomationPeer cellItemPeer2 = this.GetCellItemPeer(e.AddedCells[i]);
                 if (cellItemPeer2 != null)
                 {
                     cellItemPeer2.RaiseAutomationEvent(AutomationEvents.SelectionItemPatternOnElementAddedToSelection);
                 }
             }
         }
         if (AutomationPeer.ListenerExists(AutomationEvents.SelectionItemPatternOnElementRemovedFromSelection))
         {
             for (int i = 0; i < e.RemovedCells.Count; i++)
             {
                 DataGridCellItemAutomationPeer cellItemPeer3 = this.GetCellItemPeer(e.RemovedCells[i]);
                 if (cellItemPeer3 != null)
                 {
                     cellItemPeer3.RaiseAutomationEvent(AutomationEvents.SelectionItemPatternOnElementRemovedFromSelection);
                 }
             }
         }
     }
 }
        // Provides Peer if exist in Weak Reference Storage
        private DataGridCellItemAutomationPeer GetPeerFromWeakRefStorage(object column)
        {
            DataGridCellItemAutomationPeer returnPeer = null;
            WeakReference weakRefEP = WeakRefElementProxyStorage[column];

            if (weakRefEP != null)
            {
                ElementProxy provider = weakRefEP.Target as ElementProxy;
                if (provider != null)
                {
                    returnPeer = PeerFromProvider(provider as IRawElementProviderSimple) as DataGridCellItemAutomationPeer;
                    if (returnPeer == null)
                    {
                        WeakRefElementProxyStorage.Remove(column);
                    }
                }
                else
                {
                    WeakRefElementProxyStorage.Remove(column);
                }
            }

            return(returnPeer);
        }
        private DataGridCellItemAutomationPeer GetOrCreateCellItemPeer(DataGridColumn column, bool addParentInfo)
        {
            // try to reuse old peer if it exists either in Current AT or in WeakRefStorage of Peers being sent to Client
            DataGridCellItemAutomationPeer peer = CellItemPeers[column];
            if (peer == null)
            {
                peer = GetPeerFromWeakRefStorage(column);
                if (peer != null && !addParentInfo)
                {
                    // As cached peer is getting used it must be invalidated. addParentInfo check ensures that call is coming from GetChildrenCore
                    peer.AncestorsInvalid = false;
                    peer.ChildrenValid = false;
                }
            }

            if (peer == null)
            {
                peer = new DataGridCellItemAutomationPeer(_item, column);
                if (addParentInfo && peer != null)
                {
                    peer.TrySetParentInfo(this);
                }
            }
            
            //perform hookup so the events sourced from wrapper peer are fired as if from the data item
            AutomationPeer wrapperPeer = peer.OwningCellPeer;
            if (wrapperPeer != null)
            {
                wrapperPeer.EventsSource = peer;
            }

            return peer;
        }
        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 (!SelectorAutomationPeer.IsPropertySupportedByControlForFindItemInternal(propertyId))
                {
                    throw new ArgumentException(SR.Get(SRID.PropertyNotSupported));
                }
            }


            IList <DataGridColumn> columns = OwningDataGrid.Columns;

            if (columns != null && columns.Count > 0)
            {
                DataGridCellItemAutomationPeer startAfterItem = null;
                if (startAfter != null)
                {
                    // get the peer corresponding to this provider
                    startAfterItem = PeerFromProvider(startAfter) as DataGridCellItemAutomationPeer;
                }

                // startIndex refers to the index of the item just after startAfterItem
                int startIndex = 0;
                if (startAfterItem != null)
                {
                    if (startAfterItem.Column == null)
                    {
                        throw new InvalidOperationException(SR.Get(SRID.InavalidStartItem));
                    }

                    // To find the index of the item in items collection which occurs
                    // immidiately after startAfterItem.Item
                    startIndex = columns.IndexOf(startAfterItem.Column) + 1;
                    if (startIndex == 0 || startIndex == columns.Count)
                    {
                        return(null);
                    }
                }

                if (propertyId == 0 && startIndex < columns.Count)
                {
                    return(ProviderFromPeer(GetOrCreateCellItemPeer(columns[startIndex])));
                }

                DataGridCellItemAutomationPeer currentItemPeer;
                object currentValue = null;
                for (int i = startIndex; i < columns.Count; i++)
                {
                    currentItemPeer = GetOrCreateCellItemPeer(columns[i]);
                    if (currentItemPeer == null)
                    {
                        continue;
                    }
                    try
                    {
                        currentValue = SelectorAutomationPeer.GetSupportedPropertyValueInternal(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)
                        {
                            return(ProviderFromPeer(currentItemPeer));
                        }
                        else
                        {
                            continue;
                        }
                    }

                    // Match is found within the specified criterion of search
                    if (value.Equals(currentValue))
                    {
                        return(ProviderFromPeer(currentItemPeer));
                    }
                }
            }
            return(null);
        }
 // Called by DataGridCellItemAutomationPeer
 internal void AddProxyToWeakRefStorage(WeakReference wr, DataGridCellItemAutomationPeer cellItemPeer)
 {
     IList<DataGridColumn> columns = OwningDataGrid.Columns;
     if (columns != null && columns.Contains(cellItemPeer.Column))
     {
         if (GetPeerFromWeakRefStorage(cellItemPeer.Column) == null)
             WeakRefElementProxyStorage[cellItemPeer.Column] = wr;
     }
 }
        /// <summary>Retrieves an element by the specified property value.</summary>
        /// <param name="startAfter">The item in the container after which to begin the search.</param>
        /// <param name="propertyId">The property that contains the value to retrieve.</param>
        /// <param name="value">The value to retrieve.</param>
        /// <returns>The first item that matches the search criterion; otherwise, <see langword="null" /> if no items match.</returns>
        // Token: 0x060025E9 RID: 9705 RVA: 0x000B5858 File Offset: 0x000B3A58
        IRawElementProviderSimple IItemContainerProvider.FindItemByProperty(IRawElementProviderSimple startAfter, int propertyId, object value)
        {
            base.ResetChildrenCache();
            if (propertyId != 0 && !SelectorAutomationPeer.IsPropertySupportedByControlForFindItemInternal(propertyId))
            {
                throw new ArgumentException(SR.Get("PropertyNotSupported"));
            }
            IList <DataGridColumn> columns = this.OwningDataGrid.Columns;

            if (columns != null && columns.Count > 0)
            {
                DataGridCellItemAutomationPeer dataGridCellItemAutomationPeer = null;
                if (startAfter != null)
                {
                    dataGridCellItemAutomationPeer = (base.PeerFromProvider(startAfter) as DataGridCellItemAutomationPeer);
                }
                int num = 0;
                if (dataGridCellItemAutomationPeer != null)
                {
                    if (dataGridCellItemAutomationPeer.Column == null)
                    {
                        throw new InvalidOperationException(SR.Get("InavalidStartItem"));
                    }
                    num = columns.IndexOf(dataGridCellItemAutomationPeer.Column) + 1;
                    if (num == 0 || num == columns.Count)
                    {
                        return(null);
                    }
                }
                if (propertyId == 0 && num < columns.Count)
                {
                    return(base.ProviderFromPeer(this.GetOrCreateCellItemPeer(columns[num])));
                }
                object obj = null;
                for (int i = num; i < columns.Count; i++)
                {
                    DataGridCellItemAutomationPeer orCreateCellItemPeer = this.GetOrCreateCellItemPeer(columns[i]);
                    if (orCreateCellItemPeer != null)
                    {
                        try
                        {
                            obj = SelectorAutomationPeer.GetSupportedPropertyValueInternal(orCreateCellItemPeer, propertyId);
                        }
                        catch (Exception ex)
                        {
                            if (ex is ElementNotAvailableException)
                            {
                                goto IL_108;
                            }
                        }
                        if (value == null || obj == null)
                        {
                            if (obj == null && value == null)
                            {
                                return(base.ProviderFromPeer(orCreateCellItemPeer));
                            }
                        }
                        else if (value.Equals(obj))
                        {
                            return(base.ProviderFromPeer(orCreateCellItemPeer));
                        }
                    }
                    IL_108 :;
                }
            }
            return(null);
        }