diff --git a/org.eclipse.emf.cdo.threedee.ui/src/org/eclipse/emf/cdo/threedee/ui/ThreeDeeView.java b/org.eclipse.emf.cdo.threedee.ui/src/org/eclipse/emf/cdo/threedee/ui/ThreeDeeView.java
index 5d8c843..4b0ec1d 100644
--- a/org.eclipse.emf.cdo.threedee.ui/src/org/eclipse/emf/cdo/threedee/ui/ThreeDeeView.java
+++ b/org.eclipse.emf.cdo.threedee.ui/src/org/eclipse/emf/cdo/threedee/ui/ThreeDeeView.java
@@ -94,7 +94,7 @@
Element rootElement = session.getRootElement();
if (rootElement != null/* && !elementGroups.containsKey(rootElement) */)
{
- world.addElement(rootElement);
+ world.addElement(null, rootElement);
}
}
@@ -171,14 +171,14 @@
@Override
protected void onAdded(IContainer<Object> container, Object object)
{
- addElement(object);
+ addElement(container, object);
world.layout();
}
@Override
protected void onRemoved(IContainer<Object> container, Object object)
{
- removeElement(object);
+ removeElement(container, object);
world.layout();
}
@@ -195,22 +195,22 @@
}
}
- private void addElement(Object object)
+ private void addElement(Object container, Object object)
{
if (object instanceof Element)
{
Element element = (Element)object;
- world.addElement(element);
+ world.addElement(container, element);
for (Element child : element.getElements())
{
- addElement(child);
+ addElement(element, child);
}
}
EventUtil.addListener(object, this);
}
- private void removeElement(Object object)
+ private void removeElement(Object container, Object object)
{
EventUtil.removeListener(object, this);
if (object instanceof Element)
@@ -218,12 +218,12 @@
Element element = (Element)object;
for (Element child : element.getElements())
{
- removeElement(child);
+ removeElement(element, child);
}
try
{
- world.removeElement(element);
+ world.removeElement(container, element);
}
catch (Exception ex)
{
diff --git a/org.eclipse.emf.cdo.threedee.ui/src/org/eclipse/emf/cdo/threedee/ui/ThreeDeeWorld.java b/org.eclipse.emf.cdo.threedee.ui/src/org/eclipse/emf/cdo/threedee/ui/ThreeDeeWorld.java
index 49ce1a8..52c8cf2 100644
--- a/org.eclipse.emf.cdo.threedee.ui/src/org/eclipse/emf/cdo/threedee/ui/ThreeDeeWorld.java
+++ b/org.eclipse.emf.cdo.threedee.ui/src/org/eclipse/emf/cdo/threedee/ui/ThreeDeeWorld.java
@@ -79,6 +79,7 @@
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
@@ -101,6 +102,55 @@
private Set<ElementDescriptor> disabledDescriptors = Collections.emptySet();
+ class ElementGroups
+ {
+ private Map<Pair<Element, Element>, ElementGroup> map = new HashMap<Pair<Element, Element>, ElementGroup>();
+
+ public Collection<ElementGroup> values()
+ {
+ return map.values();
+ }
+
+ public boolean containsKey(Element element)
+ {
+ Pair<Element, Element> pair = makePair(element);
+ return map.containsKey(pair);
+ }
+
+ public ElementGroup get(Object object)
+ {
+ if (object instanceof Element)
+ {
+ Element element = (Element)object;
+ Pair<Element, Element> pair = makePair(element);
+ return map.get(pair);
+ }
+
+ return null;
+ }
+
+ public ElementGroup put(Element element, ElementGroup elementGroup)
+ {
+ Pair<Element, Element> pair = makePair(element);
+ return map.put(pair, elementGroup);
+ }
+
+ public ElementGroup remove(Element element)
+ {
+ Pair<Element, Element> pair = makePair(element);
+ return map.remove(pair);
+ }
+
+ private Pair<Element, Element> makePair(Element element)
+ {
+ Element container = element.getContainer();
+ Pair<Element, Element> pair = new Pair<Element, Element>(element, container);
+ return pair;
+ }
+ }
+
+ // private ElementGroups elementGroups = new ElementGroups();
+
private Map<Element, ElementGroup> elementGroups = new HashMap<Element, ElementGroup>();
private Map<Element, Map<Element, ReferenceShape>> referenceShapes = new HashMap<Element, Map<Element, ReferenceShape>>();
@@ -323,28 +373,35 @@
return root;
}
- public void addElement(Element element)
+ public void addElement(Object container, Element element)
{
- if (!elementGroups.containsKey(element))
+ if (elementGroups.containsKey(element))
+ {
+ removeElement(element.getContainer(), element);
+ }
{
ElementGroup group = createElementGroup(element);
- ElementProvider provider = element.getProvider();
- Map<Integer, Boolean> references = element.getReferences();
- createChildren(group, provider, references);
+ // TODO check if the createChildren call is still needed
+ // ElementProvider provider = element.getProvider();
+ // Map<Integer, Boolean> references = element.getReferences();
+ // createChildren(group, provider, references);
ElementGroup containerGroup = getContainerElementGroup(element);
addNode(group, containerGroup);
}
}
- public void removeElement(Element element)
+ public void removeElement(Object container, Element element)
{
- ElementGroup containmentGroup = elementGroups.remove(element);
- if (containmentGroup != null)
+ if (container == element.getContainer())
{
- containmentGroup.detach();
- clearReferenceNodes(element);
+ ElementGroup containmentGroup = elementGroups.remove(element);
+ if (containmentGroup != null)
+ {
+ containmentGroup.detach();
+ clearReferenceNodes(element);
+ }
}
}