Archived
0

add group binding

This commit is contained in:
iMoHax
2015-08-11 17:47:13 +03:00
parent f04c050843
commit 0db35d204f

View File

@@ -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());
}
};
}
}