package enterpriseapp.ui.crud; import java.util.Collection; import java.util.HashSet; import com.vaadin.data.Validator; import com.vaadin.data.Validator.InvalidValueException; import com.vaadin.data.util.BeanContainer; import com.vaadin.ui.Component; import com.vaadin.ui.CustomField; import enterpriseapp.hibernate.dto.Dto; public class EntityTable<T extends Dto> extends CustomField<Collection<T>> { private static final long serialVersionUID = 1L; protected EmbeddedCrudComponent<T> crudComponent; protected final Class<T> type; protected Collection<T> set; protected BeanContainer<Long, T> container; @SuppressWarnings("unchecked") public EntityTable(final Class<T> type, Collection<T> set, EmbeddedCrudComponent<T> crudComponent) { this.type = type; this.set = set; this.crudComponent = crudComponent; container = (BeanContainer<Long, T>) crudComponent.getContainer(); container.setBeanIdProperty("id"); container.addAll(set); if(set == null) { this.set = new HashSet<T>(); } crudComponent.getTable().setPageLength(0); crudComponent.getTable().setColumnCollapsed("id", true); crudComponent.getTable().setValidationVisible(false); crudComponent.getTableLayout().setMargin(false); } @Override protected Component initContent() { return crudComponent; } @SuppressWarnings("unchecked") @Override public Class<Collection<T>> getType() { return (Class<Collection<T>>) set.getClass(); } @Override public void setInternalValue(Collection<T> newValue) { super.setInternalValue(newValue); container.removeAllItems(); container.addAll(newValue); } @SuppressWarnings("unchecked") @Override public Collection<T> getInternalValue() { set.clear(); for(Object itemId : container.getItemIds()) { T bean = null; if(Dto.class.isAssignableFrom(itemId.getClass())) { bean = (T) itemId; } else { bean = container.getItem(itemId).getBean(); } if(bean != null) { set.add(bean); } } return set; } @Override public void setReadOnly(boolean readOnly) { super.setReadOnly(readOnly); crudComponent.getTable().removeAllFields(); crudComponent.getTable().setEditable(!readOnly); crudComponent.getTable().setReadOnly(readOnly); } @Override protected boolean isEmpty() { return (getValue() == null || ((Collection<?>) getValue()).isEmpty()); } @Override public boolean isValid() { try { validate(); } catch(InvalidValueException e) { return false; } return true; } @Override public void validate() throws Validator.InvalidValueException { try { setComponentError(null); super.validate(); crudComponent.getTable().validate(); } catch(InvalidValueException e) { throw new InvalidValueException(this.getCaption() + " - " + e.getMessage()); } } public CrudComponent<T> getCrudComponent() { return crudComponent; } public BeanContainer<Long, T> getContainer() { return container; } }