diff options
author | Denis Anisimov <denis@vaadin.com> | 2016-11-01 15:27:28 +0200 |
---|---|---|
committer | Denis Anisimov <denis@vaadin.com> | 2016-11-02 14:37:30 +0200 |
commit | 13747f7003625a012bfdc788a11482a346bcba4d (patch) | |
tree | bd5ee3c09c1a43ea3052fea032a80d8aaf9b5f0d /server/src/main | |
parent | dd20841c39b0b30eb2a5c5fddc2eb9cb1cd1e595 (diff) | |
download | vaadin-framework-13747f7003625a012bfdc788a11482a346bcba4d.tar.gz vaadin-framework-13747f7003625a012bfdc788a11482a346bcba4d.zip |
Make SelectionModel API only server side.
Client side doesn't use selection model anymore.
Fixes vaadin/framework8-issues#421
Change-Id: If3ecb1c2f3a0024df9bfdfd182eaf8cf8625ac75
Diffstat (limited to 'server/src/main')
8 files changed, 234 insertions, 10 deletions
diff --git a/server/src/main/java/com/vaadin/data/Listing.java b/server/src/main/java/com/vaadin/data/Listing.java index 667d4f4aef..397272a677 100644 --- a/server/src/main/java/com/vaadin/data/Listing.java +++ b/server/src/main/java/com/vaadin/data/Listing.java @@ -20,7 +20,6 @@ import java.util.Collection; import java.util.Set; import com.vaadin.server.data.DataSource; -import com.vaadin.shared.data.selection.SelectionModel; /** * A generic interface for components that show a list of data. diff --git a/server/src/main/java/com/vaadin/data/SelectionModel.java b/server/src/main/java/com/vaadin/data/SelectionModel.java new file mode 100644 index 0000000000..eca43e6c8d --- /dev/null +++ b/server/src/main/java/com/vaadin/data/SelectionModel.java @@ -0,0 +1,225 @@ +/* + * Copyright 2000-2016 Vaadin Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package com.vaadin.data; + +import java.io.Serializable; +import java.util.Arrays; +import java.util.Collections; +import java.util.LinkedHashSet; +import java.util.Objects; +import java.util.Optional; +import java.util.Set; +import java.util.stream.Stream; + +/** + * Models the selection logic of a {@code Listing} component. Determines how + * items can be selected and deselected. + * + * @author Vaadin Ltd. + * + * @param <T> + * the type of the items to select + * @since 8.0 + */ +public interface SelectionModel<T> extends Serializable { + + /** + * A selection model in which at most one item can be selected at a time. + * Selecting another item deselects the originally selected item. + * + * @param <T> + * the type of the items to select + */ + public interface Single<T> extends SelectionModel<T> { + + /** + * Selects the given item. If another item was already selected, that + * item is deselected. + */ + @Override + public void select(T item); + + /** + * Returns the currently selected item, or an empty optional if no item + * is selected. + * + * @return an optional of the selected item if any, an empty optional + * otherwise + */ + public Optional<T> getSelectedItem(); + + /** + * Sets the current selection to the given item, or clears selection if + * given {@code null}. + * + * @param item + * the item to select or {@code null} to clear selection + */ + public default void setSelectedItem(T item) { + if (item != null) { + select(item); + } else { + deselectAll(); + } + } + + /** + * Returns a singleton set of the currently selected item or an empty + * set if no item is selected. + * + * @return a singleton set of the selected item if any, an empty set + * otherwise + * + * @see #getSelectedItem() + */ + @Override + public default Set<T> getSelectedItems() { + return getSelectedItem().map(Collections::singleton) + .orElse(Collections.emptySet()); + } + } + + /** + * A selection model in which multiple items can be selected at the same + * time. Selecting an item adds it to the selection. + * + * @param <T> + * the type of the items to select + */ + public interface Multi<T> extends SelectionModel<T> { + + /** + * Adds the given item to the set of currently selected items. + * <p> + * By default this does not clear any previous selection. To do that, + * use {@link #deselectAll()}. + * <p> + * If the the item was already selected, this is a NO-OP. + * + * @param item + * the item to add to selection, not {@code null} + */ + @Override + public default void select(T item) { + Objects.requireNonNull(item); + selectItems(item); + }; + + /** + * Adds the given items to the set of currently selected items. + * <p> + * By default this does not clear any previous selection. To do that, + * use {@link #deselectAll()}. + * <p> + * If the all the items were already selected, this is a NO-OP. + * <p> + * This is a short-hand for {@link #updateSelection(Set, Set)} with + * nothing to deselect. + * + * @param items + * to add to selection, not {@code null} + */ + public default void selectItems(T... items) { + Objects.requireNonNull(items); + Stream.of(items).forEach(Objects::requireNonNull); + + updateSelection(new LinkedHashSet<>(Arrays.asList(items)), + Collections.emptySet()); + } + + /** + * Removes the given items from the set of currently selected items. + * <p> + * If the none of the items were selected, this is a NO-OP. + * <p> + * This is a short-hand for {@link #updateSelection(Set, Set)} with + * nothing to select. + * + * @param items + * to remove from selection, not {@code null} + */ + public default void deselectItems(T... items) { + Objects.requireNonNull(items); + Stream.of(items).forEach(Objects::requireNonNull); + + updateSelection(Collections.emptySet(), + new LinkedHashSet<>(Arrays.asList(items))); + } + + /** + * Updates the selection by adding and removing the given items from it. + * <p> + * If all the added items were already selected and the removed items + * were not selected, this is a NO-OP. + * <p> + * Duplicate items (in both add & remove sets) are ignored. + * + * @param addedItems + * the items to add, not {@code null} + * @param removedItems + * the items to remove, not {@code null} + */ + public void updateSelection(Set<T> addedItems, Set<T> removedItems); + } + + /** + * Returns an immutable set of the currently selected items. It is safe to + * invoke other {@code SelectionModel} methods while iterating over the set. + * <p> + * <em>Implementation note:</em> the iteration order of the items in the + * returned set should be well-defined and documented by the implementing + * class. + * + * @return the items in the current selection, not null + */ + public Set<T> getSelectedItems(); + + /** + * Selects the given item. Depending on the implementation, may cause other + * items to be deselected. If the item is already selected, does nothing. + * + * @param item + * the item to select, not null + */ + public void select(T item); + + /** + * Deselects the given item. If the item is not currently selected, does + * nothing. + * + * @param item + * the item to deselect, not null + */ + public void deselect(T item); + + /** + * Deselects all currently selected items. + */ + public default void deselectAll() { + getSelectedItems().forEach(this::deselect); + } + + /** + * Returns whether the given item is currently selected. + * + * @param item + * the item to check, not null + * @return {@code true} if the item is selected, {@code false} otherwise + */ + public default boolean isSelected(T item) { + return getSelectedItems().contains(item); + } +} diff --git a/server/src/main/java/com/vaadin/data/selection/AbstractSelectionModel.java b/server/src/main/java/com/vaadin/data/selection/AbstractSelectionModel.java index aa2457f589..7e60847685 100644 --- a/server/src/main/java/com/vaadin/data/selection/AbstractSelectionModel.java +++ b/server/src/main/java/com/vaadin/data/selection/AbstractSelectionModel.java @@ -15,8 +15,8 @@ */ package com.vaadin.data.selection; +import com.vaadin.data.SelectionModel; import com.vaadin.shared.data.DataCommunicatorConstants; -import com.vaadin.shared.data.selection.SelectionModel; import com.vaadin.ui.AbstractListing.AbstractListingExtension; import elemental.json.JsonObject; diff --git a/server/src/main/java/com/vaadin/event/selection/MultiSelectionEvent.java b/server/src/main/java/com/vaadin/event/selection/MultiSelectionEvent.java index d63f26d680..5fb91bbcbe 100644 --- a/server/src/main/java/com/vaadin/event/selection/MultiSelectionEvent.java +++ b/server/src/main/java/com/vaadin/event/selection/MultiSelectionEvent.java @@ -24,7 +24,7 @@ import com.vaadin.ui.AbstractMultiSelect; /** * Event fired when the the selection changes in a - * {@link com.vaadin.shared.data.selection.SelectionModel.Multi}. + * {@link com.vaadin.data.SelectionModel.Multi}. * * @author Vaadin Ltd * diff --git a/server/src/main/java/com/vaadin/event/selection/MultiSelectionListener.java b/server/src/main/java/com/vaadin/event/selection/MultiSelectionListener.java index c8de132341..d8005a396c 100644 --- a/server/src/main/java/com/vaadin/event/selection/MultiSelectionListener.java +++ b/server/src/main/java/com/vaadin/event/selection/MultiSelectionListener.java @@ -20,7 +20,7 @@ import java.util.function.Consumer; /** * Listens to changes from a - * {@link com.vaadin.shared.data.selection.SelectionModel.Multi}. + * {@link com.vaadin.data.SelectionModel.Multi}. * * @author Vaadin Ltd * diff --git a/server/src/main/java/com/vaadin/ui/AbstractListing.java b/server/src/main/java/com/vaadin/ui/AbstractListing.java index 0840e3fc30..3892e55662 100644 --- a/server/src/main/java/com/vaadin/ui/AbstractListing.java +++ b/server/src/main/java/com/vaadin/ui/AbstractListing.java @@ -18,11 +18,11 @@ package com.vaadin.ui; import java.util.Objects; import com.vaadin.data.Listing; +import com.vaadin.data.SelectionModel; import com.vaadin.server.AbstractExtension; import com.vaadin.server.data.DataCommunicator; import com.vaadin.server.data.DataGenerator; import com.vaadin.server.data.DataSource; -import com.vaadin.shared.data.selection.SelectionModel; /** * A base class for listing components. Provides common handling for fetching diff --git a/server/src/main/java/com/vaadin/ui/AbstractMultiSelect.java b/server/src/main/java/com/vaadin/ui/AbstractMultiSelect.java index bd1fc8937a..779cd959dd 100644 --- a/server/src/main/java/com/vaadin/ui/AbstractMultiSelect.java +++ b/server/src/main/java/com/vaadin/ui/AbstractMultiSelect.java @@ -26,6 +26,8 @@ import java.util.function.Predicate; import java.util.stream.Collectors; import com.vaadin.data.HasValue; +import com.vaadin.data.SelectionModel; +import com.vaadin.data.SelectionModel.Multi; import com.vaadin.event.selection.MultiSelectionEvent; import com.vaadin.event.selection.MultiSelectionListener; import com.vaadin.server.Resource; @@ -35,8 +37,6 @@ import com.vaadin.server.data.DataGenerator; import com.vaadin.shared.AbstractFieldState; import com.vaadin.shared.Registration; import com.vaadin.shared.data.selection.MultiSelectServerRpc; -import com.vaadin.shared.data.selection.SelectionModel; -import com.vaadin.shared.data.selection.SelectionModel.Multi; import com.vaadin.shared.ui.ListingJsonConstants; import com.vaadin.util.ReflectTools; diff --git a/server/src/main/java/com/vaadin/ui/AbstractSingleSelect.java b/server/src/main/java/com/vaadin/ui/AbstractSingleSelect.java index c529ad3f26..cb72d52444 100644 --- a/server/src/main/java/com/vaadin/ui/AbstractSingleSelect.java +++ b/server/src/main/java/com/vaadin/ui/AbstractSingleSelect.java @@ -20,12 +20,12 @@ import java.util.Objects; import java.util.Optional; import com.vaadin.data.HasValue; +import com.vaadin.data.SelectionModel; +import com.vaadin.data.SelectionModel.Single; import com.vaadin.event.selection.SingleSelectionChangeEvent; import com.vaadin.event.selection.SingleSelectionListener; import com.vaadin.server.data.DataCommunicator; import com.vaadin.shared.Registration; -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.ui.AbstractSingleSelectState; import com.vaadin.util.ReflectTools; @@ -39,7 +39,7 @@ import com.vaadin.util.ReflectTools; * @param <T> * the item date type * - * @see com.vaadin.shared.data.selection.SelectionModel.Single + * @see com.vaadin.data.SelectionModel.Single * * @since 8.0 */ |