]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.diagram/src/org/simantics/diagram/profile/StyleBase.java
Preliminary implementation to update only changed profile entries
[simantics/platform.git] / bundles / org.simantics.diagram / src / org / simantics / diagram / profile / StyleBase.java
index 9978076c641abd89d207c86610f664c609fc1b0b..fee1e8546d7e96e07bf13a21f53b98f26afac6c4 100644 (file)
@@ -27,8 +27,10 @@ import org.simantics.db.layer0.variable.Variable;
 import org.simantics.db.procedure.Listener;
 import org.simantics.db.request.Read;
 import org.simantics.diagram.stubs.DiagramResource;
+import org.simantics.g2d.canvas.Hints;
 import org.simantics.g2d.canvas.ICanvasContext;
 import org.simantics.g2d.diagram.IDiagram;
+import org.simantics.g2d.diagram.handler.DataElementMap;
 import org.simantics.g2d.element.IElement;
 import org.simantics.scenegraph.INode;
 import org.simantics.scenegraph.profile.DataNodeMap;
@@ -67,6 +69,7 @@ import org.simantics.utils.datastructures.Pair;
 public abstract class StyleBase<Result> implements Style {
 
     private Object identity;
+    private double priority;
 
     public StyleBase(Object identity) {
         this.identity = identity;
@@ -81,6 +84,14 @@ public abstract class StyleBase<Result> implements Style {
         return (T)identity;
     }
 
+    public void setPriority(double priority) {
+        this.priority = priority;
+    }
+    
+    public double getPriority() {
+        return priority;
+    }
+    
     @Override
     public int hashCode() {
         final int prime = 31;
@@ -207,7 +218,7 @@ public abstract class StyleBase<Result> implements Style {
             StyleBaseData.getInstance().removeValue(new Tuple3(this, runtimeDiagram, object));
         else
             StyleBaseData.getInstance().putValue(new Tuple3(this, runtimeDiagram, object), result);
-        observer.update();
+        observer.update(this, object);
     }
 
     /**
@@ -232,7 +243,7 @@ public abstract class StyleBase<Result> implements Style {
         
         final INode node = map.getNode(item);
         if (node == null) {
-            evaluationContext.update();
+            evaluationContext.update(this, item);
             // TODO: continue or return?
             return;
         }
@@ -241,7 +252,6 @@ public abstract class StyleBase<Result> implements Style {
             System.out.println(StyleBase.this + ": applying style for item " + item + " and element " + node + " with result " + value);
 
         applyStyleForNode(evaluationContext, node, value);
-        
     }
 
     /**
@@ -426,7 +436,8 @@ public abstract class StyleBase<Result> implements Style {
                 cleanupItems(observer, diagram, listener.getItems().toArray());
                 diagram = null;
             }
-            observer.update();
+            
+            //observer.update(); TODO: Check if this is required!
         }
 
     }
@@ -436,7 +447,6 @@ public abstract class StyleBase<Result> implements Style {
      */
     @Override
     public final void apply(Resource entry, Group group, final EvaluationContext evaluationContext) {
-
         ICanvasContext context = evaluationContext.getConstant(ProfileKeys.CANVAS);
         
         assert context.getThreadAccess().currentThreadAccess();
@@ -456,14 +466,41 @@ public abstract class StyleBase<Result> implements Style {
         StyleBaseData data = StyleBaseData.getInstance();
         
         data.applyRemovals(evaluationContext, this);
-        
+        IDiagram diagram = evaluationContext.getConstant(ProfileKeys.DIAGRAM);
+        assert diagram != null;
+        DataElementMap emap = diagram.getDiagramClass().getSingleItem(DataElementMap.class);
+      
         for (Object item : listener.getItems()) {
             Result value = data.getValue(new Tuple3(this, evaluationContext.getResource(), item));
             applyStyleForItem(evaluationContext, map, item, value);
+
+            IElement element = emap.getElement(diagram, item);
+            if (element != null)
+                element.setHint(Hints.KEY_DIRTY, Hints.VALUE_SG_DIRTY);
         }
         
     }
 
+    @Override
+    public final void apply2(Object item, final EvaluationContext evaluationContext) {
+        final DataNodeMap map = evaluationContext.getConstant(ProfileKeys.NODE_MAP);
+        
+        StyleBaseData data = StyleBaseData.getInstance();
+        
+        data.applyRemovals(evaluationContext, this);
+
+        Result value = data.getValue(new Tuple3(this, evaluationContext.getResource(), item));
+        applyStyleForItem(evaluationContext, map, item, value);
+        
+        IDiagram diagram = evaluationContext.getConstant(ProfileKeys.DIAGRAM);
+        assert diagram != null;
+        DataElementMap emap = diagram.getDiagramClass().getSingleItem(DataElementMap.class);
+        IElement element = emap.getElement(diagram, item);
+        if (element != null)
+            element.setHint(Hints.KEY_DIRTY, Hints.VALUE_SG_DIRTY);
+    }
+    
     /**
      * This is ran when this profile entry gets deactivated after being first
      * active. It allows cleaning up scene graph left-overs for the listened set
@@ -493,8 +530,16 @@ public abstract class StyleBase<Result> implements Style {
                 if (DebugPolicy.DEBUG_PROFILE_STYLE_ACTIVATION)
                     System.out.println(this + ".cleanupItems(" + evaluationContext + ", " + diagram + ", " + Arrays.toString(items));
 
+                IDiagram diagram = evaluationContext.getConstant(ProfileKeys.DIAGRAM);
+                assert diagram != null;
+                DataElementMap emap = diagram.getDiagramClass().getSingleItem(DataElementMap.class);
+
                 for (Object item : items) {
                     cleanupStyleForItem(evaluationContext, map, item);
+
+                    IElement element = emap.getElement(diagram, item);
+                    if (element != null)
+                        element.setHint(Hints.KEY_DIRTY, Hints.VALUE_SG_DIRTY);
                 }
             }
         });