use of com.vaadin.flow.internal.change.ListAddChange in project flow by vaadin.
the class StateNodeNodeListTest method testChangesAfterReset.
@Test
public void testChangesAfterReset() {
StateNode value1 = StateNodeTest.createEmptyNode("value1");
StateNode value2 = StateNodeTest.createEmptyNode("value2");
nodeList.add(value1);
nodeList.add(value2);
nodeList.getNode().clearChanges();
nodeList.generateChangesFromEmpty();
List<NodeChange> changes = collectChanges(nodeList);
Assert.assertEquals(1, changes.size());
ListAddChange<?> change = (ListAddChange<?>) changes.get(0);
Assert.assertEquals(0, change.getIndex());
Assert.assertEquals(Arrays.asList(value1, value2), change.getNewItems());
}
use of com.vaadin.flow.internal.change.ListAddChange in project flow by vaadin.
the class NodeList method collectChanges.
@Override
public void collectChanges(Consumer<NodeChange> collector) {
// This map contains items wrapped by AbstractListChanges as keys and
// index in the following allChanges list as a value (it allows to get
// AbstractListChange by the index)
Map<Object, Integer> indices = new IdentityHashMap<>();
// This list contains all changes in the tracker. These changes will be
// modified: each "remove" change following by a corresponding "add"
// will be replaced by null and "add" will be adjusted. Indeces in
// changes in between will be adjusted
List<AbstractListChange<T>> allChanges = new ArrayList<>();
int index = 0;
for (AbstractListChange<T> change : getChangeTracker()) {
if (change instanceof ListRemoveChange<?>) {
// the remove change => find an appropriate "add" event, adjust
// it and adjust everything in between
adjustChanges(index, (ListRemoveChange<T>) change, indices, allChanges);
} else if (change instanceof ListAddChange<?>) {
allChanges.add(change);
int i = index;
// put all items into "indeces" as keys and "index" as a value
// so that the "change" can be retrieved from the "allChanges"
// by the index
((ListAddChange<T>) change).getNewItems().forEach(item -> indices.put(item, i));
} else if (change instanceof ListClearChange<?>) {
allChanges.add(change);
} else {
assert false : "AbstractListChange has only three subtypes: add, remove and clear";
}
index++;
}
List<AbstractListChange<T>> changes = allChanges.stream().filter(this::acceptChange).collect(Collectors.toList());
if (isPopulated) {
changes.forEach(collector);
} else {
if (changes.isEmpty()) {
collector.accept(new EmptyChange(this));
} else {
changes.forEach(collector);
}
isPopulated = true;
}
}
Aggregations