add group binding
This commit is contained in:
@@ -2,7 +2,9 @@ package ru.trader.model.support;
|
|||||||
|
|
||||||
import com.sun.javafx.collections.ImmutableObservableList;
|
import com.sun.javafx.collections.ImmutableObservableList;
|
||||||
import javafx.beans.Observable;
|
import javafx.beans.Observable;
|
||||||
|
import javafx.beans.binding.DoubleBinding;
|
||||||
import javafx.beans.binding.ListBinding;
|
import javafx.beans.binding.ListBinding;
|
||||||
|
import javafx.beans.value.ObservableNumberValue;
|
||||||
import javafx.collections.FXCollections;
|
import javafx.collections.FXCollections;
|
||||||
import javafx.collections.ListChangeListener;
|
import javafx.collections.ListChangeListener;
|
||||||
import javafx.collections.ObservableList;
|
import javafx.collections.ObservableList;
|
||||||
@@ -12,6 +14,7 @@ import javafx.scene.control.TableView;
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.function.BinaryOperator;
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
|
|
||||||
public class BindingsHelper {
|
public class BindingsHelper {
|
||||||
@@ -32,26 +35,30 @@ public class BindingsHelper {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return new ListBinding<T>() {
|
return new ListBinding<T>() {
|
||||||
{
|
private final ListChangeListener<T> listListener = c -> {
|
||||||
super.bind(list);
|
while (c.next()) {
|
||||||
list.addListener((ListChangeListener<T>) c -> {
|
if (c.wasAdded())
|
||||||
while (c.next()) {
|
for (T item : c.getAddedSubList()) {
|
||||||
if (c.wasAdded())
|
super.bind(item);
|
||||||
for (T item : c.getRemoved()) {
|
} else if (c.wasRemoved()){
|
||||||
super.bind(item);
|
for (T item : c.getRemoved()) {
|
||||||
} else if (c.wasRemoved()){
|
super.unbind(item);
|
||||||
for (T item : c.getAddedSubList()) {
|
|
||||||
super.unbind(item);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
{
|
||||||
|
super.bind(list);
|
||||||
|
list.addListener(listListener);
|
||||||
|
list.forEach(super::bind);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void dispose() {
|
public void dispose() {
|
||||||
list.forEach((v) -> super.unbind(v));
|
list.forEach(super::unbind);
|
||||||
|
list.removeListener(listListener);
|
||||||
super.unbind(list);
|
super.unbind(list);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -83,4 +90,64 @@ public class BindingsHelper {
|
|||||||
table.setItems(sList);
|
table.setItems(sList);
|
||||||
sList.comparatorProperty().bind(table.comparatorProperty());
|
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