use of org.eclipse.sirius.components.diagrams.layout.incremental.updater.ContainmentUpdater in project sirius-components by eclipse-sirius.
the class IncrementalLayoutEngine method layout.
public void layout(Optional<IDiagramEvent> optionalDiagramElementEvent, DiagramLayoutData diagram, ISiriusWebLayoutConfigurator layoutConfigurator) {
this.borderNodeLabelPositionProvider = new BorderNodeLabelPositionProvider();
this.nodeLabelPositionProvider = new NodeLabelPositionProvider(layoutConfigurator);
this.edgeLabelPositionProvider = new EdgeLabelPositionProvider(layoutConfigurator);
// first we layout all the nodes
for (NodeLayoutData node : diagram.getChildrenNodes()) {
this.layoutNode(optionalDiagramElementEvent, node, layoutConfigurator);
}
// resolve overlaps due to previous changes
new OverlapsUpdater().update(diagram);
// resize according to the content
new ContainmentUpdater().update(diagram);
// finally we recompute the edges that needs to
for (EdgeLayoutData edge : diagram.getEdges()) {
if (this.hasChanged(edge.getSource()) || this.hasChanged(edge.getTarget()) || !this.isLabelPositioned(edge) || !this.isEdgePositioned(edge)) {
this.layoutEdge(optionalDiagramElementEvent, edge);
}
}
}
use of org.eclipse.sirius.components.diagrams.layout.incremental.updater.ContainmentUpdater 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));
}
}
Aggregations