package org.limewire.ui.swing.filter; import org.limewire.core.api.FilePropertyKey; import org.limewire.core.api.search.SearchCategory; import org.limewire.ui.swing.util.I18n; import org.limewire.util.CommonUtils; import ca.odell.glazedlists.matchers.Matcher; /** * Range filter format for length. */ class LengthFilterFormat<E extends FilterableItem> implements RangeFilterFormat<E> { /** Array of length options in seconds. */ private static final long[] LENGTHS = { 0, 30, // 30 sec 60, // 1 min 60 * 5, // 5 min 60 * 10, // 10 min 60 * 15, // 15 min 60 * 30, // 30 min 60 * 60, // 1 hr 60 * 60 * 2, // 2 hrs 60 * 60 * 4 // 4 hrs }; @Override public String getHeaderText() { return I18n.tr("Length"); } @Override public Matcher<E> getMatcher(long minValue, long maxValue) { return new LengthMatcher<E>(minValue, maxValue); } @Override public long[] getValues() { return LENGTHS; } @Override public String getValueText(int valueIndex) { return CommonUtils.seconds2time(LENGTHS[valueIndex]); } @Override public boolean isMaximumAbsolute() { return false; } @Override public boolean isUpperLimitEnabled() { return true; } @Override public boolean updateValues(SearchCategory filterCategory, long lowerValue, long upperValue) { return false; } /** * A matcher used to filter an item by length. */ private static class LengthMatcher<E extends FilterableItem> implements Matcher<E> { private final long minLength; private final long maxLength; /** * Constructs a LengthMatcher for the specified length range. */ public LengthMatcher(long minLength, long maxLength) { this.minLength = minLength; this.maxLength = maxLength; } /** * Returns true if the specified item is within the length range. */ @Override public boolean matches(E item) { Object value = item.getProperty(FilePropertyKey.LENGTH); if (value instanceof Long) { long length = ((Long) value).longValue(); boolean minValid = (minLength == LENGTHS[0]) || (length >= minLength); boolean maxValid = (maxLength == LENGTHS[LENGTHS.length - 1]) || (length <= maxLength); return (minValid && maxValid); } else { return false; } } } }