}
doUpdateSelection(set -> {
+ DataProvider<T, ?> dataProvider = getGrid().getDataProvider();
// order of add / remove does not matter since no duplicates
- set.removeAll(removedItems);
- set.addAll(addedItems);
+ Set<Object> removedItemIds = removedItems.stream()
+ .map(dataProvider::getId).collect(Collectors.toSet());
+ set.removeIf(
+ item -> removedItemIds.contains(dataProvider.getId(item)));
+ addedItems.stream().filter(
+ item -> !selectionContainsId(dataProvider.getId(item)))
+ .forEach(set::add);
// refresh method is NOOP for items that are not present client side
DataCommunicator<T> dataCommunicator = getGrid()
import java.util.Set;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicReference;
+import java.util.stream.Collectors;
import java.util.stream.IntStream;
+import java.util.stream.Stream;
+import com.vaadin.data.provider.CallbackDataProvider;
import org.easymock.Capture;
import org.junit.Before;
import org.junit.Test;
assertFalse(model.isSelectAllCheckBoxVisible());
assertEquals(SelectAllCheckBoxVisibility.DEFAULT,
model.getSelectAllCheckBoxVisibility());
+ }
+
+ @Test
+ public void testSelectAllWithProxyDataProvider() {
+ List<String> data = IntStream.range(0, 100).boxed()
+ .map(i -> "String " + i).collect(Collectors.toList());
+ Grid<AtomicReference<String>> proxyGrid = new Grid<>();
+ proxyGrid.setDataProvider(new CallbackDataProvider<>(
+ q -> data.stream().map(AtomicReference::new).skip(q.getOffset())
+ .limit(q.getLimit()),
+ q -> data.size(), AtomicReference::get));
+ MultiSelectionModel<AtomicReference<String>> model = (MultiSelectionModel<AtomicReference<String>>) proxyGrid
+ .setSelectionMode(SelectionMode.MULTI);
+ List<Set<AtomicReference<String>>> selections = new ArrayList<>();
+ model.addSelectionListener(e -> {
+ selections.add(e.getAllSelectedItems());
+ });
+ model.selectAll();
+ model.deselect(model.getFirstSelectedItem().orElseThrow(
+ () -> new IllegalStateException("Items should be selected")));
+ model.selectAll();
+
+ assertEquals("Item count mismatch on first select all", 100,
+ selections.get(0).size());
+ assertEquals("Item count mismatch on deselect", 99,
+ selections.get(1).size());
+ assertEquals("Item count mismatch on second select all", 100,
+ selections.get(2).size());
}
}