Attempt to fix broken SI view
This commit is contained in:
@@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
};
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user