package org.fxmisc.easybind.select; import javafx.beans.InvalidationListener; import javafx.beans.binding.ObjectBinding; import javafx.beans.value.ObservableValue; import org.fxmisc.easybind.monadic.MonadicBinding; class SelectObjectBinding<T, U> extends ObjectBinding<U> implements MonadicBinding<U> { private final ObservableValue<T> root; private final NestedSelectionElement<T, U> nestedSelection; private final InvalidationListener rootInvalidationListener; public SelectObjectBinding( ObservableValue<T> root, NestedSelectionElementFactory<T, U> nestedSelectionFactory) { this.root = root; nestedSelection = nestedSelectionFactory.create(this::invalidate); rootInvalidationListener = obs -> { nestedSelection.disconnect(); invalidate(); }; root.addListener(rootInvalidationListener); } @Override protected U computeValue() { if(!nestedSelection.isConnected()) { T rootVal = root.getValue(); if(rootVal == null) { return null; } nestedSelection.connect(rootVal); } return nestedSelection.getValue(); } @Override public void dispose() { root.removeListener(rootInvalidationListener); nestedSelection.disconnect(); } }