private void ConditionallySelectFiles(ConditionalSelectData csd, ShellView ShellListView) {
if (csd == null) return;
//The following items are added
var Matches_Name = new List<BExplorer.Shell._Plugin_Interfaces.IListItemEx>();
var Matches_Size = new List<BExplorer.Shell._Plugin_Interfaces.IListItemEx>();
var Matches_DateCreated = new List<BExplorer.Shell._Plugin_Interfaces.IListItemEx>();
var Matches_DateLastModified = new List<BExplorer.Shell._Plugin_Interfaces.IListItemEx>();
var Matches_LastAccessed = new List<BExplorer.Shell._Plugin_Interfaces.IListItemEx>();
ShellListView.DeSelectAllItems();
if (csd.FilterByFileName) {
foreach (var item in ShellListView.Items) {
var data = new FileInfo(item.ParsingName);
string ToFind = csd.FileNameData.matchCase ? data.Name : data.Name.ToLowerInvariant();
switch (csd.FileNameData.filter) {
case ConditionalSelectParameters.FileNameFilterTypes.Contains:
if (ToFind.Contains(csd.FileNameData.matchCase ? csd.FileNameData.query : csd.FileNameData.query.ToLowerInvariant())) Matches_Name.Add(item);
break;
case ConditionalSelectParameters.FileNameFilterTypes.StartsWith:
if (ToFind.StartsWith(csd.FileNameData.query)) Matches_Name.Add(item);
break;
case ConditionalSelectParameters.FileNameFilterTypes.EndsWith:
if (ToFind.EndsWith(csd.FileNameData.query)) Matches_Name.Add(item);
break;
case ConditionalSelectParameters.FileNameFilterTypes.Equals:
if (ToFind == csd.FileNameData.query) Matches_Name.Add(item);
break;
case ConditionalSelectParameters.FileNameFilterTypes.DoesNotContain:
if (!ToFind.Contains(csd.FileNameData.query)) Matches_Name.Add(item);
break;
case ConditionalSelectParameters.FileNameFilterTypes.NotEqualTo:
if (ToFind != csd.FileNameData.query) Matches_Name.Add(item);
break;
default:
break;
}
}
}
else {
//Matches_Name.AddRange(shells.Where((x) => !Directory.Exists(x.ParsingName)));
}
if (csd.FilterByFileSize) {
foreach (var item in Matches_Name) {
var data = new FileInfo(item.ParsingName);
switch (csd.FileSizeData.filter) {
case ConditionalSelectParameters.FileSizeFilterTypes.LargerThan:
if (data.Length > csd.FileSizeData.query1) Matches_Size.Add(item);
break;
case ConditionalSelectParameters.FileSizeFilterTypes.SmallerThan:
if (data.Length < csd.FileSizeData.query1) Matches_Size.Add(item);
break;
case ConditionalSelectParameters.FileSizeFilterTypes.Equals:
if (data.Length == csd.FileSizeData.query1) Matches_Size.Add(item);
break;
case ConditionalSelectParameters.FileSizeFilterTypes.Between:
long largebound, smallbound;
if (csd.FileSizeData.query2 > csd.FileSizeData.query1) {
smallbound = csd.FileSizeData.query1;
largebound = csd.FileSizeData.query2;
}
else if (csd.FileSizeData.query2 < csd.FileSizeData.query1) {
smallbound = csd.FileSizeData.query2;
largebound = csd.FileSizeData.query1;
}
else {
if (data.Length == csd.FileSizeData.query1) Matches_Size.Add(item);
break;
}
if (data.Length > smallbound && data.Length < largebound) Matches_Size.Add(item);
break;
case ConditionalSelectParameters.FileSizeFilterTypes.NotEqualTo:
if (data.Length != csd.FileSizeData.query1) Matches_Size.Add(item);
break;
case ConditionalSelectParameters.FileSizeFilterTypes.NotBetween:
long largebound2, smallbound2;
if (csd.FileSizeData.query2 > csd.FileSizeData.query1) {
smallbound2 = csd.FileSizeData.query1;
largebound2 = csd.FileSizeData.query2;
}
else if (csd.FileSizeData.query2 < csd.FileSizeData.query1) {
smallbound2 = csd.FileSizeData.query2;
largebound2 = csd.FileSizeData.query1;
}
else {
// they are the same, use Unequal code
if (data.Length != csd.FileSizeData.query1) Matches_Size.Add(item);
break;
}
if (data.Length < smallbound2 || data.Length > largebound2) Matches_Size.Add(item);
break;
default:
break;
}
}
}
else {
Matches_Size.AddRange(Matches_Name);
}
if (csd.FilterByDateCreated)
Matches_DateCreated.AddRange(!csd.FilterByDateCreated ? Matches_Size : DateFilter(Matches_Size, csd.DateCreatedData, x => x.CreationTimeUtc));
if (csd.FilterByDateModified)
Matches_DateLastModified.AddRange(!csd.FilterByDateModified ? Matches_Size : DateFilter(Matches_DateCreated, csd.DateModifiedData, x => x.LastWriteTimeUtc));
if (csd.FilterByDateAccessed)
Matches_LastAccessed.AddRange(!csd.FilterByDateAccessed ? Matches_DateLastModified : DateFilter(Matches_DateLastModified, csd.DateAccessedData, x => x.LastAccessTimeUtc));
ShellListView.SelectItems(
Matches_Name.
Union(Matches_Size).
Union(Matches_Size).
Union(Matches_DateCreated).
Union(Matches_DateLastModified).
Union(Matches_LastAccessed
).ToArray());
ShellListView.Focus();
}