import org.simantics.databoard.Bindings;
import org.simantics.db.ReadGraph;
import org.simantics.db.Resource;
+import org.simantics.db.VirtualGraph;
import org.simantics.db.common.ResourceArray;
import org.simantics.db.common.primitiverequest.PossibleAdapter;
import org.simantics.db.exception.DatabaseException;
import org.simantics.db.exception.NoSingleResultException;
import org.simantics.db.exception.ServiceException;
import org.simantics.db.management.ISessionContext;
+import org.simantics.db.procedure.Listener;
import org.simantics.db.request.Read;
+import org.simantics.db.service.VirtualGraphSupport;
import org.simantics.diagram.adapter.DefaultConnectionClassFactory;
import org.simantics.diagram.adapter.FlagClassFactory;
import org.simantics.diagram.adapter.GraphToDiagramSynchronizer;
import org.simantics.diagram.handler.DefaultCopyPasteStrategy;
import org.simantics.diagram.handler.DeleteHandler;
import org.simantics.diagram.handler.SimpleElementTransformHandler;
+import org.simantics.diagram.participant.ConnectionCrossingsParticipant;
import org.simantics.diagram.query.DiagramRequests;
import org.simantics.diagram.runtime.RuntimeDiagramManager;
import org.simantics.diagram.stubs.DiagramResource;
import org.simantics.utils.page.PageOrientation;
import org.simantics.utils.threads.AWTThread;
import org.simantics.utils.threads.IThreadWorkQueue;
+import org.simantics.utils.threads.ThreadUtils;
import org.simantics.utils.ui.ErrorLogger;
ctx.add( new Selection() );
ctx.add( new DiagramParticipant() );
ctx.add( new ElementPainter(true) );
+ ctx.add( new ConnectionCrossingsParticipant(resource));
//ctx.add( new ElementHeartbeater() );
ctx.add( new ZOrderHandler() );
if (unlock)
ctx.setLocked(false);
}
+
+ public static class DiagramDescListener implements Listener<DiagramDesc> {
+ ICanvasContext ctx;
+ public DiagramDescListener(ICanvasContext ctx) {
+ this.ctx = ctx;
+ }
+ @Override
+ public void execute(DiagramDesc result) {
+ if (result != null && ctx != null) {
+ ThreadUtils.asyncExec(ctx.getThreadAccess(), () -> {
+ if (ctx != null) {
+ setDiagramDesc(ctx, result);
+ }
+ });
+ }
+ }
+
+ @Override
+ public void exception(Throwable t) {
+ ErrorLogger.defaultLogError(t);
+ }
+
+ @Override
+ public boolean isDisposed() {
+ return ctx == null;
+ }
+
+ protected void setDiagramDesc(ICanvasContext ctx, DiagramDesc diagramDesc) {
+ IHintContext hints = ctx.getDefaultHintContext();
+ hints.setHint(Hints.KEY_PAGE_DESC, diagramDesc.getPageDesc());
+ hints.setHint(Hints.KEY_DISPLAY_PAGE, diagramDesc.isPageBordersVisible());
+ hints.setHint(Hints.KEY_DISPLAY_MARGINS, diagramDesc.isMarginsVisible());
+ }
+
+ public void dispose() {
+ ctx = null;
+ }
+ }
+ DiagramDescListener diagramDescListener;
+
protected void loadPageSettings(ICanvasContext ctx, Resource diagramResource) {
try {
DiagramDesc diagramDesc = Simantics.getSession().syncRequest(DiagramRequests.getDiagramDesc(diagramResource));
if (diagramDesc != null)
setDiagramDesc(ctx, diagramDesc);
+
+ diagramDescListener = new DiagramDescListener(ctx);
+ // Create a listener to react to page setting changes.
+ Simantics.getSession().asyncRequest(DiagramRequests.getDiagramDesc(diagramResource), diagramDescListener);
} catch (DatabaseException e) {
ErrorLogger.defaultLogError(e);
}
protected void setDiagramDesc(ICanvasContext ctx, DiagramDesc diagramDesc) {
IHintContext hints = ctx.getDefaultHintContext();
hints.setHint(Hints.KEY_PAGE_DESC, diagramDesc.getPageDesc());
- //hints.setHint(Hints.KEY_DISPLAY_PAGE, diagramDesc.isPageBordersVisible());
+ hints.setHint(Hints.KEY_DISPLAY_PAGE, diagramDesc.isPageBordersVisible());
hints.setHint(Hints.KEY_DISPLAY_MARGINS, diagramDesc.isMarginsVisible());
}
*/
private G2DSceneGraph initializeSceneGraph(G2DSceneGraph sg, String modelURI, String RVI, String view) {
IThreadWorkQueue thread = AWTThread.getThreadAccess();
- ctx = new CanvasContext(thread, sg); // By giving the scene graph instance as parameter, we can use external serializer
+ ICanvasContext ctx = new CanvasContext(thread, sg); // By giving the scene graph instance as parameter, we can use external serializer
return initializeSceneGraph(ctx, sg, modelURI, RVI, view);
}
* @return
*/
private G2DSceneGraph initializeSceneGraph(ICanvasContext context, G2DSceneGraph sg, String modelURI, String RVI, String view) {
- this.ctx = (CanvasContext) context;
+ if (this.ctx != null)
+ throw new RuntimeException("Cannot initialize scenegraph twice");
+ this.ctx = (CanvasContext) context;
this.view = view;
if(view != null) {
//System.out.println("using layer '"+view+"'");
fillInitialDiagramHints(initialHints);
final RuntimeDiagramManager runtimeDiagramManager = RuntimeDiagramManager.create(Simantics.getSession(), resource, modelURI, RVI);
+ VirtualGraphSupport support = Simantics.getSession().getService(VirtualGraphSupport.class);
synchronizer = Simantics.getSession().syncRequest(new Read<GraphToDiagramSynchronizer>() {
@Override
if(val != null && navigation == null) { // Set only if navigation has not been set manually
navigation = val;
}
- GraphToDiagramSynchronizer sync = new GraphToDiagramSynchronizer(graph, ctx,createElementClassProvider(graph));
+ VirtualGraph virtualGraph = support.getGraph(graph, resource);
+ GraphToDiagramSynchronizer sync;
+ if (virtualGraph != null) {
+ sync = new GraphToDiagramSynchronizer(graph, ctx,createElementClassProvider(graph), virtualGraph);
+ } else {
+ sync = new GraphToDiagramSynchronizer(graph, ctx,createElementClassProvider(graph));
+ }
sync.set(ModelingSynchronizationHints.MODELING_RESOURCE, ModelingResources.getInstance(graph));
diagram = sync.loadDiagram(new NullProgressMonitor(), graph, null, resource, runtimeDiagramManager.getRuntimeDiagram(), structuralPath, initialHints); // FIXME
@Override
public void dispose() {
+ if (diagramDescListener != null) {
+ diagramDescListener.dispose();
+ diagramDescListener = null;
+ }
if(ctx != null) {
if (ownsContext)
ctx.dispose();