blob: 32ccc284a8386cc279aa53c4994dfcb8dc54c46e [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011 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 Ivar Meikas
******************************************************************************/
package org.eclipse.bpmn2.modeler.core.features.flow;
import org.eclipse.bpmn2.BaseElement;
import org.eclipse.bpmn2.di.BPMNLabel;
import org.eclipse.bpmn2.modeler.core.di.DIImport;
import org.eclipse.bpmn2.modeler.core.features.AbstractAddBPMNShapeFeature;
import org.eclipse.bpmn2.modeler.core.features.UpdateBaseElementNameFeature;
import org.eclipse.bpmn2.modeler.core.utils.AnchorUtil;
import org.eclipse.bpmn2.modeler.core.utils.BusinessObjectUtil;
import org.eclipse.bpmn2.modeler.core.utils.ModelUtil;
import org.eclipse.bpmn2.modeler.core.utils.StyleUtil;
import org.eclipse.bpmn2.modeler.core.utils.Tuple;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.notify.impl.AdapterImpl;
import org.eclipse.graphiti.features.IFeatureProvider;
import org.eclipse.graphiti.features.context.IAddConnectionContext;
import org.eclipse.graphiti.features.context.IAddContext;
import org.eclipse.graphiti.mm.algorithms.Polyline;
import org.eclipse.graphiti.mm.algorithms.Text;
import org.eclipse.graphiti.mm.pictograms.AnchorContainer;
import org.eclipse.graphiti.mm.pictograms.Connection;
import org.eclipse.graphiti.mm.pictograms.ConnectionDecorator;
import org.eclipse.graphiti.mm.pictograms.FixPointAnchor;
import org.eclipse.graphiti.mm.pictograms.PictogramElement;
import org.eclipse.graphiti.services.Graphiti;
import org.eclipse.graphiti.services.IGaService;
import org.eclipse.graphiti.services.IPeService;
public abstract class AbstractAddFlowFeature<T extends BaseElement>
extends AbstractAddBPMNShapeFeature<T> {
public AbstractAddFlowFeature(IFeatureProvider fp) {
super(fp);
}
@Override
public boolean canAdd(IAddContext context) {
return context instanceof IAddConnectionContext
&& getBoClass().isAssignableFrom(getBusinessObject(context).getClass());
}
/* (non-Javadoc)
* @see org.eclipse.graphiti.func.IAdd#add(org.eclipse.graphiti.features.context.IAddContext)
*/
@Override
public PictogramElement add(IAddContext context) {
IPeService peService = Graphiti.getPeService();
IGaService gaService = Graphiti.getGaService();
T element = getBusinessObject(context);
IAddConnectionContext addConContext = (IAddConnectionContext) context;
Connection connection = peService.createFreeFormConnection(getDiagram());
Object importProp = context.getProperty(DIImport.IMPORT_PROPERTY);
if (importProp != null && (Boolean) importProp) {
connection.setStart(addConContext.getSourceAnchor());
connection.setEnd(addConContext.getTargetAnchor());
} else {
AnchorContainer sourceContainer = (AnchorContainer) addConContext.getSourceAnchor().eContainer();
AnchorContainer targetContainer = (AnchorContainer) addConContext.getTargetAnchor().eContainer();
Tuple<FixPointAnchor, FixPointAnchor> anchors = AnchorUtil.getSourceAndTargetBoundaryAnchors(
sourceContainer, targetContainer, connection);
connection.setStart(anchors.getFirst());
connection.setEnd(anchors.getSecond());
}
if (ModelUtil.hasName(element)) {
ConnectionDecorator labelDecorator = Graphiti.getPeService().createConnectionDecorator(connection, true, 0.5, true);
Text text = gaService.createText(labelDecorator, ModelUtil.getName(element));
if (context.getProperty("BPMNLABEL") != null) {
BPMNLabel label = (BPMNLabel) context.getProperty("BPMNLABEL");
gaService.setLocation(text, new Float(label.getBounds().getX()).intValue(), new Float(label.getBounds().getY()).intValue());
label.toString();
}
text.eAdapters().add(new AdapterImpl() {
@Override
public void notifyChanged(Notification msg) {
super.notifyChanged(msg);
}
});
peService.setPropertyValue(labelDecorator, UpdateBaseElementNameFeature.TEXT_ELEMENT, Boolean.toString(true));
StyleUtil.applyStyle(text, element);
}
createDIEdge(connection, element);
createConnectionLine(connection);
hook(addConContext, connection, element);
return connection;
}
@Override
public int getHeight() {
return -1;
}
@Override
public int getWidth() {
return -1;
}
protected abstract Class<? extends BaseElement> getBoClass();
protected void hook(IAddContext context, Connection connection, BaseElement element) {
}
protected Polyline createConnectionLine(Connection connection) {
BaseElement be = BusinessObjectUtil.getFirstBaseElement(connection);
Polyline connectionLine = Graphiti.getGaService().createPolyline(connection);
StyleUtil.applyStyle(connectionLine, be);
return connectionLine;
}
}