All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.vaadin.data.SelectionModel Maven / Gradle / Ivy

There is a newer version: 8.27.3
Show newest version
/*
 * Copyright (C) 2000-2024 Vaadin Ltd
 *
 * This program is available under Vaadin Commercial License and Service Terms.
 *
 * See  for the full
 * 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;

import com.vaadin.event.selection.SelectionListener;
import com.vaadin.shared.Registration;

/**
 * Models the selection logic of a {@code Listing} component. Determines how
 * items can be selected and deselected.
 *
 * @author Vaadin Ltd.
 *
 * @param 
 *            the type of the items to select
 * @since 8.0
 */
public interface SelectionModel 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 
     *            the type of the items to select
     */
    public interface Single extends SelectionModel {

        /**
         * 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 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 {
                getSelectedItem().ifPresent(this::deselect);
            }
        }

        @Override
        public default void deselectAll() {
            setSelectedItem(null);
        }

        /**
         * 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 getSelectedItems() {
            return getSelectedItem().map(Collections::singleton)
                    .orElse(Collections.emptySet());
        }

        @Override
        default Optional getFirstSelectedItem() {
            return getSelectedItem();
        }

        /**
         * Sets whether it's allowed to deselect the selected row through the
         * UI. Deselection is allowed by default.
         *
         * @param deselectAllowed
         *            true if the selected row can be deselected
         *            without selecting another row instead; otherwise
         *            false.
         */
        public void setDeselectAllowed(boolean deselectAllowed);

        /**
         * Gets whether it's allowed to deselect the selected row through the
         * UI.
         *
         * @return true if deselection is allowed; otherwise
         *         false
         */
        public boolean isDeselectAllowed();
    }

    /**
     * A selection model in which multiple items can be selected at the same
     * time. Selecting an item adds it to the selection.
     *
     * @param 
     *            the type of the items to select
     */
    public interface Multi extends SelectionModel {

        /**
         * Adds the given item to the set of currently selected items.
         * 

* By default this does not clear any previous selection. To do that, * use {@link #deselectAll()}. *

* 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. *

* By default this does not clear any previous selection. To do that, * use {@link #deselectAll()}. *

* If the all the items were already selected, this is a NO-OP. *

* 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()); } @SuppressWarnings("unchecked") @Override public default void deselect(T item) { deselectItems(item); } /** * Removes the given items from the set of currently selected items. *

* If the none of the items were selected, this is a NO-OP. *

* 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. *

* If all the added items were already selected and the removed items * were not selected, this is a NO-OP. *

* 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 addedItems, Set removedItems); @Override default Optional getFirstSelectedItem() { return getSelectedItems().stream().findFirst(); } /** * Selects all available the items. */ public void selectAll(); } /** * Returns an immutable set of the currently selected items. It is safe to * invoke other {@code SelectionModel} methods while iterating over the set. *

* Implementation note: 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 getSelectedItems(); /** * Get first selected data item. *

* This is the same as {@link Single#getSelectedItem()} in case of single * selection and the first selected item from * {@link Multi#getSelectedItems()} in case of multiselection. * * @return the first selected item. */ Optional getFirstSelectedItem(); /** * 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, if any. */ public void deselectAll(); /** * 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); } /** * Adds a generic listener to this selection model, accepting both single * and multiselection events. * * @param listener * the listener to add * @return a registration handle for removing the listener */ public Registration addSelectionListener(SelectionListener listener); }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy