1 package org.simantics.g3d.vtk.common;
\r
3 import java.util.ArrayList;
\r
4 import java.util.Collection;
\r
5 import java.util.List;
\r
7 import org.eclipse.jface.viewers.ISelection;
\r
8 import org.eclipse.jface.viewers.ISelectionChangedListener;
\r
9 import org.eclipse.jface.viewers.ISelectionProvider;
\r
10 import org.eclipse.jface.viewers.SelectionChangedEvent;
\r
11 import org.eclipse.jface.viewers.StructuredSelection;
\r
12 import org.eclipse.ui.IEditorPart;
\r
13 import org.eclipse.ui.ISelectionListener;
\r
14 import org.eclipse.ui.IWorkbenchPart;
\r
15 import org.simantics.db.Resource;
\r
16 import org.simantics.g3d.scenegraph.IG3DNode;
\r
17 import org.simantics.g3d.scenegraph.base.INode;
\r
18 import org.simantics.g3d.tools.AdaptationUtils;
\r
19 import org.simantics.objmap.graph.IMapping;
\r
20 import org.simantics.objmap.structural.StructuralResource;
\r
24 public class NodeSelectionProvider2<DBObject,JavaObject> implements ISelectionProvider, ISelectionChangedListener, ISelectionListener{
\r
25 private ISelection selection = new StructuredSelection();
\r
26 private List<ISelectionChangedListener> listeners = new ArrayList<ISelectionChangedListener>();
\r
28 List<IG3DNode> selectedNodes = new ArrayList<IG3DNode>(); // selection is ordered
\r
29 //List<Resource> selectedResources = new ArrayList<Resource>();
\r
30 List<VTKSelectionItem<DBObject>> selectedItems = new ArrayList<VTKSelectionItem<DBObject>>();
\r
33 IMapping<DBObject,JavaObject> mapping;
\r
36 public NodeSelectionProvider2(IEditorPart part, IMapping<DBObject,JavaObject> mapping, VTKNodeMap nodeMap) {
\r
38 this.mapping = mapping;
\r
39 this.nodeMap = nodeMap;
\r
43 public void addSelectionChangedListener(
\r
44 ISelectionChangedListener listener) {
\r
45 listeners.add(listener);
\r
49 public void removeSelectionChangedListener(
\r
50 ISelectionChangedListener listener) {
\r
51 listeners.remove(listener);
\r
55 public ISelection getSelection() {
\r
60 public void setSelection(ISelection selection) {
\r
64 // events coming from vtk
\r
66 public void selectionChanged(SelectionChangedEvent event) {
\r
67 ISelection s = event.getSelection();
\r
69 processSelection(s);
\r
70 fireSelectionChanged(event.getSource());
\r
73 @SuppressWarnings("unchecked")
\r
74 private void processSelection(ISelection s) {
\r
75 selectedNodes.clear();
\r
76 selectedItems.clear();
\r
78 Collection<vtkProp> selectedActors = AdaptationUtils.adaptToCollection(s, vtkProp.class);
\r
79 if (selectedActors.size() > 0) {
\r
80 for (vtkProp a : selectedActors) {
\r
81 IG3DNode node = (IG3DNode)nodeMap.getNode((vtkProp)a);
\r
84 if (!selectedNodes.contains(node))
\r
85 selectedNodes.add(node);
\r
86 DBObject r = mapping.inverseGet((JavaObject)node);
\r
87 selectedItems.add(new VTKSelectionItem<DBObject>(a, node,r));
\r
90 Collection<IG3DNode> selectedNds = AdaptationUtils.adaptToCollection(s, IG3DNode.class);
\r
91 for (INode node : selectedNds) {
\r
92 if (!selectedNodes.contains(node))
\r
93 selectedNodes.add((IG3DNode)node);
\r
94 DBObject r = mapping.inverseGet((JavaObject)node);
\r
95 selectedItems.add(new VTKSelectionItem<DBObject>(null, (IG3DNode)node,r));
\r
100 selection = new StructuredSelection(selectedItems);
\r
103 private void fireSelectionChanged(Object source) {
\r
104 SelectionChangedEvent evt = new SelectionChangedEvent((ISelectionProvider)source, selection);
\r
105 for (ISelectionChangedListener l : listeners) {
\r
106 l.selectionChanged(evt);
\r
112 // events coming from workbench
\r
114 public void selectionChanged(IWorkbenchPart part, ISelection selection) {
\r
115 if (part == this.part)
\r
117 processSelection(selection);
\r
121 public List<IG3DNode> getSelectedNodes() {
\r
122 return selectedNodes;
\r
125 @SuppressWarnings("unchecked")
\r
126 public List<DBObject> getSelectedResources() {
\r
128 List<DBObject> list = new ArrayList<DBObject>();
\r
129 for (VTKSelectionItem<DBObject> i : selectedItems) {
\r
130 DBObject r = (DBObject)i.getAdapter(Resource.class);
\r
132 r = (DBObject)i.getAdapter(StructuralResource.class);
\r
135 if (!list.contains(r))
\r
141 protected INode getNode(DBObject r) {
\r
142 return (INode)mapping.get(r);
\r