/******************************************************************************* * 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. *******************************************************************************/ /** * FlowElementEditPart.java * * Created 21.12.2011 - 22:23:03 */ package de.tub.tfs.henshin.editor.editparts.flow_diagram.graphical; import java.util.ArrayList; import java.util.List; import org.eclipse.draw2d.ChopboxAnchor; import org.eclipse.draw2d.ConnectionAnchor; import org.eclipse.draw2d.IFigure; import org.eclipse.draw2d.geometry.Point; import org.eclipse.draw2d.geometry.Rectangle; import org.eclipse.emf.common.notify.Notification; import org.eclipse.emf.ecore.EObject; import org.eclipse.gef.ConnectionEditPart; import org.eclipse.gef.EditPart; import org.eclipse.gef.EditPolicy; import org.eclipse.gef.NodeEditPart; import org.eclipse.gef.Request; import org.eclipse.gef.commands.Command; import org.eclipse.gef.requests.CreateRequest; import de.tub.tfs.henshin.editor.editparts.HenshinEditPolicy; import de.tub.tfs.henshin.editor.editparts.flow_diagram.FlowElementClipboardEditPolicy; import de.tub.tfs.henshin.editor.editparts.flow_diagram.FlowElementComponentEditPolicy; import de.tub.tfs.henshin.editor.util.HenshinLayoutUtil; import de.tub.tfs.henshin.model.flowcontrol.FlowElement; import de.tub.tfs.henshin.model.flowcontrol.Transition; import de.tub.tfs.henshin.model.layout.FlowElementLayout; import de.tub.tfs.muvitor.gef.editparts.AdapterGraphicalEditPart; import de.tub.tfs.muvitor.gef.editparts.policies.MuvitorXYLayoutEditPolicy; /** * A abstract {@link EditPart edit part} for {@link FlowElement flow elements}. * * @author nam * * @param <T> */ public abstract class FlowElementEditPart<T extends FlowElement> extends AdapterGraphicalEditPart<T> implements NodeEditPart { /** * The layout model. */ private FlowElementLayout layoutModel; /** * Constructs a {@link FlowDiagramEditpart} with a given model. * * @param model */ public FlowElementEditPart(T model) { super(model); layoutModel = getLayoutModel(); } /* * (non-Javadoc) * * @see * org.eclipse.gef.NodeEditPart#getSourceConnectionAnchor(org.eclipse.gef * .ConnectionEditPart) */ @Override public ConnectionAnchor getSourceConnectionAnchor( ConnectionEditPart connection) { return new ChopboxAnchor(getFigure()); } /* * (non-Javadoc) * * @see * org.eclipse.gef.NodeEditPart#getTargetConnectionAnchor(org.eclipse.gef * .ConnectionEditPart) */ @Override public ConnectionAnchor getTargetConnectionAnchor( ConnectionEditPart connection) { return new ChopboxAnchor(getFigure()); } /* * (non-Javadoc) * * @see * org.eclipse.gef.NodeEditPart#getSourceConnectionAnchor(org.eclipse.gef * .Request) */ @Override public ConnectionAnchor getSourceConnectionAnchor(Request request) { return new ChopboxAnchor(getFigure()); } /* * (non-Javadoc) * * @see * org.eclipse.gef.NodeEditPart#getTargetConnectionAnchor(org.eclipse.gef * .Request) */ @Override public ConnectionAnchor getTargetConnectionAnchor(Request request) { return new ChopboxAnchor(getFigure()); } /** * @return the layoutModel */ public FlowElementLayout getLayoutModel() { if (layoutModel == null) { layoutModel = HenshinLayoutUtil.INSTANCE .getLayout(getCastedModel()); if (layoutModel != null) { registerAdapter(layoutModel); } } return layoutModel; } /* * (non-Javadoc) * * @see * org.eclipse.gef.editparts.AbstractGraphicalEditPart#getModelSourceConnections * () */ @Override protected List<Transition> getModelSourceConnections() { List<Transition> outList = new ArrayList<Transition>(1); Transition defaultOut = getCastedModel().getOut(); if (defaultOut != null) { outList.add(defaultOut); } return outList; } /* * (non-Javadoc) * * @see * de.tub.tfs.muvitor.gef.editparts.AdapterGraphicalEditPart#notifyChanged * (org.eclipse.emf.common.notify.Notification) */ @Override protected void notifyChanged(Notification notification) { int msgType = notification.getEventType(); if (msgType != Notification.REMOVING_ADAPTER && msgType != Notification.RESOLVE) { refresh(); } } /* * (non-Javadoc) * * @see org.eclipse.gef.editparts.AbstractEditPart#refreshVisuals() */ @Override protected void refreshVisuals() { layoutFigure(getFigure()); super.refreshVisuals(); } /* * (non-Javadoc) * * @see * org.eclipse.gef.editparts.AbstractGraphicalEditPart#getModelTargetConnections * () */ @Override protected List<Transition> getModelTargetConnections() { return getCastedModel().getIn(); } /* * (non-Javadoc) * * @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#createFigure() */ @Override protected IFigure createFigure() { IFigure fig = hookCreateFigure(); layoutFigure(fig); return fig; } /* * (non-Javadoc) * * @see org.eclipse.gef.editparts.AbstractEditPart#createEditPolicies() */ @Override protected void createEditPolicies() { installEditPolicy(HenshinEditPolicy.CLIPBOARD_ROLE, new FlowElementClipboardEditPolicy()); installEditPolicy(EditPolicy.NODE_ROLE, new FlowElementGraphicalEditPolicy()); installEditPolicy(EditPolicy.COMPONENT_ROLE, new FlowElementComponentEditPolicy()); installEditPolicy(EditPolicy.LAYOUT_ROLE, new MuvitorXYLayoutEditPolicy() { @Override protected Command getCreateCommand(CreateRequest request) { return null; } @Override protected void setConstraint(EObject model, Rectangle constraint) { } }); } /** * @param fig */ protected void layoutFigure(IFigure fig) { FlowElementLayout layoutModel = getLayoutModel(); if (layoutModel != null && fig != null) { fig.setLocation(new Point(layoutModel.getX(), layoutModel.getY())); } } /** * @return */ protected abstract IFigure hookCreateFigure(); }