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=db02034e8115e76ebc27431e18b59ec9335bcd8d;hb=0bc1e827754b507fc0d7dee0390550253ab88378;hp=5b6e0f63a3d2b12925ca2e1b2d0e590b3883c5ab;hpb=0ae2b770234dfc3cbb18bd38f324125cf0faca07;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 5b6e0f63a..db02034e8 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,13 @@ 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.layer0.util.RemoverUtil; 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; @@ -37,7 +40,6 @@ import org.simantics.g2d.diagram.DiagramHints; import org.simantics.g2d.diagram.IDiagram; import org.simantics.g2d.element.ElementHints; import org.simantics.g2d.element.IElement; -import org.simantics.g2d.element.handler.ElementLayers; import org.simantics.g2d.layers.IEditableLayer; import org.simantics.g2d.layers.IEditableLayer.ILayerListener; import org.simantics.g2d.layers.IEditableLayer.LayerChangeEvent; @@ -45,7 +47,6 @@ import org.simantics.g2d.layers.ILayer; import org.simantics.g2d.layers.ILayers; import org.simantics.g2d.layers.ILayersEditor; import org.simantics.g2d.layers.ILayersEditor.ILayersEditorListener; -import org.simantics.g2d.layers.SimpleLayer; import org.simantics.g2d.layers.SimpleLayers; import org.simantics.layer0.Layer0; @@ -132,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; @@ -146,6 +149,7 @@ public class GraphLayerManager { } } layers.clear(); + disposed = true; } Resource getDiagramResource() { @@ -175,15 +179,17 @@ public class GraphLayerManager { @Override public void perform(WriteGraph g) throws Exception { String newName = layer.getName(); - for (Resource l : g.getObjects(diagram, dia.HasLayer)) { - String name = g.getRelatedValue(l, l0.HasName); + for (Resource layer : g.getObjects(diagram, dia.HasLayer)) { + String name = g.getRelatedValue(layer, l0.HasName); if (newName.equals(name)) { return; } } - GraphLayer l = new GraphLayerUtil(g).createLayer(newName, false); - g.claim(diagram, dia.HasLayer, l.getLayer()); - layers.put(newName, l); + + IGraphLayerUtil util = g.adapt(DiagramResource.getInstance(g).Layer, IGraphLayerUtil.class); + GraphLayer layer = util.createLayer(g, newName, false); + g.claim(diagram, dia.HasLayer, layer.getLayer()); + layers.put(newName, layer); } } @@ -211,10 +217,6 @@ public class GraphLayerManager { if (removedName.equals(name)) { g.denyStatement(diagram, dia.HasLayer, l); deleteLayer(g, l); - - // NOTE: leave the layer tags intact, remove them gradually - // by checking the validity of all layer tags during element - // writeback. layers.remove(name); return; } @@ -222,7 +224,7 @@ public class GraphLayerManager { } void deleteLayer(WriteGraph g, Resource layer) throws DatabaseException { - g.deny(layer); + RemoverUtil.remove(g, layer); } } @@ -292,73 +294,98 @@ public class GraphLayerManager { } } - GraphLayer loadLayer(ReadGraph g, Resource layer) throws DatabaseException { - String name = g.getRelatedValue(layer, l0.HasName); - Resource visible = g.getSingleObject(layer, dia.HasVisibleTag); - Resource focusable = g.getSingleObject(layer, dia.HasFocusableTag); - return new GraphLayer(name, layer, visible, focusable); - } - 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); -// } - - // We need to put GraphLayer to newLayers so... - for (Resource layer : g.getObjects(diagramResource, dia.HasLayer)) { - GraphLayer gl = loadLayer(g, layer); - for (String name : fixed) { - if (name.equals(gl.getName())) { - SimpleLayer l = new SimpleLayer(gl.getName()); - newLayers.put(gl.getName(), gl); - result.addLayer(l); - result.activate(l); - } + + g.syncRequest(new ResourceRead(diagramResource) { + + @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() { + + @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 { - } 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)) { - GraphLayer gl = loadLayer(g, layer); - SimpleLayer l = new SimpleLayer(gl.getName()); + newLayers.put(gl.getName(), gl); - newLayers.put(gl.getName(), gl); - result.addLayer(l); + if (DEBUG_LAYERS) + System.out.println(" Loaded " + (gl.isActive() ? "active" : "inactive") + " layer '" + gl.getName() + "'"); + + 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"); - 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) @@ -407,7 +434,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); @@ -418,7 +445,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); @@ -434,8 +461,10 @@ public class GraphLayerManager { graph.forHasStatement(element, gl.getVisible(), element, new AsyncProcedureAdapter() { @Override public void execute(AsyncReadGraph graph, Boolean result) { - synchronized (visible) { - visible.add(l); + if (result) { + synchronized (visible) { + visible.add(l); + } } if (DEBUG_LAYERS) System.out.println(" Visible on layer '" + gl.getName() + "'"); @@ -453,8 +482,10 @@ public class GraphLayerManager { graph.forHasStatement(element, gl.getFocusable(), element, new AsyncProcedureAdapter() { @Override public void execute(AsyncReadGraph graph, Boolean result) { - synchronized (focusable) { - focusable.add(l); + if (result) { + synchronized (focusable) { + focusable.add(l); + } } if (DEBUG_LAYERS) System.out.println(" Focusable on layer '" + gl.getName() + "'"); @@ -482,27 +513,6 @@ public class GraphLayerManager { } } - void putElementOnVisibleLayers(IDiagram diagram, IElement element) { - // Make the new element visible and focusable on all currently - // active layers. - ILayers diagramLayers = diagram.getHint(DiagramHints.KEY_LAYERS); - if (diagramLayers != null) { - element.setHint(ElementHints.KEY_VISIBLE_LAYERS, new HashSet()); - element.setHint(ElementHints.KEY_FOCUS_LAYERS, new HashSet()); - Set visibleLayers = diagramLayers.getVisibleLayers(); - - if (DEBUG_LAYERS) - System.out.println("Marking element visible and focusable only on visible layers: " + visibleLayers); - - for (ElementLayers elementLayers : element.getElementClass().getItemsByClass(ElementLayers.class)) { - for (ILayer layer : visibleLayers) { - elementLayers.setVisibility(element, layer, true); - elementLayers.setFocusability(element, layer, true); - } - } - } - } - public void putElementOnVisibleLayers(IDiagram diagram, WriteGraph g, Resource element) throws DatabaseException { // Make the new element visible and focusable on all currently // active layers. @@ -517,8 +527,7 @@ public class GraphLayerManager { for (ILayer layer : visibleLayers) { GraphLayer gl = layers.get(layer.getName()); if (gl != null) { - DiagramGraphUtil.tag(g, element, gl.getVisible(), true); - DiagramGraphUtil.tag(g, element, gl.getFocusable(), true); + gl.forEachTag(tag -> DiagramGraphUtil.tag(g, element, tag, true)); } } }