-package org.simantics.district.network.ui.adapters;\r
-\r
-import java.awt.geom.Path2D;\r
-\r
-import org.simantics.db.AsyncReadGraph;\r
-import org.simantics.db.ReadGraph;\r
-import org.simantics.db.Resource;\r
-import org.simantics.db.exception.DatabaseException;\r
-import org.simantics.db.procedure.AsyncProcedure;\r
-import org.simantics.diagram.adapter.SyncElementFactory;\r
-import org.simantics.diagram.stubs.DiagramResource;\r
-import org.simantics.diagram.ui.DiagramModelHints;\r
-import org.simantics.district.network.ontology.DistrictNetworkResource;\r
-import org.simantics.district.network.ui.DistrictNetworkEdge;\r
-import org.simantics.g2d.canvas.ICanvasContext;\r
-import org.simantics.g2d.diagram.IDiagram;\r
-import org.simantics.g2d.element.ElementClass;\r
-import org.simantics.g2d.element.IElement;\r
-import org.simantics.g2d.element.handler.impl.StaticObjectAdapter;\r
-\r
-public class DistrictNetworkEdgeElementFactory extends SyncElementFactory {\r
-\r
- public static final ElementClass CLASS = DistrictNetworkEdgeElement.CLASS;\r
- \r
- private DistrictNetworkResource DN;\r
- private DiagramResource DIA;\r
- \r
- public DistrictNetworkEdgeElementFactory(ReadGraph graph) {\r
- this.DN = DistrictNetworkResource.getInstance(graph);\r
- this.DIA = DiagramResource.getInstance(graph);\r
- }\r
- \r
- @Override\r
- public void create(AsyncReadGraph graph, ICanvasContext canvas, IDiagram diagram, Resource elementType, AsyncProcedure<ElementClass> procedure) {\r
- procedure.execute(graph, CLASS.newClassWith(false, new StaticObjectAdapter(elementType)));\r
- }\r
- \r
- @Override\r
- protected Resource getElementClassBaseType(AsyncReadGraph graph) {\r
- return DN.Edge;\r
- }\r
- \r
- @Override\r
- public void load(ReadGraph graph, ICanvasContext canvas, IDiagram diagram, Resource edgeResource, IElement element) throws DatabaseException {\r
- \r
- Resource diagramRuntime = diagram.getHint(DiagramModelHints.KEY_DIAGRAM_RUNTIME_RESOURCE);\r
- \r
- Resource startVertex = graph.getSingleObject(edgeResource, DN.HasStartVertex);\r
- Resource endVertex = graph.getSingleObject(edgeResource, DN.HasEndVertex);\r
- \r
- double[] startCoords = graph.getRelatedValue2(startVertex, DIA.HasLocation);\r
- double[] endCoords = graph.getRelatedValue2(endVertex, DIA.HasLocation);\r
- \r
- Path2D path = new Path2D.Double();\r
- path.moveTo(startCoords[0], startCoords[1]);\r
- path.lineTo(endCoords[0], endCoords[1]);\r
- \r
- DistrictNetworkEdge edge = new DistrictNetworkEdge(path);\r
- \r
- element.setHint(DistrictNetworkEdgeElement.KEY_DN_EDGE, edge);\r
- }\r
-}\r
+package org.simantics.district.network.ui.adapters;
+
+import java.awt.geom.Point2D;
+
+import org.simantics.db.AsyncReadGraph;
+import org.simantics.db.ReadGraph;
+import org.simantics.db.Resource;
+import org.simantics.db.exception.DatabaseException;
+import org.simantics.db.procedure.AsyncProcedure;
+import org.simantics.diagram.adapter.SyncElementFactory;
+import org.simantics.diagram.stubs.DiagramResource;
+import org.simantics.diagram.synchronization.IModifiableSynchronizationContext;
+import org.simantics.diagram.synchronization.SynchronizationHints;
+import org.simantics.diagram.synchronization.graph.GraphSynchronizationHints;
+import org.simantics.diagram.synchronization.graph.layer.GraphLayerManager;
+import org.simantics.district.network.ontology.DistrictNetworkResource;
+import org.simantics.district.network.ui.DistrictNetworkEdge;
+import org.simantics.g2d.canvas.ICanvasContext;
+import org.simantics.g2d.diagram.DiagramHints;
+import org.simantics.g2d.diagram.IDiagram;
+import org.simantics.g2d.element.ElementClass;
+import org.simantics.g2d.element.ElementUtils;
+import org.simantics.g2d.element.IElement;
+import org.simantics.g2d.element.handler.impl.StaticObjectAdapter;
+import org.simantics.g2d.layers.ILayersEditor;
+import org.simantics.maps.MapScalingTransform;
+
+public class DistrictNetworkEdgeElementFactory extends SyncElementFactory {
+
+ public static final ElementClass CLASS = DistrictNetworkEdgeElement.CLASS;
+
+ private DistrictNetworkResource DN;
+ private DiagramResource DIA;
+
+ public DistrictNetworkEdgeElementFactory(ReadGraph graph) {
+ this.DN = DistrictNetworkResource.getInstance(graph);
+ this.DIA = DiagramResource.getInstance(graph);
+ }
+
+ @Override
+ public void create(AsyncReadGraph graph, ICanvasContext canvas, IDiagram diagram, Resource elementType, AsyncProcedure<ElementClass> procedure) {
+ procedure.execute(graph, CLASS.newClassWith(false, new StaticObjectAdapter(elementType)));
+ }
+
+ @Override
+ protected Resource getElementClassBaseType(AsyncReadGraph graph) {
+ return DN.Edge;
+ }
+
+ @Override
+ public void load(ReadGraph graph, ICanvasContext canvas, IDiagram diagram, Resource edgeResource, IElement element) throws DatabaseException {
+ if (!graph.hasStatement(edgeResource))
+ return; // already deleted
+
+ Resource startVertex = graph.getSingleObject(edgeResource, DN.HasStartVertex);
+ Resource endVertex = graph.getSingleObject(edgeResource, DN.HasEndVertex);
+
+ // TODO: Find maybe a better way to apply the scaling
+ double[] startCoords = graph.getRelatedValue2(startVertex, DIA.HasLocation);
+ double[] endCoords = graph.getRelatedValue2(endVertex, DIA.HasLocation);
+ DistrictNetworkEdge edge = new DistrictNetworkEdge(new Point2D.Double(startCoords[0], startCoords[1]), new Point2D.Double(endCoords[0], endCoords[1]));
+
+ Resource mapping = graph.getSingleObject(edgeResource, DistrictNetworkResource.getInstance(graph).HasMapping);
+ element.setHint(DistrictNetworkAdditionalColor.KEY_DN_MAPPING_RESOURCE, mapping);
+
+ element.setHint(DistrictNetworkEdgeElement.KEY_DN_EDGE, edge);
+
+ // set scaling transform
+ ElementUtils.setTransform(element, MapScalingTransform.INSTANCE);
+
+ IModifiableSynchronizationContext context = diagram.getHint(SynchronizationHints.CONTEXT);
+ GraphLayerManager layerManager = context.get(GraphSynchronizationHints.GRAPH_LAYER_MANAGER);
+
+ ILayersEditor layersEditor = diagram.getHint(DiagramHints.KEY_LAYERS_EDITOR);
+ layerManager.loadLayersForElement(graph, layersEditor, element, edgeResource);
+
+ }
+}