diff --git a/org.eclipse.emf.cdo.threedee.common/src/org/eclipse/emf/cdo/threedee/common/Element.java b/org.eclipse.emf.cdo.threedee.common/src/org/eclipse/emf/cdo/threedee/common/Element.java
index 19d5953..7ee4a96 100644
--- a/org.eclipse.emf.cdo.threedee.common/src/org/eclipse/emf/cdo/threedee/common/Element.java
+++ b/org.eclipse.emf.cdo.threedee.common/src/org/eclipse/emf/cdo/threedee/common/Element.java
@@ -133,6 +133,11 @@
     return containerID;

   }

 

+  public Element getContainer()

+  {

+    return provider.getElement(containerID);

+  }

+

   public ElementDescriptor getDescriptor()

   {

     return descriptor;

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 bad9973..9a55afd 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
@@ -94,7 +94,7 @@
 

   private Map<Element, Map<Element, ReferenceShape>> referenceShapes = new HashMap<Element, Map<Element, ReferenceShape>>();

 

-  private boolean production = true;

+  private boolean production = false;

 

   private Composite composite;

 

diff --git a/org.eclipse.emf.cdo.threedee/src/org/eclipse/emf/cdo/threedee/DescriptorView.java b/org.eclipse.emf.cdo.threedee/src/org/eclipse/emf/cdo/threedee/DescriptorView.java
index 74ed207..05b5060 100644
--- a/org.eclipse.emf.cdo.threedee/src/org/eclipse/emf/cdo/threedee/DescriptorView.java
+++ b/org.eclipse.emf.cdo.threedee/src/org/eclipse/emf/cdo/threedee/DescriptorView.java
@@ -15,6 +15,7 @@
 import org.eclipse.emf.cdo.threedee.common.ElementDescriptor;
 import org.eclipse.emf.cdo.threedee.common.ElementDescriptor.Registry;
 
+import org.eclipse.net4j.util.ObjectUtil;
 import org.eclipse.net4j.util.event.Event;
 import org.eclipse.net4j.util.event.INotifier;
 import org.eclipse.net4j.util.event.ValueNotifier;
@@ -40,6 +41,7 @@
 import java.awt.Color;
 import java.util.HashSet;
 import java.util.Iterator;
+import java.util.List;
 import java.util.Set;
 
 /**
@@ -90,7 +92,7 @@
     Set<ElementDescriptor> result = new HashSet<ElementDescriptor>();
     for (ElementDescriptor descriptor : INPUT.values())
     {
-      if (getViewer().getChecked(descriptor) == checked)
+      if (viewer.getChecked(descriptor) == checked)
       {
         result.add(descriptor);
       }
@@ -103,15 +105,15 @@
   {
     try
     {
-      getViewer().removeCheckStateListener(checkStateListener);
+      viewer.removeCheckStateListener(checkStateListener);
       for (ElementDescriptor descriptor : INPUT.values())
       {
-        getViewer().setChecked(descriptor, checked);
+        viewer.setChecked(descriptor, checked);
       }
     }
     finally
     {
-      getViewer().addCheckStateListener(checkStateListener);
+      viewer.addCheckStateListener(checkStateListener);
     }
 
     notifier.fireCheckStateChangedEvent();
@@ -120,16 +122,17 @@
   @Override
   public void createPartControl(Composite parent)
   {
-    setViewer(new CheckboxTreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL));
-    getViewer().setContentProvider(new ViewContentProvider());
-    getViewer().setLabelProvider(new LabelProvider(getViewer().getControl().getDisplay()));
-    getViewer().setSorter(new NameSorter());
-    getViewer().setInput(INPUT);
-    getViewer().addCheckStateListener(checkStateListener);
+    viewer = new CheckboxTreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
+    viewer.setContentProvider(new ViewContentProvider());
+    viewer.setLabelProvider(new LabelProvider(viewer.getControl().getDisplay()));
+    viewer.setSorter(new NameSorter());
+    viewer.setInput(INPUT);
+    viewer.addCheckStateListener(checkStateListener);
 
     setAllChecked(true);
     INSTANCE.setValue(this);
 
+    getSite().setSelectionProvider(viewer);
     getSite().getPage().addSelectionListener(new ISelectionListener()
     {
       public void selectionChanged(IWorkbenchPart part, final ISelection selection)
@@ -160,8 +163,14 @@
           {
             public void run()
             {
-              ElementDescriptor[] array = descriptors.toArray(new ElementDescriptor[descriptors.size()]);
-              getViewer().setSelection(new StructuredSelection(array), true);
+              @SuppressWarnings("unchecked")
+              List<Object> list = ((StructuredSelection)viewer.getSelection()).toList();
+              Set<Object> old = new HashSet<Object>(list);
+              if (!ObjectUtil.equals(old, descriptors))
+              {
+                ElementDescriptor[] array = descriptors.toArray(new ElementDescriptor[descriptors.size()]);
+                viewer.setSelection(new StructuredSelection(array), true);
+              }
             }
           });
         }
@@ -172,7 +181,7 @@
   @Override
   public void setFocus()
   {
-    getViewer().getControl().setFocus();
+    viewer.getControl().setFocus();
   }
 
   @Override
@@ -182,16 +191,6 @@
     super.dispose();
   }
 
-  public void setViewer(CheckboxTreeViewer viewer)
-  {
-    this.viewer = viewer;
-  }
-
-  public CheckboxTreeViewer getViewer()
-  {
-    return viewer;
-  }
-
   /**
    * @author Eike Stepper
    */
@@ -358,13 +357,13 @@
       {
         try
         {
-          getViewer().removeCheckStateListener(checkStateListener);
+          viewer.removeCheckStateListener(checkStateListener);
           ElementDescriptor descriptor = (ElementDescriptor)event.getElement();
-          getViewer().setSubtreeChecked(descriptor, event.getChecked());
+          viewer.setSubtreeChecked(descriptor, event.getChecked());
         }
         finally
         {
-          getViewer().addCheckStateListener(checkStateListener);
+          viewer.addCheckStateListener(checkStateListener);
         }
       }
 
diff --git a/org.eclipse.emf.cdo.threedee/src/org/eclipse/emf/cdo/threedee/ElementView.java b/org.eclipse.emf.cdo.threedee/src/org/eclipse/emf/cdo/threedee/ElementView.java
index fe460bd..076a43d 100644
--- a/org.eclipse.emf.cdo.threedee/src/org/eclipse/emf/cdo/threedee/ElementView.java
+++ b/org.eclipse.emf.cdo.threedee/src/org/eclipse/emf/cdo/threedee/ElementView.java
@@ -1,137 +1,445 @@
-/**

- * Copyright (c) 2004 - 2011 Eike Stepper (Berlin, Germany) and others.

- * All rights reserved. This program and the accompanying materials

- * are made available under the terms of the Eclipse Public License v1.0

- * which accompanies this distribution, and is available at

- * http://www.eclipse.org/legal/epl-v10.html

- *

- * Contributors:

- *    Eike Stepper - initial API and implementation

- */

-package org.eclipse.emf.cdo.threedee;

-

-import org.eclipse.emf.cdo.threedee.bundle.OM;

-import org.eclipse.emf.cdo.threedee.common.Element;

-import org.eclipse.emf.cdo.threedee.common.ElementDescriptor;

-

-import org.eclipse.net4j.util.container.IContainer;

-import org.eclipse.net4j.util.event.ValueNotifier;

-import org.eclipse.net4j.util.ui.UIUtil;

-import org.eclipse.net4j.util.ui.views.ContainerView;

-

-import org.eclipse.jface.resource.ImageDescriptor;

-import org.eclipse.jface.viewers.ISelection;

-import org.eclipse.jface.viewers.IStructuredSelection;

-import org.eclipse.jface.viewers.StructuredSelection;

-import org.eclipse.swt.graphics.Image;

-import org.eclipse.swt.widgets.Display;

-import org.eclipse.ui.ISelectionListener;

-import org.eclipse.ui.IWorkbenchPart;

-

-import java.awt.Color;

-import java.util.HashSet;

-import java.util.Iterator;

-import java.util.Set;

-

-/**

- * @author Eike Stepper

- */

-public class ElementView extends ContainerView

-{

-  public static final String ID = "org.eclipse.emf.cdo.threedee.ElementView";

-

-  public static final ValueNotifier<ElementView> INSTANCE = new ValueNotifier<ElementView>(ID);

-

-  private Image agentIcon;

-

-  public ElementView()

-  {

-    ImageDescriptor descriptor = OM.Activator.INSTANCE.loadImageDescriptor("icons/agent.gif");

-    agentIcon = descriptor.createImage(UIUtil.getDisplay());

-  }

-

-  @Override

-  protected IContainer<?> getContainer()

-  {

-    return Frontend.INSTANCE;

-  }

-

-  @Override

-  protected Image getElementImage(Object object)

-  {

-    if (object instanceof Element)

-    {

-      Element element = (Element)object;

-      Color color = element.getDescriptor().getColor().getValue();

-      return ColorIcons.get(color);

-    }

-

-    if (object instanceof Session)

-    {

-      return agentIcon;

-    }

-

-    return super.getElementImage(object);

-  }

-

-  @Override

-  protected void createdUI()

-  {

-    INSTANCE.setValue(this);

-

-    getSite().getPage().addSelectionListener(new ISelectionListener()

-    {

-      public void selectionChanged(IWorkbenchPart part, final ISelection selection)

-      {

-        final Set<Element> elements = new HashSet<Element>();

-        if (selection instanceof IStructuredSelection)

-        {

-          IStructuredSelection ssel = (IStructuredSelection)selection;

-          for (Iterator<?> it = ssel.iterator(); it.hasNext();)

-          {

-            Object object = it.next();

-            if (object instanceof ElementDescriptor)

-            {

-              ElementDescriptor descriptor = (ElementDescriptor)object;

-              for (Session session : Frontend.INSTANCE.getElements())

-              {

-                for (Element element : session.getAllElements())

-                {

-                  if (element.getDescriptor() == descriptor)

-                  {

-                    elements.add(element);

-                  }

-                }

-              }

-            }

-            else if (object instanceof Element)

-            {

-              Element element = (Element)object;

-              elements.add(element);

-            }

-          }

-        }

-

-        if (!elements.isEmpty())

-        {

-          Display.getDefault().asyncExec(new Runnable()

-          {

-            public void run()

-            {

-              Element[] array = elements.toArray(new Element[elements.size()]);

-              getViewer().setSelection(new StructuredSelection(array), true);

-            }

-          });

-        }

-      }

-    });

-  }

-

-  @Override

-  public void dispose()

-  {

-    INSTANCE.setValue(null);

-    agentIcon.dispose();

-    super.dispose();

-  }

-}

+/**
+ * Copyright (c) 2004 - 2011 Eike Stepper (Berlin, Germany) and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Martin Fluegge - initial API and implementation
+ */
+package org.eclipse.emf.cdo.threedee;
+
+import org.eclipse.emf.cdo.threedee.bundle.OM;
+import org.eclipse.emf.cdo.threedee.common.Element;
+import org.eclipse.emf.cdo.threedee.common.ElementDescriptor;
+
+import org.eclipse.net4j.util.ObjectUtil;
+import org.eclipse.net4j.util.container.ContainerEventAdapter;
+import org.eclipse.net4j.util.container.IContainer;
+import org.eclipse.net4j.util.event.Event;
+import org.eclipse.net4j.util.event.EventUtil;
+import org.eclipse.net4j.util.event.IListener;
+import org.eclipse.net4j.util.event.INotifier;
+import org.eclipse.net4j.util.event.ValueNotifier;
+import org.eclipse.net4j.util.ui.UIUtil;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.viewers.CheckStateChangedEvent;
+import org.eclipse.jface.viewers.CheckboxTreeViewer;
+import org.eclipse.jface.viewers.ICheckStateListener;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerSorter;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.ISelectionListener;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.part.ViewPart;
+
+import java.awt.Color;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * @author Eike Stepper
+ */
+public class ElementView extends ViewPart
+{
+  public static final String ID = "org.eclipse.emf.cdo.threedee.ElementView";
+
+  public static final ValueNotifier<ElementView> INSTANCE = new ValueNotifier<ElementView>(ID);
+
+  private Notifier notifier = new Notifier();
+
+  private ICheckStateListener checkStateListener = new CheckStateListener();
+
+  private IListener frontendListener = new FrontendListener();
+
+  private boolean subTreeChecking = true;
+
+  private CheckboxTreeViewer viewer;
+
+  public ElementView()
+  {
+  }
+
+  public INotifier getNotifier()
+  {
+    return notifier;
+  }
+
+  public boolean isSubTreeChecking()
+  {
+    return subTreeChecking;
+  }
+
+  public void setSubTreeChecking(boolean subTreeChecking)
+  {
+    this.subTreeChecking = subTreeChecking;
+  }
+
+  public Set<Element> getAllChecked()
+  {
+    return getAllChecked(true);
+  }
+
+  public Set<Element> getAllChecked(boolean checked)
+  {
+    Set<Element> result = new HashSet<Element>();
+    for (Session session : Frontend.INSTANCE.getElements())
+    {
+      for (Element element : session.getAllElements())
+      {
+        if (viewer.getChecked(element) == checked)
+        {
+          result.add(element);
+        }
+      }
+    }
+
+    return result;
+  }
+
+  public void setAllChecked(boolean checked)
+  {
+    try
+    {
+      viewer.removeCheckStateListener(checkStateListener);
+      for (Session session : Frontend.INSTANCE.getElements())
+      {
+        for (Element element : session.getAllElements())
+        {
+          viewer.setChecked(element, checked);
+        }
+      }
+    }
+    finally
+    {
+      viewer.addCheckStateListener(checkStateListener);
+    }
+
+    notifier.fireCheckStateChangedEvent();
+  }
+
+  @Override
+  public void createPartControl(Composite parent)
+  {
+    viewer = new CheckboxTreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
+    viewer.setContentProvider(new ViewContentProvider());
+    viewer.setLabelProvider(new LabelProvider(viewer.getControl().getDisplay()));
+    viewer.setSorter(new NameSorter());
+    viewer.setInput(Frontend.INSTANCE);
+    viewer.addCheckStateListener(checkStateListener);
+
+    setAllChecked(true);
+    INSTANCE.setValue(this);
+
+    Frontend.INSTANCE.addListener(frontendListener);
+
+    getSite().setSelectionProvider(viewer);
+    getSite().getPage().addSelectionListener(new ISelectionListener()
+    {
+      public void selectionChanged(IWorkbenchPart part, final ISelection selection)
+      {
+        final Set<Element> elements = new HashSet<Element>();
+        if (selection instanceof IStructuredSelection)
+        {
+          IStructuredSelection ssel = (IStructuredSelection)selection;
+          for (Iterator<?> it = ssel.iterator(); it.hasNext();)
+          {
+            Object object = it.next();
+            if (object instanceof ElementDescriptor)
+            {
+              ElementDescriptor descriptor = (ElementDescriptor)object;
+              for (Session session : Frontend.INSTANCE.getElements())
+              {
+                for (Element element : session.getAllElements())
+                {
+                  if (element.getDescriptor() == descriptor)
+                  {
+                    elements.add(element);
+                  }
+                }
+              }
+            }
+            else if (object instanceof Element)
+            {
+              Element element = (Element)object;
+              elements.add(element);
+            }
+          }
+        }
+
+        if (!elements.isEmpty())
+        {
+          Display.getDefault().asyncExec(new Runnable()
+          {
+            public void run()
+            {
+              @SuppressWarnings("unchecked")
+              List<Object> list = ((StructuredSelection)viewer.getSelection()).toList();
+              Set<Object> old = new HashSet<Object>(list);
+              if (!ObjectUtil.equals(old, elements))
+              {
+                Element[] array = elements.toArray(new Element[elements.size()]);
+                viewer.setSelection(new StructuredSelection(array), true);
+              }
+            }
+          });
+        }
+      }
+    });
+  }
+
+  @Override
+  public void setFocus()
+  {
+    viewer.getControl().setFocus();
+  }
+
+  @Override
+  public void dispose()
+  {
+    Frontend.INSTANCE.removeListener(new FrontendListener());
+    INSTANCE.setValue(null);
+    super.dispose();
+  }
+
+  /**
+   * @author Eike Stepper
+   */
+  public static final class CheckStateEvent extends Event
+  {
+    private static final long serialVersionUID = 1L;
+
+    public CheckStateEvent(INotifier notifier)
+    {
+      super(notifier);
+    }
+  }
+
+  /**
+   * @author Eike Stepper
+   */
+  private static final class ViewContentProvider implements ITreeContentProvider
+  {
+    public ViewContentProvider()
+    {
+    }
+
+    public void inputChanged(Viewer v, Object oldInput, Object newInput)
+    {
+    }
+
+    public void dispose()
+    {
+    }
+
+    public Object[] getElements(Object object)
+    {
+      return getChildren(object);
+    }
+
+    public Object[] getChildren(Object object)
+    {
+      if (object instanceof IContainer<?>)
+      {
+        IContainer<?> container = (IContainer<?>)object;
+        return container.getElements();
+      }
+
+      return new Object[0];
+    }
+
+    public Object getParent(Object object)
+    {
+      if (object instanceof Element)
+      {
+        Element element = (Element)object;
+        Element container = element.getContainer();
+        if (container == null)
+        {
+          return element.getProvider();
+        }
+
+        return container;
+      }
+
+      if (object instanceof Session)
+      {
+        return Frontend.INSTANCE;
+      }
+
+      return null;
+    }
+
+    public boolean hasChildren(Object object)
+    {
+      Object[] children = getChildren(object);
+      return children != null && children.length != 0;
+    }
+  }
+
+  /**
+   * @author Eike Stepper
+   */
+  private static final class LabelProvider extends org.eclipse.jface.viewers.LabelProvider
+  {
+    private Image agentIcon;
+
+    public LabelProvider(Display display)
+    {
+      ImageDescriptor descriptor = OM.Activator.INSTANCE.loadImageDescriptor("icons/agent.gif");
+      agentIcon = descriptor.createImage(UIUtil.getDisplay());
+    }
+
+    @Override
+    public Image getImage(Object object)
+    {
+      if (object instanceof Element)
+      {
+        Element element = (Element)object;
+        Color color = element.getDescriptor().getColor().getValue();
+        return ColorIcons.get(color);
+      }
+
+      if (object instanceof Session)
+      {
+        return agentIcon;
+      }
+
+      return super.getImage(object);
+    }
+
+    @Override
+    public void dispose()
+    {
+      agentIcon.dispose();
+      super.dispose();
+    }
+  }
+
+  /**
+   * @author Eike Stepper
+   */
+  private static final class NameSorter extends ViewerSorter
+  {
+    public NameSorter()
+    {
+    }
+  }
+
+  /**
+   * @author Eike Stepper
+   */
+  private final class CheckStateListener implements ICheckStateListener
+  {
+    public void checkStateChanged(CheckStateChangedEvent event)
+    {
+      if (subTreeChecking)
+      {
+        try
+        {
+          viewer.removeCheckStateListener(checkStateListener);
+          Element descriptor = (Element)event.getElement();
+          viewer.setSubtreeChecked(descriptor, event.getChecked());
+        }
+        finally
+        {
+          viewer.addCheckStateListener(checkStateListener);
+        }
+      }
+
+      notifier.fireCheckStateChangedEvent();
+    }
+  }
+
+  /**
+   * @author Eike Stepper
+   */
+  private final class Notifier extends org.eclipse.net4j.util.event.Notifier
+  {
+    public void fireCheckStateChangedEvent()
+    {
+      fireEvent(new CheckStateEvent(this));
+    }
+  }
+
+  /**
+   * @author Eike Stepper
+   */
+  private final class FrontendListener extends ContainerEventAdapter<Object>
+  {
+    @Override
+    protected void onAdded(IContainer<Object> container, Object object)
+    {
+      addElement(object);
+      refreshViewer();
+    }
+
+    @Override
+    protected void onRemoved(IContainer<Object> container, Object object)
+    {
+      removeElement(object);
+      refreshViewer();
+    }
+
+    private void refreshViewer()
+    {
+      try
+      {
+        viewer.getControl().getDisplay().asyncExec(new Runnable()
+        {
+          public void run()
+          {
+            try
+            {
+              viewer.refresh();
+            }
+            catch (Exception ignore)
+            {
+            }
+          }
+        });
+      }
+      catch (Exception ignore)
+      {
+      }
+    }
+
+    private void addElement(Object object)
+    {
+      if (object instanceof Element)
+      {
+        Element element = (Element)object;
+        for (Element child : element.getElements())
+        {
+          addElement(child);
+        }
+      }
+
+      EventUtil.addListener(object, this);
+    }
+
+    private void removeElement(Object object)
+    {
+      EventUtil.removeListener(object, this);
+      if (object instanceof Element)
+      {
+        Element element = (Element)object;
+        for (Element child : element.getElements())
+        {
+          removeElement(child);
+        }
+      }
+    }
+  }
+}
diff --git a/org.eclipse.emf.cdo.threedee/src/org/eclipse/emf/cdo/threedee/ElementViewOld.java b/org.eclipse.emf.cdo.threedee/src/org/eclipse/emf/cdo/threedee/ElementViewOld.java
new file mode 100644
index 0000000..66d373f
--- /dev/null
+++ b/org.eclipse.emf.cdo.threedee/src/org/eclipse/emf/cdo/threedee/ElementViewOld.java
@@ -0,0 +1,137 @@
+/**

+ * Copyright (c) 2004 - 2011 Eike Stepper (Berlin, Germany) and others.

+ * All rights reserved. This program and the accompanying materials

+ * are made available under the terms of the Eclipse Public License v1.0

+ * which accompanies this distribution, and is available at

+ * http://www.eclipse.org/legal/epl-v10.html

+ *

+ * Contributors:

+ *    Eike Stepper - initial API and implementation

+ */

+package org.eclipse.emf.cdo.threedee;

+

+import org.eclipse.emf.cdo.threedee.bundle.OM;

+import org.eclipse.emf.cdo.threedee.common.Element;

+import org.eclipse.emf.cdo.threedee.common.ElementDescriptor;

+

+import org.eclipse.net4j.util.container.IContainer;

+import org.eclipse.net4j.util.event.ValueNotifier;

+import org.eclipse.net4j.util.ui.UIUtil;

+import org.eclipse.net4j.util.ui.views.ContainerView;

+

+import org.eclipse.jface.resource.ImageDescriptor;

+import org.eclipse.jface.viewers.ISelection;

+import org.eclipse.jface.viewers.IStructuredSelection;

+import org.eclipse.jface.viewers.StructuredSelection;

+import org.eclipse.swt.graphics.Image;

+import org.eclipse.swt.widgets.Display;

+import org.eclipse.ui.ISelectionListener;

+import org.eclipse.ui.IWorkbenchPart;

+

+import java.awt.Color;

+import java.util.HashSet;

+import java.util.Iterator;

+import java.util.Set;

+

+/**

+ * @author Eike Stepper

+ */

+public class ElementViewOld extends ContainerView

+{

+  public static final String ID = "org.eclipse.emf.cdo.threedee.ElementView";

+

+  public static final ValueNotifier<ElementViewOld> INSTANCE = new ValueNotifier<ElementViewOld>(ID);

+

+  private Image agentIcon;

+

+  public ElementViewOld()

+  {

+    ImageDescriptor descriptor = OM.Activator.INSTANCE.loadImageDescriptor("icons/agent.gif");

+    agentIcon = descriptor.createImage(UIUtil.getDisplay());

+  }

+

+  @Override

+  protected IContainer<?> getContainer()

+  {

+    return Frontend.INSTANCE;

+  }

+

+  @Override

+  protected Image getElementImage(Object object)

+  {

+    if (object instanceof Element)

+    {

+      Element element = (Element)object;

+      Color color = element.getDescriptor().getColor().getValue();

+      return ColorIcons.get(color);

+    }

+

+    if (object instanceof Session)

+    {

+      return agentIcon;

+    }

+

+    return super.getElementImage(object);

+  }

+

+  @Override

+  protected void createdUI()

+  {

+    INSTANCE.setValue(this);

+

+    getSite().getPage().addSelectionListener(new ISelectionListener()

+    {

+      public void selectionChanged(IWorkbenchPart part, final ISelection selection)

+      {

+        final Set<Element> elements = new HashSet<Element>();

+        if (selection instanceof IStructuredSelection)

+        {

+          IStructuredSelection ssel = (IStructuredSelection)selection;

+          for (Iterator<?> it = ssel.iterator(); it.hasNext();)

+          {

+            Object object = it.next();

+            if (object instanceof ElementDescriptor)

+            {

+              ElementDescriptor descriptor = (ElementDescriptor)object;

+              for (Session session : Frontend.INSTANCE.getElements())

+              {

+                for (Element element : session.getAllElements())

+                {

+                  if (element.getDescriptor() == descriptor)

+                  {

+                    elements.add(element);

+                  }

+                }

+              }

+            }

+            else if (object instanceof Element)

+            {

+              Element element = (Element)object;

+              elements.add(element);

+            }

+          }

+        }

+

+        if (!elements.isEmpty())

+        {

+          Display.getDefault().asyncExec(new Runnable()

+          {

+            public void run()

+            {

+              Element[] array = elements.toArray(new Element[elements.size()]);

+              getViewer().setSelection(new StructuredSelection(array), true);

+            }

+          });

+        }

+      }

+    });

+  }

+

+  @Override

+  public void dispose()

+  {

+    INSTANCE.setValue(null);

+    agentIcon.dispose();

+    super.dispose();

+  }

+}