]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.g2d/src/org/simantics/g2d/diagram/participant/ElementPainter.java
Performance and resource consumption optimization for G2D picking
[simantics/platform.git] / bundles / org.simantics.g2d / src / org / simantics / g2d / diagram / participant / ElementPainter.java
index ba575c630ffb1aff08024fe8e482d2f5423c8116..6e9ff85b1f62c9fb75f4552e346c956cad80113a 100644 (file)
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2007, 2010 Association for Decentralized Information Management
+ * Copyright (c) 2007, 2018 Association for Decentralized Information Management
  * in Industry THTH ry.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
@@ -8,6 +8,7 @@
  *
  * Contributors:
  *     VTT Technical Research Centre of Finland - initial API and implementation
+ *     Semantum Oy - GitLab issue #66
  *******************************************************************************/
 package org.simantics.g2d.diagram.participant;
 
@@ -141,6 +142,7 @@ public class ElementPainter extends AbstractDiagramParticipant implements Compos
     }
 
     private static final boolean DEBUG                  = false;
+    private static final boolean NODE_TO_ELEMENT_MAPPING = true;
 
     public static final int      ELEMENT_PAINT_PRIORITY = 10;
 
@@ -198,8 +200,9 @@ public class ElementPainter extends AbstractDiagramParticipant implements Compos
             return;
 
         if (oldValue != null) {
+            Map<INode, IElement> nodeToElementMap = oldValue.removeHint(DiagramHints.NODE_TO_ELEMENT_MAP);
             for (IElement e : oldValue.getElements()) {
-                removeElement(e);
+                removeElement(oldValue, e, nodeToElementMap);
             }
 
             oldValue.removeCompositionListener(this);
@@ -217,8 +220,13 @@ public class ElementPainter extends AbstractDiagramParticipant implements Compos
         }
 
         if (newValue != null) {
+            diagram.removeHint(DiagramHints.NODE_TO_ELEMENT_MAP);
+            Map<INode, IElement> nodeElementMap = NODE_TO_ELEMENT_MAPPING ? new HashMap<>() : null;
+            if (nodeElementMap != null)
+                diagram.setHint(DiagramHints.NODE_TO_ELEMENT_MAP, nodeElementMap);
+
             for (IElement e : newValue.getElements()) {
-                addElement(e, false);
+                addElement(newValue, e, false, nodeElementMap);
             }
 
             newValue.addCompositionListener(this);
@@ -242,7 +250,8 @@ public class ElementPainter extends AbstractDiagramParticipant implements Compos
     public void initSG(G2DParentNode parent) {
         diagramParent = parent.addNode("elements_"+Node.IDCOUNTER, UnboundedNode.class);
         diagramParent.setZIndex(ELEMENT_PAINT_PRIORITY);
-        elementParent = diagramParent.addNode("spatialRoot", RTreeNode.class);
+        elementParent = diagramParent.addNode(SceneGraphConstants.SPATIAL_ROOT_NODE_NAME, RTreeNode.class);
+        elementParent.setLookupId(SceneGraphConstants.SPATIAL_ROOT_NODE_ID);
         elementParent.setZIndex(0);
     }
 
@@ -499,10 +508,11 @@ public class ElementPainter extends AbstractDiagramParticipant implements Compos
         if (DEBUG)
             System.out.println("EP.onElementAdded(" + d + ", " + e + ")");
 
+        Map<INode, IElement> nodeElementMap = diagram.getHint(DiagramHints.NODE_TO_ELEMENT_MAP);
         if (inDiagramTransaction()) {
-            addElement(e, false);
+            addElement(d, e, false, nodeElementMap);
         } else {
-            addElement(e, true);
+            addElement(d, e, true, nodeElementMap);
         }
     }
     @Override
@@ -510,7 +520,7 @@ public class ElementPainter extends AbstractDiagramParticipant implements Compos
         if (DEBUG)
             System.out.println("EP.onElementRemoved(" + d + ", " + e + ")");
 
-        removeElement(e);
+        removeElement(d, e, diagram.getHint(DiagramHints.NODE_TO_ELEMENT_MAP));
     }
 
     @Override
@@ -518,17 +528,19 @@ public class ElementPainter extends AbstractDiagramParticipant implements Compos
         if (DEBUG)
             System.out.println("EP.elementChildrenChanged: " + event);
 
+        Map<INode, IElement> nodeElementMap = diagram.getHint(DiagramHints.NODE_TO_ELEMENT_MAP);
+
         for (IElement removed : event.removed) {
-            removeElement(removed);
+            removeElement(diagram, removed, nodeElementMap);
         }
         for (IElement added : event.added) {
-            addElement(added, false);
+            addElement(diagram, added, false, nodeElementMap);
         }
     }
 
     private final List<IElement> childrenTemp = new ArrayList<IElement>();
 
-    public void addElement(IElement e, boolean synchronizeSceneGraphNow) {
+    public void addElement(IDiagram d, IElement e, boolean synchronizeSceneGraphNow, Map<INode, IElement> nodeElementMap) {
         if (DEBUG)
             System.out.println("EP.addElement(now=" + synchronizeSceneGraphNow + ", " + e + ")");
 
@@ -563,6 +575,8 @@ public class ElementPainter extends AbstractDiagramParticipant implements Compos
                 holder.setTransferableProvider(new ElementTransferableProvider(getContext(), e));
                 e.setHint(sgKey, holder);
                 holder.setZIndex(parentNode.getNodeCount() + 1);
+                if (nodeElementMap != null)
+                    nodeElementMap.put(holder, e);
             }
 
         } else {
@@ -575,6 +589,8 @@ public class ElementPainter extends AbstractDiagramParticipant implements Compos
                 holder.setTransferableProvider(new ElementTransferableProvider(getContext(), e));
                 e.setHint(sgKey, holder);
                 holder.setZIndex(parentNode.getNodeCount() + 1);
+                if (nodeElementMap != null)
+                    nodeElementMap.put(holder, e);
             }
 
         }
@@ -587,7 +603,7 @@ public class ElementPainter extends AbstractDiagramParticipant implements Compos
             children.getChildren(e, childrenTemp);
             //System.out.println("children: " + childrenTemp);
             for (IElement child : childrenTemp) {
-                addElement(child, false);
+                addElement(d, child, false, nodeElementMap);
             }
             childrenTemp.clear();
         }
@@ -598,7 +614,7 @@ public class ElementPainter extends AbstractDiagramParticipant implements Compos
         //setTreeDirty();
     }
 
-    protected void removeElement(IElement e) {
+    protected void removeElement(IDiagram d, IElement e, Map<INode, IElement> nodeElementMap) {
         if (DEBUG)
             System.out.println("EP.removeElement(" + e + ")");
 
@@ -624,6 +640,8 @@ public class ElementPainter extends AbstractDiagramParticipant implements Compos
             Node n = e.removeHint(sgKey);
             if (n != null) {
                 n.remove();
+                if (nodeElementMap != null)
+                    nodeElementMap.remove(n);
             }
         }