/// <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); }