use of com.vaadin.flow.internal.change.AbstractListChange 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