protected internal override void OnQueryItems( VirtualPage page, AsyncQueryInfo queryInfo ) { base.OnQueryItems( page, queryInfo ); DataGridVirtualizingQueryableCollectionViewGroup collectionViewGroup = this.GetLinkedCollectionViewGroup( page.ParentVirtualList ) as DataGridVirtualizingQueryableCollectionViewGroup; IQueryable queryableToUse; int virtualItemCount = collectionViewGroup.VirtualItemCount; bool queryableIsReversed; if( ( !m_supportsPrimaryKeyOptimizations ) || ( queryInfo.StartIndex < ( virtualItemCount / 2 ) ) ) { queryableIsReversed = false; queryableToUse = collectionViewGroup.Queryable.Slice( queryInfo.StartIndex, queryInfo.RequestedItemCount ); } else { queryableIsReversed = true; int reversedStartIndex = virtualItemCount - ( queryInfo.StartIndex + queryInfo.RequestedItemCount ); queryableToUse = collectionViewGroup.ReversedQueryable.Slice( reversedStartIndex, queryInfo.RequestedItemCount ); } System.Threading.ThreadPool.QueueUserWorkItem( new System.Threading.WaitCallback( this.AsyncGatherItems ), new object[] { queryInfo, queryableToUse, queryableIsReversed } ); }
//PageTable object constructor public PageTable(RealMachine realMachine) { _realMachine = realMachine; for (int i = 0; i < Settings.Default.VirtualPagesCount; i++) { VirtualPages[i] = new VirtualPage(i); } }
protected internal override void OnQueryItemsCompleted( VirtualPage page, AsyncQueryInfo queryInfo, object[] fetchedItems ) { DataGridVirtualizingQueryableCollectionView collectionView = this.CollectionView as DataGridVirtualizingQueryableCollectionView; // The VirtualPageManager was Disposed if( collectionView == null ) return; using( collectionView.DeferRefresh() ) { base.OnQueryItemsCompleted( page, queryInfo, fetchedItems ); } }
protected internal override void OnAbortQueryItems( VirtualPage page, AsyncQueryInfo queryInfo ) { DataGridVirtualizingCollectionView collectionView = this.CollectionView as DataGridVirtualizingCollectionView; // The VirtualPageManager was Disposed if( collectionView == null ) return; DataGridVirtualizingCollectionViewGroup collectionViewGroup = this.GetLinkedCollectionViewGroup( page.ParentVirtualList ) as DataGridVirtualizingCollectionViewGroup; collectionView.OnAbortQueryItems( queryInfo, collectionViewGroup ); base.OnAbortQueryItems( page, queryInfo ); }
public void AddPage( VirtualPage page ) { Debug.Assert( !m_virtualPages.Contains( page ) ); m_virtualPages.Add( page ); int itemCount = page.Count; for( int i = 0; i < itemCount; i++ ) { VirtualizedItemInfo virtualizedItemInfo = page[ i ]; Debug.Assert( !m_objectVersusIndexDictionary.ContainsKey( virtualizedItemInfo.DataItem ) ); Debug.Assert( !m_indexVersusPageDictionary.ContainsKey( virtualizedItemInfo.Index ) ); m_objectVersusIndexDictionary.Add( virtualizedItemInfo.DataItem, virtualizedItemInfo.Index ); m_indexVersusPageDictionary.Add( virtualizedItemInfo.Index, page ); } }
public void RemovePage( VirtualPage page ) { Debug.Assert( m_virtualPages.Contains( page ) ); int itemCount = page.Count; for( int i = 0; i < itemCount; i++ ) { VirtualizedItemInfo virtualizedItemInfo = page[ i ]; Debug.Assert( m_objectVersusIndexDictionary.ContainsKey( virtualizedItemInfo.DataItem ) ); Debug.Assert( m_indexVersusPageDictionary.ContainsKey( virtualizedItemInfo.Index ) ); Debug.Assert( m_indexVersusPageDictionary[ virtualizedItemInfo.Index ] == page ); m_objectVersusIndexDictionary.Remove( virtualizedItemInfo.DataItem ); m_indexVersusPageDictionary.Remove( virtualizedItemInfo.Index ); } m_virtualPages.Remove( page ); }
protected internal virtual void OnCommitItems( VirtualPage page, AsyncCommitInfo commitInfo ) { }
protected internal virtual void OnQueryItemsCompleted( VirtualPage page, AsyncQueryInfo queryInfo, object[] fetchedItems ) { this.IncrementVersion(); page.ParentVirtualList.FillEmptyPage( queryInfo, fetchedItems ); }
protected internal virtual void OnAbortQueryItems( VirtualPage page, AsyncQueryInfo queryInfo ) { }
public bool TryGetPageForSourceIndex( int sourceIndex, out VirtualPage page ) { return m_indexVersusPageDictionary.TryGetValue( sourceIndex, out page ); }
internal virtual void OnVirtualListPageRestarting( VirtualList virtualList, VirtualPage page ) { Debug.Assert( m_managedLists.Contains( virtualList ) ); LinkedListNode<VirtualPage> pageNode = m_pageNodes.Find( page ); Debug.Assert( pageNode != null ); // RemovePageNode takes care of either raising the AbortQueryData event or aborting the QueryData Dispatcher Operation altogether. // It also takes care of raising the CommitVirtualData event for loaded pages which contains modified data. this.QueueCommitDataOrAbortIfRequired( pageNode, false ); }
internal void MovePageToFront( VirtualPage page ) { // The further from the front a page is, the longer it has been since it was requested. Debug.Assert( page != null ); LinkedListNode<VirtualPage> firstNode = m_pageNodes.First; if( firstNode.Value != page ) { LinkedListNode<VirtualPage> node = m_pageNodes.Find( page ); m_pageNodes.Remove( node ); m_pageNodes.AddFirst( node ); Debug.WriteLineIf( VirtualPageManager.DebugDataVirtualization, "Moved To Front: Page " + page.ToString() ); } }
protected internal virtual void OnCommitErrorChanged( VirtualPage page, AsyncCommitInfo commitInfo ) { }
public bool TryGetPageForItem( object item, out VirtualPage page ) { page = null; int index; if( m_objectVersusIndexDictionary.TryGetValue( item, out index ) ) return m_indexVersusPageDictionary.TryGetValue( index, out page ); return false; }
protected internal virtual void OnCommitItemsCompleted( VirtualPage page, AsyncCommitInfo commitInfo ) { page.ParentVirtualList.NotifyCommitComplete( commitInfo ); }
protected internal virtual void OnQueryErrorChanged( VirtualPage page, AsyncQueryInfo queryInfo ) { }
internal void QueueQueryData( VirtualPage page ) { Debug.Assert( m_managedLists.Contains( page.ParentVirtualList ) ); page.QueueQueryData( this.Dispatcher ); }
internal void RemovePage( VirtualPage page ) { if( page.IsDisposed ) return; Debug.Assert( page != null ); //Debug.Assert( !page.IsRestarting ); Debug.Assert( !page.IsDirty ); // A filled page is being removed. Change the version. this.IncrementVersion(); // Update the table of content of the page's ParentVirtualList page.ParentVirtualList.TableOfContent.RemovePage( page ); m_pageNodes.Remove( page ); Debug.WriteLineIf( VirtualPageManager.DebugDataVirtualization, "Removed Page: " + page.ToString() ); // Dispose the page since it will never be reused page.Dispose(); }
internal void QueueCommitData( VirtualPage page ) { Debug.WriteLineIf( VirtualPageManager.DebugDataVirtualization, "QueueCommitData for page " + page.ToString() ); Debug.Assert( m_managedLists.Contains( page.ParentVirtualList ) ); Debug.Assert( page.IsFilled ); Debug.Assert( page.IsDirty ); if( this.RestartingManager ) this.ShouldRefreshAfterRestart = true; page.QueueCommitData( this.Dispatcher ); }
internal void AddPage( VirtualPage page, PageInsertPosition insertPosition ) { if( page == null ) throw new ArgumentNullException( "page", "TODOOC: An internal error occured while paging data. Page cannot be null." ); // We call clean-up before the call to AddFirst since if we do // it afterward and the page is pending fill, we will remove it. this.CleanUpAndDisposeUnused(); if( insertPosition == PageInsertPosition.Front ) { m_pageNodes.AddFirst( page ); } else { m_pageNodes.AddLast( page ); } Debug.WriteLineIf( VirtualPageManager.DebugDataVirtualization, "Added To " + ( ( insertPosition == PageInsertPosition.Front ) ? "Front" : "Back" ) + ": Page " + page.ToString() ); }
protected internal abstract void OnBuiltInAbort( VirtualPage virtualPage, AsyncQueryInfo queryInfo );
internal virtual void OnVirtualListPageRestarted( VirtualList virtualList, VirtualPage page ) { Debug.Assert( m_managedLists.Contains( virtualList ) ); Debug.Assert( m_pageNodes.Contains( page ) ); this.RemovePage( page ); }
protected internal abstract void OnQueryItems( VirtualPage page, AsyncQueryInfo queryInfo );