1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
|
private void FilterPlaylist()
{
string Filter = this._CurrentFilter;
// si la chaine n'est pas vide, on doit filtrer
if (Filter != string.Empty)
{
//si la chaine n'a qu'un caractère, on efface tous les filtres précédent, puis on filtre
if (Filter.Length == 1)
{
FilteredPlaylist NewFilteredPlaylist = this.ExtractSubPlaylist(this._SongList, Filter);
this._FilterResult.Clear();
this._FilterResult.Add(Filter, NewFilteredPlaylist);
this._SongListView.Source = NewFilteredPlaylist.SongList;
}
else //sinon on recherche si le filtre n'est pas déjà existant
{
bool FirstLetterInDico = this._FilterResult.ContainsKey(Filter[0].ToString());
/*si la première lettre de la chaîne a déjà été filtré, on cherche si la chaîne complète
n'aurait pas déjà été filtré*/
if (FirstLetterInDico)
{
string DicoKey = Filter;
IEnumerable<Song> SongListToUse;
bool IsInDico = this._FilterResult.ContainsKey(Filter);
/*si la chaîne n'existe pas, on tente de chercher les chaines gardé en mémoire qui s'en
rapproche le plus*/
if (!IsInDico)
{
int i;
bool HasNeighbor = false;
FilteredPlaylist NewFilteredPlaylist;
for (i = Filter.Length - 1; i > 1; i--)
{
HasNeighbor = this._FilterResult.ContainsKey(Filter.Substring(0, i));
if (HasNeighbor)
break;
}
if (HasNeighbor)
DicoKey = Filter.Substring(0, i);
else
DicoKey = Filter[0].ToString();
NewFilteredPlaylist = this.ExtractSubPlaylist(this._FilterResult[DicoKey].SongList, Filter);
this._FilterResult.Add(Filter, NewFilteredPlaylist);
SongListToUse = NewFilteredPlaylist.SongList;
}
else // sinon on extrait la liste filtré
{
if(this._FilterResult.ContainsKey(this._PreviousFilter))
this._FilterResult.Remove(this._PreviousFilter);
SongListToUse = this._FilterResult[Filter].SongList;
}
//on bind la liste à la CollectionView
this._SongListView.Source = SongListToUse;
}
else // sinon cela signifie que l'on commence une nouvelle chaîne, alors on filtre au minimum la première lettre puis la chaîne complète
{
FilteredPlaylist StartFilteredPlaylist = this.ExtractSubPlaylist(this._OnePlaylist, Filter[0].ToString());
FilteredPlaylist NewFilteredPlaylist = this.ExtractSubPlaylist(StartFilteredPlaylist.SongList, Filter);
this._FilterResult.Clear();
this._FilterResult.Add(Filter[0].ToString(), StartFilteredPlaylist);
this._FilterResult.Add(Filter, NewFilteredPlaylist);
this._SongListView.Source = NewFilteredPlaylist.SongList;
}
}
}
else //sinon on remet la liste complète des chanson
{
this._FilterResult.Clear();
this._SongListView.Source = this._SongList;
}
this._PreviousFilter = Filter;
} |
Partager