package org.fxmisc.easybind.select; import java.util.function.Function; import javafx.beans.InvalidationListener; import javafx.beans.value.ObservableValue; class LeafSelectionElement<T, U> implements NestedSelectionElement<T, U> { private final InvalidationListener observableInvalidationListener = obs -> observableInvalidated(); private final Runnable onInvalidation; private final Function<? super T, ObservableValue<U>> selector; private ObservableValue<U> observable = null; public LeafSelectionElement(Runnable onInvalidation, Function<? super T, ObservableValue<U>> selector) { this.onInvalidation = onInvalidation; this.selector = selector; } @Override public void connect(T baseVal) { if(isConnected()) { throw new IllegalStateException("Already connected"); } observable = selector.apply(baseVal); observable.addListener(observableInvalidationListener); } @Override public void disconnect() { if(isConnected()) { observable.removeListener(observableInvalidationListener); observable = null; } } @Override public final boolean isConnected() { return observable != null; } @Override public U getValue() { if(!isConnected()) { throw new IllegalStateException("Not connected"); } return observable.getValue(); } private void observableInvalidated() { onInvalidation.run(); } }