package org.activiti.designer.property.ui; import java.util.Iterator; import java.util.List; import org.activiti.designer.util.eclipse.ActivitiUiUtil; import org.eclipse.bpmn2.Bpmn2Factory; import org.eclipse.bpmn2.FieldExtension; import org.eclipse.bpmn2.ServiceTask; import org.eclipse.emf.transaction.TransactionalEditingDomain; import org.eclipse.graphiti.mm.pictograms.Diagram; import org.eclipse.graphiti.mm.pictograms.PictogramElement; import org.eclipse.graphiti.platform.IDiagramEditor; import org.eclipse.graphiti.services.Graphiti; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.TableItem; public class FieldExtensionEditor extends TableFieldEditor { private Composite parent; public PictogramElement pictogramElement; public IDiagramEditor diagramEditor; public Diagram diagram; public FieldExtensionEditor(String key, Composite parent) { super(key, "", new String[] {"Field name", "String value / Expression"}, new int[] {200, 400}, parent); this.parent = parent; } public void initialize(List<FieldExtension> fieldList) { removeTableItems(); if(fieldList == null || fieldList.size() == 0) return; for (FieldExtension fieldExtension : fieldList) { addTableItem(fieldExtension.getFieldname(), fieldExtension.getExpression()); } } public void initializeModel(List<FieldExtension> fieldList) { removeTableItems(); if(fieldList == null || fieldList.size() == 0) return; for (FieldExtension fieldExtension : fieldList) { addTableItem(fieldExtension.getFieldname(), fieldExtension.getExpression()); } } @Override protected String createList(String[][] items) { return null; } @Override protected String[][] parseString(String string) { return null; } protected void addTableItem(String name, String value) { if(table != null) { TableItem tableItem = new TableItem(table, SWT.NONE); tableItem.setText(0, name); tableItem.setText(1, value); } } @Override protected String[] getNewInputObject() { FieldExtensionDialog dialog = new FieldExtensionDialog(parent.getShell(), getItems()); dialog.open(); String fieldNameInput = dialog.fieldNameInput; String fieldValueInput = dialog.fieldValueInput; if(fieldNameInput != null && fieldNameInput.length() > 0 && fieldValueInput != null && fieldValueInput.length() > 0) { return new String[] { fieldNameInput, fieldValueInput }; } else { return null; } } @Override protected String[] getChangedInputObject(TableItem tableItem) { FieldExtensionDialog dialog = new FieldExtensionDialog(parent.getShell(), getItems(), tableItem.getText(0), tableItem.getText(1)); dialog.open(); String fieldNameInput = dialog.fieldNameInput; String fieldValueInput = dialog.fieldValueInput; if(fieldNameInput != null && fieldNameInput.length() > 0 && fieldValueInput != null && fieldValueInput.length() > 0) { if(tableItem.getText(0).equals(fieldNameInput) && tableItem.getText(1).equals(fieldValueInput)) { return null; } return new String[] { fieldNameInput, fieldValueInput }; } else { return null; } } @Override protected void removedItem(int index) { // TODO Auto-generated method stub } @Override protected void selectionChanged() { super.selectionChanged(); saveFieldExtensions(); } private void saveFieldExtensions() { if (pictogramElement != null) { Object bo = Graphiti.getLinkService().getBusinessObjectForLinkedPictogramElement(pictogramElement); if (bo instanceof ServiceTask) { TransactionalEditingDomain editingDomain = diagramEditor.getEditingDomain(); ActivitiUiUtil.runModelChange(new Runnable() { public void run() { Object bo = Graphiti.getLinkService().getBusinessObjectForLinkedPictogramElement(pictogramElement); if (bo == null) { return; } ServiceTask serviceTask = (ServiceTask) bo; for (TableItem item : getItems()) { String fieldName = item.getText(0); String fieldExpression = item.getText(1); if(fieldName != null && fieldName.length() > 0 && fieldExpression != null && fieldExpression.length() > 0) { FieldExtension fieldExtension = fieldExtensionExists(serviceTask, fieldName); if(fieldExtension != null) { fieldExtension.setExpression(fieldExpression); } else { FieldExtension newFieldExtension = Bpmn2Factory.eINSTANCE.createFieldExtension(); newFieldExtension.setFieldname(fieldName); newFieldExtension.setExpression(fieldExpression); diagram.eResource().getContents().add(newFieldExtension); serviceTask.getFieldExtensions().add(newFieldExtension); } } } removeFieldExtensionsNotInList(getItems(), serviceTask); } }, editingDomain, "Model Update"); } } } private FieldExtension fieldExtensionExists(ServiceTask serviceTask, String fieldName) { if(serviceTask.getFieldExtensions() == null) return null; for(FieldExtension fieldExtension : serviceTask.getFieldExtensions()) { if(fieldName.equalsIgnoreCase(fieldExtension.getFieldname())) { return fieldExtension; } } return null; } private void removeFieldExtensionsNotInList(TableItem[] items, ServiceTask serviceTask) { Iterator<FieldExtension> entryIterator = serviceTask.getFieldExtensions().iterator(); while(entryIterator.hasNext()) { FieldExtension fieldExtension = entryIterator.next(); boolean found = false; for (TableItem item : items) { if(item.getText(0).equals(fieldExtension.getFieldname())) { found = true; break; } } if(found == false) { diagram.eResource().getContents().remove(fieldExtension); entryIterator.remove(); } } } }