Attempt to fix broken SI view

This commit is contained in:
BoykoAlex
2019-09-19 18:39:07 -04:00
parent 1963baf20c
commit 61efb95ba8
2 changed files with 42 additions and 1 deletions

View File

@@ -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());
}
}
}
}
}

View File

@@ -17,7 +17,9 @@ public class DiagramServerConfiguration {
public ILayoutEngine layoutEngine(Optional<SprottyLayoutConfigurator> 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);
};
}
}