/*******************************************************************************
* Copyright (c) 2011, 2012 Red Hat, Inc.
* All rights reserved.
* This program is made available under the terms of the
* Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Red Hat, Inc. - initial API and implementation
*
* @author Bob Brodt
******************************************************************************/
package org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5.property;
import java.util.Iterator;
import java.util.List;
import org.eclipse.bpmn2.Activity;
import org.eclipse.bpmn2.ExtensionAttributeValue;
import org.eclipse.bpmn2.modeler.core.merrimac.clad.AbstractBpmn2PropertySection;
import org.eclipse.bpmn2.modeler.core.merrimac.clad.AbstractDetailComposite;
import org.eclipse.bpmn2.modeler.core.merrimac.clad.AbstractListComposite;
import org.eclipse.bpmn2.modeler.core.merrimac.dialogs.BooleanObjectEditor;
import org.eclipse.bpmn2.modeler.core.merrimac.dialogs.ObjectEditor;
import org.eclipse.bpmn2.modeler.core.model.ModelDecorator;
import org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5.MetaDataTypeAdapter;
import org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5.model.drools.DroolsFactory;
import org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5.model.drools.DroolsPackage;
import org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5.model.drools.OnEntryScriptType;
import org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5.model.drools.OnExitScriptType;
import org.eclipse.bpmn2.modeler.ui.property.ExtensionValueListComposite;
import org.eclipse.bpmn2.modeler.ui.property.tasks.ActivityDetailComposite;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.util.FeatureMap;
import org.eclipse.emf.ecore.util.FeatureMap.Entry;
import org.eclipse.emf.transaction.RecordingCommand;
import org.eclipse.emf.transaction.TransactionalEditingDomain;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.forms.widgets.Section;
/**
* @author Bob Brodt
*
*/
public class JbpmActivityDetailComposite extends ActivityDetailComposite {
// ScriptTableComposite onEntryScriptTable;
// ScriptTableComposite onExitScriptTable;
JbpmScriptTaskDetailComposite onEntryScriptEditor;
JbpmScriptTaskDetailComposite onExitScriptEditor;
/**
* @param section
*/
public JbpmActivityDetailComposite(AbstractBpmn2PropertySection section) {
super(section);
}
public JbpmActivityDetailComposite(Composite parent, int style) {
super(parent, style);
}
@Override
public void cleanBindings() {
super.cleanBindings();
// onEntryScriptTable = null;
// onExitScriptTable = null;
}
@Override
public void createBindings(EObject be) {
super.createBindings(be);
if (be instanceof Activity) {
ObjectEditor editor = new MetaDataValueBooleanEditor(this,(Activity)be);
editor.createControl(getAttributesParent(),Messages.JbpmActivityDetailComposite_Is_Async);
}
bindEntryExitScripts(be);
}
class MetaDataValueBooleanEditor extends BooleanObjectEditor {
Activity activity;
public MetaDataValueBooleanEditor(AbstractDetailComposite parent, Activity activity) {
super(parent, activity, null);
this.activity = activity;
}
@Override
public Boolean getValue() {
String value = MetaDataTypeAdapter.getMetaData(activity, "customAsync"); //$NON-NLS-1$
return Boolean.valueOf(value);
}
@Override
public boolean setValue(final Object result) {
if (result instanceof Boolean) {
final Boolean b = (Boolean) result;
TransactionalEditingDomain domain = getDiagramEditor().getEditingDomain();
if (domain!=null) {
domain.getCommandStack().execute(new RecordingCommand(domain) {
@Override
protected void doExecute() {
MetaDataTypeAdapter.setMetaData(activity, "customAsync", b.toString().toLowerCase()); //$NON-NLS-1$
}
});
}
}
return true;
}
}
protected void bindReference(Composite parent, EObject object, EReference reference) {
if ("loopCharacteristics".equals(reference.getName())) { //$NON-NLS-1$
if (!isModelObjectEnabled(object.eClass(), reference))
return;
super.bindReference(parent, object, reference);
addStandardLoopButton.setVisible(false);
}
else
super.bindReference(parent, object, reference);
}
protected void bindEntryExitScripts(EObject be) {
// onEntryScriptTable = new ScriptTableComposite(this);
// onEntryScriptTable.bindList(be, DroolsPackage.eINSTANCE.getDocumentRoot_OnEntryScript());
// onEntryScriptTable.setTitle("On Entry Scripts");
onEntryScriptEditor = new JbpmScriptTaskDetailComposite(this, SWT.NONE);
OnEntryScriptType onEntryScript = getOrCreateEntryExitScript((Activity)be, OnEntryScriptType.class);
onEntryScriptEditor.setBusinessObject(onEntryScript);
onEntryScriptEditor.setTitle(Messages.JbpmActivityDetailComposite_On_Entry_Script);
// onExitScriptTable = new ScriptTableComposite(this);
// onExitScriptTable.bindList(be, DroolsPackage.eINSTANCE.getDocumentRoot_OnExitScript());
// onExitScriptTable.setTitle("On Exit Scripts");
onExitScriptEditor = new JbpmScriptTaskDetailComposite(this, SWT.NONE);
OnExitScriptType onExitScript = getOrCreateEntryExitScript((Activity)be, OnExitScriptType.class);
onExitScriptEditor.setBusinessObject(onExitScript);
onExitScriptEditor.setTitle(Messages.JbpmActivityDetailComposite_On_Exit_Script);
}
@SuppressWarnings("unchecked")
private <T extends EObject> T getOrCreateEntryExitScript(final Activity be, final Class<T> clazz) {
T result = null;
List<T> scriptList = ModelDecorator.getAllExtensionAttributeValues(be, clazz);
if (scriptList.size()>0)
result = scriptList.get(0);
else {
EClass eclass = (EClass)DroolsPackage.eINSTANCE.getEClassifier(clazz.getSimpleName());
T script = (T) DroolsFactory.eINSTANCE.create(eclass);
EStructuralFeature f = script.eClass().getEStructuralFeature("script"); //$NON-NLS-1$
if (f!=null)
script.eSet(f, ""); //$NON-NLS-1$
f = script.eClass().getEStructuralFeature("scriptFormat"); //$NON-NLS-1$
if (f!=null)
script.eSet(f,"http://www.java.com/java"); //$NON-NLS-1$
if (clazz == OnEntryScriptType.class)
f = DroolsPackage.eINSTANCE.getDocumentRoot_OnEntryScript();
else
f = DroolsPackage.eINSTANCE.getDocumentRoot_OnExitScript();
ModelDecorator.addExtensionAttributeValue(be.eResource(), be, f, script, true);
result = script;
}
return result;
}
public class ScriptTableComposite extends ExtensionValueListComposite {
/**
* @param parent
* @param style
*/
public ScriptTableComposite(Composite parent) {
super(parent, AbstractListComposite.DEFAULT_STYLE);
}
/* (non-Javadoc)
* @see org.eclipse.bpmn2.modeler.ui.property.ExtensionValueTableComposite#addListItem(org.eclipse.emf.ecore.EObject, org.eclipse.emf.ecore.EStructuralFeature)
*/
@Override
protected EObject addListItem(EObject object, EStructuralFeature feature) {
EObject newScript = DroolsFactory.eINSTANCE.create(listItemClass);
EStructuralFeature f = newScript.eClass().getEStructuralFeature("script"); //$NON-NLS-1$
if (f!=null)
newScript.eSet(f, ""); //$NON-NLS-1$
f = newScript.eClass().getEStructuralFeature("scriptFormat"); //$NON-NLS-1$
if (f!=null)
newScript.eSet(f,"http://www.java.com/java"); //$NON-NLS-1$
addExtensionValue(newScript);
return newScript;
}
@Override
public AbstractDetailComposite createDetailComposite(Class eClass, final Composite parent, int style) {
return new JbpmScriptTaskDetailComposite(parent, SWT.NONE) {
@Override
public Composite getAttributesParent() {
((Section)parent).setText(Messages.JbpmActivityDetailComposite_Script_Details);
return (Composite) ((Section)parent).getClient();
}
};
}
}
@Override
public void notifyChanged(Notification notification) {
super.notifyChanged(notification);
if (notification.getNotifier()==businessObject && notification.getNewValue()==null) {
// It's possible that the user did an COMMAND_UNDO which removed the On Entry/Exit Scripts,
// do we need to reset the business object for the On Entry/Exit Script editors?
if (onEntryScriptEditor!=null && onExitScriptEditor!=null) {
Object oldValue = notification.getOldValue();
if (oldValue instanceof ExtensionAttributeValue) {
FeatureMap map = ((ExtensionAttributeValue)oldValue).getValue();
Iterator<Entry> iter = map.iterator();
while (iter.hasNext()) {
Object value = iter.next().getValue();
if (value==onEntryScriptEditor.getBusinessObject()) {
OnEntryScriptType onEntryScript = getOrCreateEntryExitScript((Activity)businessObject, OnEntryScriptType.class);
onEntryScriptEditor.setBusinessObject(onEntryScript);
}
else if (value==onExitScriptEditor.getBusinessObject()) {
OnExitScriptType onExitScript = getOrCreateEntryExitScript((Activity)businessObject, OnExitScriptType.class);
onExitScriptEditor.setBusinessObject(onExitScript);
}
}
}
}
}
// System.out.println(notification.getNotifier());
// System.out.println("old: " + notification.getOldValue());
// System.out.println("new: " + notification.getNewValue());
}
}