diff --git a/client/src/main/java/ru/trader/model/support/BindingsHelper.java b/client/src/main/java/ru/trader/model/support/BindingsHelper.java index 44d93a7..dcd0bb5 100644 --- a/client/src/main/java/ru/trader/model/support/BindingsHelper.java +++ b/client/src/main/java/ru/trader/model/support/BindingsHelper.java @@ -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() { - { - super.bind(list); - list.addListener((ListChangeListener) c -> { - while (c.next()) { - if (c.wasAdded()) - for (T item : c.getRemoved()) { - super.bind(item); - } else if (c.wasRemoved()){ - for (T item : c.getAddedSubList()) { - super.unbind(item); - } + private final ListChangeListener listListener = c -> { + while (c.next()) { + if (c.wasAdded()) + for (T item : c.getAddedSubList()) { + super.bind(item); + } else if (c.wasRemoved()){ + 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 DoubleBinding group(final BinaryOperator operation, final Function convert, final List list){ + if ((list == null)) { + throw new NullPointerException("Operands cannot be null."); + } + + return new DoubleBinding(){ + private final ListChangeListener 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 oList = (ObservableList) 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 oList = (ObservableList) 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 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()); + } + }; + } + }