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 04a6b50..59e9801 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
@@ -11,8 +11,8 @@
*/
package org.eclipse.emf.cdo.threedee.ui;
+import org.eclipse.emf.cdo.threedee.AbstractView.CheckStateEvent;
import org.eclipse.emf.cdo.threedee.DescriptorView;
-import org.eclipse.emf.cdo.threedee.DescriptorView.CheckStateEvent;
import org.eclipse.emf.cdo.threedee.Frontend;
import org.eclipse.emf.cdo.threedee.Session;
import org.eclipse.emf.cdo.threedee.common.Element;
diff --git a/org.eclipse.emf.cdo.threedee/icons/synced.gif b/org.eclipse.emf.cdo.threedee/icons/synced.gif
new file mode 100644
index 0000000..870934b
--- /dev/null
+++ b/org.eclipse.emf.cdo.threedee/icons/synced.gif
Binary files differ
diff --git a/org.eclipse.emf.cdo.threedee/src/org/eclipse/emf/cdo/threedee/AbstractView.java b/org.eclipse.emf.cdo.threedee/src/org/eclipse/emf/cdo/threedee/AbstractView.java
new file mode 100644
index 0000000..0ae08ce
--- /dev/null
+++ b/org.eclipse.emf.cdo.threedee/src/org/eclipse/emf/cdo/threedee/AbstractView.java
@@ -0,0 +1,432 @@
+/**
+ * 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.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.jface.viewers.CheckStateChangedEvent;
+import org.eclipse.jface.viewers.CheckboxTreeViewer;
+import org.eclipse.jface.viewers.IBaseLabelProvider;
+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.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Tree;
+import org.eclipse.ui.ISelectionListener;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.part.ViewPart;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * @author Eike Stepper
+ */
+public abstract class AbstractView<CONTENT> extends ViewPart
+{
+ private Notifier notifier = new Notifier();
+
+ private PageSelectionListener pageSelectionListener = new PageSelectionListener();
+
+ private ICheckStateListener checkStateListener = new CheckStateListener();
+
+ private IListener frontendListener = new FrontendListener();
+
+ private boolean subTreeChecking = true;
+
+ private CheckboxTreeViewer viewer;
+
+ public AbstractView()
+ {
+ }
+
+ public INotifier getNotifier()
+ {
+ return notifier;
+ }
+
+ public CheckboxTreeViewer getViewer()
+ {
+ return viewer;
+ }
+
+ public boolean isSubTreeChecking()
+ {
+ return subTreeChecking;
+ }
+
+ public void setSubTreeChecking(boolean subTreeChecking)
+ {
+ this.subTreeChecking = subTreeChecking;
+ }
+
+ public Set<CONTENT> getAllChecked()
+ {
+ return getAllChecked(true);
+ }
+
+ public Set<CONTENT> getAllChecked(boolean checked)
+ {
+ Set<CONTENT> result = new HashSet<CONTENT>();
+ for (CONTENT object : getContents())
+ {
+ if (viewer.getChecked(object) == checked)
+ {
+ result.add(object);
+ }
+ }
+
+ return result;
+ }
+
+ public void setAllChecked(boolean checked)
+ {
+ try
+ {
+ viewer.removeCheckStateListener(checkStateListener);
+ for (CONTENT object : getContents())
+ {
+ viewer.setChecked(object, checked);
+ }
+ }
+ finally
+ {
+ viewer.addCheckStateListener(checkStateListener);
+ }
+
+ notifier.fireCheckStateChangedEvent();
+ }
+
+ @Override
+ public void createPartControl(Composite parent)
+ {
+ ViewContentProvider contentProvider = new ViewContentProvider();
+
+ viewer = new CheckboxTreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
+ viewer.setContentProvider(contentProvider);
+ viewer.setLabelProvider(createLabelProvider(viewer.getControl().getDisplay()));
+ viewer.setSorter(createSorter());
+ viewer.setInput(getInput());
+ viewer.addCheckStateListener(checkStateListener);
+
+ setAllChecked(true);
+
+ Tree tree = viewer.getTree();
+ tree.addSelectionListener(new SubTreeSelectionAdapter(contentProvider, tree));
+
+ Frontend.INSTANCE.addListener(frontendListener);
+
+ getSite().setSelectionProvider(viewer);
+ // getSite().getPage().addSelectionListener(pageSelectionListener);
+
+ setInstance(this);
+ }
+
+ protected ViewerSorter createSorter()
+ {
+ return new NameSorter();
+ }
+
+ @Override
+ public void setFocus()
+ {
+ viewer.getControl().setFocus();
+ }
+
+ @Override
+ public void dispose()
+ {
+ setInstance(null);
+ getSite().getPage().removeSelectionListener(pageSelectionListener);
+ Frontend.INSTANCE.removeListener(frontendListener);
+ super.dispose();
+ }
+
+ public abstract Collection<CONTENT> getContents();
+
+ public abstract Object getInput();
+
+ public abstract Object[] getChildren(Object object);
+
+ public abstract Object getParent(Object object);
+
+ protected abstract IBaseLabelProvider createLabelProvider(Display display);
+
+ protected abstract void handlePageSelectionObject(Object pageSelectionObject, Collection<CONTENT> contents,
+ Set<Object> result);
+
+ protected abstract void setInstance(AbstractView<CONTENT> view);
+
+ /**
+ * @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 final class CheckStateListener implements ICheckStateListener
+ {
+ public void checkStateChanged(CheckStateChangedEvent event)
+ {
+ if (subTreeChecking)
+ {
+ try
+ {
+ viewer.removeCheckStateListener(checkStateListener);
+ viewer.setSubtreeChecked(event.getElement(), event.getChecked());
+ }
+ finally
+ {
+ viewer.addCheckStateListener(checkStateListener);
+ }
+ }
+
+ notifier.fireCheckStateChangedEvent();
+ }
+ }
+
+ /**
+ * @author Eike Stepper
+ */
+ private final class PageSelectionListener implements ISelectionListener
+ {
+ public void selectionChanged(IWorkbenchPart part, final ISelection selection)
+ {
+ if (selection instanceof IStructuredSelection)
+ {
+ IStructuredSelection ssel = (IStructuredSelection)selection;
+
+ final Set<Object> result = new HashSet<Object>();
+ Collection<CONTENT> contents = getContents();
+ for (Iterator<?> it = ssel.iterator(); it.hasNext();)
+ {
+ Object object = it.next();
+ handlePageSelectionObject(object, contents, result);
+ }
+
+ if (!result.isEmpty())
+ {
+ Display.getDefault().syncExec(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, result))
+ {
+ viewer.setSelection(new StructuredSelection(result.toArray()), true);
+ }
+ }
+ });
+ }
+ }
+ }
+ }
+
+ /**
+ * @author Eike Stepper
+ */
+ private final class SubTreeSelectionAdapter extends SelectionAdapter
+ {
+ private ITreeContentProvider contentProvider;
+
+ private Tree tree;
+
+ private SubTreeSelectionAdapter(ITreeContentProvider contentProvider, Tree tree)
+ {
+ this.contentProvider = contentProvider;
+ this.tree = tree;
+ }
+
+ @Override
+ public void widgetSelected(SelectionEvent e)
+ {
+ if ((e.stateMask & SWT.ALT) == SWT.ALT)
+ {
+ tree.removeSelectionListener(this);
+
+ try
+ {
+ Object object = e.item.getData();
+ List<Object> objects = new ArrayList<Object>();
+ objects.add(object);
+
+ addChildren(object, objects);
+ viewer.setSelection(new StructuredSelection(objects), true);
+ }
+ finally
+ {
+ tree.addSelectionListener(this);
+ }
+ }
+ }
+
+ private void addChildren(Object object, List<Object> objects)
+ {
+ Object[] children = contentProvider.getChildren(object);
+ for (Object child : children)
+ {
+ objects.add(child);
+ addChildren(child, objects);
+ }
+ }
+ }
+
+ /**
+ * @author Eike Stepper
+ */
+ private 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)
+ {
+ return AbstractView.this.getChildren(object);
+ }
+
+ public Object getParent(Object object)
+ {
+ return AbstractView.this.getParent(object);
+ }
+
+ public boolean hasChildren(Object object)
+ {
+ Object[] children = getChildren(object);
+ return children != null && children.length != 0;
+ }
+ }
+
+ /**
+ * @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)
+ {
+ for (Object child : getChildren(object))
+ {
+ addElement(child);
+ }
+
+ EventUtil.addListener(object, this);
+ }
+
+ private void removeElement(Object object)
+ {
+ EventUtil.removeListener(object, this);
+ for (Object child : getChildren(object))
+ {
+ removeElement(child);
+ }
+ }
+ }
+
+ /**
+ * @author Eike Stepper
+ */
+ private static final class NameSorter extends ViewerSorter
+ {
+ public NameSorter()
+ {
+ }
+ }
+}
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 2ea8bcd..6465054 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,43 +15,22 @@
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.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.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.IBaseLabelProvider;
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.Collection;
import java.util.Set;
/**
* @author Eike Stepper
*/
-public class DescriptorView extends ViewPart
+public class DescriptorView extends AbstractView<ElementDescriptor>
{
public static final String ID = "org.eclipse.emf.cdo.threedee.DescriptorView";
@@ -59,219 +38,83 @@
private static final Registry INPUT = ElementDescriptor.Registry.INSTANCE;
- private Notifier notifier = new Notifier();
-
- private ICheckStateListener checkStateListener = new CheckStateListener();
-
- private IListener frontendListener = new FrontendListener();
-
- private boolean subTreeChecking = true;
-
- private CheckboxTreeViewer viewer;
-
public DescriptorView()
{
}
- public INotifier getNotifier()
+ @Override
+ public Collection<ElementDescriptor> getContents()
{
- return notifier;
- }
-
- public boolean isSubTreeChecking()
- {
- return subTreeChecking;
- }
-
- public void setSubTreeChecking(boolean subTreeChecking)
- {
- this.subTreeChecking = subTreeChecking;
- }
-
- public boolean isChecked(ElementDescriptor descriptor)
- {
- return viewer.getChecked(descriptor);
- }
-
- public Set<ElementDescriptor> getAllChecked()
- {
- return getAllChecked(true);
- }
-
- public Set<ElementDescriptor> getAllChecked(boolean checked)
- {
- Set<ElementDescriptor> result = new HashSet<ElementDescriptor>();
- for (ElementDescriptor descriptor : INPUT.values())
- {
- if (viewer.getChecked(descriptor) == checked)
- {
- result.add(descriptor);
- }
- }
-
- return result;
- }
-
- public void setAllChecked(boolean checked)
- {
- try
- {
- viewer.removeCheckStateListener(checkStateListener);
- for (ElementDescriptor descriptor : INPUT.values())
- {
- viewer.setChecked(descriptor, checked);
- }
- }
- finally
- {
- viewer.addCheckStateListener(checkStateListener);
- }
-
- notifier.fireCheckStateChangedEvent();
+ return INPUT.values();
}
@Override
- public void createPartControl(Composite parent)
+ public Object[] getChildren(Object object)
{
- 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);
-
- Frontend.INSTANCE.addListener(frontendListener);
-
- getSite().setSelectionProvider(viewer);
- getSite().getPage().addSelectionListener(new ISelectionListener()
+ if (object instanceof ElementDescriptor)
{
- public void selectionChanged(IWorkbenchPart part, final ISelection selection)
- {
- final Set<ElementDescriptor> descriptors = new HashSet<ElementDescriptor>();
- 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;
- descriptors.add(descriptor);
- }
- else if (object instanceof Element)
- {
- Element element = (Element)object;
- descriptors.add(element.getDescriptor());
- }
- }
- }
+ ElementDescriptor descriptor = (ElementDescriptor)object;
+ return descriptor.getSubDescriptors().toArray();
+ }
- if (!descriptors.isEmpty())
- {
- Display.getDefault().syncExec(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, descriptors))
- {
- ElementDescriptor[] array = descriptors.toArray(new ElementDescriptor[descriptors.size()]);
- viewer.setSelection(new StructuredSelection(array), true);
- }
- }
- });
- }
- }
- });
+ if (object == INPUT)
+ {
+ return INPUT.getRootDescriptors().toArray();
+ }
+
+ return new Object[0];
}
@Override
- public void setFocus()
+ public Object getParent(Object object)
{
- viewer.getControl().setFocus();
+ if (object instanceof ElementDescriptor)
+ {
+ ElementDescriptor descriptor = (ElementDescriptor)object;
+ return descriptor.getSuperDescriptor();
+ }
+
+ return null;
}
@Override
- public void dispose()
+ public Object getInput()
{
- Frontend.INSTANCE.removeListener(frontendListener);
- INSTANCE.setValue(null);
- super.dispose();
+ return INPUT;
}
- /**
- * @author Eike Stepper
- */
- public static final class CheckStateEvent extends Event
+ @Override
+ protected IBaseLabelProvider createLabelProvider(Display display)
{
- private static final long serialVersionUID = 1L;
+ return new LabelProvider(display);
+ }
- public CheckStateEvent(INotifier notifier)
+ @Override
+ protected ViewerSorter createSorter()
+ {
+ return new NameSorter();
+ }
+
+ @Override
+ protected void handlePageSelectionObject(Object pageSelectionObject, Collection<ElementDescriptor> contents,
+ Set<Object> result)
+ {
+ if (pageSelectionObject instanceof ElementDescriptor)
{
- super(notifier);
+ ElementDescriptor descriptor = (ElementDescriptor)pageSelectionObject;
+ result.add(descriptor);
+ }
+ else if (pageSelectionObject instanceof Element)
+ {
+ Element element = (Element)pageSelectionObject;
+ result.add(element.getDescriptor());
}
}
- /**
- * @author Eike Stepper
- */
- private static final class ViewContentProvider implements ITreeContentProvider
+ @Override
+ protected void setInstance(AbstractView<ElementDescriptor> view)
{
- 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 ElementDescriptor)
- {
- ElementDescriptor descriptor = (ElementDescriptor)object;
- return descriptor.getSubDescriptors().toArray();
- }
-
- if (object == INPUT)
- {
- return INPUT.getRootDescriptors().toArray();
- }
-
- return new Object[0];
- }
-
- public Object getParent(Object object)
- {
- if (object instanceof ElementDescriptor)
- {
- ElementDescriptor descriptor = (ElementDescriptor)object;
- return descriptor.getSuperDescriptor();
- }
-
- return null;
- }
-
- public boolean hasChildren(Object object)
- {
- Object[] children = getChildren(object);
- return children != null && children.length != 0;
- }
+ INSTANCE.setValue((DescriptorView)view);
}
/**
@@ -357,10 +200,6 @@
*/
private static final class NameSorter extends ViewerSorter
{
- public NameSorter()
- {
- }
-
@Override
public int category(Object element)
{
@@ -377,110 +216,4 @@
return 3;
}
}
-
- /**
- * @author Eike Stepper
- */
- private final class CheckStateListener implements ICheckStateListener
- {
- public void checkStateChanged(CheckStateChangedEvent event)
- {
- if (subTreeChecking)
- {
- try
- {
- viewer.removeCheckStateListener(checkStateListener);
- ElementDescriptor descriptor = (ElementDescriptor)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(true);
- }
- 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/ElementView.java b/org.eclipse.emf.cdo.threedee/src/org/eclipse/emf/cdo/threedee/ElementView.java
index 8484de1..1baeb22 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
@@ -14,320 +14,120 @@
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.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.jface.viewers.IBaseLabelProvider;
import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.ui.ISelectionListener;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.part.ViewPart;
import java.awt.Color;
import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.Iterator;
+import java.util.Collection;
import java.util.List;
import java.util.Set;
/**
* @author Eike Stepper
*/
-public class ElementView extends ViewPart
+public class ElementView extends AbstractView<Element>
{
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()
+ @Override
+ public List<Element> getContents()
{
- 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>();
+ List<Element> result = new ArrayList<Element>();
for (Session session : Frontend.INSTANCE.getElements())
{
for (Element element : session.getAllElements())
{
- if (viewer.getChecked(element) == checked)
- {
- result.add(element);
- }
+ result.add(element);
}
}
return result;
}
- public void setAllChecked(boolean checked)
+ @Override
+ public Object getInput()
{
- 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();
+ return Frontend.INSTANCE;
}
@Override
- public void createPartControl(Composite parent)
+ public Object[] getChildren(Object object)
{
- final ViewContentProvider contentProvider = new ViewContentProvider();
-
- viewer = new CheckboxTreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
- viewer.setContentProvider(contentProvider);
- viewer.setLabelProvider(new LabelProvider(viewer.getControl().getDisplay()));
- viewer.setSorter(new NameSorter());
- viewer.setInput(Frontend.INSTANCE);
- viewer.addCheckStateListener(checkStateListener);
-
- final Tree tree = viewer.getTree();
- tree.addSelectionListener(new SelectionAdapter()
+ if (object instanceof IContainer<?>)
{
- @Override
- public void widgetSelected(SelectionEvent e)
- {
- if ((e.stateMask & SWT.ALT) == SWT.ALT)
- {
- tree.removeSelectionListener(this);
+ IContainer<?> container = (IContainer<?>)object;
+ return container.getElements();
+ }
- try
- {
- Object object = e.item.getData();
- List<Object> objects = new ArrayList<Object>();
- objects.add(object);
-
- addChildren(contentProvider, object, objects);
- viewer.setSelection(new StructuredSelection(objects), true);
- }
- finally
- {
- tree.addSelectionListener(this);
- }
- }
- }
-
- private void addChildren(final ViewContentProvider contentProvider, Object object, List<Object> objects)
- {
- Object[] children = contentProvider.getChildren(object);
- for (Object child : children)
- {
- objects.add(child);
- addChildren(contentProvider, child, objects);
- }
- }
- });
-
- 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().syncExec(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);
- }
- }
- });
- }
- }
- });
+ return new Object[0];
}
@Override
- public void setFocus()
+ public Object getParent(Object object)
{
- viewer.getControl().setFocus();
+ 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;
}
@Override
- public void dispose()
+ protected void setInstance(AbstractView<Element> view)
{
- Frontend.INSTANCE.removeListener(frontendListener);
- INSTANCE.setValue(null);
- super.dispose();
+ INSTANCE.setValue((ElementView)view);
}
- /**
- * @author Eike Stepper
- */
- public static final class CheckStateEvent extends Event
+ @Override
+ protected IBaseLabelProvider createLabelProvider(Display display)
{
- private static final long serialVersionUID = 1L;
-
- public CheckStateEvent(INotifier notifier)
- {
- super(notifier);
- }
+ return new LabelProvider(display);
}
- /**
- * @author Eike Stepper
- */
- private static final class ViewContentProvider implements ITreeContentProvider
+ @Override
+ protected void handlePageSelectionObject(Object pageSelectionObject, Collection<Element> contents, Set<Object> result)
{
- public ViewContentProvider()
+ if (pageSelectionObject instanceof ElementDescriptor)
{
- }
-
- 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<?>)
+ ElementDescriptor descriptor = (ElementDescriptor)pageSelectionObject;
+ for (Element element : contents)
{
- 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)
+ if (element.getDescriptor() == descriptor)
{
- return element.getProvider();
+ result.add(element);
}
-
- return container;
}
-
- if (object instanceof Session)
- {
- return Frontend.INSTANCE;
- }
-
- return null;
}
-
- public boolean hasChildren(Object object)
+ else if (pageSelectionObject instanceof Element)
{
- Object[] children = getChildren(object);
- return children != null && children.length != 0;
+ Element element = (Element)pageSelectionObject;
+ result.add(element);
}
}
@@ -369,120 +169,4 @@
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);
- }
- }
- }
- }
}