From 61efb95ba80c255ebef52db08794ab855566175e Mon Sep 17 00:00:00 2001 From: BoykoAlex Date: Thu, 19 Sep 2019 18:39:07 -0400 Subject: [PATCH] Attempt to fix broken SI view --- .../scan/DefaultDiagramServerManager.java | 39 +++++++++++++++++++ .../scan/DiagramServerConfiguration.java | 4 +- 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/headless-services/commons/commons-sprotty/src/main/java/org/springframework/ide/vscode/commons/sprotty/scan/DefaultDiagramServerManager.java b/headless-services/commons/commons-sprotty/src/main/java/org/springframework/ide/vscode/commons/sprotty/scan/DefaultDiagramServerManager.java index af3c708ae..5cb21c5f8 100644 --- a/headless-services/commons/commons-sprotty/src/main/java/org/springframework/ide/vscode/commons/sprotty/scan/DefaultDiagramServerManager.java +++ b/headless-services/commons/commons-sprotty/src/main/java/org/springframework/ide/vscode/commons/sprotty/scan/DefaultDiagramServerManager.java @@ -6,12 +6,23 @@ import java.util.function.Consumer; import org.eclipse.sprotty.Action; import org.eclipse.sprotty.ActionMessage; +import org.eclipse.sprotty.Alignable; +import org.eclipse.sprotty.BoundsAware; +import org.eclipse.sprotty.ComputedBoundsAction; +import org.eclipse.sprotty.ComputedBoundsApplicator; import org.eclipse.sprotty.DefaultDiagramServer; +import org.eclipse.sprotty.Dimension; +import org.eclipse.sprotty.ElementAndAlignment; +import org.eclipse.sprotty.ElementAndBounds; import org.eclipse.sprotty.IDiagramServer; import org.eclipse.sprotty.ILayoutEngine; import org.eclipse.sprotty.IPopupModelFactory; +import org.eclipse.sprotty.Point; import org.eclipse.sprotty.RequestModelAction; import org.eclipse.sprotty.SGraph; +import org.eclipse.sprotty.SModelElement; +import org.eclipse.sprotty.SModelIndex; +import org.eclipse.sprotty.SModelRoot; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -54,6 +65,7 @@ public class DefaultDiagramServerManager implements DiagramServerManager { diagramServer.setRemoteEndpoint(this::sendMessageToRemoteEndpoint); diagramServer.setLayoutEngine(layoutEngine); diagramServer.setPopupModelFactory(popups.orElse(null)); + diagramServer.setComputedBoundsApplicator(new CorrectedComputedBoundsApplicator()); return diagramServer; }); } catch (ExecutionException e) { @@ -87,4 +99,31 @@ public class DefaultDiagramServerManager implements DiagramServerManager { server.accept(message); } } + + private static class CorrectedComputedBoundsApplicator extends ComputedBoundsApplicator { + + /** + * Apply the computed bounds from the given action to the model. + */ + public void applyBounds(SModelRoot root, ComputedBoundsAction action) { + SModelIndex index = new SModelIndex(root); + for (ElementAndBounds b : action.getBounds()) { + SModelElement element = index.get(b.getElementId()); + if (element instanceof BoundsAware) { + BoundsAware bae = (BoundsAware) element; + if (b.getNewPosition() != null) + bae.setPosition(new Point(b.getNewPosition().getX(), b.getNewPosition().getY())); + if (b.getNewSize() != null) + bae.setSize(new Dimension(b.getNewSize().getWidth(), b.getNewSize().getHeight())); + } + } + for (ElementAndAlignment a: action.getAlignments()) { + SModelElement element = index.get(a.getElementId()); + if (element instanceof Alignable) { + Alignable alignable = (Alignable) element; + alignable.setAlignment(a.getNewAlignment()); + } + } + } + } } diff --git a/headless-services/commons/commons-sprotty/src/main/java/org/springframework/ide/vscode/commons/sprotty/scan/DiagramServerConfiguration.java b/headless-services/commons/commons-sprotty/src/main/java/org/springframework/ide/vscode/commons/sprotty/scan/DiagramServerConfiguration.java index 678e47bf5..8f17ab751 100644 --- a/headless-services/commons/commons-sprotty/src/main/java/org/springframework/ide/vscode/commons/sprotty/scan/DiagramServerConfiguration.java +++ b/headless-services/commons/commons-sprotty/src/main/java/org/springframework/ide/vscode/commons/sprotty/scan/DiagramServerConfiguration.java @@ -17,7 +17,9 @@ public class DiagramServerConfiguration { public ILayoutEngine layoutEngine(Optional configurator) { ElkLayoutEngine.initialize(new LayeredMetaDataProvider()); final ElkLayoutEngine engine = new ElkLayoutEngine(); - return (root) -> engine.layout((SGraph)root, configurator.orElse(null)); + return (root, action) -> { + engine.layout((SGraph)root, configurator.orElse(null), action); + }; } }