]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.diagram/src/org/simantics/diagram/synchronization/graph/layer/GraphLayerManager.java
Bringing layers back to life
[simantics/platform.git] / bundles / org.simantics.diagram / src / org / simantics / diagram / synchronization / graph / layer / GraphLayerManager.java
index e92ce1b41da779df96b1d08359241a7b959fa6b1..79e79a2174033c7cf67fe3b2a21f4eac294b0bdd 100644 (file)
@@ -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<String, GraphLayer> newLayers = new ConcurrentHashMap<String, GraphLayer>();
-
+        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<LayersSpec>(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<GraphLayer> 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<LayersSpec>() {
 
-        } else {
+            @Override
+            public void execute(LayersSpec layersSpec) {
+                ConcurrentMap<String, GraphLayer> newLayers = new ConcurrentHashMap<String, GraphLayer>();
+                Set<ILayer> visibleLayers = new HashSet<>();
+                Set<ILayer> 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<IElement> 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<ILayer> allLayers = layersEditor.getLayers();
+        Set<ILayer> allLayers = layers2.getLayers();
         if (allLayers.isEmpty()) {
             e.setHint(ElementHints.KEY_VISIBLE_LAYERS, visible);
             e.setHint(ElementHints.KEY_FOCUS_LAYERS, focusable);