diff options
author | Johannes Dahlström <johannesd@vaadin.com> | 2016-09-08 21:26:35 +0300 |
---|---|---|
committer | Vaadin Code Review <review@vaadin.com> | 2016-09-12 08:19:48 +0000 |
commit | 34dc467f08440e2b1a4e563ede205590002ac64e (patch) | |
tree | 3d3f787d2d251877b32c8119209791764c85d8db | |
parent | 78a5468279ddc442ac64d045f5fe4aa79ed9ef6e (diff) | |
download | vaadin-framework-34dc467f08440e2b1a4e563ede205590002ac64e.tar.gz vaadin-framework-34dc467f08440e2b1a4e563ede205590002ac64e.zip |
Reimplement Grid selection model in terms of AbstractSingleSelection
Change-Id: Id21cb0df32e07bd01f90a29a814dcf0775067bfa
5 files changed, 79 insertions, 25 deletions
diff --git a/client/src/main/java/com/vaadin/client/connectors/grid/GridConnector.java b/client/src/main/java/com/vaadin/client/connectors/grid/GridConnector.java index 863cee0c88..e2d2172166 100644 --- a/client/src/main/java/com/vaadin/client/connectors/grid/GridConnector.java +++ b/client/src/main/java/com/vaadin/client/connectors/grid/GridConnector.java @@ -20,6 +20,7 @@ import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Optional; import com.google.gwt.dom.client.Element; import com.google.gwt.dom.client.NativeEvent; @@ -45,8 +46,9 @@ import com.vaadin.client.widget.grid.sort.SortEvent; import com.vaadin.client.widget.grid.sort.SortOrder; import com.vaadin.client.widgets.Grid; import com.vaadin.client.widgets.Grid.Column; +import com.vaadin.shared.data.DataCommunicatorConstants; import com.vaadin.shared.data.selection.SelectionModel; -import com.vaadin.shared.data.selection.SelectionModel.Single; +import com.vaadin.shared.data.selection.SelectionServerRpc; import com.vaadin.shared.data.sort.SortDirection; import com.vaadin.shared.ui.Connect; import com.vaadin.shared.ui.grid.GridConstants; @@ -123,7 +125,8 @@ public class GridConnector super.init(); // Default selection style is space key. - spaceSelectHandler = new SpaceSelectHandler<JsonObject>(getWidget()); + spaceSelectHandler = new SpaceSelectHandler<>(getWidget()); + clickSelectHandler = new ClickSelectHandler<>(getWidget()); getWidget().addSortHandler(this::handleSortEvent); getWidget().setRowStyleGenerator(rowRef -> { JsonObject json = rowRef.getRow(); @@ -152,6 +155,32 @@ public class GridConnector /* Item click events */ getWidget().addBodyClickHandler(itemClickHandler); getWidget().addBodyDoubleClickHandler(itemClickHandler); + getWidget().setSelectionModel(new SelectionModel.Single<JsonObject>() { + + @Override + public void select(JsonObject item) { + getRpcProxy(SelectionServerRpc.class) + .select(item.getString(DataCommunicatorConstants.KEY)); + } + + @Override + public void deselect(JsonObject item) { + getRpcProxy(SelectionServerRpc.class).deselect( + item.getString(DataCommunicatorConstants.KEY)); + } + + @Override + public Optional<JsonObject> getSelectedItem() { + throw new UnsupportedOperationException( + "Selected item not known on the client side"); + } + + @Override + public boolean isSelected(JsonObject item) { + return item.hasKey(DataCommunicatorConstants.SELECTED) + && item.getBoolean(DataCommunicatorConstants.SELECTED); + } + }); layout(); } @@ -164,15 +193,8 @@ public class GridConnector @Override public void setSelectionModel(SelectionModel<JsonObject> selectionModel) { - removeClickHandler(); - - super.setSelectionModel(selectionModel); - getWidget().setSelectionModel(selectionModel); - - if (selectionModel instanceof Single) { - // Single selection should be moved by a click. - clickSelectHandler = new ClickSelectHandler<>(getWidget()); - } + throw new UnsupportedOperationException( + "Cannot set a selection model for GridConnector"); } /** diff --git a/server/src/main/java/com/vaadin/ui/Grid.java b/server/src/main/java/com/vaadin/ui/Grid.java index c895ad08c3..705a9ca890 100644 --- a/server/src/main/java/com/vaadin/ui/Grid.java +++ b/server/src/main/java/com/vaadin/ui/Grid.java @@ -29,11 +29,11 @@ import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.Optional; import java.util.Set; import java.util.function.Function; import java.util.stream.Stream; -import com.vaadin.data.selection.SingleSelection; import com.vaadin.event.ConnectorEvent; import com.vaadin.event.EventListener; import com.vaadin.server.KeyMapper; @@ -41,7 +41,6 @@ import com.vaadin.server.data.SortOrder; import com.vaadin.shared.MouseEventDetails; import com.vaadin.shared.Registration; import com.vaadin.shared.data.DataCommunicatorConstants; -import com.vaadin.shared.data.selection.SelectionModel; import com.vaadin.shared.data.sort.SortDirection; import com.vaadin.shared.ui.grid.ColumnState; import com.vaadin.shared.ui.grid.GridConstants; @@ -67,8 +66,7 @@ import elemental.json.JsonValue; * @param <T> * the grid bean type */ -public class Grid<T> extends AbstractListing<T, SelectionModel<T>> - implements HasComponents { +public class Grid<T> extends AbstractSingleSelect<T> implements HasComponents { @Deprecated private static final Method ITEM_CLICK_METHOD = ReflectTools @@ -197,7 +195,7 @@ public class Grid<T> extends AbstractListing<T, SelectionModel<T>> * * @param <T> */ - public static abstract class AbstractGridExtension<T> + public abstract static class AbstractGridExtension<T> extends AbstractListingExtension<T> { @Override @@ -776,6 +774,44 @@ public class Grid<T> extends AbstractListing<T, SelectionModel<T>> } } + private final class SingleSelection extends AbstractSingleSelection { + private T selectedItem = null; + + SingleSelection() { + addDataGenerator((item, json) -> { + if (isSelected(item)) { + json.put(DataCommunicatorConstants.SELECTED, true); + } + }); + } + + @Override + public Optional<T> getSelectedItem() { + return Optional.ofNullable(selectedItem); + } + + @Override + protected boolean isKeySelected(String key) { + return Objects.equals(key, getSelectedKey()); + } + + @Override + protected String getSelectedKey() { + return itemToKey(selectedItem); + } + + @Override + protected void doSetSelectedKey(String key) { + if (selectedItem != null) { + getDataCommunicator().refresh(selectedItem); + } + selectedItem = keyToItem(key); + if (selectedItem != null) { + getDataCommunicator().refresh(selectedItem); + } + } + } + private KeyMapper<Column<T, ?>> columnKeys = new KeyMapper<>(); private Set<Column<T, ?>> columnSet = new LinkedHashSet<>(); private List<SortOrder<Column<T, ?>>> sortOrder = new ArrayList<>(); @@ -788,7 +824,7 @@ public class Grid<T> extends AbstractListing<T, SelectionModel<T>> * Constructor for the {@link Grid} component. */ public Grid() { - setSelectionModel(new SingleSelection<>(this)); + setSelectionModel(new SingleSelection()); registerRpc(new GridServerRpcImpl()); detailsManager = new DetailsManager<>(); addExtension(detailsManager); diff --git a/shared/src/main/java/com/vaadin/shared/ui/AbstractSingleSelectState.java b/shared/src/main/java/com/vaadin/shared/ui/AbstractSingleSelectState.java index 3889fdae2b..98aad0bf37 100644 --- a/shared/src/main/java/com/vaadin/shared/ui/AbstractSingleSelectState.java +++ b/shared/src/main/java/com/vaadin/shared/ui/AbstractSingleSelectState.java @@ -15,8 +15,6 @@ */ package com.vaadin.shared.ui; -import com.vaadin.shared.AbstractComponentState; - /** * Shared state for {@code AbstractSingleSelect}. * @@ -24,7 +22,7 @@ import com.vaadin.shared.AbstractComponentState; * * @since 8.0 */ -public class AbstractSingleSelectState extends AbstractComponentState { +public class AbstractSingleSelectState extends TabIndexState { /** * The key of the currently selected item or {@code null} if no item is diff --git a/shared/src/main/java/com/vaadin/shared/ui/grid/GridState.java b/shared/src/main/java/com/vaadin/shared/ui/grid/GridState.java index ffdbc79a32..4f480139d5 100644 --- a/shared/src/main/java/com/vaadin/shared/ui/grid/GridState.java +++ b/shared/src/main/java/com/vaadin/shared/ui/grid/GridState.java @@ -21,7 +21,7 @@ import java.util.List; import com.vaadin.shared.annotations.DelegateToWidget; import com.vaadin.shared.data.sort.SortDirection; -import com.vaadin.shared.ui.TabIndexState; +import com.vaadin.shared.ui.AbstractSingleSelectState; /** * The shared state for the {@link com.vaadin.ui.Grid} component. @@ -29,7 +29,7 @@ import com.vaadin.shared.ui.TabIndexState; * @since 8.0 * @author Vaadin Ltd */ -public class GridState extends TabIndexState { +public class GridState extends AbstractSingleSelectState { /** * The default value for height-by-rows for both GWT widgets diff --git a/uitest/src/main/java/com/vaadin/tests/components/grid/basics/GridBasics.java b/uitest/src/main/java/com/vaadin/tests/components/grid/basics/GridBasics.java index c82a434e23..0278149be9 100644 --- a/uitest/src/main/java/com/vaadin/tests/components/grid/basics/GridBasics.java +++ b/uitest/src/main/java/com/vaadin/tests/components/grid/basics/GridBasics.java @@ -9,7 +9,6 @@ import java.util.function.Consumer; import java.util.stream.Stream; import com.vaadin.annotations.Widgetset; -import com.vaadin.data.selection.SingleSelection; import com.vaadin.server.VaadinRequest; import com.vaadin.shared.Registration; import com.vaadin.shared.ui.grid.HeightMode; @@ -146,8 +145,7 @@ public class GridBasics extends AbstractTestUIWithLog { grid.addColumn("Small Random", data -> data.getSmallRandom() / 5d, new ProgressBarRenderer()); - ((SingleSelection<DataObject>) grid.getSelectionModel()) - .addSelectionListener(e -> log("Selected: " + e.getValue())); + grid.addSelectionListener(e -> log("Selected: " + e.getValue())); layout.addComponent(createMenu()); layout.addComponent(grid); |