/**
* This file is protected by Copyright.
* Please refer to the COPYRIGHT file distributed with this source distribution.
*
* This file is part of REDHAWK IDE.
*
* 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.
*/
package gov.redhawk.core.graphiti.ui.adapters;
import org.eclipse.core.runtime.IAdapterFactory;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.gef.EditPart;
import org.eclipse.graphiti.mm.pictograms.ContainerShape;
import org.eclipse.graphiti.mm.pictograms.Diagram;
import org.eclipse.graphiti.mm.pictograms.PictogramElement;
import org.eclipse.graphiti.services.Graphiti;
import gov.redhawk.core.graphiti.ui.util.DUtil;
import gov.redhawk.model.sca.ScaPort;
import gov.redhawk.model.sca.ScaPortContainer;
import gov.redhawk.model.sca.ScaProvidesPort;
import gov.redhawk.model.sca.ScaUsesPort;
import mil.jpeojtrs.sca.partitioning.ComponentInstantiation;
import mil.jpeojtrs.sca.partitioning.ProvidesPortStub;
import mil.jpeojtrs.sca.partitioning.UsesPortStub;
import mil.jpeojtrs.sca.scd.AbstractPort;
import mil.jpeojtrs.sca.scd.Provides;
import mil.jpeojtrs.sca.scd.Uses;
/**
* Adapts a graphical port object (org.eclipse.graphiti.ui.internal.parts.AdvancedAnchorEditPart) to an SCA port model
* object, or its profile.
*/
public class PortEditPartAdapterFactory implements IAdapterFactory {
private static final Class< ? >[] LIST = new Class< ? >[] { ScaProvidesPort.class, ScaUsesPort.class, ScaPort.class, AbstractPort.class };
@Override
public < T > T getAdapter(Object adaptableObject, Class<T> adapterType) {
// EditPart is a parent class of AdvancedAnchorEditPart (and isn't private API)
EditPart editPart = (EditPart) adaptableObject;
PictogramElement pe = (PictogramElement) editPart.getModel();
// Disallow context menu options for super ports
if (DUtil.isSuperPort((ContainerShape) pe.eContainer())) {
return null;
}
// Get the port name
EObject port = DUtil.getBusinessObject(pe);
String portName;
if (port instanceof UsesPortStub) {
portName = ((UsesPortStub) port).getName();
} else if (port instanceof ProvidesPortStub) {
portName = ((ProvidesPortStub) port).getName();
} else {
return null;
}
// Get the SCA model object, or the profile for it
Diagram diagram = Graphiti.getPeService().getDiagramForPictogramElement(pe);
ScaPort< ? , ? > scaPort = getScaPort(diagram, port, portName);
if (scaPort != null && AbstractPort.class.isAssignableFrom(adapterType)) {
return adapterType.cast(scaPort.getProfileObj());
} else if (adapterType.isInstance(scaPort)) {
return adapterType.cast(scaPort);
}
// We get here when selecting a port in a design time editor
if (port instanceof UsesPortStub) {
Uses uses = ((UsesPortStub) port).getUses();
if (adapterType.isInstance(uses)) {
return adapterType.cast(uses);
}
} else if (port instanceof ProvidesPortStub) {
Provides provides = ((ProvidesPortStub) port).getProvides();
if (adapterType.isInstance(provides)) {
return adapterType.cast(provides);
}
}
return null;
}
private ScaPort< ? , ? > getScaPort(Diagram diagram, EObject port, String name) {
if (!(port.eContainer() instanceof ComponentInstantiation)) {
return null;
}
ScaPortContainer portContainer = ContainerShapeAdapterFactory.adaptCompInstToScaModel(diagram, (ComponentInstantiation) port.eContainer(), ScaPortContainer.class);
return (portContainer != null) ? portContainer.getScaPort(name) : null;
}
@Override
public Class< ? >[] getAdapterList() {
return PortEditPartAdapterFactory.LIST;
}
}