| /***************************************************************************** |
| * Copyright (c) 2016 CEA LIST and others. |
| * |
| * 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: |
| * CEA LIST - Initial API and implementation |
| * |
| *****************************************************************************/ |
| package org.eclipse.papyrus.interoperability.rpy.geometry.utils; |
| |
| import java.util.List; |
| import java.util.Vector; |
| |
| import org.eclipse.emf.common.util.EList; |
| import org.eclipse.emf.ecore.EObject; |
| import org.eclipse.papyrus.interoperability.rpy.geometry.rpygeometry.Point; |
| import org.eclipse.papyrus.interoperability.rpy.geometry.rpygeometry.Rectangle; |
| import org.eclipse.papyrus.interoperability.rpy.geometry.rpygeometry.RpyGeometryFactory; |
| import org.eclipse.papyrus.interoperability.rpy.geometry.rpygeometry.RpyShape; |
| import org.eclipse.papyrus.interoperability.rpy.geometry.rpygeometry.TransformMatrix; |
| import org.eclipse.papyrus.interoperability.rpy.rpymetamodel.CGIPortConnector; |
| import org.eclipse.papyrus.interoperability.rpy.rpymetamodel.GraphElementsType; |
| import org.eclipse.papyrus.interoperability.rpy.rpymetamodel.UMLRpyPackage; |
| |
| public class RpyShapeOperations { |
| |
| public static String M_POLYGON_FEATURE_NAME = UMLRpyPackage.eINSTANCE.getCGIGenericElement_M_polygon().getName(); |
| public static String M_PARENT_FEATURE_NAME = UMLRpyPackage.eINSTANCE.getCGIGenericElement_M_pParent().getName(); |
| public static String M_TRANSFORM_FEATURE_NAME = UMLRpyPackage.eINSTANCE.getCGIGenericElement_M_transform().getName(); |
| |
| |
| public static void initializeShape(RpyShape rpyShape, EObject rpyMMObj) { |
| initializeTransform(rpyShape, rpyMMObj); |
| initializeRectangle(rpyShape, rpyMMObj); |
| initializeParent(rpyShape, rpyMMObj); |
| initializePositionAndSize(rpyShape); |
| |
| } |
| |
| public static RpyShape createRpyShape(GraphElementsType graphElement) { |
| RpyShape shape; |
| if (isPort(graphElement)) { |
| shape = RpyGeometryFactory.eINSTANCE.createRpyPort(); |
| } else { |
| shape = RpyGeometryFactory.eINSTANCE.createRpyShape(); |
| } |
| |
| shape.setRpyMetamodelObject(graphElement); |
| return shape; |
| } |
| |
| |
| |
| private static boolean isPort(GraphElementsType graphElement) { |
| |
| return graphElement instanceof CGIPortConnector; |
| } |
| |
| public static void initializePositionAndSize(RpyShape rpyShape) { |
| Point point; |
| if (rpyShape.getRectangle() == null) { |
| point = PointsOperations.getPoint("0", "0"); |
| } else { |
| point = rpyShape.getRectangle().getTopLeft(); |
| } |
| TransformMatrix transfo = rpyShape.getTransform(); |
| |
| RpyShape parentShape = rpyShape.getParent(); |
| |
| while (parentShape != null && parentShape.getTransform() != null) { |
| transfo = parentShape.getTransform().multiply(transfo); |
| parentShape = parentShape.getParent(); |
| } |
| Point absoluteTopLeft = transfo.multiply(point); |
| rpyShape.setAbsolutePosition(absoluteTopLeft); |
| |
| if (rpyShape.getParent() == null) { |
| rpyShape.setParentRelativePosition(PointsOperations.getPoint("0", "0")); |
| } else { |
| rpyShape.setParentRelativePosition(absoluteTopLeft.minus(rpyShape.getParent().getAbsolutePosition())); |
| } |
| |
| if (rpyShape.getRectangle() != null) { |
| Point absoluteBottomRight = transfo.multiply(rpyShape.getRectangle().getBottomRight()); |
| Point relativeBottomRight = absoluteBottomRight.minus(absoluteTopLeft); |
| rpyShape.setHeight(relativeBottomRight.getIntY()); |
| rpyShape.setWidth(relativeBottomRight.getIntX()); |
| } |
| } |
| |
| |
| |
| |
| |
| private static List<RpyShape> collectParentShapes(RpyShape rpyShape) { |
| Vector<RpyShape> ret = new Vector<>(); |
| RpyShape parent = rpyShape.getParent(); |
| while (parent != null) { |
| ret.add(0, parent); |
| parent = rpyShape.getParent(); |
| } |
| return ret; |
| } |
| |
| |
| |
| public static void initializeParent(RpyShape rpyShape, EObject rpyMMObj) { |
| Object parentObj = GeometryUtils.getFeatureValue(rpyMMObj, M_PARENT_FEATURE_NAME); |
| if (parentObj instanceof EObject) { |
| RpyShape parentShape = RpyGeometryFactory.eINSTANCE.createRpyShape(); |
| parentShape.setRpyMetamodelObject((EObject) parentObj); |
| rpyShape.setParent(parentShape); |
| } |
| } |
| |
| public static void initializeRectangle(RpyShape rpyShape, EObject rpyMMObj) { |
| Object polygonObj = GeometryUtils.getFeatureValue(rpyMMObj, M_POLYGON_FEATURE_NAME); |
| if (polygonObj instanceof List) { |
| @SuppressWarnings("unchecked") |
| Rectangle rectangle = RectangleOperations.getRectangle((List<String>) polygonObj); |
| rpyShape.setRectangle(rectangle); |
| } |
| |
| } |
| |
| public static void initializeTransform(RpyShape rpyShape, EObject rpyMMObj) { |
| Object transformObj = GeometryUtils.getFeatureValue(rpyMMObj, M_TRANSFORM_FEATURE_NAME); |
| if (transformObj instanceof EList && !((EList) transformObj).isEmpty()) { |
| @SuppressWarnings("unchecked") |
| TransformMatrix transform = TransformMatrixOperations.createMatrix((EList<String>) transformObj); |
| rpyShape.setTransform(transform); |
| } else { |
| rpyShape.setTransform(TransformMatrixOperations.getIdentityTransform()); |
| } |
| } |
| |
| |
| |
| |
| |
| } |