package org.genericsystem.defaults.tools;

import java.util.ArrayList;
import java.util.List;
import java.util.function.Function;

import javafx.beans.InvalidationListener;
import javafx.beans.Observable;
import javafx.beans.WeakInvalidationListener;
import javafx.collections.ObservableList;

/**
 * @author Nicolas Feybesse
 *
 * @param <T>
 */
public abstract class TransitiveObservableList<T> extends AbstractMinimalChangesObservableList<T> {

	private final List<Observable> slaves = new ArrayList<>();
	protected final ObservableList<T> master;
	private final InvalidationListener listener = l -> onMasterInvalidation();
	private final Function<T, Observable> slaveSupplier;

	public TransitiveObservableList(ObservableList<T> master, Function<T, Observable> slaveSupplier) {
		this.master = master;
		this.slaveSupplier = slaveSupplier;
		this.master.addListener(new WeakInvalidationListener(listener));
		onMasterInvalidation();
	}

	protected void bindSlave(Observable observable) {
		slaves.add(observable);
		bind(observable);
	}

	protected void onMasterInvalidation() {
		for (Observable slave : slaves)
			unbind(slave);
		slaves.clear();
		invalidate();
		for (T elt : master)
			bindSlave(slaveSupplier.apply(elt));
	}
}

@@ -1,8 +1,11 @@
+// 
 package 
@@ -38,17 +38,22 @@
 .tools;%0A
-%0A
+//%0A// 
 import j
@@ -68,24 +68,27 @@
 .ArrayList;%0A
+// 
 import java.
@@ -98,16 +98,19 @@
 l.List;%0A
+// 
 import j
@@ -137,17 +137,22 @@
 nction;%0A
-%0A
+//%0A// 
 import j
@@ -177,32 +177,35 @@
 dationListener;%0A
+// 
 import javafx.be
@@ -220,16 +220,19 @@
 rvable;%0A
+// 
 import j
@@ -269,16 +269,19 @@
 stener;%0A
+// 
 import j
@@ -318,13 +318,20 @@
 st;%0A
-%0A
 /
+/%0A/// 
 **%0A
+//
  * @
@@ -358,11 +358,15 @@
 sse%0A
+//
  *%0A
+//
  * @
@@ -379,12 +379,17 @@
 %3CT%3E%0A
+//
  */%0A
+// 
 publ
@@ -484,18 +484,22 @@
 st%3CT%3E %7B%0A
-%0A%09
+//%0A// 
 private 
@@ -549,17 +549,19 @@
 st%3C%3E();%0A
-%09
+// 
 protecte
@@ -594,17 +594,19 @@
 master;%0A
-%09
+// 
 private 
@@ -672,17 +672,19 @@
 tion();%0A
-%09
+// 
 private 
@@ -728,18 +728,22 @@
 pplier;%0A
-%0A%09
+//%0A// 
 public T
@@ -833,18 +833,19 @@
 lier) %7B%0A
-%09%09
+// 
 this.mas
@@ -854,26 +854,27 @@
 r = master;%0A
-%09%09
+// 
 this.slaveSu
@@ -897,18 +897,19 @@
 pplier;%0A
-%09%09
+// 
 this.mas
@@ -965,18 +965,19 @@
 ener));%0A
-%09%09
+// 
 onMaster
@@ -992,21 +992,27 @@
 tion();%0A
-%09%7D%0A%0A%09
+// %7D%0A//%0A// 
 protecte
@@ -1053,18 +1053,19 @@
 able) %7B%0A
-%09%09
+// 
 slaves.a
@@ -1080,18 +1080,19 @@
 vable);%0A
-%09%09
+// 
 bind(obs
@@ -1105,13 +1105,19 @@
 e);%0A
-%09%7D%0A%0A%09
+// %7D%0A//%0A// 
 prot
@@ -1152,18 +1152,19 @@
 ion() %7B%0A
-%09%09
+// 
 for (Obs
@@ -1187,19 +1187,19 @@
 slaves)%0A
-%09%09%09
+// 
 unbind(s
@@ -1205,18 +1205,19 @@
 slave);%0A
-%09%09
+// 
 slaves.c
@@ -1224,18 +1224,19 @@
 lear();%0A
-%09%09
+// 
 invalida
@@ -1241,18 +1241,19 @@
 date();%0A
-%09%09
+// 
 for (T e
@@ -1269,11 +1269,11 @@
 er)%0A
-%09%09%09
+// 
 bind
@@ -1309,9 +1309,14 @@
 ));%0A
-%09%7D%0A
+// %7D%0A// 
 %7D%0A

comment Transitive ObservableList