1 /*******************************************************************************
2 * Copyright (c) 2012, 2013 Association for Decentralized Information Management in
4 * All rights reserved. This program and the accompanying materials
5 * are made available under the terms of the Eclipse Public License v1.0
6 * which accompanies this distribution, and is available at
7 * http://www.eclipse.org/legal/epl-v10.html
10 * VTT Technical Research Centre of Finland - initial API and implementation
11 *******************************************************************************/
12 package org.simantics.g3d.vtk.common;
14 import java.util.ArrayList;
15 import java.util.Collection;
16 import java.util.List;
18 import org.eclipse.jface.viewers.ISelection;
19 import org.eclipse.jface.viewers.ISelectionChangedListener;
20 import org.eclipse.jface.viewers.ISelectionProvider;
21 import org.eclipse.jface.viewers.SelectionChangedEvent;
22 import org.eclipse.jface.viewers.StructuredSelection;
23 import org.eclipse.ui.IEditorPart;
24 import org.eclipse.ui.ISelectionListener;
25 import org.eclipse.ui.IWorkbenchPart;
26 import org.simantics.db.Resource;
27 import org.simantics.g3d.scenegraph.IG3DNode;
28 import org.simantics.g3d.scenegraph.base.INode;
29 import org.simantics.g3d.tools.AdaptationUtils;
30 import org.simantics.objmap.graph.IMapping;
31 import org.simantics.objmap.structural.StructuralResource;
35 public class NodeSelectionProvider2<DBObject,JavaObject> implements ISelectionProvider, ISelectionChangedListener, ISelectionListener{
36 protected ISelection selection = new StructuredSelection();
37 protected List<ISelectionChangedListener> listeners = new ArrayList<ISelectionChangedListener>();
39 protected List<IG3DNode> selectedNodes = new ArrayList<IG3DNode>(); // selection is ordered
40 //List<Resource> selectedResources = new ArrayList<Resource>();
41 protected List<VTKSelectionItem<DBObject>> selectedItems = new ArrayList<VTKSelectionItem<DBObject>>();
43 protected IEditorPart part;
44 protected IMapping<DBObject,JavaObject> mapping;
45 protected VTKNodeMap nodeMap;
47 public NodeSelectionProvider2(IEditorPart part, IMapping<DBObject,JavaObject> mapping, VTKNodeMap nodeMap) {
49 this.mapping = mapping;
50 this.nodeMap = nodeMap;
54 public void addSelectionChangedListener(
55 ISelectionChangedListener listener) {
56 listeners.add(listener);
60 public void removeSelectionChangedListener(
61 ISelectionChangedListener listener) {
62 listeners.remove(listener);
66 public ISelection getSelection() {
71 public void setSelection(ISelection selection) {
75 // events coming from vtk
77 public void selectionChanged(SelectionChangedEvent event) {
78 ISelection s = event.getSelection();
81 fireSelectionChanged(event.getSource());
84 @SuppressWarnings("unchecked")
85 protected void processSelection(ISelection s) {
86 selectedNodes.clear();
87 selectedItems.clear();
89 Collection<vtkProp> selectedActors = AdaptationUtils.adaptToCollection(s, vtkProp.class);
90 if (selectedActors.size() > 0) {
91 for (vtkProp a : selectedActors) {
92 IG3DNode node = (IG3DNode)nodeMap.getNode((vtkProp)a);
95 if (!selectedNodes.contains(node))
96 selectedNodes.add(node);
97 DBObject r = mapping.inverseGet((JavaObject)node);
98 selectedItems.add(new VTKSelectionItem<DBObject>(a, node,r));
101 Collection<IG3DNode> selectedNds = AdaptationUtils.adaptToCollection(s, IG3DNode.class);
102 for (INode node : selectedNds) {
103 if (!selectedNodes.contains(node))
104 selectedNodes.add((IG3DNode)node);
105 DBObject r = mapping.inverseGet((JavaObject)node);
106 selectedItems.add(new VTKSelectionItem<DBObject>(null, (IG3DNode)node,r));
111 selection = new StructuredSelection(selectedItems);
114 protected void fireSelectionChanged(Object source) {
115 SelectionChangedEvent evt = new SelectionChangedEvent((ISelectionProvider)source, selection);
116 for (ISelectionChangedListener l : listeners) {
117 l.selectionChanged(evt);
123 // events coming from workbench
125 public void selectionChanged(IWorkbenchPart part, ISelection selection) {
126 if (part == this.part)
128 processSelection(selection);
132 public List<IG3DNode> getSelectedNodes() {
133 return selectedNodes;
136 @SuppressWarnings("unchecked")
137 public List<DBObject> getSelectedResources() {
139 List<DBObject> list = new ArrayList<DBObject>();
140 for (VTKSelectionItem<DBObject> i : selectedItems) {
141 DBObject r = (DBObject)i.getAdapter(Resource.class);
143 r = (DBObject)i.getAdapter(StructuralResource.class);
146 if (!list.contains(r))
152 protected INode getNode(DBObject r) {
153 return (INode)mapping.get(r);