package enterpriseapp.ui.crud; import java.util.List; import com.vaadin.data.Property; import com.vaadin.data.Validator; import com.vaadin.ui.AbstractSelect; import com.vaadin.ui.Button; import com.vaadin.ui.Button.ClickEvent; import com.vaadin.ui.Component; import com.vaadin.ui.CustomField; import com.vaadin.ui.HorizontalLayout; import com.vaadin.ui.ListSelect; import com.vaadin.ui.themes.Reindeer; import enterpriseapp.hibernate.ContainerFactory; import enterpriseapp.hibernate.DefaultHbnContainer; import enterpriseapp.ui.Constants; /** * A field which allows selection of multiple Entity/Dto values. * * @author Alejandro Duarte. * */ public class EntitySetField extends CustomField implements Button.ClickListener { private static final long serialVersionUID = 1L; protected final Class<?> type; protected HorizontalLayout layout; protected AbstractSelect select; protected Button refreshButton; protected final DefaultHbnContainer<?> container; /** * @param type Entity/Dto type. * @param container container to set for the field. */ public EntitySetField(Class<?> type, DefaultHbnContainer<?> container) { this.type = type; if(container == null) { this.container = ContainerFactory.getInstance().getContainer(type); } else { this.container = container; } initSelectComponent(); select.setSizeFull(); select.setImmediate(true); refreshButton = new Button(Constants.uiRefresh); refreshButton.setTabIndex(-1); refreshButton.setStyleName(Reindeer.BUTTON_SMALL); refreshButton.addListener((Button.ClickListener) this); layout = new HorizontalLayout(); layout.setSizeFull(); layout.setSpacing(true); layout.addComponent(select); layout.setExpandRatio(select, 1); layout.addComponent(refreshButton); update(); } @Override protected Component initContent() { return layout; } protected void initSelectComponent() { select = new ListSelect(); select.setMultiSelect(true); select.setNullSelectionAllowed(true); } @Override public void attach() { super.attach(); if(CrudTable.class.isAssignableFrom(getParent().getClass())) { refreshButton.setVisible(false); } } /** * Updates field items. */ public void update() { select.removeAllItems(); List<?> list = container.listAll(); for(Object o : list) { String stringRep = o.toString(); select.addItem(o); select.setItemCaption(o, stringRep); } } @Override public Class<?> getType() { return type; } @Override public void setValue(Object newValue) { select.setValue(newValue); } @Override public Object getValue() { return select.getValue(); } @Override public void setPropertyDataSource(Property newDataSource) { select.setPropertyDataSource(newDataSource); } @Override public boolean isValid() { return select.isValid(); } @Override public void validate() throws Validator.InvalidValueException { select.validate(); } @Override public void setReadOnly(boolean readOnly) { select.setReadOnly(readOnly); refreshButton.setVisible(!readOnly); } @Override public void buttonClick(ClickEvent event) { update(); } @Override public boolean isRequired() { return select.isRequired(); } @Override public void setRequired(boolean required) { select.setRequired(required); } @Override public String getRequiredError() { return select.getRequiredError(); } @Override public void setRequiredError(String requiredMessage) { select.setRequiredError(requiredMessage); } @Override public void addListener(Property.ValueChangeListener listener) { select.addListener(listener); } @Override public void addStyleName(String style) { select.addStyleName(style); } @Override public void setStyleName(String style) { select.setStyleName(style); } /** * @return layout where the field is presented. */ public HorizontalLayout getLayout() { return layout; } /** * @return select field. */ public AbstractSelect getSelect() { return select; } }