package org.activiti.designer.property.ui;
import java.util.ArrayList;
import java.util.List;
import org.activiti.bpmn.model.FormProperty;
import org.activiti.bpmn.model.FormValue;
import org.activiti.bpmn.model.StartEvent;
import org.activiti.bpmn.model.UserTask;
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 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", "Expression", "Variable", "Default", "Pattern", "Required", "Readable", "Writeable", "Form values"},
new int[] {60, 100, 60, 100, 80, 80, 60, 60, 60, 60, 120}, 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());
tableItem.setText(1, formProperty.getName() != null ? formProperty.getName() : "");
tableItem.setText(2, formProperty.getType() != null ? formProperty.getType() : "");
tableItem.setText(3, formProperty.getExpression() != null ? formProperty.getExpression() : "");
tableItem.setText(4, formProperty.getVariable() != null ? formProperty.getVariable() : "");
tableItem.setText(5, formProperty.getDefaultExpression() != null ? formProperty.getDefaultExpression() : "");
tableItem.setText(6, formProperty.getDatePattern() != null ? formProperty.getDatePattern() : "");
tableItem.setText(7, "" + formProperty.isRequired());
tableItem.setText(8, "" + formProperty.isReadable());
tableItem.setText(9, "" + formProperty.isWriteable());
StringBuilder formValuesString = new StringBuilder();
for(int i = 0; i < formProperty.getFormValues().size(); i++) {
FormValue formValue = formProperty.getFormValues().get(i);
if(i > 0) {
formValuesString.append(";");
}
formValuesString.append(formValue.getId()).append(":").append(formValue.getName());
}
tableItem.setText(10, formValuesString.toString());
}
}
@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.expression, dialog.variable, dialog.defaultExpression, dialog.datePattern,
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), item.getText(8), item.getText(9), item.getText(10));
dialog.open();
if(dialog.id != null && dialog.id.length() > 0) {
return new String[] {dialog.id, dialog.name, dialog.type,
dialog.expression, dialog.variable, dialog.defaultExpression, dialog.datePattern,
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 = ModelHandler.getModel(EcoreUtil.getURI(diagram)).getFeatureProvider().getBusinessObjectForPictogramElement(pictogramElement);
if (bo == null) {
return;
}
final List<FormProperty> formPropertyList = getFormProperties(bo);
if(formPropertyList == null) 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 expression = item.getText(3);
String variable = item.getText(4);
String defaultExpression = item.getText(5);
String datePattern = item.getText(6);
String required = item.getText(7);
String readable = item.getText(8);
String writeable = item.getText(9);
String formValues = item.getText(10);
if(id != null && id.length() > 0) {
FormProperty newFormProperty = new FormProperty();
newFormProperty.setId(id);
newFormProperty.setName(name);
newFormProperty.setType(type);
newFormProperty.setExpression(expression);
newFormProperty.setVariable(variable);
newFormProperty.setDefaultExpression(defaultExpression);
newFormProperty.setDatePattern(datePattern);
if(StringUtils.isNotEmpty(required)) {
newFormProperty.setRequired(Boolean.valueOf(required.toLowerCase()));
}
if(StringUtils.isNotEmpty(readable)) {
newFormProperty.setReadable(Boolean.valueOf(readable.toLowerCase()));
}
if(StringUtils.isNotEmpty(writeable)) {
newFormProperty.setWriteable(Boolean.valueOf(writeable.toLowerCase()));
}
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 = new FormValue();
formValueObj.setId(formValue.substring(0, formValue.lastIndexOf(":")));
formValueObj.setName(formValue.substring(formValue.lastIndexOf(":") + 1));
formValueList.add(formValueObj);
}
}
}
newFormProperty.getFormValues().addAll(formValueList);
newFormList.add(newFormProperty);
}
}
setFormProperties(bo, newFormList);
}
}, editingDomain, "Model Update");
}
}
}