using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections.ObjectModel;
using System.Collections.Specialized;
namespace Developpez.Dotnet.Windows.Collections
{
///
/// Représente une collection d'objet qui fournit des notifications quand des éléments sont ajoutés ou
/// supprimés, ou quand la collection entière est modifiée. Fournit une méthode permettant d'ajouter
/// plusieurs objets à la fois en ne déclenchant qu'une seule notification par groupe d'éléments supprimés.
///
/// Type des éléments de la collection
public class RangeObservableCollection : ObservableCollection
{
///
/// Initialise une nouvelle instance vide de RangeObservableCollection<T>
///
public RangeObservableCollection()
{
}
///
/// Initialise une nouvelle instance de RangeObservableCollection<T> en y copiant
/// les éléments de la séquence spécifiée.
///
/// La séquence à partir de laquelle copier les éléments
public RangeObservableCollection(IEnumerable source)
: base(source)
{
}
///
/// Ajoute tous les éléments spécifiés à la collection. Cette méthode ne déclenche qu'une seule notification pour tous les éléments ajoutés,
/// et non une notification par élément ajouté.
///
/// Les éléments à ajouter
public void AddRange(IEnumerable items)
{
items.CheckArgumentNull("items");
var addedItems = new List();
int startingIndex = this.Count;
foreach (var item in items)
{
this.Items.Add(item);
addedItems.Add(item);
}
var args = new NotifyCollectionChangedEventArgs(
NotifyCollectionChangedAction.Add,
addedItems,
startingIndex);
OnCollectionChanged(args);
}
///
/// Insère tous les éléments spécifiés à l'index spécifié de la collection. Cette méthode ne déclenche qu'une seule notification pour tous les éléments insérés,
/// et non une notification par élément inséré.
///
/// L'index auquel insérer les éléments
/// Les éléments à insérer
public void InsertRange(int index, IEnumerable items)
{
if (index < 0 || index > this.Count)
throw new ArgumentOutOfRangeException("index", ExceptionMessages.ArgMustBeInRange);
items.CheckArgumentNull("items");
var addedItems = new List();
int startingIndex = index;
foreach (var item in items)
{
this.Items.Insert(index++, item);
addedItems.Add(item);
}
var args = new NotifyCollectionChangedEventArgs(
NotifyCollectionChangedAction.Add,
addedItems,
startingIndex);
OnCollectionChanged(args);
}
///
/// Supprime le nombre d'éléments spécifié à partir de l'index spécifié de la collection. Cette méthode ne déclenche qu'une seule notification pour tous les éléments supprimés,
/// et non une notification par élément supprimé.
///
/// L'index à partir duquel supprimer les éléments
/// Le nombre d'éléments à supprimer
public void RemoveRange(int index, int count)
{
if (index < 0)
throw new ArgumentOutOfRangeException("index", ExceptionMessages.ArgMustBePositive);
if (count < 0)
throw new ArgumentOutOfRangeException("count", ExceptionMessages.ArgMustBePositive);
if (index + count > this.Count)
throw new ArgumentException(ExceptionMessages.RemoveRangeBadArgs);
var removedItems = new List();
int startingIndex = index;
for (int i = 0; i < count; i++)
{
removedItems.Add(this.Items[index]);
this.Items.RemoveAt(index);
}
var args = new NotifyCollectionChangedEventArgs(
NotifyCollectionChangedAction.Remove,
removedItems,
startingIndex);
OnCollectionChanged(args);
}
///
/// Supprime tous les éléments de la collection qui vérifient la condition spécifiée.
/// Cette méthode déclenche une notification par groupe d'éléments contigus supprimés,
/// et non une notification par élément supprimé.
///
/// La condition à vérifier
public void RemoveAll(Predicate predicate)
{
int index = 0;
int startIndex = 0;
int count = 0;
while (index < this.Count)
{
if (predicate(this.Items[index]))
{
count++;
index++;
}
else
{
if (count > 0)
{
this.RemoveRange(startIndex, count);
}
startIndex++;
index = startIndex;
count = 0;
}
}
if (count > 0)
{
this.RemoveRange(startIndex, count);
}
}
}
}