Search in sources :

Example 1 with ListRemoveChange

use of com.vaadin.flow.internal.change.ListRemoveChange in project flow by vaadin.

the class NodeListAddRemoveTest method verifyRemoved.

private void verifyRemoved(List<NodeChange> changes, List<String> items, Integer... indexes) {
    Assert.assertTrue(changes.size() > 0);
    for (int i = 0; i < indexes.length; i++) {
        NodeChange nodeChange = changes.get(i);
        Assert.assertThat(nodeChange, CoreMatchers.instanceOf(ListRemoveChange.class));
        ListRemoveChange<?> change = (ListRemoveChange<?>) nodeChange;
        Assert.assertEquals(indexes[i].intValue(), change.getIndex());
        Assert.assertEquals(items.get(i), change.getRemovedItem());
    }
}
Also used : NodeChange(com.vaadin.flow.internal.change.NodeChange) ListRemoveChange(com.vaadin.flow.internal.change.ListRemoveChange)

Example 2 with ListRemoveChange

use of com.vaadin.flow.internal.change.ListRemoveChange in project flow by vaadin.

the class StateNodeNodeListTest method testAddingAndRemoving.

@Test
public void testAddingAndRemoving() {
    StateNode value1 = StateNodeTest.createEmptyNode("value1");
    StateNode value2 = StateNodeTest.createEmptyNode("value2");
    nodeList.add(value1);
    Assert.assertEquals(1, nodeList.size());
    Assert.assertSame(value1, nodeList.get(0));
    List<NodeChange> firstAddChanges = collectChanges(nodeList);
    Assert.assertEquals(1, firstAddChanges.size());
    ListAddChange<?> firstAddChange = (ListAddChange<?>) firstAddChanges.get(0);
    Assert.assertEquals(0, firstAddChange.getIndex());
    Assert.assertEquals(Arrays.asList(value1), firstAddChange.getNewItems());
    nodeList.add(0, value2);
    Assert.assertEquals(2, nodeList.size());
    Assert.assertSame(value2, nodeList.get(0));
    Assert.assertSame(value1, nodeList.get(1));
    List<NodeChange> secondAddChanges = collectChanges(nodeList);
    Assert.assertEquals(1, secondAddChanges.size());
    ListAddChange<?> secondAddChange = (ListAddChange<?>) secondAddChanges.get(0);
    Assert.assertEquals(0, secondAddChange.getIndex());
    Assert.assertEquals(Arrays.asList(value2), secondAddChange.getNewItems());
    StateNode removedItem = nodeList.remove(0);
    Assert.assertEquals(1, nodeList.size());
    Assert.assertSame(value1, nodeList.get(0));
    Assert.assertSame(value2, removedItem);
    List<NodeChange> removeChanges = collectChanges(nodeList);
    Assert.assertEquals(1, removeChanges.size());
    ListRemoveChange<?> removeChange = (ListRemoveChange<?>) removeChanges.get(0);
    Assert.assertEquals(0, removeChange.getIndex());
}
Also used : NodeChange(com.vaadin.flow.internal.change.NodeChange) ListAddChange(com.vaadin.flow.internal.change.ListAddChange) StateNode(com.vaadin.flow.internal.StateNode) ListRemoveChange(com.vaadin.flow.internal.change.ListRemoveChange) Test(org.junit.Test) StateNodeTest(com.vaadin.flow.internal.StateNodeTest)

Example 3 with ListRemoveChange

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

ListRemoveChange (com.vaadin.flow.internal.change.ListRemoveChange)3 NodeChange (com.vaadin.flow.internal.change.NodeChange)3 StateNode (com.vaadin.flow.internal.StateNode)2 ListAddChange (com.vaadin.flow.internal.change.ListAddChange)2 StateNodeTest (com.vaadin.flow.internal.StateNodeTest)1 AbstractListChange (com.vaadin.flow.internal.change.AbstractListChange)1 EmptyChange (com.vaadin.flow.internal.change.EmptyChange)1 ListClearChange (com.vaadin.flow.internal.change.ListClearChange)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