com.holonplatform.vaadin7.internal.components.MultiSelectField Maven / Gradle / Ivy
/*
* Copyright 2016-2017 Axioma srl.
*
* 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.holonplatform.vaadin7.internal.components;
import java.util.Collection;
import java.util.Collections;
import java.util.Set;
import com.holonplatform.core.internal.utils.ObjectUtils;
import com.holonplatform.core.property.Property;
import com.holonplatform.core.property.PropertyBox;
import com.holonplatform.vaadin7.components.MultiSelect;
import com.holonplatform.vaadin7.components.builders.MultiPropertySelectInputBuilder;
import com.holonplatform.vaadin7.components.builders.MultiSelectInputBuilder;
import com.holonplatform.vaadin7.components.builders.BaseSelectInputBuilder.RenderingMode;
import com.holonplatform.vaadin7.data.ItemDataProvider;
import com.holonplatform.vaadin7.data.ItemIdentifierProvider;
import com.holonplatform.vaadin7.data.container.ItemAdapter;
import com.holonplatform.vaadin7.data.container.PropertyBoxItem;
import com.holonplatform.vaadin7.internal.components.builders.AbstractSelectFieldBuilder;
import com.holonplatform.vaadin7.internal.data.PropertyItemIdentifier;
import com.holonplatform.vaadin7.internal.data.container.PropertyBoxItemAdapter;
import com.vaadin.ui.Field;
/**
* Default multiple select {@link Field} implementation.
*
* @param Field type
*
* @since 5.0.0
*/
public class MultiSelectField extends AbstractSelectField, T, ITEM> implements MultiSelect {
private static final long serialVersionUID = -7662977233168084151L;
/**
* Constructor
* @param type Selection value type
* @param renderingMode Rendering mode
*/
@SuppressWarnings("unchecked")
public MultiSelectField(Class type, RenderingMode renderingMode) {
super((Class>) (Class) Set.class, renderingMode);
}
/*
* (non-Javadoc)
* @see com.holonplatform.vaadin.components.Selectable#getSelectedItems()
*/
@Override
public Set getSelectedItems() {
final Set value = getValue();
return (value != null) ? Collections.unmodifiableSet(value) : Collections.emptySet();
}
/*
* (non-Javadoc)
* @see com.holonplatform.vaadin.components.Selectable#deselectAll()
*/
@Override
public void deselectAll() {
clear();
}
/*
* (non-Javadoc)
* @see com.holonplatform.vaadin.components.MultiSelect#select(java.lang.Iterable)
*/
@Override
public void select(Iterable items) {
ObjectUtils.argumentNotNull(items, "Items to select must be not null");
items.forEach(i -> {
ObjectUtils.argumentNotNull(i, "Items to select must be not null");
getInternalField().select(i);
});
}
/*
* (non-Javadoc)
* @see com.holonplatform.vaadin.components.MultiSelect#deselect(java.lang.Iterable)
*/
@Override
public void deselect(Iterable items) {
ObjectUtils.argumentNotNull(items, "Items to deselect must be not null");
items.forEach(i -> {
ObjectUtils.argumentNotNull(i, "Items to deselect must be not null");
getInternalField().unselect(i);
});
}
/*
* (non-Javadoc)
* @see com.holonplatform.vaadin.components.MultiSelect#selectAll()
*/
@Override
public void selectAll() {
Collection ids = getItemIds();
if (ids != null) {
select(ids);
}
}
// Builder
/**
* Base {@link MultiSelect} builder.
* @param Selection type
*/
public static class Builder extends
AbstractSelectFieldBuilder, MultiSelect, T, T, MultiSelectField, MultiSelectInputBuilder>
implements MultiSelectInputBuilder {
/**
* Constructor
* @param type Selection value type
* @param renderingMode Rendering mode
*/
public Builder(Class type, RenderingMode renderingMode) {
super(new MultiSelectField<>(type, renderingMode));
}
/*
* (non-Javadoc)
* @see com.holonplatform.vaadin.internal.components.builders.AbstractComponentBuilder#builder()
*/
@Override
protected Builder builder() {
return this;
}
/*
* (non-Javadoc)
* @see
* com.holonplatform.vaadin.components.builders.MultiSelectFieldBuilder#dataSource(com.holonplatform.vaadin.
* data.ItemDataProvider)
*/
@SuppressWarnings("unchecked")
@Override
public MultiSelectInputBuilder dataSource(ItemDataProvider dataProvider) {
ObjectUtils.argumentNotNull(dataProvider, "Item data provider must be not null");
dataSourceBuilder.dataSource(dataProvider);
dataSourceBuilder.itemIdentifier(ItemIdentifierProvider.identity());
dataProviderConfigured = true;
return builder();
}
/*
* (non-Javadoc)
* @see
* com.holonplatform.vaadin.components.builders.MultiSelectFieldBuilder#itemAdapter(com.holonplatform.vaadin.
* data.container.ItemAdapter)
*/
@SuppressWarnings("unchecked")
@Override
public MultiSelectInputBuilder itemAdapter(ItemAdapter itemAdapter) {
dataSourceBuilder.itemAdapter(itemAdapter);
return builder();
}
/*
* (non-Javadoc)
* @see com.holonplatform.vaadin.components.builders.SelectFieldBuilder#items(java.lang.Iterable)
*/
@Override
public MultiSelectInputBuilder items(Iterable items) {
ObjectUtils.argumentNotNull(items, "Items must be not null");
this.items.clear();
items.forEach(i -> this.items.add(i));
return builder();
}
/*
* (non-Javadoc)
* @see com.holonplatform.vaadin.components.builders.SelectFieldBuilder#addItem(java.lang.Object)
*/
@Override
public MultiSelectInputBuilder addItem(T item) {
ObjectUtils.argumentNotNull(item, "Item must be not null");
this.items.add(item);
return builder();
}
/*
* (non-Javadoc)
* @see
* com.holonplatform.vaadin.internal.components.builders.AbstractSelectFieldBuilder#configureDataSource(com.
* holonplatform.vaadin.internal.components.AbstractSelectField)
*/
@SuppressWarnings("unchecked")
@Override
protected void configureDataSource(MultiSelectField instance) {
super.configureDataSource(instance);
if (!instance.getItemDataExtractor().isPresent()) {
// default extractor
instance.setItemDataExtractor((c, id, i) -> (T) id);
}
}
/*
* (non-Javadoc)
* @see com.holonplatform.vaadin.internal.components.builders.AbstractSelectFieldBuilder#buildSelect(com.
* holonframework.vaadin.internal.components.AbstractSelectField)
*/
@Override
protected MultiSelect buildSelect(MultiSelectField instance) {
return instance;
}
/*
* (non-Javadoc)
* @see com.holonplatform.vaadin.internal.components.builders.AbstractSelectFieldBuilder#buildSelectAsField(com.
* holonplatform.vaadin.internal.components.AbstractSelectField)
*/
@Override
protected Field> buildSelectAsField(MultiSelectField instance) {
return instance;
}
}
/**
* Base {@link MultiSelect} builder with {@link Property} data source support.
* @param Selection type
*/
public static class PropertyBuilder extends
AbstractSelectFieldBuilder, MultiSelect, T, PropertyBox, MultiSelectField, MultiPropertySelectInputBuilder>
implements MultiPropertySelectInputBuilder {
/**
* Constructor
* @param selectProperty Selection (and identifier) property
* @param renderingMode Rendering mode
*/
@SuppressWarnings("unchecked")
public PropertyBuilder(Property selectProperty, RenderingMode renderingMode) {
super(new MultiSelectField<>(selectProperty.getType(), renderingMode));
dataSourceBuilder.withProperty(selectProperty, selectProperty.getType());
dataSourceBuilder.itemIdentifier(new PropertyItemIdentifier<>(selectProperty));
itemAdapter(new PropertyBoxItemAdapter());
}
/*
* (non-Javadoc)
* @see
* com.holonplatform.vaadin.components.builders.PropertySelectInputBuilder#dataSource(com.holonplatform.vaadin.
* data.ItemDataProvider, java.lang.Iterable)
*/
@SuppressWarnings("unchecked")
@Override
public > MultiPropertySelectInputBuilder dataSource(
ItemDataProvider dataProvider, Iterable properties) {
ObjectUtils.argumentNotNull(dataProvider, "ItemDataProvider must be not null");
ObjectUtils.argumentNotNull(properties, "Item property set must be not null");
properties.forEach(p -> dataSourceBuilder.withProperty(p, p.getType()));
dataSourceBuilder.dataSource(dataProvider);
dataProviderConfigured = true;
return builder();
}
/*
* (non-Javadoc)
* @see com.holonplatform.vaadin.components.builders.PropertySelectFieldBuilder#itemAdapter(com.holonplatform.
* vaadin.data.container.ItemAdapter)
*/
@SuppressWarnings("unchecked")
@Override
public MultiPropertySelectInputBuilder itemAdapter(ItemAdapter itemAdapter) {
ObjectUtils.argumentNotNull(itemAdapter, "ItemAdapter must be not null");
dataSourceBuilder.itemAdapter(itemAdapter);
// set extractor
getInstance().setItemDataExtractor((c, id, i) -> itemAdapter.restore(c, i));
return builder();
}
/*
* (non-Javadoc)
* @see
* com.holonplatform.vaadin.internal.components.builders.AbstractSelectFieldBuilder#configureDataSource(com.
* holonplatform.vaadin.internal.components.AbstractSelectField)
*/
@Override
protected void configureDataSource(MultiSelectField instance) {
super.configureDataSource(instance);
if (!instance.getItemDataExtractor().isPresent()) {
// default extractor
instance.setItemDataExtractor((c, id, i) -> ((PropertyBoxItem) i).getPropertyBox());
}
}
/*
* (non-Javadoc)
* @see com.holonplatform.vaadin.internal.components.builders.AbstractSelectFieldBuilder#buildSelect(com.
* holonframework.vaadin.internal.components.AbstractSelectField)
*/
@Override
protected MultiSelect buildSelect(MultiSelectField instance) {
return instance;
}
/*
* (non-Javadoc)
* @see com.holonplatform.vaadin.internal.components.builders.AbstractSelectFieldBuilder#buildSelectAsField(com.
* holonplatform.vaadin.internal.components.AbstractSelectField)
*/
@Override
protected Field> buildSelectAsField(MultiSelectField instance) {
return instance;
}
/*
* (non-Javadoc)
* @see com.holonplatform.vaadin.internal.components.builders.AbstractComponentConfigurator#builder()
*/
@Override
protected MultiPropertySelectInputBuilder builder() {
return this;
}
}
}