blob: 4ae391f41ba8c74f7651dc6fb656eadf32fb6dfd [file] [log] [blame]
/*******************************************************************************
* <copyright>
*
* Copyright (c) 2005, 2010 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.graphiti.examples.tutorial.features;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.EcoreFactory;
import org.eclipse.graphiti.features.IFeatureProvider;
import org.eclipse.graphiti.features.context.ICreateConnectionContext;
import org.eclipse.graphiti.features.context.impl.AddConnectionContext;
import org.eclipse.graphiti.features.impl.AbstractCreateConnectionFeature;
import org.eclipse.graphiti.mm.pictograms.Anchor;
import org.eclipse.graphiti.mm.pictograms.Connection;
public class TutorialCreateEReferenceFeature extends AbstractCreateConnectionFeature {
public TutorialCreateEReferenceFeature(IFeatureProvider fp) {
// provide name and description for the UI, e.g. the palette
super(fp, "EReference", "Create EReference"); //$NON-NLS-1$ //$NON-NLS-2$
}
public boolean canCreate(ICreateConnectionContext context) {
// return true if both anchors belong to a EClass
// and those EClasses are not identical
EClass source = getEClass(context.getSourceAnchor());
EClass target = getEClass(context.getTargetAnchor());
if (source != null && target != null && source != target) {
return true;
}
return false;
}
public boolean canStartConnection(ICreateConnectionContext context) {
// return true if start anchor belongs to a EClass
if (getEClass(context.getSourceAnchor()) != null) {
return true;
}
return false;
}
public Connection create(ICreateConnectionContext context) {
Connection newConnection = null;
// get EClasses which should be connected
EClass source = getEClass(context.getSourceAnchor());
EClass target = getEClass(context.getTargetAnchor());
if (source != null && target != null) {
// create new business object
EReference eReference = createEReference(source, target);
// add connection for business object
AddConnectionContext addContext = new AddConnectionContext(context.getSourceAnchor(), context.getTargetAnchor());
addContext.setNewObject(eReference);
newConnection = (Connection) getFeatureProvider().addIfPossible(addContext);
}
return newConnection;
}
/**
* Returns the EClass belonging to the anchor, or null if not available.
*/
private EClass getEClass(Anchor anchor) {
if (anchor != null) {
Object obj = getBusinessObjectForPictogramElement(anchor.getParent());
if (obj instanceof EClass) {
return (EClass) obj;
}
}
return null;
}
/**
* Creates a EReference between two EClasses.
*/
private EReference createEReference(EClass source, EClass target) {
EReference eReference = EcoreFactory.eINSTANCE.createEReference();
eReference.setName("new EReference"); //$NON-NLS-1$
eReference.setEType(target);
eReference.setLowerBound(0);
eReference.setUpperBound(1);
source.getEStructuralFeatures().add(eReference);
return eReference;
}
}