/*******************************************************************************
* 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.ui.adapters.properties;
import java.util.List;
import org.eclipse.bpmn2.BaseElement;
import org.eclipse.bpmn2.Bpmn2Package;
import org.eclipse.bpmn2.Message;
import org.eclipse.bpmn2.MessageFlow;
import org.eclipse.bpmn2.ReceiveTask;
import org.eclipse.bpmn2.SendTask;
import org.eclipse.bpmn2.modeler.core.adapters.ExtendedPropertiesAdapter;
import org.eclipse.bpmn2.modeler.core.adapters.ExtendedPropertiesProvider;
import org.eclipse.bpmn2.modeler.core.adapters.ObjectDescriptor;
import org.eclipse.bpmn2.modeler.core.di.DIUtils;
import org.eclipse.bpmn2.modeler.core.features.choreography.ChoreographyUtil;
import org.eclipse.bpmn2.modeler.core.utils.BusinessObjectUtil;
import org.eclipse.emf.common.notify.AdapterFactory;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.graphiti.mm.pictograms.Connection;
/**
* @author Gary Brown
*
*/
public class MessageFlowPropertiesAdapter extends ExtendedPropertiesAdapter<MessageFlow> {
/**
* @param adapterFactory
* @param object
*/
public MessageFlowPropertiesAdapter(AdapterFactory adapterFactory, MessageFlow object) {
super(adapterFactory, object);
EStructuralFeature ref = Bpmn2Package.eINSTANCE.getMessageFlow_MessageRef();
setFeatureDescriptor(ref, new RootElementRefFeatureDescriptor<MessageFlow>(this,object,ref) {
protected void internalSet(MessageFlow messageFlow, EStructuralFeature feature, Object value, int index) {
if (value instanceof Message || value==null) {
final Message message = (Message)value;
ResourceSet resourceSet = messageFlow.eResource().getResourceSet();
// first change the MessageRef on the SendTask
messageFlow.setMessageRef(message);
// If the source and/or target of this Message Flow are a SendTask
// or ReceiveTask make sure the messageRef is the same as ours
List<Connection> connections = DIUtils.getConnections(resourceSet, messageFlow);
for (Connection connection : connections) {
BaseElement source = BusinessObjectUtil.getFirstBaseElement(connection.getStart().getParent());
BaseElement target = BusinessObjectUtil.getFirstBaseElement(connection.getEnd().getParent());
if (source instanceof SendTask) {
ExtendedPropertiesAdapter adapter = ExtendedPropertiesAdapter.adapt(source);
adapter.getFeatureDescriptor(Bpmn2Package.eINSTANCE.getSendTask_MessageRef()).setValue(message);
}
if (target instanceof ReceiveTask) {
ExtendedPropertiesAdapter adapter = ExtendedPropertiesAdapter.adapt(target);
adapter.getFeatureDescriptor(Bpmn2Package.eINSTANCE.getReceiveTask_MessageRef()).setValue(message);
}
}
}
}
});
setObjectDescriptor(new ObjectDescriptor<MessageFlow>(this,object) {
@Override
public String getTextValue() {
String text = ""; //$NON-NLS-1$
if (object.getName()!=null)
text = object.getName();
else {
if (object.getMessageRef()!=null) {
text += ChoreographyUtil.getMessageFlowName(object);
}
if (object.getSourceRef() != null) {
text += "(" + ExtendedPropertiesProvider.getTextValue(object.getSourceRef())+"->"; //$NON-NLS-1$ //$NON-NLS-2$
if (object.getTargetRef() != null) {
text += ExtendedPropertiesProvider.getTextValue(object.getTargetRef());
}
text += ")"; //$NON-NLS-1$
}
}
return text;
}
});
}
}