package edu.ualberta.med.biobank.mvp.view.item; import java.util.ArrayList; import java.util.List; import org.eclipse.swt.widgets.Control; import edu.ualberta.med.biobank.mvp.user.ui.HasControl; public abstract class AbstractControlField implements HasControl { private final EnabledForwarder enabledForwarder = new EnabledForwarder(); private final VisibleForwarder visibleForwarder = new VisibleForwarder(); public void forwardEnabled(Control control) { enabledForwarder.add(control); } public void unforwardEnabled(Control control) { enabledForwarder.remove(control); } public void forwardVisible(Control control) { visibleForwarder.add(control); } public void unforwardVisible(Control control) { visibleForwarder.remove(control); } @Override public void setEnabled(boolean enabled) { enabledForwarder.setState(enabled); } @Override public boolean isEnabled() { return enabledForwarder.getState(); } @Override public void setVisible(boolean visible) { visibleForwarder.setState(visible); } @Override public boolean isVisible() { return visibleForwarder.getState(); } /** * Synchronises a state between a list of objects. * * @author jferland * * @param <T> object * @param <S> state */ protected abstract static class StateForwarder<T, S> { private final List<T> objects = new ArrayList<T>(); private S state; /** * @param state initial state. */ public StateForwarder(S state) { this.state = state; } public void add(T object) { setState(object, state); objects.add(object); } public void remove(T object) { objects.remove(object); // TODO: revert state before removing? } public void clear() { objects.clear(); // TODO: revert state before clearing? } public void setState(S state) { this.state = state; update(); } public S getState() { return state; } public void update() { for (T object : objects) { setState(object, state); } } protected abstract void setState(T object, S state); } private static class EnabledForwarder extends StateForwarder<Control, Boolean> { public EnabledForwarder() { super(true); } @Override protected void setState(Control object, Boolean state) { object.setEnabled(Boolean.TRUE.equals(state)); } } private static class VisibleForwarder extends StateForwarder<Control, Boolean> { public VisibleForwarder() { super(true); } @Override protected void setState(Control object, Boolean state) { object.setVisible(Boolean.TRUE.equals(state)); } } }