1 package org.simantics.district.network.ui.adapters;
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;
29 public class DistrictDiagramClassAdapter extends DiagramClassAdapter {
31 static final DiagramClass INSTANCE = DiagramClass.compile(
32 new PickContextImpl(true),
33 LockingTransactionContext.INSTANCE,
34 ConnectionValidator.INSTANCE,
35 DistrictDiagramSubstituteElementClass.INSTANCE
39 public void adapt(AsyncReadGraph g, Resource source, Resource r, AsyncProcedure<DiagramClass> procedure) {
40 procedure.execute(g, INSTANCE);
43 static class DistrictDiagramElementLayerListenerImpl implements ElementLayerListener {
45 private static final long serialVersionUID = 7723435000661141433L;
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());
53 changeTag(e, gl.getVisible(), visible);
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());
63 changeTag(e, gl.getFocusable(), focusable);
67 void changeTag(IElement e, Resource tag, boolean set) {
68 Object object = e.getHint(ElementHints.KEY_OBJECT);
70 if (object instanceof Resource)
71 tagged = (Resource) object;
77 Simantics.getSession().asyncRequest(new WriteRequest() {
80 public void perform(WriteGraph graph) throws DatabaseException {
81 DiagramGraphUtil.tag(graph, tagged, tag, set);
87 static class DistrictDiagramSubstituteElementClass implements SubstituteElementClass {
89 static final SubstituteElementClass INSTANCE = new DistrictDiagramSubstituteElementClass();
91 final ElementLayerListener LAYER_LISTENER = new DistrictDiagramElementLayerListenerImpl();
94 public ElementClass substitute(IDiagram d, ElementClass ec) {
95 return ec.newClassWith(false, LAYER_LISTENER);