Search in sources :

Example 1 with AbstractListChange

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;
    }
}
Also used : IdentityHashMap(java.util.IdentityHashMap) StateNode(com.vaadin.flow.internal.StateNode) Iterator(java.util.Iterator) ListAddChange(com.vaadin.flow.internal.change.ListAddChange) Collection(java.util.Collection) AbstractSet(java.util.AbstractSet) Set(java.util.Set) Collectors(java.util.stream.Collectors) Serializable(java.io.Serializable) ArrayList(java.util.ArrayList) ListClearChange(com.vaadin.flow.internal.change.ListClearChange) ListRemoveChange(com.vaadin.flow.internal.change.ListRemoveChange) Consumer(java.util.function.Consumer) NodeChange(com.vaadin.flow.internal.change.NodeChange) List(java.util.List) Map(java.util.Map) AbstractListChange(com.vaadin.flow.internal.change.AbstractListChange) EmptyChange(com.vaadin.flow.internal.change.EmptyChange) Collections(java.util.Collections) AbstractListChange(com.vaadin.flow.internal.change.AbstractListChange) IdentityHashMap(java.util.IdentityHashMap) ArrayList(java.util.ArrayList) ListRemoveChange(com.vaadin.flow.internal.change.ListRemoveChange) EmptyChange(com.vaadin.flow.internal.change.EmptyChange) ListAddChange(com.vaadin.flow.internal.change.ListAddChange) ListClearChange(com.vaadin.flow.internal.change.ListClearChange)

Aggregations

StateNode (com.vaadin.flow.internal.StateNode)1 AbstractListChange (com.vaadin.flow.internal.change.AbstractListChange)1 EmptyChange (com.vaadin.flow.internal.change.EmptyChange)1 ListAddChange (com.vaadin.flow.internal.change.ListAddChange)1 ListClearChange (com.vaadin.flow.internal.change.ListClearChange)1 ListRemoveChange (com.vaadin.flow.internal.change.ListRemoveChange)1 NodeChange (com.vaadin.flow.internal.change.NodeChange)1 Serializable (java.io.Serializable)1 AbstractSet (java.util.AbstractSet)1 ArrayList (java.util.ArrayList)1 Collection (java.util.Collection)1 Collections (java.util.Collections)1 IdentityHashMap (java.util.IdentityHashMap)1 Iterator (java.util.Iterator)1 List (java.util.List)1 Map (java.util.Map)1 Set (java.util.Set)1 Consumer (java.util.function.Consumer)1 Collectors (java.util.stream.Collectors)1