/******************************************************************************* * 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. *******************************************************************************/ /** * FlowDiagramParametersContainerEditpart.java * * Created 24.12.2011 - 21:26:37 */ package de.tub.tfs.henshin.editor.editparts.flow_diagram; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; import org.eclipse.draw2d.ConnectionLayer; import org.eclipse.draw2d.FanRouter; import org.eclipse.draw2d.FreeformLayer; import org.eclipse.draw2d.GridLayout; import org.eclipse.draw2d.IFigure; import org.eclipse.emf.common.notify.Notification; import org.eclipse.emf.common.util.TreeIterator; import org.eclipse.emf.ecore.EObject; import org.eclipse.gef.EditPart; import org.eclipse.gef.LayerConstants; import org.eclipse.swt.SWT; import de.tub.tfs.henshin.editor.editparts.flow_diagram.graphical.ParameterEditPart; import de.tub.tfs.henshin.editor.figure.flow_diagram.FlowDiagramParameterMappingsConnectionRouter; 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.muvitor.gef.editparts.AdapterGraphicalEditPart; /** * @author nam * */ public class FlowDiagramParametersContainerEditpart extends AdapterGraphicalEditPart<FlowDiagram> { /** * @param model */ public FlowDiagramParametersContainerEditpart(FlowDiagram model) { super(model); for (FlowElement e : model.getElements()) { if (e instanceof Activity) { deepRegisterAdapters((Activity) e); } } } /* * (non-Javadoc) * * @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#createFigure() */ @Override protected IFigure createFigure() { final FreeformLayer fig = new FreeformLayer(); GridLayout gridLayout = new GridLayout(1, false); gridLayout.verticalSpacing = 20; ConnectionLayer cLayer = (ConnectionLayer) getLayer(LayerConstants.CONNECTION_LAYER); FanRouter router = new FanRouter(); router.setNextRouter(new FlowDiagramParameterMappingsConnectionRouter( fig)); cLayer.setAntialias(SWT.ON); cLayer.setConnectionRouter(router); fig.setLayoutManager(gridLayout); return fig; } /* * (non-Javadoc) * * @see org.eclipse.gef.editparts.AbstractEditPart#getModelChildren() */ @Override protected List<Parameter> getModelChildren() { List<Parameter> children = new ArrayList<Parameter>(); FlowDiagram model = getCastedModel(); for (FlowElement e : model.getElements()) { if (e instanceof Activity) { deepGetParameters(children, (Activity) e); } } return children; } /* * (non-Javadoc) * * @see * de.tub.tfs.muvitor.gef.editparts.AdapterGraphicalEditPart#notifyChanged * (org.eclipse.emf.common.notify.Notification) */ @Override protected void notifyChanged(Notification notification) { int msgId = notification.getFeatureID(FlowControlPackage.class); int msgType = notification.getEventType(); switch (msgId) { case FlowControlPackage.FLOW_DIAGRAM__ELEMENTS: if (msgType == Notification.ADD && notification.getNewValue() instanceof Activity) { deepRegisterAdapters((Activity) notification.getNewValue()); } break; default: break; } refresh(); } /* * (non-Javadoc) * * @see org.eclipse.gef.editparts.AbstractEditPart#refreshChildren() */ @Override protected void refreshChildren() { super.refreshChildren(); for (Object child : getChildren()) { ((EditPart) child).refresh(); } sortChildren(); } /** * */ private void sortChildren() { @SuppressWarnings("unchecked") List<Object> children = new ArrayList<Object>(getChildren()); Collections.sort(children, new Comparator<Object>() { @Override public int compare(Object o1, Object o2) { ParameterEditPart p0 = (ParameterEditPart) o1; ParameterEditPart p1 = (ParameterEditPart) o2; return Integer.valueOf(p0.get2NodeMappingID()).compareTo( Integer.valueOf(p1.get2NodeMappingID())); } }); for (int i = 0; i < children.size(); i++) { reorderChild((EditPart) children.get(i), i); } } /* * (non-Javadoc) * * @see org.eclipse.gef.editparts.AbstractEditPart#createEditPolicies() */ @Override protected void createEditPolicies() { } /** * @param parameters * @param a */ private void deepGetParameters(List<Parameter> parameters, Activity a) { parameters.addAll(a.getParameters()); TreeIterator<EObject> it = a.eAllContents(); while (it.hasNext()) { EObject child = it.next(); if (child instanceof Activity) { parameters.addAll(((Activity) child).getParameters()); } } } /** * @param a */ private void deepRegisterAdapters(Activity a) { registerAdapter(a); TreeIterator<EObject> it = a.eAllContents(); while (it.hasNext()) { EObject child = it.next(); if (child instanceof Activity) { registerAdapter(child); if (((Activity) child).getContent() != null) { registerAdapter(((Activity) child).getContent()); } } } } }