/**
* 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.ide.graphiti.sad.ui.diagram.providers;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.graphiti.dt.IDiagramTypeProvider;
import org.eclipse.graphiti.features.IReconnectionFeature;
import org.eclipse.graphiti.features.IUpdateFeature;
import org.eclipse.graphiti.features.context.ICustomContext;
import org.eclipse.graphiti.features.context.IReconnectionContext;
import org.eclipse.graphiti.features.context.IUpdateContext;
import org.eclipse.graphiti.features.custom.ICustomFeature;
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.pattern.IPattern;
import gov.redhawk.core.graphiti.sad.ui.diagram.providers.SADGraphitiFeatureProvider;
import gov.redhawk.ide.graphiti.sad.ui.diagram.features.custom.DecrementStartOrderFeature;
import gov.redhawk.ide.graphiti.sad.ui.diagram.features.custom.IncrementStartOrderFeature;
import gov.redhawk.ide.graphiti.sad.ui.diagram.features.custom.MarkExternalPortFeature;
import gov.redhawk.ide.graphiti.sad.ui.diagram.features.custom.MarkNonExternalPortFeature;
import gov.redhawk.ide.graphiti.sad.ui.diagram.features.custom.SetAsAssemblyControllerFeature;
import gov.redhawk.ide.graphiti.sad.ui.diagram.features.reconnect.SADReconnectFeature;
import gov.redhawk.ide.graphiti.sad.ui.diagram.patterns.HostCollocationPattern;
import gov.redhawk.ide.graphiti.sad.ui.diagram.patterns.UsesDeviceFrontEndTunerPattern;
import gov.redhawk.ide.graphiti.sad.ui.diagram.patterns.UsesDevicePattern;
import gov.redhawk.ide.graphiti.sad.ui.internal.diagram.features.SADUpdateDiagramFeature;
import gov.redhawk.ide.graphiti.ui.diagram.features.custom.DialogEditingFeatureForPattern;
import gov.redhawk.ide.graphiti.ui.diagram.features.custom.IDialogEditingPattern;
import gov.redhawk.ide.graphiti.ui.diagram.patterns.FindByCORBANamePattern;
import gov.redhawk.ide.graphiti.ui.diagram.patterns.FindByDomainManagerPattern;
import gov.redhawk.ide.graphiti.ui.diagram.patterns.FindByEventChannelPattern;
import gov.redhawk.ide.graphiti.ui.diagram.patterns.FindByFileManagerPattern;
import gov.redhawk.ide.graphiti.ui.diagram.patterns.FindByServicePattern;
import gov.redhawk.ide.graphiti.ui.diagram.util.DUtil;
import mil.jpeojtrs.sca.partitioning.ComponentSupportedInterfaceStub;
import mil.jpeojtrs.sca.partitioning.ProvidesPortStub;
import mil.jpeojtrs.sca.partitioning.UsesPortStub;
import mil.jpeojtrs.sca.sad.Port;
import mil.jpeojtrs.sca.sad.SadComponentInstantiation;
import mil.jpeojtrs.sca.sad.SoftwareAssembly;
public class SADEditorFeatureProvider extends SADGraphitiFeatureProvider {
public SADEditorFeatureProvider(IDiagramTypeProvider diagramTypeProvider) {
super(diagramTypeProvider);
// Add host collocation pattern
addPattern(new HostCollocationPattern());
// Add find by patterns
addPattern(new FindByDomainManagerPattern());
addPattern(new FindByFileManagerPattern());
addPattern(new FindByEventChannelPattern());
addPattern(new FindByServicePattern());
addPattern(new FindByCORBANamePattern());
// Add uses device patterns
addPattern(new UsesDeviceFrontEndTunerPattern());
addPattern(new UsesDevicePattern());
}
@Override
public IUpdateFeature getUpdateFeature(IUpdateContext context) {
if (context.getPictogramElement() instanceof Diagram) {
return new SADUpdateDiagramFeature(this);
}
return super.getUpdateFeature(context);
}
@Override
public ICustomFeature[] getCustomFeatures(ICustomContext context) {
List<ICustomFeature> features = new ArrayList<>();
Collections.addAll(features, super.getCustomFeatures(context));
Diagram diagram = getDiagramTypeProvider().getDiagram();
PictogramElement[] pes = context.getPictogramElements();
if (pes == null || pes.length == 0) {
return features.toArray(new ICustomFeature[features.size()]);
}
EObject businessObject = DUtil.getBusinessObject(pes[0]);
if (pes[0] instanceof ContainerShape) {
if (businessObject instanceof SadComponentInstantiation) {
// Design-time-only component features
features.add(new SetAsAssemblyControllerFeature(this));
features.add(new IncrementStartOrderFeature(this));
features.add(new DecrementStartOrderFeature(this));
}
IPattern pattern = getPatternForPictogramElement(pes[0]);
if (pattern instanceof IDialogEditingPattern) {
IDialogEditingPattern dialogEditing = (IDialogEditingPattern) pattern;
if (dialogEditing.canDialogEdit(context)) {
features.add(new DialogEditingFeatureForPattern(this, dialogEditing));
}
}
}
// Design-time-only port features
if ((businessObject instanceof ProvidesPortStub || businessObject instanceof UsesPortStub)
&& businessObject.eContainer() instanceof SadComponentInstantiation) {
boolean mark = true;
final SoftwareAssembly sad = DUtil.getDiagramSAD(diagram);
if (sad.getExternalPorts() != null) {
// Get existing external ports
EList<Port> externalPortList = sad.getExternalPorts().getPort();
// Determine if this port is already external
if (businessObject instanceof ProvidesPortStub) {
String portName = ((ProvidesPortStub) businessObject).getName();
EObject portContainer = ((ProvidesPortStub) businessObject).eContainer();
for (Port p : externalPortList) {
if (portName.equals(p.getProvidesIdentifier()) && portContainer.equals(p.getComponentInstantiationRef().getInstantiation())) {
mark = false;
break;
}
}
} else if (businessObject instanceof UsesPortStub) {
String portName = ((UsesPortStub) businessObject).getName();
EObject portContainer = ((UsesPortStub) businessObject).eContainer();
for (Port p : externalPortList) {
if (portName.equals(p.getUsesIdentifier()) && portContainer.equals(p.getComponentInstantiationRef().getInstantiation())) {
mark = false;
break;
}
}
}
}
// Add the mark external feature
if (mark) {
features.add(new MarkExternalPortFeature(this));
} else {
features.add(new MarkNonExternalPortFeature(this));
}
}
return features.toArray(new ICustomFeature[features.size()]);
}
@Override
public IReconnectionFeature getReconnectionFeature(IReconnectionContext context) {
Object businessObject = getBusinessObjectForPictogramElement(context.getOldAnchor());
if (businessObject instanceof UsesPortStub || businessObject instanceof ProvidesPortStub || businessObject instanceof ComponentSupportedInterfaceStub) {
return new SADReconnectFeature(this);
}
return super.getReconnectionFeature(context);
}
}