/** * 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.sca.sad.diagram.edit.policies; import gov.redhawk.diagram.edit.parts.FindByStubEditPart; import gov.redhawk.sca.sad.diagram.RedhawkSadDiagramPlugin; import gov.redhawk.sca.util.PluginUtil; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; import mil.jpeojtrs.sca.diagram.EObjectContainerStyle; import mil.jpeojtrs.sca.partitioning.ComponentPlacement; import mil.jpeojtrs.sca.partitioning.ConnectInterface; import mil.jpeojtrs.sca.partitioning.FindByStub; import mil.jpeojtrs.sca.partitioning.FindByStubContainer; import mil.jpeojtrs.sca.partitioning.PartitioningFactory; import mil.jpeojtrs.sca.partitioning.PartitioningPackage; import mil.jpeojtrs.sca.partitioning.ProvidesPortStub; import mil.jpeojtrs.sca.partitioning.UsesPortStub; import mil.jpeojtrs.sca.sad.HostCollocation; import mil.jpeojtrs.sca.sad.SadComponentInstantiation; import mil.jpeojtrs.sca.sad.SadConnectInterface; import mil.jpeojtrs.sca.sad.SadPackage; import mil.jpeojtrs.sca.sad.SadProvidesPort; import mil.jpeojtrs.sca.sad.SadUsesPort; import mil.jpeojtrs.sca.sad.SoftwareAssembly; import mil.jpeojtrs.sca.sad.diagram.edit.parts.ComponentPlacementEditPart; import mil.jpeojtrs.sca.sad.diagram.edit.parts.HostCollocationEditPart; import mil.jpeojtrs.sca.sad.diagram.edit.parts.SadConnectInterfaceEditPart; import mil.jpeojtrs.sca.sad.diagram.part.SadVisualIDRegistry; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EStructuralFeature; import org.eclipse.emf.edit.command.AddCommand; import org.eclipse.gef.EditPart; import org.eclipse.gef.EditPartViewer; import org.eclipse.gef.Request; import org.eclipse.gef.commands.Command; import org.eclipse.gmf.runtime.diagram.ui.editparts.DiagramEditPart; import org.eclipse.gmf.runtime.diagram.ui.editparts.INodeEditPart; import org.eclipse.gmf.runtime.diagram.ui.editpolicies.CanonicalConnectionEditPolicy; import org.eclipse.gmf.runtime.diagram.ui.parts.IDiagramGraphicalViewer; import org.eclipse.gmf.runtime.diagram.ui.requests.DropObjectsRequest; import org.eclipse.gmf.runtime.emf.core.util.EMFCoreUtil; import org.eclipse.gmf.runtime.notation.NotationPackage; import org.eclipse.gmf.runtime.notation.View; /** * */ public class SoftwareAssemblyCanonicalEditPolicy extends CanonicalConnectionEditPolicy { private Set<EStructuralFeature> myFeaturesToSynchronize; @Override protected List<EObject> getSemanticChildrenList() { final List<EObject> retVal = new ArrayList<EObject>(); if (getSemanticHost() == null) { return Collections.emptyList(); } if (getSemanticHost().getPartitioning() != null) { retVal.addAll(getSemanticHost().getPartitioning().getComponentPlacement()); retVal.addAll(getSemanticHost().getPartitioning().getHostCollocation()); } final View view = (View) this.host().getModel(); final EObjectContainerStyle style = (EObjectContainerStyle) view.getStyle(NotationPackage.eINSTANCE.getEObjectValueStyle()); if (style != null) { final FindByStubContainer container = (FindByStubContainer) style.getValue(); if (container != null) { retVal.addAll(container.getStubs()); } } return retVal; } @Override public SoftwareAssembly getSemanticHost() { return (SoftwareAssembly) super.getSemanticHost(); } @Override protected Set<EStructuralFeature> getFeaturesToSynchronize() { if (this.myFeaturesToSynchronize == null) { this.myFeaturesToSynchronize = new HashSet<EStructuralFeature>(); this.myFeaturesToSynchronize.add(PartitioningPackage.eINSTANCE.getPartitioning_ComponentPlacement()); this.myFeaturesToSynchronize.add(SadPackage.eINSTANCE.getSadPartitioning_HostCollocation()); this.myFeaturesToSynchronize.add(PartitioningPackage.eINSTANCE.getConnections_ConnectInterface()); } return this.myFeaturesToSynchronize; } @Override protected List<EObject> getSemanticConnectionsList() { if (getSemanticHost().getConnections() == null) { return Collections.emptyList(); } final List<EObject> retVal = new ArrayList<EObject>(); retVal.addAll(getSemanticHost().getConnections().getConnectInterface()); return retVal; } @Override protected EObject getSourceElement(final EObject relationship) { final SadConnectInterface connection = (SadConnectInterface) relationship; return connection.getSource(); } @Override protected EObject getTargetElement(final EObject relationship) { final SadConnectInterface connection = (SadConnectInterface) relationship; return connection.getTarget(); } @Override protected String getFactoryHint(final IAdaptable elementAdapter) { final Object adapter = elementAdapter.getAdapter(EObject.class); if (adapter instanceof HostCollocation) { return SadVisualIDRegistry.getType(HostCollocationEditPart.VISUAL_ID); } else if (adapter instanceof ComponentPlacement) { return SadVisualIDRegistry.getType(ComponentPlacementEditPart.VISUAL_ID); } else if (adapter instanceof FindByStub) { return SadVisualIDRegistry.getType(FindByStubEditPart.VISUAL_ID); } else if (adapter instanceof ConnectInterface) { return SadVisualIDRegistry.getType(SadConnectInterfaceEditPart.VISUAL_ID); } return super.getFactoryHint(elementAdapter); } @Override protected boolean shouldCheckForConnections(final View view, final Collection<View> viewChildren) { return true; } @Override public Command getCommand(final Request request) { if (understandsRequest(request)) { if (isEnabled() && request instanceof DropObjectsRequest) { return null; } } return super.getCommand(request); } @Override protected EditPart getTargetEditPartFor(final EObject connection) { EObject tel; EditPart tep; tel = getTargetElement(connection); /** * If the target element comes back null, derive it from the connection and add it to the appropriate edit part. */ if (tel == null) { final SadConnectInterface connectInterface = (SadConnectInterface) connection; final SadProvidesPort providesPort = connectInterface.getProvidesPort(); if (providesPort == null) { return super.getTargetEditPartFor(connection); } tel = PartitioningFactory.eINSTANCE.createProvidesPortStub(); if (providesPort.getComponentInstantiationRef() != null) { final SadComponentInstantiation compInst = providesPort.getComponentInstantiationRef().getInstantiation(); if (compInst == null) { PluginUtil.logWarning(RedhawkSadDiagramPlugin.getDefault(), "Unable to find target edit part: " + providesPort, null); return null; } final DiagramEditPart diagramEditPart = (DiagramEditPart) getHost(); ((ProvidesPortStub) tel).setName(providesPort.getProvidesIdentifier()); final AddCommand addCommand = new AddCommand(diagramEditPart.getEditingDomain(), compInst.getProvides(), tel); diagramEditPart.getEditingDomain().getCommandStack().execute(addCommand); } } tep = getEditPartFor(tel, connection); return tep; } @Override protected EditPart getSourceEditPartFor(final EObject connection) { EObject sel; EditPart sep; sel = getSourceElement(connection); /** * If the source element comes back null, derive it from the connection and add it to the appropriate edit part */ if (sel == null) { final SadConnectInterface connectInterface = (SadConnectInterface) connection; final SadUsesPort usesPort = connectInterface.getUsesPort(); if (usesPort == null) { return super.getSourceEditPartFor(connection); } sel = PartitioningFactory.eINSTANCE.createUsesPortStub(); if (usesPort.getComponentInstantiationRef() != null) { final SadComponentInstantiation compInst = usesPort.getComponentInstantiationRef().getInstantiation(); if (compInst == null) { PluginUtil.logWarning(RedhawkSadDiagramPlugin.getDefault(), "Unable to find source edit part: " + usesPort, null); return null; } final DiagramEditPart diagramEditPart = (DiagramEditPart) getHost(); ((UsesPortStub) sel).setName(usesPort.getUsesIdentifier()); final AddCommand addCommand = new AddCommand(diagramEditPart.getEditingDomain(), compInst.getUses(), sel); diagramEditPart.getEditingDomain().getCommandStack().execute(addCommand); } } sep = getEditPartFor(sel, connection); return sep; } @SuppressWarnings("unchecked") private EditPart getEditPartFor(final EObject element, final EObject context) { if (element != null && !(element instanceof View)) { final EditPartViewer viewer = getHost().getViewer(); if (viewer instanceof IDiagramGraphicalViewer) { List<EditPart> parts = ((IDiagramGraphicalViewer) viewer).findEditPartsForElement(EMFCoreUtil.getProxyID(element), INodeEditPart.class); if (parts.isEmpty()) { // reach for the container's editpart instead and force it // to refresh final EObject container = element.eContainer(); final EditPart containerEP = getEditPartFor(container, null); if (containerEP != null) { containerEP.refresh(); parts = ((IDiagramGraphicalViewer) viewer).findEditPartsForElement(EMFCoreUtil.getProxyID(element), INodeEditPart.class); } } // Check if the part is contained with-in the host EditPart // since we are canonically updated the host. return findEditPartForElement(element, context, parts); } } return (EditPart) host().getViewer().getEditPartRegistry().get(element); } }