package edu.ualberta.med.biobank.mvp.view.item;
import java.util.ArrayList;
import java.util.List;
import edu.ualberta.med.biobank.mvp.event.ui.ListChangeEvent;
import edu.ualberta.med.biobank.mvp.event.ui.ListChangeHandler;
import edu.ualberta.med.biobank.mvp.user.ui.ListField;
public class AdaptedListField<T, U> extends AbstractListField<T> {
private final AdapteeMonitor adapteeMonitor = new AdapteeMonitor();
private final ListField<U> adaptee;
private final Adapter<T, U> adapter;
public AdaptedListField(ListField<U> adaptee, Adapter<T, U> adapter) {
this.adaptee = adaptee;
this.adapter = adapter;
adaptee.addListChangeHandler(adapteeMonitor);
}
@Override
protected void updateGui() {
List<U> unadaptedElements = unadaptList(asUnmodifiableList());
adaptee.setElements(unadaptedElements, false);
}
private List<T> adaptList(List<U> unadaptedList) {
List<T> adaptedList = new ArrayList<T>();
for (U unadapted : unadaptedList) {
T adapted = adapter.adapt(unadapted);
adaptedList.add(adapted);
}
return adaptedList;
}
private List<U> unadaptList(List<T> adaptedList) {
List<U> unadaptedList = new ArrayList<U>();
for (T adapted : adaptedList) {
U unadapted = adapter.unadapt(adapted);
unadaptedList.add(unadapted);
}
return unadaptedList;
}
private class AdapteeMonitor implements ListChangeHandler<U> {
@Override
public void onListChange(ListChangeEvent<U> event) {
List<T> adaptedElements = adaptList(adaptee.asUnmodifiableList());
setElementsInternal(adaptedElements);
}
}
}