com.holonplatform.vaadin7.internal.components.builders.AbstractItemListingBuilder 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.builders;
import java.util.LinkedList;
import java.util.List;
import com.holonplatform.core.Path;
import com.holonplatform.core.i18n.Localizable;
import com.holonplatform.core.internal.utils.ObjectUtils;
import com.holonplatform.core.query.QueryConfigurationProvider;
import com.holonplatform.core.query.QueryFilter;
import com.holonplatform.core.query.QuerySort;
import com.holonplatform.vaadin7.components.ItemListing;
import com.holonplatform.vaadin7.components.ItemListing.CellStyleGenerator;
import com.holonplatform.vaadin7.components.ItemListing.ColumnAlignment;
import com.holonplatform.vaadin7.components.ItemListing.ItemClickListener;
import com.holonplatform.vaadin7.components.ItemListing.ItemDescriptionGenerator;
import com.holonplatform.vaadin7.components.ItemListing.PropertyReorderListener;
import com.holonplatform.vaadin7.components.ItemListing.PropertyResizeListener;
import com.holonplatform.vaadin7.components.ItemListing.PropertyVisibilityListener;
import com.holonplatform.vaadin7.components.ItemListing.RowStyleGenerator;
import com.holonplatform.vaadin7.components.Selectable.SelectionListener;
import com.holonplatform.vaadin7.components.Selectable.SelectionMode;
import com.holonplatform.vaadin7.components.builders.ComponentPostProcessor;
import com.holonplatform.vaadin7.components.builders.ItemListingBuilder;
import com.holonplatform.vaadin7.data.ItemDataProvider;
import com.holonplatform.vaadin7.data.ItemIdentifierProvider;
import com.holonplatform.vaadin7.data.ItemDataSource.CommitHandler;
import com.holonplatform.vaadin7.data.ItemDataSource.PropertySortGenerator;
import com.holonplatform.vaadin7.data.container.ItemAdapter;
import com.holonplatform.vaadin7.data.container.ItemDataSourceContainer;
import com.holonplatform.vaadin7.data.container.ItemDataSourceContainerBuilder.BaseItemDataSourceContainerBuilder;
import com.holonplatform.vaadin7.internal.components.DefaultItemListing;
import com.holonplatform.vaadin7.internal.data.container.BeanItemAdapter;
import com.vaadin.ui.Component;
import com.vaadin.ui.Field;
/**
* Base {@link ItemListingBuilder} implementation.
*
* @param Item data type
* @param Item property type
* @param Component type
* @param Internal instance
* @param Concrete builder type
* @param Concrete backing component type
*
* @since 5.0.0
*/
public abstract class AbstractItemListingBuilder, I extends DefaultItemListing, B extends ItemListingBuilder, X extends Component>
extends AbstractComponentBuilder implements ItemListingBuilder {
protected final List> postProcessors = new LinkedList<>();
private PropertyReorderListener reorderListener;
/**
* Data source builder.
*/
protected final BaseItemDataSourceContainerBuilder dataSourceBuilder = ItemDataSourceContainer.builder();
/**
* Constructor
* @param instance Instance to build
*/
@SuppressWarnings("unchecked")
public AbstractItemListingBuilder(I instance) {
super(instance);
// default adapter
dataSourceBuilder.itemAdapter(new BeanItemAdapter());
}
/*
* (non-Javadoc)
* @see com.holonplatform.vaadin.components.builders.ItemListingBuilder#editor(java.lang.Object,
* com.vaadin.ui.Field)
*/
@Override
public B editor(P property, Field editor) {
ObjectUtils.argumentNotNull(property, "Property must be not null");
getInstance().getPropertyColumn(property).setEditor(editor);
return builder();
}
/*
* (non-Javadoc)
* @see
* com.holonplatform.vaadin.components.builders.ItemDataSourceComponentBuilder#dataSource(com.holonplatform.vaadin
* .data.ItemDataProvider, com.holonplatform.vaadin.data.ItemIdentifierProvider)
*/
@Override
public B dataSource(ItemDataProvider dataProvider, ItemIdentifierProvider itemIdentifierProvider) {
ObjectUtils.argumentNotNull(dataProvider, "Item data provider must be not null");
ObjectUtils.argumentNotNull(itemIdentifierProvider, "Item identifier provider must be not null");
dataSourceBuilder.dataSource(dataProvider);
dataSourceBuilder.itemIdentifier(itemIdentifierProvider);
return builder();
}
/*
* (non-Javadoc)
* @see com.holonplatform.vaadin.components.builders.ItemDataSourceComponentBuilder#itemAdapter(com.holonplatform.
* vaadin.data.container.ItemAdapter)
*/
@Override
public B itemAdapter(ItemAdapter itemAdapter) {
ObjectUtils.argumentNotNull(itemAdapter, "Item adapter must be not null");
dataSourceBuilder.itemAdapter(itemAdapter);
return builder();
}
/*
* (non-Javadoc)
* @see com.holonplatform.vaadin.components.builders.ItemListingBuilder#sortable(java.lang.Object, boolean)
*/
@Override
public B sortable(P property, boolean sortable) {
ObjectUtils.argumentNotNull(property, "Property must be not null");
dataSourceBuilder.sortable(property, sortable);
return builder();
}
/*
* (non-Javadoc)
* @see com.holonplatform.vaadin.components.builders.ItemListingBuilder#readOnly(java.lang.Object, boolean)
*/
@Override
public B readOnly(P property, boolean readOnly) {
ObjectUtils.argumentNotNull(property, "Property must be not null");
dataSourceBuilder.readOnly(property, readOnly);
return builder();
}
/*
* (non-Javadoc)
* @see com.holonplatform.vaadin.components.builders.ItemListingBuilder#defaultValue(java.lang.Object,
* java.lang.Object)
*/
@Override
public B defaultValue(P property, Object defaultValue) {
ObjectUtils.argumentNotNull(property, "Property must be not null");
dataSourceBuilder.defaultValue(property, defaultValue);
return builder();
}
/*
* (non-Javadoc)
* @see com.holonplatform.vaadin.components.builders.ItemListingBuilder#sortUsing(java.lang.Object,
* com.holonplatform.core.Path)
*/
@Override
public B sortUsing(P property, final Path sortPath) {
ObjectUtils.argumentNotNull(property, "Property must be not null");
dataSourceBuilder.withPropertySortGenerator(property, (p, asc) -> QuerySort.of(sortPath, asc));
return builder();
}
/*
* (non-Javadoc)
* @see com.holonplatform.vaadin.components.builders.ItemListingBuilder#sortGenerator(java.lang.Object,
* com.holonplatform.vaadin.data.ItemDataSource.PropertySortGenerator)
*/
@Override
public B sortGenerator(P property, PropertySortGenerator generator) {
ObjectUtils.argumentNotNull(property, "Property must be not null");
ObjectUtils.argumentNotNull(generator, "Sort generator must be not null");
dataSourceBuilder.withPropertySortGenerator(property, generator);
return builder();
}
/*
* (non-Javadoc)
* @see com.holonplatform.vaadin.components.builders.BaseItemDataSourceComponentBuilder#autoRefresh(boolean)
*/
@Override
public B autoRefresh(boolean autoRefresh) {
dataSourceBuilder.autoRefresh(autoRefresh);
return builder();
}
/*
* (non-Javadoc)
* @see com.holonplatform.vaadin.components.builders.BaseItemDataSourceComponentBuilder#batchSize(int)
*/
@Override
public B batchSize(int batchSize) {
dataSourceBuilder.batchSize(batchSize);
return builder();
}
/*
* (non-Javadoc)
* @see com.holonplatform.vaadin.components.builders.BaseItemDataSourceComponentBuilder#maxCacheSize(int)
*/
@Override
public B maxCacheSize(int maxCacheSize) {
dataSourceBuilder.maxCacheSize(maxCacheSize);
return builder();
}
/*
* (non-Javadoc)
* @see
* com.holonplatform.vaadin.components.builders.BaseItemDataSourceComponentBuilder#withQueryConfigurationProvider(
* com.holonplatform.core.query.QueryConfigurationProvider)
*/
@Override
public B withQueryConfigurationProvider(QueryConfigurationProvider queryConfigurationProvider) {
ObjectUtils.argumentNotNull(queryConfigurationProvider, "QueryConfigurationProvider must be not null");
dataSourceBuilder.withQueryConfigurationProvider(queryConfigurationProvider);
return builder();
}
/*
* (non-Javadoc)
* @see
* com.holonplatform.vaadin.components.builders.BaseItemDataSourceComponentBuilder#fixedFilter(com.holonplatform.
* core.query.QueryFilter)
*/
@Override
public B fixedFilter(QueryFilter filter) {
dataSourceBuilder.fixedFilter(filter);
return builder();
}
/*
* (non-Javadoc)
* @see com.holonplatform.vaadin.components.builders.BaseItemDataSourceComponentBuilder#fixedSort(com.holonplatform.
* core.query.QuerySort)
*/
@Override
public B fixedSort(QuerySort sort) {
dataSourceBuilder.fixedSort(sort);
return builder();
}
/*
* (non-Javadoc)
* @see
* com.holonplatform.vaadin.components.builders.BaseItemDataSourceComponentBuilder#defaultSort(com.holonplatform.
* core.query.QuerySort)
*/
@Override
public B defaultSort(QuerySort sort) {
dataSourceBuilder.defaultSort(sort);
return builder();
}
/*
* (non-Javadoc)
* @see
* com.holonplatform.vaadin.components.builders.BaseItemDataSourceComponentBuilder#queryParameter(java.lang.String,
* java.lang.Object)
*/
@Override
public B queryParameter(String name, Object value) {
dataSourceBuilder.queryParameter(name, value);
return builder();
}
/*
* (non-Javadoc)
* @see com.holonplatform.vaadin.components.builders.ItemListingBuilder#commitHandler(com.holonplatform.vaadin.data.
* ItemDataSource.CommitHandler)
*/
@Override
public B commitHandler(CommitHandler commitHandler) {
ObjectUtils.argumentNotNull(commitHandler, "CommitHandler must be not null");
dataSourceBuilder.commitHandler(commitHandler);
return builder();
}
/*
* (non-Javadoc)
* @see
* com.holonplatform.vaadin.components.builders.ItemListingBuilder#withRowStyle(com.holonplatform.vaadin.components.
* ItemListing.RowStyleGenerator)
*/
@Override
public B withRowStyle(RowStyleGenerator rowStyleGenerator) {
getInstance().addRowStyleGenerator(rowStyleGenerator);
return builder();
}
/*
* (non-Javadoc)
* @see com.holonplatform.vaadin.components.builders.ItemListingBuilder#header(java.lang.Object,
* com.holonplatform.core.i18n.Localizable)
*/
@Override
public B header(P property, Localizable header) {
ObjectUtils.argumentNotNull(property, "Property must be not null");
ObjectUtils.argumentNotNull(header, "Header must be not null");
getInstance().getPropertyColumn(property).setCaption(header);
return builder();
}
/*
* (non-Javadoc)
* @see com.holonplatform.vaadin.components.builders.ItemListingBuilder#alignment(java.lang.Object,
* com.holonplatform.vaadin.components.ItemListing.ColumnAlignment)
*/
@Override
public B alignment(P property, ColumnAlignment alignment) {
ObjectUtils.argumentNotNull(property, "Property must be not null");
ObjectUtils.argumentNotNull(alignment, "Aligment must be not null");
getInstance().getPropertyColumn(property).setAlignment(alignment);
return builder();
}
/*
* (non-Javadoc)
* @see com.holonplatform.vaadin.components.builders.ItemListingBuilder#width(java.lang.Object, int)
*/
@Override
public B width(P property, int widthInPixels) {
ObjectUtils.argumentNotNull(property, "Property must be not null");
getInstance().getPropertyColumn(property).setWidth(widthInPixels);
return builder();
}
/*
* (non-Javadoc)
* @see com.holonplatform.vaadin.components.builders.ItemListingBuilder#editable(java.lang.Object, boolean)
*/
@Override
public B editable(P property, boolean editable) {
ObjectUtils.argumentNotNull(property, "Property must be not null");
getInstance().getPropertyColumn(property).setEditable(editable);
return builder();
}
/*
* (non-Javadoc)
* @see com.holonplatform.vaadin.components.builders.ItemListingBuilder#hidable(java.lang.Object, boolean)
*/
@Override
public B hidable(P property, boolean hidable) {
ObjectUtils.argumentNotNull(property, "Property must be not null");
getInstance().getPropertyColumn(property).setHidable(hidable);
return builder();
}
/*
* (non-Javadoc)
* @see com.holonplatform.vaadin.components.builders.ItemListingBuilder#hidden(java.lang.Object, boolean)
*/
@Override
public B hidden(P property, boolean hidden) {
ObjectUtils.argumentNotNull(property, "Property must be not null");
getInstance().getPropertyColumn(property).setHidden(hidden);
return builder();
}
/*
* (non-Javadoc)
* @see com.holonplatform.vaadin.components.builders.ItemListingBuilder#hideHeaders()
*/
@Override
public B hideHeaders() {
getInstance().setHeadersVisible(false);
return builder();
}
/*
* (non-Javadoc)
* @see com.holonplatform.vaadin.components.builders.ItemListingBuilder#style(java.lang.Object,
* com.holonplatform.vaadin.components.ItemListing.CellStyleGenerator)
*/
@Override
public B style(P property, CellStyleGenerator cellStyleGenerator) {
ObjectUtils.argumentNotNull(property, "Property must be not null");
ObjectUtils.argumentNotNull(cellStyleGenerator, "Style generator must be not null");
getInstance().getPropertyColumn(property).setStyle(cellStyleGenerator);
return builder();
}
/*
* (non-Javadoc)
* @see com.holonplatform.vaadin.components.builders.ItemListingBuilder#buffered(boolean)
*/
@Override
public B buffered(boolean buffered) {
getInstance().setBuffered(buffered);
dataSourceBuilder.buffered(buffered);
return builder();
}
/*
* (non-Javadoc)
* @see
* com.holonplatform.vaadin.components.builders.ItemListingBuilder#selectionMode(com.holonplatform.vaadin.components
* .Selectable.SelectionMode)
*/
@Override
public B selectionMode(SelectionMode selectionMode) {
ObjectUtils.argumentNotNull(selectionMode, "SelectionMode must be not null");
getInstance().setSelectionMode(selectionMode);
return builder();
}
/*
* (non-Javadoc)
* @see
* com.holonplatform.vaadin.components.builders.ItemListingBuilder#withSelectionListener(com.holonplatform.vaadin.
* components.Selectable.SelectionListener)
*/
@Override
public B withSelectionListener(SelectionListener selectionListener) {
ObjectUtils.argumentNotNull(selectionListener, "SelectionListener must be not null");
getInstance().addSelectionListener(selectionListener);
return builder();
}
/*
* (non-Javadoc)
* @see com.holonplatform.vaadin.components.builders.ItemListingBuilder#editable(boolean)
*/
@Override
public B editable(boolean editable) {
getInstance().setEditable(editable);
return builder();
}
/*
* (non-Javadoc)
* @see
* com.holonplatform.vaadin.components.builders.ItemListingBuilder#withItemClickListener(com.holonplatform.vaadin.
* components.ItemListing.ItemClickListener)
*/
@Override
public B withItemClickListener(ItemClickListener listener) {
getInstance().addItemClickListener(listener);
return builder();
}
/*
* (non-Javadoc)
* @see
* com.holonplatform.vaadin.components.builders.ItemListingBuilder#withPropertyReorderListener(com.holonplatform.
* vaadin.components.ItemListing.PropertyReorderListener)
*/
@Override
public B withPropertyReorderListener(PropertyReorderListener listener) {
ObjectUtils.argumentNotNull(listener, "Listener must be not null");
this.reorderListener = listener;
return builder();
}
/*
* (non-Javadoc)
* @see
* com.holonplatform.vaadin.components.builders.ItemListingBuilder#withPropertyResizeListener(com.holonplatform.
* vaadin.components.ItemListing.PropertyResizeListener)
*/
@Override
public B withPropertyResizeListener(PropertyResizeListener
listener) {
getInstance().addPropertyResizeListener(listener);
return builder();
}
/*
* (non-Javadoc)
* @see
* com.holonplatform.vaadin.components.builders.ItemListingBuilder#withPropertyVisibilityListener(com.holonplatform.
* vaadin.components.ItemListing.PropertyVisibilityListener)
*/
@Override
public B withPropertyVisibilityListener(PropertyVisibilityListener
listener) {
getInstance().addPropertyVisibilityListener(listener);
return builder();
}
/*
* (non-Javadoc)
* @see
* com.holonplatform.vaadin.components.builders.ItemListingBuilder#itemDescriptionGenerator(com.holonplatform.vaadin
* .components.ItemListing.ItemDescriptionGenerator)
*/
@Override
public B itemDescriptionGenerator(ItemDescriptionGenerator rowDescriptionGenerator) {
getInstance().setDescriptionGenerator(rowDescriptionGenerator);
return builder();
}
/*
* (non-Javadoc)
* @see com.holonplatform.vaadin.components.builders.ItemListingBuilder#columnHidingAllowed(boolean)
*/
@Override
public B columnHidingAllowed(boolean columnHidingAllowed) {
getInstance().setColumnHidingAllowed(columnHidingAllowed);
return builder();
}
/*
* (non-Javadoc)
* @see com.holonplatform.vaadin.components.builders.ItemListingBuilder#columnReorderingAllowed(boolean)
*/
@Override
public B columnReorderingAllowed(boolean columnReorderingAllowed) {
getInstance().setColumnReorderingAllowed(columnReorderingAllowed);
return builder();
}
/*
* (non-Javadoc)
* @see com.holonplatform.vaadin.components.builders.ItemListingBuilder#footerVisible(boolean)
*/
@Override
public B footerVisible(boolean footerVisible) {
getInstance().setFooterVisible(footerVisible);
return builder();
}
/*
* (non-Javadoc)
* @see
* com.holonplatform.vaadin.components.builders.ComponentPostProcessorSupport#withPostProcessor(com.holonplatform.
* vaadin.components.builders.ComponentPostProcessor)
*/
@Override
public B withPostProcessor(ComponentPostProcessor postProcessor) {
ObjectUtils.argumentNotNull(postProcessor, "ComponentPostProcessor must be not null");
postProcessors.add(postProcessor);
return builder();
}
/*
* (non-Javadoc)
* @see com.holonplatform.vaadin.components.builders.ItemListingBuilder#build(java.lang.Iterable)
*/
@Override
public C build(Iterable visibleColumns) {
return buildAndConfigure(visibleColumns);
}
/*
* (non-Javadoc)
* @see com.holonplatform.vaadin.components.builders.ComponentBuilder#build()
*/
@Override
public C build() {
return buildAndConfigure(null);
}
/**
* Build listing component and configure columns
* @param visibleColumns Columns to show. If null
or empty, all data source properties will be used as
* visibile columns.
* @return Listing component
*/
protected C buildAndConfigure(Iterable
visibleColumns) {
// build
I listing = getInstance();
localize(listing);
// data source
ItemDataSourceContainer dataSource = dataSourceBuilder.build();
listing.setDataSource(dataSource);
// visible columns
listing.setPropertyColumns(
(visibleColumns != null) ? visibleColumns : dataSource.getConfiguration().getProperties());
// additional configuration
configure(listing);
// Reorder listener
if (reorderListener != null) {
listing.addPropertyReorderListener(reorderListener);
}
// build
C built = build(listing);
// post processors
postProcessors.forEach(p -> p.process(built));
// done
return built;
}
/**
* Additional listing configuration
* @param instance Building instance
*/
protected abstract void configure(I instance);
}