From 19a7e696fdca4d1d23624b1a39e6a5f34e982887 Mon Sep 17 00:00:00 2001 From: Aleksi Hietanen Date: Tue, 23 May 2017 16:14:34 +0300 Subject: Make select all work with TreeGrid (#9412) Fixes #9403 --- .../components/grid/MultiSelectionModelImpl.java | 63 ++++++++++++++++++++-- 1 file changed, 60 insertions(+), 3 deletions(-) (limited to 'server') diff --git a/server/src/main/java/com/vaadin/ui/components/grid/MultiSelectionModelImpl.java b/server/src/main/java/com/vaadin/ui/components/grid/MultiSelectionModelImpl.java index 01635302f0..289db2a04f 100644 --- a/server/src/main/java/com/vaadin/ui/components/grid/MultiSelectionModelImpl.java +++ b/server/src/main/java/com/vaadin/ui/components/grid/MultiSelectionModelImpl.java @@ -29,6 +29,8 @@ import java.util.stream.Stream; import com.vaadin.data.provider.DataCommunicator; import com.vaadin.data.provider.DataProvider; +import com.vaadin.data.provider.HierarchicalDataProvider; +import com.vaadin.data.provider.HierarchicalQuery; import com.vaadin.data.provider.Query; import com.vaadin.event.selection.MultiSelectionEvent; import com.vaadin.event.selection.MultiSelectionListener; @@ -312,14 +314,69 @@ public class MultiSelectionModelImpl extends AbstractSelectionModel getState().allSelected = true; } - DataProvider dataSource = getGrid().getDataProvider(); + Stream allItemsStream; + DataProvider dataProvider = getGrid().getDataProvider(); // this will fetch everything from backend - Stream stream = dataSource.fetch(new Query<>()); + if (dataProvider instanceof HierarchicalDataProvider) { + allItemsStream = fetchAllHierarchical( + (HierarchicalDataProvider) dataProvider); + } else { + allItemsStream = fetchAll(dataProvider); + } LinkedHashSet allItems = new LinkedHashSet<>(); - stream.forEach(allItems::add); + allItemsStream.forEach(allItems::add); updateSelection(allItems, Collections.emptySet(), userOriginated); } + /** + * Fetch all items from the given hierarchical data provider. + * + * @since 8.1 + * @param dataProvider + * the data provider to fetch from + * @return all items in the data provider + */ + private Stream fetchAllHierarchical( + HierarchicalDataProvider dataProvider) { + return fetchAllDescendants(null, dataProvider); + } + + /** + * Fetch all the descendants of the given parent item from the given data + * provider. + * + * @since 8.1 + * @param parent + * the parent item to fetch descendants for + * @param dataProvider + * the data provider to fetch from + * @return the stream of all descendant items + */ + private Stream fetchAllDescendants(T parent, + HierarchicalDataProvider dataProvider) { + List children = dataProvider + .fetchChildren(new HierarchicalQuery<>(null, parent)) + .collect(Collectors.toList()); + if (children.isEmpty()) { + return Stream.empty(); + } + return children.stream() + .flatMap(child -> Stream.concat(Stream.of(child), + fetchAllDescendants(child, dataProvider))); + } + + /** + * Fetch all items from the given data provider. + * + * @since 8.1 + * @param dataProvider + * the data provider to fetch from + * @return all items in this data provider + */ + private Stream fetchAll(DataProvider dataProvider) { + return dataProvider.fetch(new Query<>()); + } + /** * Triggered when the user unchecks the select all checkbox. * -- cgit v1.2.3