package com.dooapp.fxform.view.control.map;
import com.dooapp.fxform.model.Element;
import javafx.beans.property.ListProperty;
import javafx.beans.property.MapProperty;
import javafx.beans.property.ReadOnlyListProperty;
import javafx.beans.property.SimpleListProperty;
import javafx.collections.FXCollections;
import javafx.collections.MapChangeListener;
import javafx.collections.ObservableList;
import java.util.stream.Collectors;
/**
* User: Antoine Mischler <antoine@dooapp.com>
* Date: 24/04/15
* Time: 14:52
*/
public class MapElementProvider<K, V> {
private final ListProperty<Element<V>> elements = new SimpleListProperty<>(FXCollections.observableArrayList());
private final MapProperty<K, V> map;
private final Class<V> valueType;
private final MapChangeListener<K, V> mapChangeListener;
public MapElementProvider(MapProperty<K, V> map, Class<V> valueType) {
this.map = map;
this.valueType = valueType;
mapChangeListener = change -> {
if (change.wasAdded()) {
if (getElementByKey(change.getKey()) == null) {
elements.add(new MapEntryPropertyElement(map, change.getKey(), valueType));
}
} else if (change.wasRemoved()) {
elements.remove(getElementByKey(change.getKey()));
}
};
map.addListener(mapChangeListener);
init();
}
private Element getElementByKey(K key) {
Element toRemove = null;
for (Element element : elements) {
if (((MapEntryElement) element).getKey().equals(key)) {
toRemove = element;
break;
}
}
return toRemove;
}
protected void init() {
elements.addAll(map.keySet().stream()
.map(key -> new MapEntryPropertyElement<>(map, key, valueType))
.collect(Collectors.toList()));
}
public ObservableList<Element<V>> getElements() {
return elements.get();
}
public ReadOnlyListProperty<Element<V>> elementsProperty() {
return elements;
}
public void dispose() {
map.removeListener(mapChangeListener);
}
}