package edu.ualberta.med.biobank.mvp.view.item; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; import com.google.gwt.event.shared.GwtEvent; import com.google.gwt.event.shared.HandlerManager; import com.google.gwt.event.shared.HandlerRegistration; 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 abstract class AbstractListField<E> extends AbstractValidationField implements ListField<E> { private final HandlerManager handlerManager = new HandlerManager(this); private final List<E> list = new ArrayList<E>(); private final List<E> unmodifiableList = Collections.unmodifiableList(list); @Override public HandlerRegistration addListChangeHandler(ListChangeHandler<E> handler) { return handlerManager.addHandler(ListChangeEvent.getType(), handler); } @Override public void fireEvent(GwtEvent<?> event) { handlerManager.fireEvent(event); } @Override public List<E> asUnmodifiableList() { return unmodifiableList; } @Override public final void setElements(Collection<? extends E> elements) { setElements(elements, false); } @Override public void setElements(Collection<? extends E> elements, boolean fireEvents) { setElements(elements, fireEvents, true); } protected void setElementsInternal(Collection<? extends E> elements) { setElements(elements, true, false); } /** * Update the GUI's value to match {@link #asUnmodifiableList()}. Do so * without firing any events. */ protected abstract void updateGui(); private synchronized void setElements(Collection<? extends E> elements, boolean fireEvents, boolean updateGui) { list.clear(); list.addAll(elements); if (updateGui) { updateGui(); } if (fireEvents) { fireEvent(new ListChangeEvent<E>(this)); } } }