package ffg.gui.table.filter;
import ffg.entity.AFLPlayer;
import ffg.game.GameStats;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
/**
* Responsible for extracting the AFLPlayer out of a GameStats object.
* @author eugeneh
* @param <S>
*/
public class PlayerKey<S extends GameStats> implements FilterKey<S, AFLPlayer> {
private static final FilterOperator<AFLPlayer, ?> IN_FILTER = new PlayerInFilterOperator();
private static final FilterOperator<AFLPlayer, ?> OUT_FILTER = new PlayerOutFilterOperator();
private final List<FilterOperator<AFLPlayer, ?>> operators;
/**
* Creates a new instance of {@link PlayerKey}
*/
public PlayerKey() {
super();
List<FilterOperator<AFLPlayer, ?>> localOperators = new ArrayList<FilterOperator<AFLPlayer, ?>>();
localOperators.add(IN_FILTER);
localOperators.add(OUT_FILTER);
operators = Collections.unmodifiableList(localOperators);
}
// @Override
public List<FilterOperator<AFLPlayer, ?>> getFilterOperators() {
return operators;
}
// @Override
public AFLPlayer getFilterObjectValue(S item) {
return item.getPlayer();
}
// @Override
public FilterOperator<AFLPlayer, ?> getDefaultFilterOperator() {
return operators.get(0);
}
// @Override
public AFLPlayer getDefaultValue() {
return null;
}
@Override
public String toString() {
return "Player";
}
/**
* Given a list of {@link AFLPlayer}s, create a filter operator that includes those in the list.
*/
private static class PlayerInFilterOperator extends FilterOperator<AFLPlayer, List<AFLPlayer>> {
public PlayerInFilterOperator() {
super("contains", null);
}
@Override
public boolean matches(AFLPlayer value1, List<AFLPlayer> value2) {
return value2 != null && value2.contains(value1);
}
@Override
public boolean isValueValid(Object value) {
if (value instanceof List) {
List listValue = (List) value;
for (Iterator it = listValue.iterator(); it.hasNext();) {
Object elem = it.next();
if (!(elem instanceof AFLPlayer)) {
return false;
}
}
return true;
} else {
return false;
}
}
}
/**
* Given a list of {@link AFLPlayer}s, create a filter operator that excludes those in the list.
*/
private static class PlayerOutFilterOperator extends FilterOperator<AFLPlayer, List<AFLPlayer>> {
public PlayerOutFilterOperator() {
super("doesn't contain", null);
}
@Override
public boolean matches(AFLPlayer value1, List<AFLPlayer> value2) {
return value2 != null && !value2.contains(value1);
}
@Override
public boolean isValueValid(Object value) {
if (value instanceof List) {
List listValue = (List) value;
for (Iterator it = listValue.iterator(); it.hasNext();) {
Object elem = it.next();
if (!(elem instanceof AFLPlayer)) {
return false;
}
}
return true;
} else {
return false;
}
}
}
}
|