/*
* Copyright (c) 2012 Hai Bison
*
* See the file LICENSE at the root directory of this project for copying
* permission.
*/
package group.pals.android.lib.ui.filechooser.utils;
import group.pals.android.lib.ui.filechooser.io.IFile;
import group.pals.android.lib.ui.filechooser.services.IFileProvider;
import java.text.Collator;
import java.util.Comparator;
/**
* {@link IFile} comparator.<br>
* Rules:<br>
* - directories first;<br>
* - other properties are based on parameters given in constructor, see
* {@link #FileComparator(IFileProvider.SortType, IFileProvider.SortOrder)};
*
* @author Hai Bison
* @since v1.91
*/
public class FileComparator implements Comparator<IFile> {
private final IFileProvider.SortType mSortType;
private final IFileProvider.SortOrder mSortOrder;
private final Collator mCollator = Collator.getInstance();
/**
* Creates new {@link FileComparator}
*
* @param sortType
* see {@link IFileProvider.SortType}
* @param sortOrder
* see {@link IFileProvider.SortOrder}
*/
public FileComparator(IFileProvider.SortType sortType, IFileProvider.SortOrder sortOrder) {
mSortType = sortType;
mSortOrder = sortOrder;
}
@Override
public int compare(IFile lhs, IFile rhs) {
if ((lhs.isDirectory() && rhs.isDirectory()) || (lhs.isFile() && rhs.isFile())) {
// default is to compare by name (case insensitive)
int res = mCollator.compare(lhs.getName(), rhs.getName());
switch (mSortType) {
case SortByName:
break;// SortByName
case SortBySize:
if (lhs.length() > rhs.length())
res = 1;
else if (lhs.length() < rhs.length())
res = -1;
break;// SortBySize
case SortByDate:
if (lhs.lastModified() > rhs.lastModified())
res = 1;
else if (lhs.lastModified() < rhs.lastModified())
res = -1;
break;// SortByDate
}
return mSortOrder == IFileProvider.SortOrder.Ascending ? res : -res;
}
return lhs.isDirectory() ? -1 : 1;
}// compare
}