package org.activiti.designer.property.ui; import java.util.ArrayList; import java.util.List; import org.activiti.designer.util.eclipse.ActivitiUiUtil; import org.eclipse.bpmn2.Bpmn2Factory; import org.eclipse.bpmn2.CallActivity; import org.eclipse.bpmn2.IOParameter; 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 IOParameterEditor extends TableFieldEditor { protected Composite parent; public PictogramElement pictogramElement; public IDiagramEditor diagramEditor; public Diagram diagram; public boolean isInputParameters = false; public IOParameterEditor(String key, Composite parent) { super(key, "", new String[] {"Source", "Target"}, new int[] {300, 300}, parent); this.parent = parent; } public void initialize(List<IOParameter> parameterList) { removeTableItems(); if(parameterList == null || parameterList.size() == 0) return; for (IOParameter parameter : parameterList) { addTableItem(parameter); } } @Override protected String createList(String[][] items) { return null; } @Override protected String[][] parseString(String string) { return null; } protected void addTableItem(IOParameter parameter) { if(table != null) { TableItem tableItem = new TableItem(table, SWT.NONE); tableItem.setText(0, parameter.getSource()); tableItem.setText(1, parameter.getTarget()); } } @Override protected String[] getNewInputObject() { IOParameterDialog dialog = new IOParameterDialog(parent.getShell(), getItems()); dialog.open(); if(dialog.source != null && dialog.source.length() > 0 && dialog.target != null && dialog.target.length() > 0) { return new String[] { dialog.source, dialog.target}; } else { return null; } } @Override protected String[] getChangedInputObject(TableItem item) { IOParameterDialog dialog = new IOParameterDialog(parent.getShell(), getItems(), item.getText(0), item.getText(1)); dialog.open(); if(dialog.source != null && dialog.source.length() > 0 && dialog.target != null && dialog.target.length() > 0) { return new String[] { dialog.source, dialog.target}; } else { return null; } } @Override protected void removedItem(int index) { // TODO Auto-generated method stub } @Override protected void selectionChanged() { super.selectionChanged(); saveFormProperties(); } private void saveFormProperties() { if (pictogramElement != null) { final Object bo = Graphiti.getLinkService().getBusinessObjectForLinkedPictogramElement(pictogramElement); if (bo == null) { return; } List<IOParameter> parameterList = null; if(isInputParameters == true) { parameterList = ((CallActivity) bo).getInParameters(); } else { parameterList = ((CallActivity) bo).getOutParameters(); } if(parametersChanged(parameterList, getItems()) == false) { return; } TransactionalEditingDomain editingDomain = diagramEditor.getEditingDomain(); ActivitiUiUtil.runModelChange(new Runnable() { public void run() { List<IOParameter> newParameterList = new ArrayList<IOParameter>(); List<IOParameter> parameterList = null; if(isInputParameters == true) { parameterList = ((CallActivity) bo).getInParameters(); } else { parameterList = ((CallActivity) bo).getOutParameters(); } for (TableItem item : getItems()) { String source = item.getText(0); String target = item.getText(1); if(source != null && source.length() > 0 && target != null && target.length() > 0) { IOParameter parameter = parameterExists(parameterList, source, target); if(parameter != null) { parameter.setSource(source); parameter.setTarget(target); newParameterList.add(parameter); } else { IOParameter newParameter = Bpmn2Factory.eINSTANCE.createIOParameter(); newParameter.setSource(source); newParameter.setTarget(target); newParameterList.add(newParameter); } } } if(isInputParameters == true) { ((CallActivity) bo).getInParameters().clear(); ((CallActivity) bo).getInParameters().addAll(newParameterList); } else { ((CallActivity) bo).getOutParameters().clear(); ((CallActivity) bo).getOutParameters().addAll(newParameterList); } } }, editingDomain, "Model Update"); } } private boolean parametersChanged(List<IOParameter> parameterList, TableItem[] items) { boolean noPropertySaved = false; boolean nothingInTable = false; if(parameterList == null || parameterList.size() == 0) { noPropertySaved = true; } if(items == null || items.length == 0) { nothingInTable = true; } if(noPropertySaved && nothingInTable) { return false; } else if(noPropertySaved == false && nothingInTable == false) { for(int i = 0; i < parameterList.size(); i++) { IOParameter parameter = parameterList.get(i); boolean found = false; if(items.length > i) { TableItem item = items[i]; if(item.getText(0).equalsIgnoreCase(parameter.getSource()) && item.getText(1).equalsIgnoreCase(parameter.getTarget())) { found = true; } } if(found == false) { return true; } } for (int i = 0; i < items.length; i++) { TableItem item = items[i]; boolean found = false; if(parameterList.size() > i) { IOParameter parameter = parameterList.get(i); if(item.getText(0).equalsIgnoreCase(parameter.getSource()) && item.getText(1).equalsIgnoreCase(parameter.getTarget())) { found = true; } } if(found == false) { return true; } } return false; } else { return true; } } private IOParameter parameterExists(List<IOParameter> parameterList, String source, String target) { if(parameterList == null) return null; for(IOParameter parameter : parameterList) { if(source.equalsIgnoreCase(parameter.getSource()) && target.equalsIgnoreCase(parameter.getTarget())) { return parameter; } } return null; } }