Ejemplo n.º 1
0
        private static void ProcessHeadersNodeVisit(HeadersFootersGeneratorNode headersNode, DataGridContext sourceContext, int minIndex, int maxIndex, IDataGridContextVisitor visitor, ref bool stopVisit)
        {
            for (int i = minIndex; i <= maxIndex; i++)
            {
                var template = headersNode.GetAt(i);

                var groupNode = headersNode.Parent as GroupGeneratorNode;
                if (groupNode != null)
                {
                    visitor.Visit(sourceContext, ( GroupHeaderFooterItem )template, ref stopVisit);
                }
                else
                {
                    visitor.Visit(sourceContext, ( DataTemplate )template, ref stopVisit);
                }

                if (stopVisit)
                {
                    break;
                }
            }
        }
    private int GetStickyFooterCountForNode(
      HeadersFootersGeneratorNode footerNode,
      int footerNodeIndex,
      int realizedIndex,
      bool isRealizedIndexPartOfHeaderNode )
    {
      int stickyFooterCount = 0;

      int footersNodeItemCount = footerNode.ItemCount;
      for( int i = footersNodeItemCount - 1; i >= 0; i-- )
      {
        if( ( isRealizedIndexPartOfHeaderNode )
            && ( footerNodeIndex + i < realizedIndex ) )
        {
          continue;
        }

        object item = footerNode.GetAt( i );

        GroupHeaderFooterItem? groupHeaderFooterItem = null;

        if( item is GroupHeaderFooterItem )
          groupHeaderFooterItem = ( GroupHeaderFooterItem )item;

        if( ( groupHeaderFooterItem != null )
          && ( !( groupHeaderFooterItem.Value.Group.IsBottomLevel ) || !this.IsGroupExpanded( groupHeaderFooterItem.Value.Group ) ) )
        {
          continue;
        }

        stickyFooterCount++;
      }

      return stickyFooterCount;
    }
    private List<StickyContainerGenerated> GenerateStickyFootersForNode(
      HeadersFootersGeneratorNode footerNode,
      int footerNodeIndex,
      int realizedIndex,
      bool isRealizedIndexPartOfFooterNode )
    {
      List<StickyContainerGenerated> generatedStickyContainers = new List<StickyContainerGenerated>();

      int footersNodeItemCount = footerNode.ItemCount;

      // The container is already part of the footer.
      ICustomItemContainerGenerator generator = ( ICustomItemContainerGenerator )this;
      GeneratorPosition position = generator.GeneratorPositionFromIndex( footerNodeIndex + footersNodeItemCount - 1 );

      // In that case, the potential sticky containers are the requested one and bottom.
      using( generator.StartAt( position, GeneratorDirection.Backward, true ) )
      {
        for( int i = footersNodeItemCount - 1; i >= 0; i-- )
        {
          if( ( isRealizedIndexPartOfFooterNode )
              && ( footerNodeIndex + i < realizedIndex ) )
          {
            continue;
          }

          object item = footerNode.GetAt( i );

          GroupHeaderFooterItem? groupHeaderFooterItem = null;

          if( item is GroupHeaderFooterItem )
            groupHeaderFooterItem = ( GroupHeaderFooterItem )item;

          if( ( groupHeaderFooterItem != null )
            && ( !( groupHeaderFooterItem.Value.Group.IsBottomLevel ) || !this.IsGroupExpanded( groupHeaderFooterItem.Value.Group ) ) )
          {
            this.Skip();
            continue;
          }

          bool isNewlyRealized;
          DependencyObject stickyContainer = generator.GenerateNext( out isNewlyRealized );

          generatedStickyContainers.Add( new StickyContainerGenerated( stickyContainer, footerNodeIndex + i, isNewlyRealized ) );
        }
      }

      return generatedStickyContainers;
    }
    private List<StickyContainerGenerated> GenerateStickyHeadersForNode(
      HeadersFootersGeneratorNode headerNode,
      int headerNodeIndex,
      int realizedIndex,
      bool isRealizedIndexPartOfHeaderNode )
    {
      List<StickyContainerGenerated> generatedStickyContainers = new List<StickyContainerGenerated>();

      // The container is already part of the header.
      ICustomItemContainerGenerator generator = ( ICustomItemContainerGenerator )this;
      GeneratorPosition position = generator.GeneratorPositionFromIndex( headerNodeIndex );

      // In that case, the potential sticky containers are the requested one and up.
      using( generator.StartAt( position, GeneratorDirection.Forward, true ) )
      {
        for( int i = 0; i < headerNode.ItemCount; i++ )
        {
          // If the realized index represent the index of one of the HeaderNode
          // item, do not process
          if( ( isRealizedIndexPartOfHeaderNode )
              && ( headerNodeIndex + i > realizedIndex ) )
          {
            break;
          }

          object item = headerNode.GetAt( i );

          GroupHeaderFooterItem? groupHeaderFooterItem = null;

          if( item is GroupHeaderFooterItem )
            groupHeaderFooterItem = ( GroupHeaderFooterItem )item;

          if( ( groupHeaderFooterItem != null )
            && ( !( groupHeaderFooterItem.Value.Group.IsBottomLevel ) || !this.IsGroupExpanded( groupHeaderFooterItem.Value.Group ) ) )
          {
            this.Skip();
            continue;
          }

          bool isNewlyRealized;
          DependencyObject stickyContainer = generator.GenerateNext( out isNewlyRealized );

          generatedStickyContainers.Add( new StickyContainerGenerated( stickyContainer, headerNodeIndex + i, isNewlyRealized ) );
        }
      }

      return generatedStickyContainers;
    }
    private static void ProcessHeadersNodeVisit( HeadersFootersGeneratorNode headersNode, DataGridContext sourceContext, int minIndex, int maxIndex, IDataGridContextVisitor visitor, ref bool stopVisit )
    {
      for( int i = minIndex; i <= maxIndex; i++ )
      {
        object template = headersNode.GetAt( i );

        GroupGeneratorNode groupNode = headersNode.Parent as GroupGeneratorNode;
        if( groupNode != null )
        {
          visitor.Visit( sourceContext, ( GroupHeaderFooterItem )template, ref stopVisit );
        }
        else
        {
          visitor.Visit( sourceContext, ( DataTemplate )template, ref stopVisit );
        }

        if( stopVisit )
          break;
      }
    }