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.FormProperty;
import org.eclipse.bpmn2.FormValue;
import org.eclipse.bpmn2.StartEvent;
import org.eclipse.bpmn2.UserTask;
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 FormPropertyEditor extends TableFieldEditor {
protected Composite parent;
public PictogramElement pictogramElement;
public IDiagramEditor diagramEditor;
public Diagram diagram;
public FormPropertyEditor(String key, Composite parent) {
super(key, "", new String[] {"Id", "Name", "Type", "Value/Expression", "Required", "Readable", "Writeable", "Form values"},
new int[] {100, 100, 100, 200, 100, 100, 100, 200}, parent);
this.parent = parent;
}
public void initialize(List<FormProperty> formPropertyList) {
removeTableItems();
if(formPropertyList == null || formPropertyList.size() == 0) return;
for (FormProperty formProperty : formPropertyList) {
addTableItem(formProperty);
}
}
@Override
protected String createList(String[][] items) {
return null;
}
@Override
protected String[][] parseString(String string) {
return null;
}
protected void addTableItem(FormProperty formProperty) {
if(table != null) {
TableItem tableItem = new TableItem(table, SWT.NONE);
tableItem.setText(0, formProperty.getId());
if(formProperty.getName() != null) {
tableItem.setText(1, formProperty.getName());
} else {
tableItem.setText(1, "");
}
if(formProperty.getType() != null) {
tableItem.setText(2, formProperty.getType());
} else {
tableItem.setText(2, "");
}
if(formProperty.getValue() != null) {
tableItem.setText(3, formProperty.getValue());
} else {
tableItem.setText(3, "");
}
if(formProperty.getRequired() != null) {
tableItem.setText(4, "" + formProperty.getRequired().toString().toLowerCase());
} else {
tableItem.setText(4, "");
}
if(formProperty.getReadable() != null) {
tableItem.setText(5, "" + formProperty.getReadable().toString().toLowerCase());
} else {
tableItem.setText(5, "");
}
if(formProperty.getWriteable() != null) {
tableItem.setText(6, "" + formProperty.getWriteable().toString().toLowerCase());
} else {
tableItem.setText(6, "");
}
String formValuesString = "";
for(int i = 0; i < formProperty.getFormValues().size(); i++) {
FormValue formValue = formProperty.getFormValues().get(i);
if(i > 0) {
formValuesString += ";";
}
formValuesString += formValue.getValueId() + ":" + formValue.getValueName();
}
tableItem.setText(7, formValuesString);
}
}
@Override
protected String[] getNewInputObject() {
FormPropertyDialog dialog = new FormPropertyDialog(parent.getShell(), getItems());
dialog.open();
if(dialog.id != null && dialog.id.length() > 0) {
return new String[] { dialog.id, dialog.name, dialog.type, dialog.value,
dialog.required.toLowerCase(), dialog.readable.toLowerCase(),
dialog.writeable.toLowerCase(), dialog.formValues};
} else {
return null;
}
}
@Override
protected String[] getChangedInputObject(TableItem item) {
FormPropertyDialog dialog = new FormPropertyDialog(parent.getShell(), getItems(),
item.getText(0), item.getText(1), item.getText(2), item.getText(3), item.getText(4),
item.getText(5), item.getText(6), item.getText(7));
dialog.open();
if(dialog.id != null && dialog.id.length() > 0) {
return new String[] {dialog.id, dialog.name, dialog.type, dialog.value,
dialog.required.toLowerCase(), dialog.readable.toLowerCase(),
dialog.writeable.toLowerCase(), dialog.formValues};
} else {
return null;
}
}
@Override
protected void removedItem(int index) {
// TODO Auto-generated method stub
}
@Override
protected void selectionChanged() {
super.selectionChanged();
saveFormProperties();
}
private List<FormProperty> getFormProperties(Object bo) {
List<FormProperty> formPropertyList = null;
if(bo instanceof UserTask) {
formPropertyList = ((UserTask) bo).getFormProperties();
} else if(bo instanceof StartEvent) {
formPropertyList = ((StartEvent) bo).getFormProperties();
}
return formPropertyList;
}
private void setFormProperties(Object bo, List<FormProperty> formPropertyList) {
if(bo instanceof UserTask) {
((UserTask) bo).getFormProperties().clear();
((UserTask) bo).getFormProperties().addAll(formPropertyList);
} else if(bo instanceof StartEvent) {
((StartEvent) bo).getFormProperties().clear();
((StartEvent) bo).getFormProperties().addAll(formPropertyList);
}
}
private void saveFormProperties() {
if (pictogramElement != null) {
final Object bo = Graphiti.getLinkService().getBusinessObjectForLinkedPictogramElement(pictogramElement);
if (bo == null) {
return;
}
final List<FormProperty> formPropertyList = getFormProperties(bo);
if(formPropertyList == null) return;
if(formPropertiesChanged(formPropertyList, getItems()) == false) {
return;
}
TransactionalEditingDomain editingDomain = diagramEditor.getEditingDomain();
ActivitiUiUtil.runModelChange(new Runnable() {
public void run() {
List<FormProperty> newFormList = new ArrayList<FormProperty>();
for (TableItem item : getItems()) {
String id = item.getText(0);
String name = item.getText(1);
String type = item.getText(2);
String value = item.getText(3);
String required = item.getText(4);
String readable = item.getText(5);
String writeable = item.getText(6);
String formValues = item.getText(7);
if(id != null && id.length() > 0) {
FormProperty newFormProperty = Bpmn2Factory.eINSTANCE.createFormProperty();
newFormProperty.setId(id);
newFormProperty.setName(name);
newFormProperty.setType(type);
newFormProperty.setValue(value);
if(required != null && required.length() > 0) {
newFormProperty.setRequired(Boolean.valueOf(required.toLowerCase()));
} else {
newFormProperty.setRequired(null);
}
if(readable != null && readable.length() > 0) {
newFormProperty.setReadable(Boolean.valueOf(readable.toLowerCase()));
} else {
newFormProperty.setReadable(null);
}
if(writeable != null && writeable.length() > 0) {
newFormProperty.setWriteable(Boolean.valueOf(writeable.toLowerCase()));
} else {
newFormProperty.setWriteable(null);
}
List<FormValue> formValueList = new ArrayList<FormValue>();
if(formValues != null && formValues.length() > 0) {
String[] formValueArray = formValues.split(";");
if(formValueArray != null) {
for(String formValue : formValueArray) {
FormValue formValueObj = Bpmn2Factory.eINSTANCE.createFormValue();
formValueObj.setValueId(formValue.substring(0, formValue.lastIndexOf(":")));
formValueObj.setValueName(formValue.substring(formValue.lastIndexOf(":") + 1));
formValueList.add(formValueObj);
}
}
}
newFormProperty.getFormValues().addAll(formValueList);
newFormList.add(newFormProperty);
}
}
setFormProperties(bo, newFormList);
}
}, editingDomain, "Model Update");
}
}
private boolean formPropertiesChanged(List<FormProperty> formPropertyList, TableItem[] items) {
boolean noPropertySaved = false;
boolean nothingInTable = false;
if(formPropertyList == null || formPropertyList.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 < formPropertyList.size(); i++) {
FormProperty formProperty = formPropertyList.get(i);
boolean found = false;
if(items.length > i) {
TableItem item = items[i];
if(item.getText(0).equalsIgnoreCase(formProperty.getId()) &&
item.getText(1).equalsIgnoreCase(formProperty.getName()) &&
item.getText(2).equalsIgnoreCase(formProperty.getType()) &&
item.getText(3).equalsIgnoreCase(formProperty.getValue()) &&
item.getText(4).equalsIgnoreCase("" + formProperty.getRequired()) &&
item.getText(5).equalsIgnoreCase("" + formProperty.getReadable()) &&
item.getText(6).equalsIgnoreCase("" + formProperty.getWriteable())) {
found = true;
}
}
if(found == false) {
return true;
}
}
for (int i = 0; i < items.length; i++) {
TableItem item = items[i];
boolean found = false;
if(formPropertyList.size() > i) {
FormProperty formProperty = formPropertyList.get(i);
if(item.getText(0).equalsIgnoreCase(formProperty.getId()) &&
item.getText(1).equalsIgnoreCase(formProperty.getName()) &&
item.getText(2).equalsIgnoreCase(formProperty.getType()) &&
item.getText(3).equalsIgnoreCase(formProperty.getValue()) &&
item.getText(4).equalsIgnoreCase("" + formProperty.getRequired()) &&
item.getText(5).equalsIgnoreCase("" + formProperty.getReadable()) &&
item.getText(6).equalsIgnoreCase("" + formProperty.getWriteable())) {
found = true;
}
}
if(found == false) {
return true;
}
}
return false;
} else {
return true;
}
}
}