]> gerrit.simantics Code Review - simantics/district.git/blob - org.simantics.district.network.ui/src/org/simantics/district/network/ui/adapters/DistrictDiagramClassAdapter.java
Optimization of district scene graph node rendering
[simantics/district.git] / org.simantics.district.network.ui / src / org / simantics / district / network / ui / adapters / DistrictDiagramClassAdapter.java
1 package org.simantics.district.network.ui.adapters;
2
3 import org.simantics.Simantics;
4 import org.simantics.db.AsyncReadGraph;
5 import org.simantics.db.Resource;
6 import org.simantics.db.WriteGraph;
7 import org.simantics.db.common.request.WriteRequest;
8 import org.simantics.db.exception.DatabaseException;
9 import org.simantics.db.procedure.AsyncProcedure;
10 import org.simantics.diagram.adapter.DiagramClassAdapter;
11 import org.simantics.diagram.synchronization.IModifiableSynchronizationContext;
12 import org.simantics.diagram.synchronization.SynchronizationHints;
13 import org.simantics.diagram.synchronization.graph.DiagramGraphUtil;
14 import org.simantics.diagram.synchronization.graph.GraphSynchronizationHints;
15 import org.simantics.diagram.synchronization.graph.layer.GraphLayer;
16 import org.simantics.diagram.synchronization.graph.layer.GraphLayerManager;
17 import org.simantics.g2d.diagram.DiagramClass;
18 import org.simantics.g2d.diagram.IDiagram;
19 import org.simantics.g2d.diagram.handler.SubstituteElementClass;
20 import org.simantics.g2d.diagram.handler.impl.LockingTransactionContext;
21 import org.simantics.g2d.diagram.handler.impl.PickContextImpl;
22 import org.simantics.g2d.element.ElementClass;
23 import org.simantics.g2d.element.ElementHints;
24 import org.simantics.g2d.element.IElement;
25 import org.simantics.g2d.element.handler.ElementLayerListener;
26 import org.simantics.g2d.elementclass.connection.ConnectionValidator;
27 import org.simantics.g2d.layers.ILayer;
28
29 public class DistrictDiagramClassAdapter extends DiagramClassAdapter {
30
31     static final DiagramClass INSTANCE = DiagramClass.compile(
32             new PickContextImpl(true),
33             LockingTransactionContext.INSTANCE,
34             ConnectionValidator.INSTANCE,
35             DistrictDiagramSubstituteElementClass.INSTANCE
36     );
37
38     @Override
39     public void adapt(AsyncReadGraph g, Resource source, Resource r, AsyncProcedure<DiagramClass> procedure) {
40         procedure.execute(g, INSTANCE);
41     }
42
43     static class DistrictDiagramElementLayerListenerImpl implements ElementLayerListener {
44
45         private static final long serialVersionUID = 7723435000661141433L;
46
47         @Override
48         public void visibilityChanged(IElement e, ILayer layer, boolean visible) {
49             IModifiableSynchronizationContext context = e.getDiagram().getHint(SynchronizationHints.CONTEXT);
50             GraphLayerManager layerManager = context.get(GraphSynchronizationHints.GRAPH_LAYER_MANAGER);
51             GraphLayer gl = layerManager.getGraphLayer(layer.getName());
52             if (gl != null) {
53                 changeTag(e, gl.getVisible(), visible);
54             }
55         }
56
57         @Override
58         public void focusabilityChanged(IElement e, ILayer layer, boolean focusable) {
59             IModifiableSynchronizationContext context = e.getDiagram().getHint(SynchronizationHints.CONTEXT);
60             GraphLayerManager layerManager = context.get(GraphSynchronizationHints.GRAPH_LAYER_MANAGER);
61             GraphLayer gl = layerManager.getGraphLayer(layer.getName());
62             if (gl != null) {
63                 changeTag(e, gl.getFocusable(), focusable);
64             }
65         }
66
67         void changeTag(IElement e, Resource tag, boolean set) {
68             Object object = e.getHint(ElementHints.KEY_OBJECT);
69             Resource tagged;
70             if (object instanceof Resource)
71                 tagged = (Resource) object;
72             else
73                 tagged = null;
74             if (tagged == null)
75                 return;
76             
77             Simantics.getSession().asyncRequest(new WriteRequest() {
78                 
79                 @Override
80                 public void perform(WriteGraph graph) throws DatabaseException {
81                     DiagramGraphUtil.tag(graph, tagged, tag, set);
82                 }
83             });
84         }
85     }
86
87     static class DistrictDiagramSubstituteElementClass implements SubstituteElementClass {
88
89         static final SubstituteElementClass INSTANCE = new DistrictDiagramSubstituteElementClass();
90
91         final ElementLayerListener LAYER_LISTENER = new DistrictDiagramElementLayerListenerImpl();
92
93         @Override
94         public ElementClass substitute(IDiagram d, ElementClass ec) {
95             return ec.newClassWith(false, LAYER_LISTENER);
96         }
97
98     }
99 }