/******************************************************************************* | |
* <copyright> | |
* | |
* Copyright (c) 2013, 2013 SAP AG. | |
* All rights reserved. This program and the accompanying materials | |
* are 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: | |
* SAP AG - initial API, implementation and documentation | |
* | |
* </copyright> | |
* | |
*******************************************************************************/ | |
package org.eclipse.fmc.blockdiagram.editor.features; | |
import org.eclipse.fmc.blockdiagram.editor.util.FMCUtil; | |
import org.eclipse.graphiti.datatypes.ILocation; | |
import org.eclipse.graphiti.features.ICreateConnectionFeature; | |
import org.eclipse.graphiti.features.ICreateFeature; | |
import org.eclipse.graphiti.features.context.IContext; | |
import org.eclipse.graphiti.features.context.ICreateConnectionContext; | |
import org.eclipse.graphiti.features.context.ICreateContext; | |
import org.eclipse.graphiti.features.context.impl.CreateConnectionContext; | |
import org.eclipse.graphiti.features.context.impl.CreateContext; | |
import org.eclipse.graphiti.mm.algorithms.AbstractText; | |
import org.eclipse.graphiti.mm.pictograms.Connection; | |
import org.eclipse.graphiti.mm.pictograms.ContainerShape; | |
import org.eclipse.graphiti.mm.pictograms.Shape; | |
/** | |
* This class is capable of executing two features: one for creating a shape and | |
* one for creating a connection. The new Shape will be the target of the | |
* connection. | |
* | |
* @author Benjamin Schmeling | |
* | |
*/ | |
public class CreateShapeAndConnectionFeature extends CompositeFeature implements | |
ICreateConnectionFeature { | |
private final int width; | |
private final int height; | |
/** | |
* | |
* @param createFeature | |
* @param createConnectionFeature | |
* @param width | |
* The width of the new shape. | |
* @param height | |
* The height of the new shape. | |
*/ | |
public CreateShapeAndConnectionFeature(ICreateFeature createFeature, | |
ICreateConnectionFeature createConnectionFeature, int width, | |
int height) { | |
super(createFeature, createConnectionFeature); | |
this.width = width; | |
this.height = height; | |
} | |
private ICreateFeature getCreateFeature() { | |
return (ICreateFeature) getFeature(0); | |
} | |
private ICreateConnectionFeature getCreateConnectionFeature() { | |
return (ICreateConnectionFeature) getFeature(1); | |
} | |
@Override | |
public boolean canExecute(IContext context) { | |
return true; | |
} | |
@Override | |
public void execute(IContext context) { | |
CreateConnectionContext ctx = (CreateConnectionContext) context; | |
getCreateFeature().execute(createContext(ctx)); | |
// NOT Look up the location again and determine the new shape that has | |
// been added to the diagram | |
// ILocationInfo locationInfo = | |
// Graphiti.getPeLayoutService().getLocationInfo((Shape) | |
// ctx.getTargetPictogramElement(), ctx.getTargetLocation().getX(), | |
// ctx.getTargetLocation().getY()); | |
// Set this new shape create through the create feature to the context. | |
ContainerShape container = ((ContainerShape) ctx | |
.getTargetPictogramElement()); | |
// The element that we have added is the last child of the target | |
// pictogram. | |
Shape shape = getShapeBehind(container.getChildren().get( | |
container.getChildren().size() - 1)); | |
// Shape shape = ); | |
ctx.setTargetPictogramElement(shape); | |
ctx.setTargetAnchor(shape.getAnchors().get(0)); | |
getCreateConnectionFeature().execute(ctx); | |
} | |
/** | |
* For the case that there is a text on top of this shape. | |
* | |
* @param shape | |
* @return | |
*/ | |
private Shape getShapeBehind(Shape shape) { | |
if (shape.getGraphicsAlgorithm() instanceof AbstractText) { | |
return shape.getContainer(); | |
} else | |
return shape; | |
} | |
private ICreateContext createContext(ICreateConnectionContext ctx) { | |
CreateContext cctx = new CreateContext(); | |
ILocation relativePosition = FMCUtil.getRelativePosition( | |
ctx.getTargetPictogramElement(), ctx.getTargetLocation()); | |
cctx.setX(relativePosition.getX()); | |
cctx.setY(relativePosition.getY()); | |
cctx.setSize(width, height); | |
cctx.setTargetContainer((ContainerShape) ctx | |
.getTargetPictogramElement()); | |
return cctx; | |
} | |
@Override | |
public boolean canCreate(ICreateConnectionContext context) { | |
return getCreateConnectionFeature().canCreate(context); | |
} | |
@Override | |
public Connection create(ICreateConnectionContext context) { | |
return getCreateConnectionFeature().create(context); | |
} | |
@Override | |
public boolean canStartConnection(ICreateConnectionContext context) { | |
return getCreateConnectionFeature().canStartConnection(context); | |
} | |
@Override | |
public String getCreateName() { | |
return getCreateConnectionFeature().getCreateName(); | |
} | |
@Override | |
public String getCreateDescription() { | |
return getCreateConnectionFeature().getCreateDescription(); | |
} | |
@Override | |
public String getCreateImageId() { | |
return getCreateConnectionFeature().getCreateImageId(); | |
} | |
@Override | |
public String getCreateLargeImageId() { | |
return getCreateConnectionFeature().getCreateLargeImageId(); | |
} | |
@Override | |
public void startConnecting() { | |
getCreateConnectionFeature().startConnecting(); | |
} | |
@Override | |
public void endConnecting() { | |
getCreateConnectionFeature().endConnecting(); | |
} | |
@Override | |
public void attachedToSource(ICreateConnectionContext context) { | |
getCreateConnectionFeature().attachedToSource(context); | |
} | |
@Override | |
public void canceledAttaching(ICreateConnectionContext context) { | |
getCreateConnectionFeature().canceledAttaching(context); | |
} | |
} |