1 | |
package com.sun.javafx.runtime.sequence; |
2 | |
|
3 | |
import com.sun.javafx.runtime.location.SequenceLocation; |
4 | |
import com.sun.javafx.runtime.location.SequenceChangeListener; |
5 | |
|
6 | |
|
7 | |
|
8 | |
|
9 | |
|
10 | |
|
11 | |
class BoundReverseSequence<T> extends AbstractBoundSequence<T> implements SequenceLocation<T> { |
12 | |
private final SequenceLocation<T> location; |
13 | |
|
14 | |
BoundReverseSequence(SequenceLocation<T> location) { |
15 | 1 | super(location.getAsSequence().getElementType()); |
16 | 1 | this.location = location; |
17 | |
|
18 | 1 | setInitialValue(computeValue()); |
19 | 1 | addTriggers(); |
20 | 1 | } |
21 | |
|
22 | |
private Sequence<T> computeValue() { |
23 | 1 | return location.getAsSequence().reverse(); |
24 | |
} |
25 | |
|
26 | |
private void addTriggers() { |
27 | 1 | location.addChangeListener(new SequenceChangeListener<T>() { |
28 | |
public void onChange(int startPos, int endPos, Sequence<? extends T> newElements, Sequence<T> oldValue, Sequence<T> newValue) { |
29 | 7 | int sliceSize = endPos - startPos; |
30 | 7 | int actualStart = oldValue.size() - startPos - (sliceSize + 1); |
31 | 7 | int actualEnd = actualStart + sliceSize; |
32 | 7 | Sequence<? extends T> reverseElements = newElements == null ? null : newElements.reverse(); |
33 | 7 | updateSlice(actualStart, actualEnd, reverseElements); |
34 | 7 | } |
35 | |
}); |
36 | 1 | } |
37 | |
} |