package tim.prune.data.sort; import java.util.Comparator; import tim.prune.data.DataPoint; /** * Class for comparing photos to sort them by name or timestamp */ public class PhotoComparer implements Comparator { /** Sort mode */ private SortMode _sortMode; /** * Constructor * @param inMode sort mode */ public PhotoComparer(SortMode inMode) { _sortMode = inMode; } /** * Main compare method */ public int compare(DataPoint inP1, DataPoint inP2) { if (inP2 == null || inP2.getPhoto() == null) return -1; // all nulls at end if (inP1 == null || inP1.getPhoto() == null) return 1; // Sort by name int result = 0; if (_sortMode == SortMode.SORTBY_NAME) { result = compareNames(inP1, inP2); } if (result == 0) { result = compareTimes(inP1, inP2); } // check names if times didn't work if (result == 0 && _sortMode == SortMode.SORTBY_TIME) { result = compareNames(inP1, inP2); } // names and times equal, try width and height if (result == 0) { result = compareSizes(inP1, inP2); } return result; } /** * Compare the names of the two photo points * @param inP1 first point * @param inP2 second point * @return compare value (-1,0,1) */ private int compareNames(DataPoint inP1, DataPoint inP2) { // If the files can't be compared, use the photo names if (inP1.getPhoto().getFile() == null || inP2.getPhoto().getFile() == null) { return inP1.getPhoto().getName().compareTo(inP2.getPhoto().getName()); } // both photos have files, so just compare the files return inP1.getPhoto().getFile().compareTo(inP2.getPhoto().getFile()); } /** * Compare the timestamps of the two photo points * @param inP1 first point * @param inP2 second point * @return compare value (-1,0,1) */ private int compareTimes(DataPoint inP1, DataPoint inP2) { // Photos might not have timestamps if (!inP2.hasTimestamp()) return -1; if (!inP1.hasTimestamp()) return 1; // Compare the timestamps long secDiff = inP1.getPhoto().getTimestamp().getMillisecondsSince(inP2.getPhoto().getTimestamp()); return (secDiff<0?-1:(secDiff==0?0:1)); } /** * Compare the sizes of the two photos * @param inP1 first point * @param inP2 second point * @return compare value (-1,0,1) */ private int compareSizes(DataPoint inP1, DataPoint inP2) { // Try the widths int w1 = inP1.getPhoto().getWidth(); int w2 = inP2.getPhoto().getWidth(); if (w2 <= 0) return -1; if (w1 <= 0) return 1; if (w1 != w2) return (w2 > w1 ? 1 : -1); // Try the heights int h1 = inP1.getPhoto().getHeight(); int h2 = inP2.getPhoto().getHeight(); if (h2 <= 0) return -1; if (h1 <= 0) return 1; if (h1 != h2) return (h2 > h1 ? 1 : -1); // sizes same return 0; } }