aboutsummaryrefslogtreecommitdiffstats
path: root/server/src/main
diff options
context:
space:
mode:
authorDenis Anisimov <denis@vaadin.com>2016-11-01 15:27:28 +0200
committerDenis Anisimov <denis@vaadin.com>2016-11-02 14:37:30 +0200
commit13747f7003625a012bfdc788a11482a346bcba4d (patch)
treebd5ee3c09c1a43ea3052fea032a80d8aaf9b5f0d /server/src/main
parentdd20841c39b0b30eb2a5c5fddc2eb9cb1cd1e595 (diff)
downloadvaadin-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')
-rw-r--r--server/src/main/java/com/vaadin/data/Listing.java1
-rw-r--r--server/src/main/java/com/vaadin/data/SelectionModel.java225
-rw-r--r--server/src/main/java/com/vaadin/data/selection/AbstractSelectionModel.java2
-rw-r--r--server/src/main/java/com/vaadin/event/selection/MultiSelectionEvent.java2
-rw-r--r--server/src/main/java/com/vaadin/event/selection/MultiSelectionListener.java2
-rw-r--r--server/src/main/java/com/vaadin/ui/AbstractListing.java2
-rw-r--r--server/src/main/java/com/vaadin/ui/AbstractMultiSelect.java4
-rw-r--r--server/src/main/java/com/vaadin/ui/AbstractSingleSelect.java6
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
*/