blob: ed0378702a2721986e86748e79c2ab1c4b793086 [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.testtool.ecore.features.association;
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;
import org.eclipse.graphiti.mm.pictograms.PictogramElement;
/**
* The Class TestCreateAssociationFeature.
*/
public class TestCreateAssociationFeature extends AbstractCreateConnectionFeature {
/**
* Instantiates a new test create association feature.
*
* @param fp
* the fp
*/
public TestCreateAssociationFeature(IFeatureProvider fp) {
/*
* provide name and description for the UI, e.g. the palette
*/
super(fp, "Association", "create association");
}
public boolean canCreate(ICreateConnectionContext context) {
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 business object for the new connection
EReference association = createAssociation(source, target);
// use existing add feature for the creation of the graphical
// representation
AddConnectionContext addContext = new AddConnectionContext(context.getSourceAnchor(), context.getTargetAnchor());
addContext.setNewObject(association);
PictogramElement pe = getFeatureProvider().addIfPossible(addContext);
if (pe instanceof Connection) {
newConnection = (Connection) pe;
// link new pictogram element with business object
link(newConnection, association);
}
}
return newConnection;
}
/**
* If the parent of the anchor is connected with an EClass, this method <br>
* returns the EClass.
*
* @param anchor
* @return the EClass or null if no EClass is connected
*/
private EClass getEClass(Anchor anchor) {
if (anchor != null) {
Object eObject = getBusinessObjectForPictogramElement(anchor.getParent());
if (eObject instanceof EClass) {
return (EClass) eObject;
}
}
return null;
}
/**
* Creates the business object(s) for the new connection between the two
* classes.<br>
* It creates an association with two association ends which both point to
* an EClass.
*
* @param source
* @param target
* @return the newly created association
*/
private EReference createAssociation(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;
}
}