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 } );
    }
Exemple #2
0
 //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 );