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

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; } } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy