package com.thingtrack.konekti.view.web.form.field; import java.util.List; import org.osgi.framework.BundleContext; import org.osgi.framework.FrameworkUtil; import org.osgi.framework.ServiceReference; import org.vaadin.addon.customfield.CustomField; import com.thingtrack.konekti.domain.Product; import com.thingtrack.konekti.domain.ProductUnit; import com.thingtrack.konekti.service.api.ProductUnitService; import com.thingtrack.konekti.view.addon.data.BindingSource; import com.thingtrack.konekti.view.kernel.IWorkbenchContext; import com.vaadin.annotations.AutoGenerated; import com.vaadin.data.Property; import com.vaadin.ui.CheckBox; import com.vaadin.ui.Table; import com.vaadin.ui.VerticalLayout; @SuppressWarnings("serial") public class ProductUnitCollectionField extends CustomField { @AutoGenerated private VerticalLayout mainLayout; @AutoGenerated private Table productUnitTable; /*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */ private BindingSource<ProductUnit> productUnitsBindingSource; private List<ProductUnit> assignedProductUnit; private ProductUnitService productUnitService; private Product product; private IWorkbenchContext context; /** * The constructor should first build the main layout, set the * composition root and then do any custom initialization. * * The constructor will not be automatically regenerated by the * visual editor. */ public ProductUnitCollectionField(IWorkbenchContext context) { this.context = context; buildMainLayout(); setCompositionRoot(mainLayout); // TODO add user code here //Retrieve enterprise services getServices(); productUnitsBindingSource = new BindingSource<ProductUnit>(ProductUnit.class); productUnitTable.setContainerDataSource(productUnitsBindingSource); productUnitTable.addGeneratedColumn(ProductAssignmentColumn.PRODUCT_COLUMN_ID, new ProductAssignmentColumn()); productUnitTable.setVisibleColumns(new String[]{"code", "description", ProductAssignmentColumn.PRODUCT_COLUMN_ID}); productUnitTable.setColumnHeaders(new String[] { "Code", "DescripciĆ³n", "Activo" } ); } @SuppressWarnings("unchecked") @Override public void setPropertyDataSource(Property newDataSource) { if(newDataSource.getValue() instanceof List){ List<ProductUnit> productUnits = (List<ProductUnit>) newDataSource.getValue(); //Already organziations assigned to parent vehicle assignedProductUnit = productUnits; //Clean first the biding source productUnitsBindingSource.removeAllItems(); try { //Add all available organizations productUnitsBindingSource.addAll(productUnitService.getAll(context.getUser().getActiveArea())); } catch (Exception e) { e.printStackTrace(); } } super.setPropertyDataSource(newDataSource); } @Override public Class<?> getType() { if(getPropertyDataSource() instanceof Property) return getPropertyDataSource().getType(); return List.class; } @Override public Object getValue() { return assignedProductUnit; } @AutoGenerated private VerticalLayout buildMainLayout() { // common part: create layout mainLayout = new VerticalLayout(); mainLayout.setImmediate(false); mainLayout.setWidth("100%"); mainLayout.setHeight("100%"); mainLayout.setMargin(false); // top-level component properties setWidth("100.0%"); setHeight("100.0%"); // Organizationstable productUnitTable = new Table(); productUnitTable.setImmediate(false); productUnitTable.setWidth("100.0%"); productUnitTable.setHeight("100.0%"); mainLayout.addComponent(productUnitTable); mainLayout.setExpandRatio(productUnitTable, 1.0f); return mainLayout; } @SuppressWarnings({ "unchecked", "rawtypes" }) public void getServices(){ BundleContext bundleContext = FrameworkUtil.getBundle(this.getClass()).getBundleContext(); ServiceReference productUnitServiceReference = bundleContext.getServiceReference(ProductUnitService.class.getName()); productUnitService = ProductUnitService.class.cast(bundleContext.getService(productUnitServiceReference)); } private class ProductAssignmentColumn implements Table.ColumnGenerator{ static final String PRODUCT_COLUMN_ID = "productunit-assignment"; @Override public Object generateCell(Table source, Object itemId, Object columnId) { CheckBox assignmentColumn = new CheckBox(); final ProductUnit productUnitItem = (ProductUnit) itemId; assignmentColumn.setValue(assignedProductUnit.contains(productUnitItem)); assignmentColumn.addListener(new ValueChangeListener() { @Override public void valueChange(Property.ValueChangeEvent event) { boolean assignmentValue = (Boolean) event.getProperty().getValue(); if(assignmentValue) assignedProductUnit.add(productUnitItem); else assignedProductUnit.remove(productUnitItem); } }); return assignmentColumn; } } /** * @param product the product to set */ public void setProduct(Product product) { this.product = product; } }