package org.activiti.designer.property.ui; import java.util.Iterator; import java.util.List; import org.activiti.bpmn.model.FieldExtension; import org.activiti.bpmn.model.ServiceTask; import org.activiti.designer.util.eclipse.ActivitiUiUtil; import org.activiti.designer.util.editor.ModelHandler; import org.apache.commons.lang.StringUtils; import org.eclipse.emf.ecore.util.EcoreUtil; 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.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[] {150, 150, 150}, 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.getStringValue(), fieldExtension.getExpression()); } } public void initializeModel(List<FieldExtension> fieldList) { removeTableItems(); if(fieldList == null || fieldList.size() == 0) return; for (FieldExtension fieldExtension : fieldList) { addTableItem(fieldExtension.getFieldName(), fieldExtension.getStringValue(), fieldExtension.getExpression()); } } @Override protected String createList(String[][] items) { return null; } @Override protected String[][] parseString(String string) { return null; } protected void addTableItem(String name, String stringValue, String expression) { if(table != null) { TableItem tableItem = new TableItem(table, SWT.NONE); tableItem.setText(0, name); if (stringValue == null) { stringValue = ""; } tableItem.setText(1, stringValue); if (expression == null) { expression = ""; } tableItem.setText(2, expression); } } @Override protected String[] getNewInputObject() { FieldExtensionDialog dialog = new FieldExtensionDialog(parent.getShell(), getItems()); dialog.open(); String fieldNameInput = dialog.fieldNameInput; String fieldValueInput = dialog.fieldValueInput; String fieldExpressionInput = dialog.fieldExpressionInput; if(StringUtils.isNotEmpty(fieldNameInput) && (StringUtils.isNotEmpty(fieldValueInput) || StringUtils.isNotEmpty(fieldExpressionInput))) { return new String[] { fieldNameInput, fieldValueInput, fieldExpressionInput }; } else { return null; } } @Override protected String[] getChangedInputObject(TableItem tableItem) { FieldExtensionDialog dialog = new FieldExtensionDialog(parent.getShell(), getItems(), tableItem.getText(0), tableItem.getText(1), tableItem.getText(2)); dialog.open(); String fieldNameInput = dialog.fieldNameInput; String fieldValueInput = dialog.fieldValueInput; String fieldExpressionInput = dialog.fieldExpressionInput; if(StringUtils.isNotEmpty(fieldNameInput) && (StringUtils.isNotEmpty(fieldValueInput) || StringUtils.isNotEmpty(fieldExpressionInput))) { if(tableItem.getText(0).equals(fieldNameInput) && tableItem.getText(1).equals(fieldValueInput) && tableItem.getText(2).equals(fieldExpressionInput)) { return null; } return new String[] { fieldNameInput, fieldValueInput, fieldExpressionInput }; } 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) { final Object bo = ModelHandler.getModel(EcoreUtil.getURI(diagram)).getFeatureProvider().getBusinessObjectForPictogramElement(pictogramElement); if (bo instanceof ServiceTask) { TransactionalEditingDomain editingDomain = diagramEditor.getEditingDomain(); ActivitiUiUtil.runModelChange(new Runnable() { public void run() { ServiceTask serviceTask = (ServiceTask) bo; for (TableItem item : getItems()) { String fieldName = item.getText(0); String fieldStringValue = item.getText(1); String fieldExpression = item.getText(2); if(StringUtils.isNotEmpty(fieldName) && (StringUtils.isNotEmpty(fieldStringValue) || StringUtils.isNotEmpty(fieldExpression))) { FieldExtension fieldExtension = fieldExtensionExists(serviceTask, fieldName); if(fieldExtension != null) { fieldExtension.setStringValue(fieldStringValue); fieldExtension.setExpression(fieldExpression); } else { FieldExtension newFieldExtension = new FieldExtension(); newFieldExtension.setFieldName(fieldName); newFieldExtension.setStringValue(fieldStringValue); newFieldExtension.setExpression(fieldExpression); 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) { entryIterator.remove(); } } } }