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;
}
}