package com.constellio.app.ui.framework.containers; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; import com.vaadin.data.Container; import com.vaadin.data.Container.Filterable; import com.vaadin.data.Container.Indexed; import com.vaadin.data.Container.ItemSetChangeNotifier; import com.vaadin.data.Container.PropertySetChangeNotifier; import com.vaadin.data.Container.Sortable; import com.vaadin.data.Item; import com.vaadin.data.Property; import com.vaadin.data.Property.ValueChangeListener; import com.vaadin.data.Property.ValueChangeNotifier; import com.vaadin.data.util.AbstractContainer; import com.vaadin.data.util.filter.UnsupportedFilterException; @SuppressWarnings("serial") public class ContainerAdapter<T extends Container & Indexed & Sortable> extends AbstractContainer implements Indexed, Sortable, Filterable, PropertySetChangeNotifier, ValueChangeNotifier, ItemSetChangeNotifier { protected T adapted; private List<Container.ItemSetChangeListener> itemSetChangeListeners = new ArrayList<>(); public ContainerAdapter(T adapted) { this.adapted = adapted; } public T getNestedContainer() { return adapted; } @Override public Collection<?> getContainerPropertyIds() { List<Object> propertyIds = new ArrayList<>(); Collection<?> adaptedPropertyIds = adapted.getContainerPropertyIds(); Collection<?> ownPropertyIds = getOwnContainerPropertyIds(); propertyIds.addAll(adaptedPropertyIds); propertyIds.addAll(ownPropertyIds); return propertyIds; } @Override public Property<?> getContainerProperty(Object itemId, Object propertyId) { Property<?> ownProperty = getOwnContainerProperty(itemId, propertyId); return ownProperty != null ? ownProperty : adapted.getContainerProperty(itemId, propertyId); } @Override public Class<?> getType(Object propertyId) { Class<?> ownType = getOwnType(propertyId); return ownType != null ? ownType : adapted.getType(propertyId); } @Override public Object nextItemId(Object itemId) { return adapted.nextItemId(itemId); } @Override public Object prevItemId(Object itemId) { return adapted.prevItemId(itemId); } @Override public Object firstItemId() { return adapted.firstItemId(); } @Override public Object lastItemId() { return adapted.lastItemId(); } @Override public boolean isFirstId(Object itemId) { return adapted.isFirstId(itemId); } @Override public boolean isLastId(Object itemId) { return adapted.isLastId(itemId); } @Override public Object addItemAfter(Object previousItemId) throws UnsupportedOperationException { return adapted.addItemAfter(previousItemId); } @Override public Item addItemAfter(Object previousItemId, Object newItemId) throws UnsupportedOperationException { return adapted.addItemAfter(previousItemId, newItemId); } @Override public Item getItem(Object itemId) { return adapted.getItem(itemId); } @Override public Collection<?> getItemIds() { return adapted.getItemIds(); } @Override public int size() { return adapted.size(); } @Override public boolean containsId(Object itemId) { return adapted.containsId(itemId); } @Override public Item addItem(Object itemId) throws UnsupportedOperationException { return adapted.addItem(itemId); } @Override public Object addItem() throws UnsupportedOperationException { return adapted.addItem(); } @Override public boolean removeItem(Object itemId) throws UnsupportedOperationException { return adapted.removeItem(itemId); } @Override public boolean addContainerProperty(Object propertyId, Class<?> type, Object defaultValue) throws UnsupportedOperationException { return adapted.addContainerProperty(propertyId, type, defaultValue); } @Override public boolean removeContainerProperty(Object propertyId) throws UnsupportedOperationException { return adapted.removeContainerProperty(propertyId); } @Override public boolean removeAllItems() throws UnsupportedOperationException { return adapted.removeAllItems(); } @Override public int indexOfId(Object itemId) { return adapted.indexOfId(itemId); } @Override public Object getIdByIndex(int index) { return adapted.getIdByIndex(index); } @Override public List<?> getItemIds(int startIndex, int numberOfItems) { return adapted.getItemIds(startIndex, numberOfItems); } @Override public Object addItemAt(int index) throws UnsupportedOperationException { return adapted.addItemAt(index); } @Override public Item addItemAt(int index, Object newItemId) throws UnsupportedOperationException { return adapted.addItemAt(index, newItemId); } @Override public void sort(Object[] propertyId, boolean[] ascending) { adapted.sort(propertyId, ascending); } @Override public Collection<?> getSortableContainerPropertyIds() { return adapted.getSortableContainerPropertyIds(); } @Override public void addValueChangeListener(ValueChangeListener listener) { if (adapted instanceof ValueChangeNotifier) { ((ValueChangeNotifier) adapted).addValueChangeListener(listener); } } @Deprecated @Override public void addListener(ValueChangeListener listener) { if (adapted instanceof ValueChangeNotifier) { ((ValueChangeNotifier) adapted).addListener(listener); } } @Override public void removeValueChangeListener(ValueChangeListener listener) { if (adapted instanceof ValueChangeNotifier) { ((ValueChangeNotifier) adapted).removeValueChangeListener(listener); } } @Deprecated @Override public void removeListener(ValueChangeListener listener) { if (adapted instanceof ValueChangeNotifier) { ((ValueChangeNotifier) adapted).removeListener(listener); } } @Override public void addPropertySetChangeListener( Container.PropertySetChangeListener listener) { if (adapted instanceof PropertySetChangeNotifier) { ((PropertySetChangeNotifier) adapted).addPropertySetChangeListener(listener); } } /** * @deprecated As of 7.0, replaced by * {@link #addPropertySetChangeListener(com.vaadin.data.Container.PropertySetChangeListener)} **/ @Deprecated @Override public void addListener(Container.PropertySetChangeListener listener) { if (adapted instanceof PropertySetChangeNotifier) { ((PropertySetChangeNotifier) adapted).addListener(listener); } } @Override public void removePropertySetChangeListener( Container.PropertySetChangeListener listener) { if (adapted instanceof PropertySetChangeNotifier) { ((PropertySetChangeNotifier) adapted).removePropertySetChangeListener(listener); } } /** * @deprecated As of 7.0, replaced by * {@link #removePropertySetChangeListener(com.vaadin.data.Container.PropertySetChangeListener)} **/ @Deprecated @Override public void removeListener(Container.PropertySetChangeListener listener) { if (adapted instanceof PropertySetChangeNotifier) { ((PropertySetChangeNotifier) adapted).removeListener(listener); } } // ItemSetChangeNotifier /** * @deprecated As of 7.0, replaced by * {@link #addItemSetChangeListener(com.vaadin.data.Container.ItemSetChangeListener)} **/ @Deprecated @Override public void addListener(Container.ItemSetChangeListener listener) { if (adapted instanceof ItemSetChangeNotifier) { ((ItemSetChangeNotifier) adapted).addListener(listener); } itemSetChangeListeners.add(listener); } @Override public void addItemSetChangeListener( Container.ItemSetChangeListener listener) { if (adapted instanceof ItemSetChangeNotifier) { ((ItemSetChangeNotifier) adapted).addItemSetChangeListener(listener); } itemSetChangeListeners.add(listener); } @Override public void removeItemSetChangeListener( Container.ItemSetChangeListener listener) { if (adapted instanceof ItemSetChangeNotifier) { ((ItemSetChangeNotifier) adapted).removeItemSetChangeListener(listener); } itemSetChangeListeners.remove(listener); } /** * @deprecated As of 7.0, replaced by * {@link #removeItemSetChangeListener(com.vaadin.data.Container.ItemSetChangeListener)} **/ @Deprecated @Override public void removeListener(Container.ItemSetChangeListener listener) { if (adapted instanceof ItemSetChangeNotifier) { ((ItemSetChangeNotifier) adapted).removeListener(listener); } itemSetChangeListeners.remove(listener); } @Override public void addContainerFilter(Filter filter) throws UnsupportedFilterException { if (adapted instanceof Filterable) { ((Filterable) adapted).addContainerFilter(filter); } } @Override public void removeContainerFilter(Filter filter) { if (adapted instanceof Filterable) { ((Filterable) adapted).removeContainerFilter(filter); } } @Override public void removeAllContainerFilters() { if (adapted instanceof Filterable) { ((Filterable) adapted).removeAllContainerFilters(); } } @Override public Collection<Filter> getContainerFilters() { if (adapted instanceof Filterable) { return ((Filterable) adapted).getContainerFilters(); } else { return new ArrayList<>(); } } protected Collection<?> getOwnContainerPropertyIds() { return Collections.emptyList(); } protected Class<?> getOwnType(Object propertyId) { return null; } protected Property<?> getOwnContainerProperty(Object itemId, Object propertyId) { return null; } @SuppressWarnings("unchecked") @Override public void fireItemSetChange() { super.fireItemSetChange(); if (adapted instanceof ContainerAdapter) { ((ContainerAdapter<T>) adapted).fireItemSetChange(); } else if (adapted instanceof RefreshableContainer) { ((RefreshableContainer) adapted).refresh(); } } @Override protected void fireItemSetChange(ItemSetChangeEvent event) { super.fireItemSetChange(event); for (ItemSetChangeListener listener : itemSetChangeListeners) { listener.containerItemSetChange(event); } } }