package bluej.utility.javafx.binding;

import java.util.IdentityHashMap;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

import bluej.utility.javafx.JavaFXUtil;
import bluej.utility.javafx.MultiListener;
import javafx.collections.ListChangeListener;
import javafx.collections.ObservableList;


| This class is useful when you want to bind one (observable) list to some function of another observable list | but you need to not only listen to changes in that list, but also further lists inside it. | public abstract class DeepListBinding<DEST>{ private final ObservableList<DEST> dest; private final MultiListener<ObservableList<?>> multiListener; public DeepListBinding(ObservableList<DEST> dest) { this.dest = dest; final ListChangeListener<Object> listener = c -> update(); this.multiListener = new MultiListener<>(l -> { l.addListener(listener); return () -> l.removeListener(listener); }); } public void startListening() { update(); } protected abstract Stream> getListenTargets(); protected abstract Stream calculateValues(); protected void update() { multiListener.listenOnlyTo(getListenTargets()); dest.setAll(calculateValues().collect(Collectors.toList())); } }

.   DeepListBinding
.   startListening
.   getListenTargets
.   calculateValues
.   update




48 neLoCode + 2 LoComm