Search in sources :

Example 1 with Bounds

use of org.eclipse.sirius.components.diagrams.layout.incremental.utils.Bounds 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 2 with Bounds

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

the class EdgeRoutingPointsProvider method getRoutingPoints.

public List<Position> getRoutingPoints(EdgeLayoutData edge) {
    List<Position> positions = List.of();
    if (edge.getSource().equals(edge.getTarget())) {
        positions = this.getRoutingPointsToMyself(edge.getSource().getPosition(), edge.getSource().getSize().getWidth());
    } else {
        Bounds sourceBounds = this.getAbsoluteBounds(edge.getSource());
        Bounds targetBounds = this.getAbsoluteBounds(edge.getTarget());
        this.supportOldDiagramWithExistingEdge(edge);
        Position sourceAbsolutePosition = this.toAbsolutePosition(edge.getSourceAnchorRelativePosition(), sourceBounds);
        Position targetAbsolutePosition = this.toAbsolutePosition(edge.getTargetAnchorRelativePosition(), targetBounds);
        Geometry geometry = new Geometry();
        Optional<Position> optionalSourceIntersection = geometry.getIntersection(targetAbsolutePosition, sourceAbsolutePosition, sourceBounds);
        Optional<Position> optionalTargetIntersection = geometry.getIntersection(sourceAbsolutePosition, targetAbsolutePosition, targetBounds);
        if (optionalSourceIntersection.isPresent() && optionalTargetIntersection.isPresent()) {
            positions = List.of(optionalSourceIntersection.get(), optionalTargetIntersection.get());
        }
    }
    return positions;
}
Also used : Geometry(org.eclipse.sirius.components.diagrams.layout.incremental.utils.Geometry) Position(org.eclipse.sirius.components.diagrams.Position) Bounds(org.eclipse.sirius.components.diagrams.layout.incremental.utils.Bounds)

Example 3 with Bounds

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

the class IncrementalLayoutEngine method layoutNode.

private void layoutNode(Optional<IDiagramEvent> optionalDiagramElementEvent, NodeLayoutData node, ISiriusWebLayoutConfigurator layoutConfigurator) {
    Bounds initialNodeBounds = Bounds.newBounds().position(node.getPosition()).size(node.getSize()).build();
    // first layout child nodes
    for (NodeLayoutData childNode : node.getChildrenNodes()) {
        this.layoutNode(optionalDiagramElementEvent, childNode, layoutConfigurator);
    }
    // compute the node size according to what has been done in the previous steps
    Size size = this.nodeSizeProvider.getSize(optionalDiagramElementEvent, node, layoutConfigurator);
    if (!this.getRoundedSize(size).equals(this.getRoundedSize(node.getSize()))) {
        node.setSize(size);
        node.setChanged(true);
    }
    // recompute the node position
    Position position = this.nodePositionProvider.getPosition(optionalDiagramElementEvent, node);
    if (!position.equals(node.getPosition())) {
        node.setPosition(position);
        node.setChanged(true);
        node.setPinned(true);
    }
    // resolve overlaps due to previous changes
    new OverlapsUpdater().update(node);
    // resize / change position according to the content
    new ContainmentUpdater().update(node);
    // update the border node once the current node bounds are updated
    Bounds newBounds = Bounds.newBounds().position(node.getPosition()).size(node.getSize()).build();
    List<BorderNodesOnSide> borderNodesOnSide = this.layoutBorderNodes(optionalDiagramElementEvent, node.getBorderNodes(), initialNodeBounds, newBounds, layoutConfigurator);
    // recompute the label
    if (node.getLabel() != null) {
        node.getLabel().setPosition(this.nodeLabelPositionProvider.getPosition(node, node.getLabel(), borderNodesOnSide));
    }
}
Also used : ContainmentUpdater(org.eclipse.sirius.components.diagrams.layout.incremental.updater.ContainmentUpdater) Position(org.eclipse.sirius.components.diagrams.Position) Size(org.eclipse.sirius.components.diagrams.Size) Bounds(org.eclipse.sirius.components.diagrams.layout.incremental.utils.Bounds) OverlapsUpdater(org.eclipse.sirius.components.diagrams.layout.incremental.updater.OverlapsUpdater) NodeLayoutData(org.eclipse.sirius.components.diagrams.layout.incremental.data.NodeLayoutData)

Aggregations

Position (org.eclipse.sirius.components.diagrams.Position)3 Bounds (org.eclipse.sirius.components.diagrams.layout.incremental.utils.Bounds)3 Size (org.eclipse.sirius.components.diagrams.Size)2 NodeLayoutData (org.eclipse.sirius.components.diagrams.layout.incremental.data.NodeLayoutData)2 ContainmentUpdater (org.eclipse.sirius.components.diagrams.layout.incremental.updater.ContainmentUpdater)2 OverlapsUpdater (org.eclipse.sirius.components.diagrams.layout.incremental.updater.OverlapsUpdater)2 Geometry (org.eclipse.sirius.components.diagrams.layout.incremental.utils.Geometry)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