123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285 |
- /*
- * 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.v7.client.widget.grid.selection;
-
- import java.util.ArrayList;
- import java.util.Arrays;
- import java.util.Collection;
- import java.util.Collections;
- import java.util.LinkedHashSet;
- import java.util.List;
- import java.util.Set;
-
- import com.vaadin.client.data.DataSource.RowHandle;
- import com.vaadin.v7.client.renderers.Renderer;
- import com.vaadin.v7.client.widgets.Grid;
-
- /**
- * Multi-row selection model.
- *
- * @author Vaadin Ltd
- * @since 7.4
- */
- public class SelectionModelMulti<T> extends AbstractRowHandleSelectionModel<T>
- implements SelectionModel.Multi.Batched<T>, HasUserSelectionAllowed<T> {
-
- private final LinkedHashSet<RowHandle<T>> selectedRows;
- private Renderer<Boolean> renderer;
- private Grid<T> grid;
-
- private boolean batchStarted = false;
- private final LinkedHashSet<RowHandle<T>> selectionBatch = new LinkedHashSet<RowHandle<T>>();
- private final LinkedHashSet<RowHandle<T>> deselectionBatch = new LinkedHashSet<RowHandle<T>>();
-
- /* Event handling for selection with space key */
- private SpaceSelectHandler<T> spaceSelectHandler;
- private boolean userSelectionAllowed = true;
-
- public SelectionModelMulti() {
- grid = null;
- renderer = null;
- selectedRows = new LinkedHashSet<RowHandle<T>>();
- }
-
- @Override
- public boolean isSelected(T row) {
- return isSelectedByHandle(grid.getDataSource().getHandle(row));
- }
-
- @Override
- public Renderer<Boolean> getSelectionColumnRenderer() {
- return renderer;
- }
-
- @Override
- public void setGrid(Grid<T> grid) {
- if (this.grid != null && grid != null) {
- // Trying to replace grid
- throw new IllegalStateException(
- "Selection model is already attached to a grid. "
- + "Remove the selection model first from "
- + "the grid and then add it.");
- }
-
- this.grid = grid;
- if (this.grid != null) {
- spaceSelectHandler = new SpaceSelectHandler<T>(grid);
- this.renderer = new MultiSelectionRenderer<T>(grid);
- } else {
- spaceSelectHandler.removeHandler();
- spaceSelectHandler = null;
- this.renderer = null;
- }
-
- }
-
- @Override
- public boolean select(T... rows) {
- if (rows == null) {
- throw new IllegalArgumentException("Rows cannot be null");
- }
- return select(Arrays.asList(rows));
- }
-
- @Override
- public boolean deselect(T... rows) {
- if (rows == null) {
- throw new IllegalArgumentException("Rows cannot be null");
- }
- return deselect(Arrays.asList(rows));
- }
-
- @Override
- public boolean deselectAll() {
- if (!selectedRows.isEmpty()) {
-
- @SuppressWarnings("unchecked")
- final LinkedHashSet<RowHandle<T>> selectedRowsClone = (LinkedHashSet<RowHandle<T>>) selectedRows
- .clone();
- SelectionEvent<T> event = new SelectionEvent<T>(grid, null,
- getSelectedRows(), isBeingBatchSelected());
- selectedRows.clear();
-
- if (isBeingBatchSelected()) {
- selectionBatch.clear();
- deselectionBatch.clear();
- deselectionBatch.addAll(selectedRowsClone);
- }
-
- grid.fireEvent(event);
- return true;
- }
- return false;
- }
-
- @Override
- public boolean select(Collection<T> rows) {
- if (rows == null) {
- throw new IllegalArgumentException("Rows cannot be null");
- }
-
- Set<T> added = new LinkedHashSet<T>();
-
- for (T row : rows) {
- RowHandle<T> handle = grid.getDataSource().getHandle(row);
- if (selectByHandle(handle)) {
- added.add(row);
- }
- }
-
- if (!added.isEmpty()) {
- grid.fireEvent(new SelectionEvent<T>(grid, added, null,
- isBeingBatchSelected()));
-
- return true;
- }
- return false;
- }
-
- @Override
- public boolean deselect(Collection<T> rows) {
- if (rows == null) {
- throw new IllegalArgumentException("Rows cannot be null");
- }
-
- Set<T> removed = new LinkedHashSet<T>();
-
- for (T row : rows) {
- RowHandle<T> handle = grid.getDataSource().getHandle(row);
- if (deselectByHandle(handle)) {
- removed.add(row);
- }
- }
-
- if (!removed.isEmpty()) {
- grid.fireEvent(new SelectionEvent<T>(grid, null, removed,
- isBeingBatchSelected()));
- return true;
- }
- return false;
- }
-
- protected boolean isSelectedByHandle(RowHandle<T> handle) {
- return selectedRows.contains(handle);
- }
-
- @Override
- protected boolean selectByHandle(RowHandle<T> handle) {
- if (selectedRows.add(handle)) {
- handle.pin();
-
- if (isBeingBatchSelected()) {
- deselectionBatch.remove(handle);
- selectionBatch.add(handle);
- }
-
- return true;
- }
- return false;
- }
-
- @Override
- protected boolean deselectByHandle(RowHandle<T> handle) {
- if (selectedRows.remove(handle)) {
-
- if (!isBeingBatchSelected()) {
- handle.unpin();
- } else {
- selectionBatch.remove(handle);
- deselectionBatch.add(handle);
- }
- return true;
- }
- return false;
- }
-
- @Override
- public Collection<T> getSelectedRows() {
- Set<T> selected = new LinkedHashSet<T>();
- for (RowHandle<T> handle : selectedRows) {
- selected.add(handle.getRow());
- }
- return Collections.unmodifiableSet(selected);
- }
-
- @Override
- public void reset() {
- deselectAll();
- }
-
- @Override
- public void startBatchSelect() {
- assert !isBeingBatchSelected() : "Batch has already been started";
- batchStarted = true;
- }
-
- @Override
- public void commitBatchSelect() {
- assert isBeingBatchSelected() : "Batch was never started";
- if (!isBeingBatchSelected()) {
- return;
- }
-
- batchStarted = false;
-
- final Collection<T> added = getSelectedRowsBatch();
- selectionBatch.clear();
-
- final Collection<T> removed = getDeselectedRowsBatch();
-
- // unpin deselected rows
- for (RowHandle<T> handle : deselectionBatch) {
- handle.unpin();
- }
- deselectionBatch.clear();
-
- grid.fireEvent(new SelectionEvent<T>(grid, added, removed,
- isBeingBatchSelected()));
- }
-
- @Override
- public boolean isBeingBatchSelected() {
- return batchStarted;
- }
-
- @Override
- public Collection<T> getSelectedRowsBatch() {
- return rowHandlesToRows(selectionBatch);
- }
-
- @Override
- public Collection<T> getDeselectedRowsBatch() {
- return rowHandlesToRows(deselectionBatch);
- }
-
- private List<T> rowHandlesToRows(Collection<RowHandle<T>> rowHandles) {
- List<T> rows = new ArrayList<T>(rowHandles.size());
- for (RowHandle<T> handle : rowHandles) {
- rows.add(handle.getRow());
- }
- return rows;
- }
-
- @Override
- public boolean isUserSelectionAllowed() {
- return userSelectionAllowed;
- }
-
- @Override
- public void setUserSelectionAllowed(boolean userSelectionAllowed) {
- this.userSelectionAllowed = userSelectionAllowed;
- }
- }
|