-
Notifications
You must be signed in to change notification settings - Fork 5
/
ObservableListWrapperExtended.java
105 lines (88 loc) · 3.07 KB
/
ObservableListWrapperExtended.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
package org.genericsystem.defaults.tools;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.function.BiConsumer;
import java.util.function.Consumer;
import com.sun.javafx.collections.ObservableListWrapper;
import javafx.beans.Observable;
import javafx.collections.ListChangeListener;
import javafx.collections.ObservableList;
import javafx.util.Callback;
public class ObservableListWrapperExtended<E> extends ObservableListWrapper<E> implements ListChangeListener<E> {
private final BiConsumer<Integer, E> addBiConsumer;
private final ObservableList<E> external;
private final Consumer<Integer> removeConsumer;
private BindingHelperObserver<E> observer;
public final void bind() {
if (observer == null)
observer = new BindingHelperObserver<>(this);
external.addListener(observer);
}
public final void unbind() {
if (observer != null)
external.removeListener(observer);
observer = null;
}
public BiConsumer<Integer, E> getAddBiConsumer() {
return addBiConsumer;
}
public Consumer<Integer> getRemoveConsumer() {
return removeConsumer;
}
public static class BindingHelperObserver<E> implements ListChangeListener<E> {
private final WeakReference<ObservableListWrapperExtended<E>> ref;
public BindingHelperObserver(ObservableListWrapperExtended<E> transformationList) {
if (transformationList == null) {
throw new NullPointerException("Binding has to be specified.");
}
ref = new WeakReference<ObservableListWrapperExtended<E>>(transformationList);
}
@Override
public void onChanged(Change<? extends E> change) {
final ObservableListWrapperExtended<E> binding = ref.get();
if (binding == null) {
change.getList().removeListener(this);
} else {
binding.onChanged(change);
}
}
}
public ObservableListWrapperExtended(ObservableList<E> external, Callback<E, Observable[]> extractor) {
super(new ArrayList<>(), extractor);
this.external = external; // prevents of listener garbage collection
this.addBiConsumer = (index, src) -> add(index, src);
this.removeConsumer = index -> remove(index.intValue());
bind();
int i = 0;
beginChange();
for (E element : external)
getAddBiConsumer().accept(i++, element);
endChange();
}
@Override
public void onChanged(Change<? extends E> change) {
System.out.println("------------- onChange dans ObservableListWrapperExtended");
while (change.next()) {
beginChange();
if (change.wasPermutated()) {
assert false;// Not tested after
for (int i = change.getFrom(); i < change.getTo(); i++)
getRemoveConsumer().accept(change.getFrom());
int index = change.getFrom();
for (E source : change.getList().subList(change.getFrom(), change.getTo()))
getAddBiConsumer().accept(index++, source);
} else {
if (change.wasRemoved()) {
for (int i = 0; i < change.getRemovedSize(); i++)
getRemoveConsumer().accept(change.getFrom());
}
if (change.wasAdded()) {
int index = change.getFrom();
for (E source : change.getAddedSubList())
getAddBiConsumer().accept(index++, source);
}
}
endChange();
}
}
}