/******************************************************************************* * Copyright (c) 2010-2015 Henshin developers. 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: * TU Berlin, University of Luxembourg, SES S.A. *******************************************************************************/ /** * ParameterEditPart.java * * Created 23.12.2011 - 17:39:32 */ package de.tub.tfs.henshin.editor.editparts.flow_diagram.graphical; import java.util.LinkedList; import java.util.List; import org.eclipse.draw2d.ConnectionAnchor; import org.eclipse.draw2d.IFigure; import org.eclipse.emf.common.notify.Notification; import org.eclipse.emf.ecore.EObject; import org.eclipse.gef.ConnectionEditPart; import org.eclipse.gef.EditPolicy; import org.eclipse.gef.NodeEditPart; import org.eclipse.gef.Request; import org.eclipse.gef.editpolicies.SelectionEditPolicy; import de.tub.tfs.henshin.editor.figure.flow_diagram.ParameterFigure; import de.tub.tfs.henshin.editor.figure.flow_diagram.ParameterFigure.TYPE; import de.tub.tfs.henshin.editor.figure.flow_diagram.ParameterFigureConnectionAnchor; import de.tub.tfs.henshin.editor.util.HenshinLayoutUtil; import de.tub.tfs.henshin.editor.util.ModelUtil; import de.tub.tfs.henshin.model.flowcontrol.Activity; import de.tub.tfs.henshin.model.flowcontrol.FlowControlPackage; import de.tub.tfs.henshin.model.flowcontrol.FlowDiagram; import de.tub.tfs.henshin.model.flowcontrol.FlowElement; import de.tub.tfs.henshin.model.flowcontrol.Parameter; import de.tub.tfs.henshin.model.flowcontrol.ParameterMapping; import de.tub.tfs.henshin.model.flowcontrol.ParameterProvider; import de.tub.tfs.henshin.model.layout.FlowElementLayout; import de.tub.tfs.henshin.model.layout.HenshinLayoutPackage; import de.tub.tfs.muvitor.gef.editparts.AdapterGraphicalEditPart; /** * @author nam * */ public class ParameterEditPart extends AdapterGraphicalEditPart<Parameter> implements NodeEditPart { /** * @param model */ public ParameterEditPart(final Parameter model) { super(model); if (model.getProvider() instanceof Activity) { Activity container = (Activity) model.getProvider(); FlowElementLayout containerLayout = HenshinLayoutUtil.INSTANCE .getLayout((FlowElement) container); registerAdapter(containerLayout); if (container.getContent() != null) { registerAdapter(container.getContent()); } } registerAdapter(model.getHenshinParameter()); } /* * (non-Javadoc) * * @see * de.tub.tfs.muvitor.gef.editparts.AdapterGraphicalEditPart#notifyChanged * (org.eclipse.emf.common.notify.Notification) */ @Override protected void notifyChanged(Notification notification) { int id = notification.getFeatureID(HenshinLayoutPackage.class); int type = notification.getEventType(); if (id == HenshinLayoutPackage.FLOW_ELEMENT_LAYOUT__MAP_ID && notification.getNotifier() instanceof FlowElementLayout) { ((ParameterFigure) getFigure()).setMapping(notification .getNewIntValue()); } if (type != Notification.RESOLVE && type != Notification.REMOVING_ADAPTER) { refresh(); } } /* * (non-Javadoc) * * @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#createFigure() */ @Override protected IFigure createFigure() { ParameterFigure fig = new ParameterFigure(); Parameter model = getCastedModel(); fig.setName(model.getHenshinParameter().getName()); updateMapping(fig); return fig; } /* * (non-Javadoc) * * @see org.eclipse.gef.editparts.AbstractEditPart#createEditPolicies() */ @Override protected void createEditPolicies() { installEditPolicy(EditPolicy.GRAPHICAL_NODE_ROLE, new ParameterGraphicalNodeEditPolicy()); installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE, new SelectionEditPolicy() { @Override protected void showSelection() { ((ParameterFigure) getHostFigure()) .setHighlighted(true); } @Override protected void hideSelection() { ((ParameterFigure) getHostFigure()) .setHighlighted(false); } }); } /* * (non-Javadoc) * * @see * org.eclipse.gef.editparts.AbstractGraphicalEditPart#getModelSourceConnections * () */ @Override protected List<ParameterMapping> getModelSourceConnections() { List<ParameterMapping> outMapping = new LinkedList<ParameterMapping>(); FlowDiagram diagram; ParameterProvider provider = getCastedModel().getProvider(); if (provider instanceof Activity) { diagram = ((Activity) provider).getDiagram(); } else { diagram = (FlowDiagram) provider; } List<EObject> allMappings = ModelUtil.getReferences(getCastedModel(), diagram, FlowControlPackage.Literals.PARAMETER_MAPPING__SRC); for (EObject m : allMappings) { ParameterMapping mapping = (ParameterMapping) m; if (!(mapping.getTarget().getProvider() instanceof FlowDiagram)) { outMapping.add(mapping); } } return outMapping; } /* * (non-Javadoc) * * @see * org.eclipse.gef.editparts.AbstractGraphicalEditPart#getModelTargetConnections * () */ @Override protected List<ParameterMapping> getModelTargetConnections() { List<ParameterMapping> inMapping = new LinkedList<ParameterMapping>(); ParameterProvider provider = getCastedModel().getProvider(); FlowDiagram diagram; if (provider instanceof FlowDiagram) { diagram = (FlowDiagram) provider; } else { diagram = ((Activity) provider).getDiagram(); } List<EObject> allMappings = ModelUtil.getReferences(getCastedModel(), diagram, FlowControlPackage.Literals.PARAMETER_MAPPING__TARGET); for (EObject m : allMappings) { ParameterMapping mapping = (ParameterMapping) m; if (!(mapping.getSrc().getProvider() instanceof FlowDiagram)) { inMapping.add(mapping); } } return inMapping; } /* * (non-Javadoc) * * @see * org.eclipse.gef.NodeEditPart#getSourceConnectionAnchor(org.eclipse.gef * .ConnectionEditPart) */ @Override public ConnectionAnchor getSourceConnectionAnchor( ConnectionEditPart connection) { return new ParameterFigureConnectionAnchor(getFigure()); } /* * (non-Javadoc) * * @see * org.eclipse.gef.NodeEditPart#getTargetConnectionAnchor(org.eclipse.gef * .ConnectionEditPart) */ @Override public ConnectionAnchor getTargetConnectionAnchor( ConnectionEditPart connection) { return new ParameterFigureConnectionAnchor(getFigure()); } /* * (non-Javadoc) * * @see org.eclipse.gef.editparts.AbstractEditPart#refreshVisuals() */ @Override protected void refreshVisuals() { Parameter model = getCastedModel(); ParameterFigure fig = (ParameterFigure) getFigure(); if (model.isInput()) { fig.setType(TYPE.IN); } else if (model.isOutPut()) { fig.setType(TYPE.OUT); } else { fig.setType(TYPE.NONE); } fig.setName(model.getHenshinParameter().getName()); updateMapping(fig); super.refreshVisuals(); } /* * (non-Javadoc) * * @see * org.eclipse.gef.NodeEditPart#getSourceConnectionAnchor(org.eclipse.gef * .Request) */ @Override public ConnectionAnchor getSourceConnectionAnchor(Request request) { return new ParameterFigureConnectionAnchor(getFigure()); } /** * @return */ public int get2NodeMappingID() { if (getCastedModel().getProvider() instanceof Activity) { Activity container = (Activity) getCastedModel().getProvider(); FlowElementLayout containerLayout = HenshinLayoutUtil.INSTANCE .getLayout((FlowElement) container); return containerLayout.getMapId(); } return -1; } /* * (non-Javadoc) * * @see * org.eclipse.gef.NodeEditPart#getTargetConnectionAnchor(org.eclipse.gef * .Request) */ @Override public ConnectionAnchor getTargetConnectionAnchor(Request request) { return new ParameterFigureConnectionAnchor(getFigure()); } /** * @param fig */ private void updateMapping(ParameterFigure fig) { Parameter model = getCastedModel(); if (model.getProvider() instanceof Activity) { Activity container = (Activity) model.getProvider(); EObject content = container.getContent(); FlowElementLayout containerLayout = HenshinLayoutUtil.INSTANCE .getLayout((FlowElement) container); fig.setMapping(containerLayout.getMapId()); if (content instanceof FlowDiagram) { for (ParameterMapping m : container.getParameterMappings()) { if (m.getSrc() == model || m.getTarget() == model) { Parameter target = m.getTarget() == model ? m.getSrc() : m.getTarget(); FlowDiagram d = (FlowDiagram) content; if (target.isInput()) { for (ParameterMapping m0 : d.getParameterMappings()) { if (m0.getSrc() == target) { Activity a = (Activity) m0.getTarget() .getProvider(); int idExt = HenshinLayoutUtil.INSTANCE .getLayout(a).getMapId(); fig.setMapExt(idExt, true); } } } else if (target.isOutPut()) { for (ParameterMapping m0 : d.getParameterMappings()) { if (m0.getTarget() == target) { Activity a = (Activity) m0.getSrc() .getProvider(); int idExt = HenshinLayoutUtil.INSTANCE .getLayout(a).getMapId(); fig.setMapExt(idExt, false); } } } } } } } } }