X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=bundles%2Forg.simantics.diagram%2Fsrc%2Forg%2Fsimantics%2Fdiagram%2Fsynchronization%2Fgraph%2Flayer%2FGraphLayerManager.java;h=79e79a2174033c7cf67fe3b2a21f4eac294b0bdd;hb=052c827e209230bd428e74180caed3620280a31f;hp=e92ce1b41da779df96b1d08359241a7b959fa6b1;hpb=560d8aa2e37cb6b0249aec6d7e96e67d5a64c59f;p=simantics%2Fplatform.git diff --git a/bundles/org.simantics.diagram/src/org/simantics/diagram/synchronization/graph/layer/GraphLayerManager.java b/bundles/org.simantics.diagram/src/org/simantics/diagram/synchronization/graph/layer/GraphLayerManager.java index e92ce1b41..79e79a217 100644 --- a/bundles/org.simantics.diagram/src/org/simantics/diagram/synchronization/graph/layer/GraphLayerManager.java +++ b/bundles/org.simantics.diagram/src/org/simantics/diagram/synchronization/graph/layer/GraphLayerManager.java @@ -25,10 +25,12 @@ import org.simantics.db.ReadGraph; import org.simantics.db.Resource; import org.simantics.db.WriteGraph; import org.simantics.db.common.procedure.adapter.AsyncProcedureAdapter; +import org.simantics.db.common.request.ResourceRead; import org.simantics.db.exception.CancelTransactionException; import org.simantics.db.exception.DatabaseException; import org.simantics.db.exception.ServiceException; import org.simantics.db.procedure.AsyncProcedure; +import org.simantics.db.procedure.Listener; import org.simantics.diagram.stubs.DiagramResource; import org.simantics.diagram.synchronization.IModificationQueue; import org.simantics.diagram.synchronization.ModificationAdapter; @@ -131,6 +133,8 @@ public class GraphLayerManager { */ LayerListener layerListener = new LayerListener(); + boolean disposed = false; + public GraphLayerManager(ReadGraph graph, IModificationQueue modificationQueue, Resource diagram) { this.modificationQueue = modificationQueue; this.diagram = diagram; @@ -145,6 +149,7 @@ public class GraphLayerManager { } } layers.clear(); + disposed = true; } Resource getDiagramResource() { @@ -295,69 +300,96 @@ public class GraphLayerManager { public ILayersEditor loadLayers(IDiagram diagram, ReadGraph g, Resource diagramResource) throws DatabaseException { - SimpleLayers result = new SimpleLayers(); - ConcurrentMap newLayers = new ConcurrentHashMap(); - + layerEditor = new SimpleLayers(); + layerEditor.addLayerEditorListener(layerListener); + String[] fixed = diagram.getHint(DiagramHints.KEY_FIXED_LAYERS); - if (fixed != null) { -// for (String name : fixed) { -// SimpleLayer l = new SimpleLayer(name); -// result.addLayer(l); -// result.activate(l); -// } + g.syncRequest(new ResourceRead(diagramResource) { - // We need to put GraphLayer to newLayers so... - for (Resource layer : g.getObjects(diagramResource, dia.HasLayer)) { - IGraphLayerUtil layerUtil = g.adapt(g.getSingleObject(layer, Layer0.getInstance(g).InstanceOf), IGraphLayerUtil.class); - - GraphLayer gl = layerUtil.loadLayer(g, layer); - for (String name : fixed) { - if (name.equals(gl.getName())) { - ILayer l = gl.getILayer(); - newLayers.put(gl.getName(), gl); - result.addLayer(l); - result.activate(l); - } + @Override + public LayersSpec perform(ReadGraph g) throws DatabaseException { + Collection gls = new ArrayList<>(); + for (Resource layer : g.getObjects(resource, dia.HasLayer)) { + IGraphLayerUtil layerUtil = g.adapt(g.getSingleObject(layer, Layer0.getInstance(g).InstanceOf), IGraphLayerUtil.class); + GraphLayer gl = layerUtil.loadLayer(g, layer); + gls.add(gl); } + return new LayersSpec(gls); } + + }, new Listener() { - } else { + @Override + public void execute(LayersSpec layersSpec) { + ConcurrentMap newLayers = new ConcurrentHashMap(); + Set visibleLayers = new HashSet<>(); + Set allLayers = new HashSet<>(); + + if (fixed != null) { + for (GraphLayer gl : layersSpec.getGraphLayers()) { + for (String name : fixed) { + if (name.equals(gl.getName())) { + ILayer l = gl.getILayer(); + newLayers.put(gl.getName(), gl); + allLayers.add(l); + visibleLayers.add(l); + } + } + } + + } else { - if (DEBUG_LAYERS) - System.out.println("Loading layers"); + if (DEBUG_LAYERS) + System.out.println("Loading layers"); + + for (GraphLayer gl : layersSpec.getGraphLayers()) { + ILayer l = gl.getILayer(); - for (Resource layer : g.getObjects(diagramResource, dia.HasLayer)) { - IGraphLayerUtil layerUtil = g.adapt(g.getSingleObject(layer, Layer0.getInstance(g).InstanceOf), IGraphLayerUtil.class); - GraphLayer gl = layerUtil.loadLayer(g, layer); - ILayer l = gl.getILayer(); + newLayers.put(gl.getName(), gl); + + if (DEBUG_LAYERS) + System.out.println(" Loaded " + (gl.isActive() ? "active" : "inactive") + " layer '" + gl.getName() + "'"); - newLayers.put(gl.getName(), gl); - result.addLayer(l); + if (l instanceof IEditableLayer) + ((IEditableLayer) l).addLayerListener(layerListener); - Boolean active = g.getPossibleRelatedValue(layer, dia.IsActive); - if (active == null) - active = Boolean.FALSE; + allLayers.add(l); + if (gl.isActive()) + visibleLayers.add(l); + + } + } + // Show all and focus all by default if there are no layers + + + if (newLayers.isEmpty()) { + layerEditor.setIgnoreVisibilitySettings(true); + layerEditor.setIgnoreFocusSettings(true); + } if (DEBUG_LAYERS) - System.out.println(" Loaded " + (active ? "active" : "inactive") + " layer '" + gl.getName() + "'"); + System.out.println("Loaded " + newLayers.size() + " layers"); - if (l instanceof IEditableLayer) - ((IEditableLayer) l).addLayerListener(layerListener); - if (active) - result.activate(l); + layerEditor.update(allLayers, visibleLayers); + + layers = newLayers; } - if (DEBUG_LAYERS) - System.out.println("Loaded " + newLayers.size() + " layers"); + @Override + public void exception(Throwable t) { + t.printStackTrace(); + } - } + @Override + public boolean isDisposed() { + return disposed; + } + + }); - this.layers = newLayers; - this.layerEditor = result; - this.layerEditor.addListener(layerListener); - return result; + return layerEditor; } public void loadLayersForElement(ReadGraph graph, ILayersEditor layersEditor, IElement e, Resource element) @@ -406,7 +438,7 @@ public class GraphLayerManager { * many times depending on how many errors occur during layer loading * @throws DatabaseException */ - public void loadLayersForElement(AsyncReadGraph graph, ILayersEditor layersEditor, final IElement e, + public void loadLayersForElement(AsyncReadGraph graph, ILayers layers2, final IElement e, Resource element, final AsyncProcedure callback) { if (DEBUG_LAYERS) System.out.println("Loading layers for element " + element + " - " + e); @@ -417,7 +449,7 @@ public class GraphLayerManager { // NOTE: must not set layer hints into element until the layer sets have // been properly loaded. - Set allLayers = layersEditor.getLayers(); + Set allLayers = layers2.getLayers(); if (allLayers.isEmpty()) { e.setHint(ElementHints.KEY_VISIBLE_LAYERS, visible); e.setHint(ElementHints.KEY_FOCUS_LAYERS, focusable);