--- /dev/null
+/*
+ * 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.event;
+
+import java.io.Serializable;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.EventObject;
+import java.util.LinkedHashSet;
+import java.util.Set;
+
+/**
+ * An event that specifies what in a selection has changed, and where the
+ * selection took place.
+ *
+ * @since 7.4
+ * @author Vaadin Ltd
+ */
+@Deprecated
+public class SelectionEvent extends EventObject {
+
+ private LinkedHashSet<Object> oldSelection;
+ private LinkedHashSet<Object> newSelection;
+
+ public SelectionEvent(Object source, Collection<Object> oldSelection,
+ Collection<Object> newSelection) {
+ super(source);
+ this.oldSelection = new LinkedHashSet<>(oldSelection);
+ this.newSelection = new LinkedHashSet<>(newSelection);
+ }
+
+ /**
+ * A {@link Collection} of all the itemIds that became selected.
+ * <p>
+ * <em>Note:</em> this excludes all itemIds that might have been previously
+ * selected.
+ *
+ * @return a Collection of the itemIds that became selected
+ */
+ public Set<Object> getAdded() {
+ return setDifference(newSelection, oldSelection);
+ }
+
+ /**
+ * A {@link Collection} of all the itemIds that became deselected.
+ * <p>
+ * <em>Note:</em> this excludes all itemIds that might have been previously
+ * deselected.
+ *
+ * @return a Collection of the itemIds that became deselected
+ */
+ public Set<Object> getRemoved() {
+ return setDifference(oldSelection, newSelection);
+ }
+
+ /**
+ * Slightly optimized set difference that can return the original set or a
+ * modified one.
+ *
+ * @param set1
+ * original set
+ * @param set2
+ * the set to subtract
+ * @return the difference set
+ */
+ private static <T> Set<T> setDifference(Set<T> set1, Set<T> set2) {
+ if (set2.isEmpty()) {
+ return set1;
+ } else {
+ LinkedHashSet<T> set = new LinkedHashSet<>(set1);
+ set.removeAll(set2);
+ return set;
+ }
+ }
+
+ /**
+ * A {@link Collection} of all the itemIds that are currently selected.
+ *
+ * @return a Collection of the itemIds that are currently selected
+ */
+ public Set<Object> getSelected() {
+ return Collections.unmodifiableSet(newSelection);
+ }
+
+ /**
+ * The listener interface for receiving {@link SelectionEvent
+ * SelectionEvents}.
+ */
+ @Deprecated
+ public interface SelectionListener extends Serializable {
+ /**
+ * Notifies the listener that the selection state has changed.
+ *
+ * @param event
+ * the selection change event
+ */
+ void select(SelectionEvent event);
+ }
+
+ /**
+ * The interface for adding and removing listeners for {@link SelectionEvent
+ * SelectionEvents}.
+ */
+ @Deprecated
+ public interface SelectionNotifier extends Serializable {
+ /**
+ * Registers a new selection listener
+ *
+ * @param listener
+ * the listener to register
+ */
+ void addSelectionListener(SelectionListener listener);
+
+ /**
+ * Removes a previously registered selection change listener
+ *
+ * @param listener
+ * the listener to remove
+ */
+ void removeSelectionListener(SelectionListener listener);
+ }
+}
import com.vaadin.data.sort.Sort;
import com.vaadin.data.sort.SortOrder;
import com.vaadin.event.ContextClickEvent;
-import com.vaadin.event.SelectionEvent;
-import com.vaadin.event.SelectionEvent.SelectionListener;
-import com.vaadin.event.SelectionEvent.SelectionNotifier;
import com.vaadin.event.SortEvent;
import com.vaadin.event.SortEvent.SortListener;
import com.vaadin.event.SortEvent.SortNotifier;
import com.vaadin.v7.data.util.converter.Converter;
import com.vaadin.v7.data.util.converter.ConverterUtil;
import com.vaadin.v7.event.ItemClickEvent;
+import com.vaadin.v7.event.SelectionEvent;
import com.vaadin.v7.event.ItemClickEvent.ItemClickListener;
import com.vaadin.v7.event.ItemClickEvent.ItemClickNotifier;
+import com.vaadin.v7.event.SelectionEvent.SelectionListener;
+import com.vaadin.v7.event.SelectionEvent.SelectionNotifier;
import com.vaadin.v7.server.communication.data.DataGenerator;
import com.vaadin.v7.server.communication.data.RpcDataProviderExtension;
import com.vaadin.v7.shared.ui.grid.EditorClientRpc;
import org.junit.Before;
import org.junit.Test;
-import com.vaadin.event.SelectionEvent;
-import com.vaadin.event.SelectionEvent.SelectionListener;
import com.vaadin.v7.data.util.IndexedContainer;
+import com.vaadin.v7.event.SelectionEvent;
+import com.vaadin.v7.event.SelectionEvent.SelectionListener;
import com.vaadin.v7.ui.Grid;
import com.vaadin.v7.ui.Grid.SelectionMode;
import com.vaadin.v7.ui.Grid.SelectionModel;
import org.junit.Before;
import org.junit.Test;
-import com.vaadin.event.SelectionEvent;
-import com.vaadin.event.SelectionEvent.SelectionListener;
import com.vaadin.v7.data.Container;
import com.vaadin.v7.data.util.IndexedContainer;
+import com.vaadin.v7.event.SelectionEvent;
+import com.vaadin.v7.event.SelectionEvent.SelectionListener;
import com.vaadin.v7.ui.Grid;
import com.vaadin.v7.ui.Grid.MultiSelectionModel;
import com.vaadin.v7.ui.Grid.SelectionMode;
import org.junit.Before;
import org.junit.Test;
-import com.vaadin.event.SelectionEvent;
-import com.vaadin.event.SelectionEvent.SelectionListener;
import com.vaadin.v7.data.Container;
import com.vaadin.v7.data.util.IndexedContainer;
+import com.vaadin.v7.event.SelectionEvent;
+import com.vaadin.v7.event.SelectionEvent.SelectionListener;
import com.vaadin.v7.ui.Grid;
import com.vaadin.v7.ui.Grid.SelectionMode;
import com.vaadin.v7.ui.Grid.SingleSelectionModel;
+++ /dev/null
-/*
- * 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.event;
-
-import java.io.Serializable;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.EventObject;
-import java.util.LinkedHashSet;
-import java.util.Set;
-
-/**
- * An event that specifies what in a selection has changed, and where the
- * selection took place.
- *
- * @since 7.4
- * @author Vaadin Ltd
- */
-public class SelectionEvent extends EventObject {
-
- private LinkedHashSet<Object> oldSelection;
- private LinkedHashSet<Object> newSelection;
-
- public SelectionEvent(Object source, Collection<Object> oldSelection,
- Collection<Object> newSelection) {
- super(source);
- this.oldSelection = new LinkedHashSet<>(oldSelection);
- this.newSelection = new LinkedHashSet<>(newSelection);
- }
-
- /**
- * A {@link Collection} of all the itemIds that became selected.
- * <p>
- * <em>Note:</em> this excludes all itemIds that might have been previously
- * selected.
- *
- * @return a Collection of the itemIds that became selected
- */
- public Set<Object> getAdded() {
- return setDifference(newSelection, oldSelection);
- }
-
- /**
- * A {@link Collection} of all the itemIds that became deselected.
- * <p>
- * <em>Note:</em> this excludes all itemIds that might have been previously
- * deselected.
- *
- * @return a Collection of the itemIds that became deselected
- */
- public Set<Object> getRemoved() {
- return setDifference(oldSelection, newSelection);
- }
-
- /**
- * Slightly optimized set difference that can return the original set or a
- * modified one.
- *
- * @param set1
- * original set
- * @param set2
- * the set to subtract
- * @return the difference set
- */
- private static <T> Set<T> setDifference(Set<T> set1, Set<T> set2) {
- if (set2.isEmpty()) {
- return set1;
- } else {
- LinkedHashSet<T> set = new LinkedHashSet<>(set1);
- set.removeAll(set2);
- return set;
- }
- }
-
- /**
- * A {@link Collection} of all the itemIds that are currently selected.
- *
- * @return a Collection of the itemIds that are currently selected
- */
- public Set<Object> getSelected() {
- return Collections.unmodifiableSet(newSelection);
- }
-
- /**
- * The listener interface for receiving {@link SelectionEvent
- * SelectionEvents}.
- */
- public interface SelectionListener extends Serializable {
- /**
- * Notifies the listener that the selection state has changed.
- *
- * @param event
- * the selection change event
- */
- void select(SelectionEvent event);
- }
-
- /**
- * The interface for adding and removing listeners for {@link SelectionEvent
- * SelectionEvents}.
- */
- public interface SelectionNotifier extends Serializable {
- /**
- * Registers a new selection listener
- *
- * @param listener
- * the listener to register
- */
- void addSelectionListener(SelectionListener listener);
-
- /**
- * Removes a previously registered selection change listener
- *
- * @param listener
- * the listener to remove
- */
- void removeSelectionListener(SelectionListener listener);
- }
-}
package com.vaadin.event.selection;
import java.util.Collections;
+import java.util.Optional;
import java.util.Set;
import com.vaadin.data.HasValue.ValueChange;
* @param <T>
* the data type of the selection model
*/
-public class MultiSelectionEvent<T> extends ValueChange<Set<T>> {
+public class MultiSelectionEvent<T> extends ValueChange<Set<T>>
+ implements SelectionEvent<T> {
private final Set<T> oldSelection;
public Set<T> getOldSelection() {
return Collections.unmodifiableSet(oldSelection);
}
+
+ @Override
+ public Optional<T> getFirstSelected() {
+ return getValue().stream().findFirst();
+ }
}
--- /dev/null
+/*
+ * 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.event.selection;
+
+import java.io.Serializable;
+import java.util.Optional;
+
+/**
+ * A selection event that unifies the way to access to selection event for multi
+ * selection and single selection components (in case when only one selected
+ * item is required).
+ *
+ * @since 8.0
+ * @author Vaadin Ltd
+ * @param <T>
+ * the data type of the selection model
+ */
+public interface SelectionEvent<T> extends Serializable {
+
+ /**
+ * Get first selected data item.
+ * <p>
+ * This is the same as {@link SingleSelectionChange#getSelectedItem()} in
+ * case of single selection and the first selected item from
+ * {@link MultiSelectionEvent#getNewSelection()} in case of multi selection.
+ *
+ * @return the first selected item.
+ */
+ Optional<T> getFirstSelected();
+}
* the type of the selected item
* @since 8.0
*/
-public class SingleSelectionChange<T> extends ValueChange<T> {
+public class SingleSelectionChange<T> extends ValueChange<T>
+ implements SelectionEvent<T> {
/**
* Creates a new selection change event.
* {@code true} if this event originates from the client,
* {@code false} otherwise.
*/
- public SingleSelectionChange(AbstractListing<T, ?> source,
- T selectedItem, boolean userOriginated) {
+ public SingleSelectionChange(AbstractListing<T, ?> source, T selectedItem,
+ boolean userOriginated) {
super(source, selectedItem, userOriginated);
}
public AbstractListing<T, ?> getSource() {
return (AbstractListing<T, ?>) super.getSource();
}
+
+ @Override
+ public Optional<T> getFirstSelected() {
+ return getSelectedItem();
+ }
}
--- /dev/null
+/*
+ * 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.event.selection;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.LinkedHashSet;
+import java.util.Optional;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.mockito.Mockito;
+
+/**
+ * @author Vaadin Ltd
+ *
+ */
+public class SelectionEventTest {
+
+ @SuppressWarnings({ "unchecked", "rawtypes" })
+ @Test
+ public void getFirstSelected_mutliSelectEvent() {
+ MultiSelectionEvent<?> event = Mockito.mock(MultiSelectionEvent.class);
+ Mockito.doCallRealMethod().when(event).getFirstSelected();
+
+ Mockito.when(event.getValue())
+ .thenReturn(new LinkedHashSet(Arrays.asList("foo", "bar")));
+
+ Optional<?> selected = event.getFirstSelected();
+
+ Mockito.verify(event).getValue();
+ Assert.assertEquals("foo", selected.get());
+
+ Mockito.when(event.getValue()).thenReturn(Collections.emptySet());
+ Assert.assertFalse(event.getFirstSelected().isPresent());
+ }
+
+ @SuppressWarnings({ "unchecked", "rawtypes" })
+ @Test
+ public void getFirstSelected_singleSelectEvent() {
+ SingleSelectionChange event = Mockito.mock(SingleSelectionChange.class);
+ Mockito.doCallRealMethod().when(event).getFirstSelected();
+
+ Mockito.when(event.getSelectedItem()).thenReturn(Optional.of("foo"));
+
+ Optional<?> selected = event.getSelectedItem();
+
+ Mockito.verify(event).getSelectedItem();
+ Assert.assertEquals("foo", selected.get());
+
+ Mockito.when(event.getSelectedItem()).thenReturn(Optional.empty());
+ Assert.assertFalse(event.getFirstSelected().isPresent());
+ }
+
+}
*/
package com.vaadin.tests.fieldgroup;
-import com.vaadin.event.SelectionEvent;
-import com.vaadin.event.SelectionEvent.SelectionListener;
import com.vaadin.server.VaadinRequest;
import com.vaadin.v7.data.Item;
import com.vaadin.v7.data.util.BeanItem;
+import com.vaadin.v7.event.SelectionEvent;
+import com.vaadin.v7.event.SelectionEvent.SelectionListener;
import com.vaadin.v7.ui.Grid;
public class BasicCrudGrid extends AbstractBasicCrud {
import java.text.DateFormat;
import java.util.Locale;
-import com.vaadin.event.SelectionEvent;
-import com.vaadin.event.SelectionEvent.SelectionListener;
import com.vaadin.server.VaadinRequest;
import com.vaadin.v7.data.Item;
import com.vaadin.v7.data.util.BeanItem;
import com.vaadin.v7.data.validator.IntegerRangeValidator;
+import com.vaadin.v7.event.SelectionEvent;
+import com.vaadin.v7.event.SelectionEvent.SelectionListener;
import com.vaadin.v7.ui.Grid;
import com.vaadin.v7.ui.renderers.DateRenderer;
import java.util.logging.Level;
import com.vaadin.annotations.Push;
-import com.vaadin.event.SelectionEvent;
-import com.vaadin.event.SelectionEvent.SelectionListener;
import com.vaadin.server.VaadinRequest;
import com.vaadin.tests.components.AbstractTestUI;
import com.vaadin.ui.Button;
import com.vaadin.ui.VerticalLayout;
import com.vaadin.v7.data.Item;
import com.vaadin.v7.data.util.IndexedContainer;
+import com.vaadin.v7.event.SelectionEvent;
+import com.vaadin.v7.event.SelectionEvent.SelectionListener;
import com.vaadin.v7.ui.Grid;
import com.vaadin.v7.ui.Grid.SelectionMode;
*/
package com.vaadin.v7.tests.components.grid;
-import com.vaadin.event.SelectionEvent;
-import com.vaadin.event.SelectionEvent.SelectionListener;
import com.vaadin.server.VaadinRequest;
import com.vaadin.tests.components.AbstractTestUIWithLog;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.v7.data.Container.Indexed;
import com.vaadin.v7.data.util.BeanItemContainer;
+import com.vaadin.v7.event.SelectionEvent;
+import com.vaadin.v7.event.SelectionEvent.SelectionListener;
import com.vaadin.v7.ui.Grid;
import com.vaadin.v7.ui.Grid.SelectionMode;
*/
package com.vaadin.v7.tests.components.grid;
-import com.vaadin.event.SelectionEvent;
-import com.vaadin.event.SelectionEvent.SelectionListener;
import com.vaadin.server.VaadinRequest;
import com.vaadin.tests.components.AbstractReindeerTestUI;
import com.vaadin.ui.VerticalLayout;
import com.vaadin.v7.data.Item;
import com.vaadin.v7.data.util.IndexedContainer;
+import com.vaadin.v7.event.SelectionEvent;
+import com.vaadin.v7.event.SelectionEvent.SelectionListener;
import com.vaadin.v7.ui.Grid;
import com.vaadin.v7.ui.Grid.SelectionMode;
*/
package com.vaadin.v7.tests.components.grid;
-import com.vaadin.event.SelectionEvent;
-import com.vaadin.event.SelectionEvent.SelectionListener;
import com.vaadin.server.VaadinRequest;
import com.vaadin.tests.components.AbstractReindeerTestUI;
import com.vaadin.ui.VerticalSplitPanel;
import com.vaadin.v7.data.Item;
import com.vaadin.v7.data.util.IndexedContainer;
+import com.vaadin.v7.event.SelectionEvent;
+import com.vaadin.v7.event.SelectionEvent.SelectionListener;
import com.vaadin.v7.ui.Grid;
import com.vaadin.v7.ui.Grid.SelectionMode;
import java.util.Arrays;
import java.util.List;
-import com.vaadin.event.SelectionEvent;
-import com.vaadin.event.SelectionEvent.SelectionListener;
import com.vaadin.server.VaadinRequest;
import com.vaadin.tests.components.AbstractReindeerTestUI;
+import com.vaadin.v7.event.SelectionEvent;
+import com.vaadin.v7.event.SelectionEvent.SelectionListener;
import com.vaadin.v7.ui.Grid;
import com.vaadin.v7.ui.Grid.SelectionMode;
import com.vaadin.annotations.Theme;
import com.vaadin.data.sort.Sort;
import com.vaadin.data.sort.SortOrder;
-import com.vaadin.event.SelectionEvent;
-import com.vaadin.event.SelectionEvent.SelectionListener;
import com.vaadin.event.SortEvent;
import com.vaadin.event.SortEvent.SortListener;
import com.vaadin.shared.data.sort.SortDirection;
import com.vaadin.v7.data.fieldgroup.FieldGroup.CommitException;
import com.vaadin.v7.data.util.IndexedContainer;
import com.vaadin.v7.event.ItemClickEvent;
+import com.vaadin.v7.event.SelectionEvent;
import com.vaadin.v7.event.ItemClickEvent.ItemClickListener;
+import com.vaadin.v7.event.SelectionEvent.SelectionListener;
import com.vaadin.v7.shared.ui.grid.GridStaticCellType;
import com.vaadin.v7.shared.ui.grid.HeightMode;
import com.vaadin.v7.ui.Field;