Search in sources :

Example 1 with RectangleSide

use of org.eclipse.sirius.components.diagrams.layout.incremental.utils.RectangleSide in project sirius-components by eclipse-sirius.

the class IncrementalLayoutEngine method updateBorderNodeAccordingParentResize.

/**
 * Move the border node along the side according to the parent Size changes.
 */
private void updateBorderNodeAccordingParentResize(Optional<IDiagramEvent> optionalDiagramElementEvent, Bounds initialNodeBounds, Bounds newNodeBounds, List<BorderNodesOnSide> borderNodesPerSideList, String parentId) {
    // @formatter:off
    boolean isParentRectangleResized = optionalDiagramElementEvent.filter(ResizeEvent.class::isInstance).map(ResizeEvent.class::cast).map(ResizeEvent::getNodeId).filter(parentId::equals).isPresent();
    if (isParentRectangleResized && !initialNodeBounds.equals(newNodeBounds)) {
        EnumMap<RectangleSide, Double> sideHomotheticRatio = this.getHomotheticRatio(initialNodeBounds.getSize(), newNodeBounds.getSize());
        Size initialSize = initialNodeBounds.getSize();
        Size newSize = newNodeBounds.getSize();
        for (BorderNodesOnSide borderNodesOnSide : borderNodesPerSideList) {
            RectangleSide side = borderNodesOnSide.getSide();
            List<NodeLayoutData> borderNodes = borderNodesOnSide.getBorderNodes();
            double homotheticRatio = sideHomotheticRatio.get(side);
            for (NodeLayoutData borderNodeLayoutData : borderNodes) {
                // The border node position is done in the parent node coordinate system
                Position position = borderNodeLayoutData.getPosition();
                Size size = borderNodeLayoutData.getSize();
                if (RectangleSide.NORTH.equals(side)) {
                    borderNodeLayoutData.setPosition(Position.at((position.getX() + size.getWidth() / 2) * homotheticRatio - size.getWidth() / 2, position.getY()));
                } else if (RectangleSide.SOUTH.equals(side)) {
                    double dySouthShift = newSize.getHeight() - initialSize.getHeight();
                    borderNodeLayoutData.setPosition(Position.at((position.getX() + size.getWidth() / 2) * homotheticRatio - size.getWidth() / 2, position.getY() + dySouthShift));
                } else if (RectangleSide.WEST.equals(side)) {
                    borderNodeLayoutData.setPosition(Position.at(position.getX(), (position.getY() + size.getHeight() / 2) * homotheticRatio - size.getHeight() / 2));
                } else if (RectangleSide.EAST.equals(side)) {
                    double dxEastShift = newSize.getWidth() - initialSize.getWidth();
                    borderNodeLayoutData.setPosition(Position.at(position.getX() + dxEastShift, (position.getY() + size.getHeight() / 2) * homotheticRatio - size.getHeight() / 2));
                }
            }
        }
    }
}
Also used : Position(org.eclipse.sirius.components.diagrams.Position) Size(org.eclipse.sirius.components.diagrams.Size) ResizeEvent(org.eclipse.sirius.components.diagrams.events.ResizeEvent) RectangleSide(org.eclipse.sirius.components.diagrams.layout.incremental.utils.RectangleSide) NodeLayoutData(org.eclipse.sirius.components.diagrams.layout.incremental.data.NodeLayoutData)

Example 2 with RectangleSide

use of org.eclipse.sirius.components.diagrams.layout.incremental.utils.RectangleSide in project sirius-components by eclipse-sirius.

the class IncrementalLayoutEngine method snapBorderNodes.

/**
 * Update the border node by snapping it to the parentRectangle, that is moving it to the closest point of the
 * parentRectangle.
 *
 * @param borderNodesLayoutData
 *            the border nodes which position is given in the rectangle upper right corner coordinates system
 * @return for each side of the given parentRectangle, the list of the updates border node
 */
private List<BorderNodesOnSide> snapBorderNodes(List<NodeLayoutData> borderNodesLayoutData, Size parentRectangle, ISiriusWebLayoutConfigurator layoutConfigurator) {
    EnumMap<RectangleSide, List<NodeLayoutData>> borderNodesPerSide = new EnumMap<>(RectangleSide.class);
    Geometry geometry = new Geometry();
    for (NodeLayoutData borderNodeLayoutData : borderNodesLayoutData) {
        double portOffset = layoutConfigurator.configureByType(borderNodeLayoutData.getNodeType()).getProperty(CoreOptions.PORT_BORDER_OFFSET).doubleValue();
        Bounds borderNodeRectangle = Bounds.newBounds().position(borderNodeLayoutData.getPosition()).size(borderNodeLayoutData.getSize()).build();
        PointOnRectangleInfo borderNodePositionOnSide = geometry.snapBorderNodeOnRectangle(borderNodeRectangle, parentRectangle, portOffset);
        // update the border node
        borderNodeLayoutData.setPosition(borderNodePositionOnSide.getPosition());
        borderNodesPerSide.computeIfAbsent(borderNodePositionOnSide.getSide(), side -> new ArrayList<>());
        borderNodesPerSide.get(borderNodePositionOnSide.getSide()).add(borderNodeLayoutData);
    }
    // @formatter:off
    return borderNodesPerSide.entrySet().stream().map(entry -> new BorderNodesOnSide(entry.getKey(), entry.getValue())).collect(Collectors.toList());
// @formatter:on
}
Also used : Geometry(org.eclipse.sirius.components.diagrams.layout.incremental.utils.Geometry) CoreOptions(org.eclipse.elk.core.options.CoreOptions) Size(org.eclipse.sirius.components.diagrams.Size) Ratio(org.eclipse.sirius.components.diagrams.Ratio) DiagramLayoutData(org.eclipse.sirius.components.diagrams.layout.incremental.data.DiagramLayoutData) Position(org.eclipse.sirius.components.diagrams.Position) NodeLabelPositionProvider(org.eclipse.sirius.components.diagrams.layout.incremental.provider.NodeLabelPositionProvider) NodeSizeProvider(org.eclipse.sirius.components.diagrams.layout.incremental.provider.NodeSizeProvider) ArrayList(java.util.ArrayList) EdgeRoutingPointsProvider(org.eclipse.sirius.components.diagrams.layout.incremental.provider.EdgeRoutingPointsProvider) Geometry(org.eclipse.sirius.components.diagrams.layout.incremental.utils.Geometry) BigDecimal(java.math.BigDecimal) NodePositionProvider(org.eclipse.sirius.components.diagrams.layout.incremental.provider.NodePositionProvider) Service(org.springframework.stereotype.Service) OverlapsUpdater(org.eclipse.sirius.components.diagrams.layout.incremental.updater.OverlapsUpdater) NodeLayoutData(org.eclipse.sirius.components.diagrams.layout.incremental.data.NodeLayoutData) Bounds(org.eclipse.sirius.components.diagrams.layout.incremental.utils.Bounds) RoundingMode(java.math.RoundingMode) EdgeLabelPositionProvider(org.eclipse.sirius.components.diagrams.layout.incremental.provider.EdgeLabelPositionProvider) IDiagramEvent(org.eclipse.sirius.components.diagrams.events.IDiagramEvent) ISiriusWebLayoutConfigurator(org.eclipse.sirius.components.diagrams.layout.ISiriusWebLayoutConfigurator) EnumMap(java.util.EnumMap) ResizeEvent(org.eclipse.sirius.components.diagrams.events.ResizeEvent) ContainmentUpdater(org.eclipse.sirius.components.diagrams.layout.incremental.updater.ContainmentUpdater) IContainerLayoutData(org.eclipse.sirius.components.diagrams.layout.incremental.data.IContainerLayoutData) Collectors(java.util.stream.Collectors) DoublePositionEvent(org.eclipse.sirius.components.diagrams.events.DoublePositionEvent) MoveEvent(org.eclipse.sirius.components.diagrams.events.MoveEvent) Objects(java.util.Objects) List(java.util.List) BorderNodeLabelPositionProvider(org.eclipse.sirius.components.diagrams.layout.incremental.provider.BorderNodeLabelPositionProvider) RectangleSide(org.eclipse.sirius.components.diagrams.layout.incremental.utils.RectangleSide) Optional(java.util.Optional) EdgeLayoutData(org.eclipse.sirius.components.diagrams.layout.incremental.data.EdgeLayoutData) PointOnRectangleInfo(org.eclipse.sirius.components.diagrams.layout.incremental.utils.PointOnRectangleInfo) Bounds(org.eclipse.sirius.components.diagrams.layout.incremental.utils.Bounds) PointOnRectangleInfo(org.eclipse.sirius.components.diagrams.layout.incremental.utils.PointOnRectangleInfo) ArrayList(java.util.ArrayList) List(java.util.List) EnumMap(java.util.EnumMap) RectangleSide(org.eclipse.sirius.components.diagrams.layout.incremental.utils.RectangleSide) NodeLayoutData(org.eclipse.sirius.components.diagrams.layout.incremental.data.NodeLayoutData)

Example 3 with RectangleSide

use of org.eclipse.sirius.components.diagrams.layout.incremental.utils.RectangleSide in project sirius-components by eclipse-sirius.

the class IncrementalLayoutEngine method updateBorderNodeLabel.

private void updateBorderNodeLabel(Optional<IDiagramEvent> optionalDiagramElementEvent, List<BorderNodesOnSide> borderNodesPerSideList) {
    for (BorderNodesOnSide borderNodesOnSide : borderNodesPerSideList) {
        RectangleSide side = borderNodesOnSide.getSide();
        List<NodeLayoutData> borderNodes = borderNodesOnSide.getBorderNodes();
        for (NodeLayoutData borderNodeLayoutData : borderNodes) {
            this.borderNodeLabelPositionProvider.updateLabelPosition(optionalDiagramElementEvent, side, borderNodeLayoutData);
        }
    }
}
Also used : RectangleSide(org.eclipse.sirius.components.diagrams.layout.incremental.utils.RectangleSide) NodeLayoutData(org.eclipse.sirius.components.diagrams.layout.incremental.data.NodeLayoutData)

Aggregations

NodeLayoutData (org.eclipse.sirius.components.diagrams.layout.incremental.data.NodeLayoutData)3 RectangleSide (org.eclipse.sirius.components.diagrams.layout.incremental.utils.RectangleSide)3 Position (org.eclipse.sirius.components.diagrams.Position)2 Size (org.eclipse.sirius.components.diagrams.Size)2 ResizeEvent (org.eclipse.sirius.components.diagrams.events.ResizeEvent)2 BigDecimal (java.math.BigDecimal)1 RoundingMode (java.math.RoundingMode)1 ArrayList (java.util.ArrayList)1 EnumMap (java.util.EnumMap)1 List (java.util.List)1 Objects (java.util.Objects)1 Optional (java.util.Optional)1 Collectors (java.util.stream.Collectors)1 CoreOptions (org.eclipse.elk.core.options.CoreOptions)1 Ratio (org.eclipse.sirius.components.diagrams.Ratio)1 DoublePositionEvent (org.eclipse.sirius.components.diagrams.events.DoublePositionEvent)1 IDiagramEvent (org.eclipse.sirius.components.diagrams.events.IDiagramEvent)1 MoveEvent (org.eclipse.sirius.components.diagrams.events.MoveEvent)1 ISiriusWebLayoutConfigurator (org.eclipse.sirius.components.diagrams.layout.ISiriusWebLayoutConfigurator)1 DiagramLayoutData (org.eclipse.sirius.components.diagrams.layout.incremental.data.DiagramLayoutData)1