add group binding
This commit is contained in:
@@ -2,7 +2,9 @@ package ru.trader.model.support;
|
||||
|
||||
import com.sun.javafx.collections.ImmutableObservableList;
|
||||
import javafx.beans.Observable;
|
||||
import javafx.beans.binding.DoubleBinding;
|
||||
import javafx.beans.binding.ListBinding;
|
||||
import javafx.beans.value.ObservableNumberValue;
|
||||
import javafx.collections.FXCollections;
|
||||
import javafx.collections.ListChangeListener;
|
||||
import javafx.collections.ObservableList;
|
||||
@@ -12,6 +14,7 @@ import javafx.scene.control.TableView;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.function.BinaryOperator;
|
||||
import java.util.function.Function;
|
||||
|
||||
public class BindingsHelper {
|
||||
@@ -32,26 +35,30 @@ public class BindingsHelper {
|
||||
}
|
||||
|
||||
return new ListBinding<T>() {
|
||||
{
|
||||
super.bind(list);
|
||||
list.addListener((ListChangeListener<T>) c -> {
|
||||
private final ListChangeListener<T> listListener = c -> {
|
||||
while (c.next()) {
|
||||
if (c.wasAdded())
|
||||
for (T item : c.getRemoved()) {
|
||||
for (T item : c.getAddedSubList()) {
|
||||
super.bind(item);
|
||||
} else if (c.wasRemoved()){
|
||||
for (T item : c.getAddedSubList()) {
|
||||
for (T item : c.getRemoved()) {
|
||||
super.unbind(item);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
{
|
||||
super.bind(list);
|
||||
list.addListener(listListener);
|
||||
list.forEach(super::bind);
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void dispose() {
|
||||
list.forEach((v) -> super.unbind(v));
|
||||
list.forEach(super::unbind);
|
||||
list.removeListener(listListener);
|
||||
super.unbind(list);
|
||||
}
|
||||
|
||||
@@ -83,4 +90,64 @@ public class BindingsHelper {
|
||||
table.setItems(sList);
|
||||
sList.comparatorProperty().bind(table.comparatorProperty());
|
||||
}
|
||||
|
||||
public static <T> DoubleBinding group(final BinaryOperator<Double> operation, final Function<T, ObservableNumberValue> convert, final List<T> list){
|
||||
if ((list == null)) {
|
||||
throw new NullPointerException("Operands cannot be null.");
|
||||
}
|
||||
|
||||
return new DoubleBinding(){
|
||||
private final ListChangeListener<T> listListener = c -> {
|
||||
while (c.next()) {
|
||||
if (c.wasAdded())
|
||||
for (T item : c.getAddedSubList()) {
|
||||
super.bind(convert.apply(item));
|
||||
} else if (c.wasRemoved()){
|
||||
for (T item : c.getRemoved()) {
|
||||
super.unbind(convert.apply(item));
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
{
|
||||
if (list instanceof ObservableList){
|
||||
ObservableList<T> oList = (ObservableList<T>) list;
|
||||
super.bind(oList);
|
||||
oList.addListener(listListener);
|
||||
}
|
||||
list.forEach(v -> super.bind(convert.apply(v)));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void dispose() {
|
||||
list.forEach(v -> super.unbind(convert.apply(v)));
|
||||
if (list instanceof ObservableList){
|
||||
ObservableList<T> oList = (ObservableList<T>) list;
|
||||
oList.removeListener(listListener);
|
||||
super.unbind(oList);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected double computeValue() {
|
||||
double res = 0;
|
||||
for (T item : list) {
|
||||
res = operation.apply(res, convert.apply(item).doubleValue());
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
@Override
|
||||
public javafx.collections.ObservableList<?> getDependencies() {
|
||||
ArrayList<Observable> dependencies = new ArrayList<>(list.size());
|
||||
list.forEach(v -> dependencies.add(convert.apply(v)));
|
||||
if (list instanceof ObservableList){
|
||||
dependencies.add((ObservableList)list);
|
||||
}
|
||||
return new ImmutableObservableList<>((Observable[]) dependencies.toArray());
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user