internal void SortRootRawItems( SortDescriptionInfo[] sortDescriptionInfos, List<RawItem> globalRawItems )
    {
      Debug.Assert( this.IsBottomLevel );

      int itemCount = m_sortedRawItems.Count;
      if( itemCount == 0 )
        return;

      int[] indexes;
      indexes = new int[ itemCount + 1 ];
      for( int i = 0; i < itemCount; i++ )
      {
        indexes[ i ] = m_sortedRawItems[ i ].Index;
      }

      // "Weak heap sort" sort array[0..NUM_ELEMENTS-1] to array[1..NUM_ELEMENTS]
      DataGridCollectionViewSort collectionViewSort = new DataGridCollectionViewSort( indexes, sortDescriptionInfos );

      collectionViewSort.Sort( itemCount );
      int index = 0;

      for( int i = 1; i <= itemCount; i++ )
      {
        RawItem newRawItem = globalRawItems[ indexes[ i ] ];
        newRawItem.SetSortedIndex( index );
        m_sortedRawItems[ index ] = newRawItem;
        index++;
      }
    }
Exemplo n.º 2
0
        public override int Compare(int xDataIndex, int yDataIndex)
        {
            ListSortDirection lastSortDirection = ListSortDirection.Ascending;

            if (m_sortDescriptionInfos != null)
            {
                int result = 0;
                int count  = m_sortDescriptionInfos.Length;

                for (int i = 0; i < count; i++)
                {
                    SortDescriptionInfo sortDescriptionInfo = m_sortDescriptionInfos[i];

                    lastSortDirection = sortDescriptionInfo.SortDirection;

                    if (sortDescriptionInfo.Property == null)
                    {
                        continue;
                    }

                    IComparer sortComparer = sortDescriptionInfo.SortComparer;
                    DataStore dataStore    = sortDescriptionInfo.DataStore;

                    if (sortComparer != null)
                    {
                        result = sortComparer.Compare(dataStore.GetData(xDataIndex), dataStore.GetData(yDataIndex));
                    }
                    else
                    {
                        result = dataStore.Compare(xDataIndex, yDataIndex);
                    }

                    if (result != 0)
                    {
                        if (lastSortDirection == ListSortDirection.Descending)
                        {
                            result = -result;
                        }

                        return(result);
                    }
                }
            }

            if (lastSortDirection == ListSortDirection.Descending)
            {
                return(yDataIndex - xDataIndex);
            }

            return(xDataIndex - yDataIndex);
        }
    public bool IsReverseOf( SortDescriptionInfo sortDescriptionInfo )
    {
      if( sortDescriptionInfo.m_property == m_property )
      {
        switch( sortDescriptionInfo.m_direction )
        {
          case ListSortDirection.Ascending:
            return m_direction == ListSortDirection.Descending;

          case ListSortDirection.Descending:
            return m_direction == ListSortDirection.Ascending;
        }
      }

      return false;
    }
        public bool IsReverseOf(SortDescriptionInfo sortDescriptionInfo)
        {
            if (sortDescriptionInfo.m_property == m_property)
            {
                switch (sortDescriptionInfo.m_direction)
                {
                case ListSortDirection.Ascending:
                    return(m_direction == ListSortDirection.Descending);

                case ListSortDirection.Descending:
                    return(m_direction == ListSortDirection.Ascending);
                }
            }

            return(false);
        }
        public override bool Equals(object obj)
        {
            SortDescriptionInfo sortDescriptionInfo = obj as SortDescriptionInfo;

            if (sortDescriptionInfo == null)
            {
                return(false);
            }

            if ((sortDescriptionInfo.m_direction == m_direction) &&
                (sortDescriptionInfo.m_property == m_property))
            {
                return(true);
            }

            return(false);
        }
    internal void SortItems(
      SortDescriptionInfo[] sortDescriptionInfos,
      GroupSortComparer[] groupSortComparers,
      int level,
      List<RawItem> globalRawItems,
      DataGridCollectionViewGroup newSortedGroup )
    {
      int itemCount = this.ItemCount;

      if( itemCount == 0 )
        return;

      ObservableCollection<object> groupItems = this.ProtectedItems;

      if( this.IsBottomLevel )
      {
        int[] indexes;

        indexes = new int[ itemCount + 1 ];

        for( int i = 0; i < itemCount; i++ )
        {
          indexes[ i ] = m_sortedRawItems[ i ].Index;
        }

        // "Weak heap sort" sort array[0..NUM_ELEMENTS-1] to array[1..NUM_ELEMENTS]
        DataGridCollectionViewSort collectionViewSort =
          new DataGridCollectionViewSort( indexes, sortDescriptionInfos );

        collectionViewSort.Sort( itemCount );
        int index = 0;

        for( int i = 1; i <= itemCount; i++ )
        {
          newSortedGroup.InsertRawItem( index, globalRawItems[ indexes[ i ] ] );
          index++;
        }
      }
      else
      {
        int[] indexes;

        indexes = new int[ itemCount + 1 ];

        for( int i = 0; i < itemCount; i++ )
        {
          indexes[ i ] = i;
        }

        // "Weak heap sort" sort array[0..NUM_ELEMENTS-1] to array[1..NUM_ELEMENTS]
        DataGridCollectionViewGroupSort collectionViewSort =
          new DataGridCollectionViewGroupSort( indexes, groupSortComparers[ level ], this );

        collectionViewSort.Sort( itemCount );
        int index = 0;
        level++;

        for( int i = 1; i <= itemCount; i++ )
        {
          DataGridCollectionViewGroup oldGroup = ( DataGridCollectionViewGroup )groupItems[ indexes[ i ] ];
          DataGridCollectionViewGroup newGroup = new DataGridCollectionViewGroup( oldGroup, newSortedGroup );

          // Sort sub items
          oldGroup.SortItems( sortDescriptionInfos, groupSortComparers, level, globalRawItems, newGroup );

          newSortedGroup.InsertGroup( index, newGroup );
          index++;
        }
      }
    }
 public DataGridCollectionViewSort( int[] dataIndexArray, SortDescriptionInfo[] sortDescriptionInfos )
   : base( dataIndexArray )
 {
   m_sortDescriptionInfos = sortDescriptionInfos;
 }