package lighthouse.utils;
import com.sun.javafx.collections.ObservableSetWrapper;
import javafx.collections.ObservableList;
import javafx.collections.ObservableSet;
import javafx.collections.SetChangeListener;
import java.util.HashSet;
public class MoreBindings {
public static <T> void bindSetToList(ObservableSet<T> set, ObservableList<T> list) {
list.setAll(set);
set.addListener((SetChangeListener<T>) change -> {
if (change.wasAdded())
list.add(change.getElementAdded());
else if (change.wasRemoved())
list.remove(change.getElementRemoved());
});
}
@SuppressWarnings("unchecked")
public static <T> ObservableSet<T> mergeSets(ObservableSet<T>... sets) {
return new ObservableSetWrapper<T>(new HashSet<>()) {
// GC pin in case the observable sets aren't pinned by anything else.
private ObservableSet<T>[] backingSets = sets;
{
for (ObservableSet<T> set : backingSets) {
addAll(set);
set.addListener((SetChangeListener<T>) change -> {
if (change.wasAdded())
add(change.getElementAdded());
if (change.wasRemoved()) {
// Check if any other set still has this element, if so, don't remove.
boolean otherHas = false;
for (ObservableSet<T> set2 : backingSets) {
if (set2 == change.getSet()) continue;
if (set2.contains(change.getElementRemoved())) {
otherHas = true;
break;
}
}
if (!otherHas)
remove(change.getElementRemoved());
}
});
}
}
};
}
}