X-Git-Url: https://gerrit.simantics.org/r/gitweb?p=simantics%2Fplatform.git;a=blobdiff_plain;f=bundles%2Forg.simantics.g2d%2Fsrc%2Forg%2Fsimantics%2Fg2d%2Fdiagram%2Fparticipant%2FElementPainter.java;h=6e9ff85b1f62c9fb75f4552e346c956cad80113a;hp=ba575c630ffb1aff08024fe8e482d2f5423c8116;hb=48135dcd03588783f9c1b688aaa53cdaacba6ef2;hpb=b75a6bbcc34a3e88f94d04d0389ed0d2e37b6511 diff --git a/bundles/org.simantics.g2d/src/org/simantics/g2d/diagram/participant/ElementPainter.java b/bundles/org.simantics.g2d/src/org/simantics/g2d/diagram/participant/ElementPainter.java index ba575c630..6e9ff85b1 100644 --- a/bundles/org.simantics.g2d/src/org/simantics/g2d/diagram/participant/ElementPainter.java +++ b/bundles/org.simantics.g2d/src/org/simantics/g2d/diagram/participant/ElementPainter.java @@ -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 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 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 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 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 childrenTemp = new ArrayList(); - public void addElement(IElement e, boolean synchronizeSceneGraphNow) { + public void addElement(IDiagram d, IElement e, boolean synchronizeSceneGraphNow, Map 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 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); } }