/******************************************************************************* * Copyright (c) 2012, 2013 Association for Decentralized Information Management in * Industry THTH ry. * 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: * VTT Technical Research Centre of Finland - initial API and implementation *******************************************************************************/ package org.simantics.g3d.vtk.common; import java.util.ArrayList; import java.util.Collection; import java.util.List; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.ISelectionProvider; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.ISelectionListener; import org.eclipse.ui.IWorkbenchPart; import org.simantics.db.Resource; import org.simantics.g3d.scenegraph.IG3DNode; import org.simantics.g3d.scenegraph.base.INode; import org.simantics.g3d.tools.AdaptationUtils; import org.simantics.objmap.graph.IMapping; import org.simantics.objmap.structural.StructuralResource; import vtk.vtkProp; public class NodeSelectionProvider2 implements ISelectionProvider, ISelectionChangedListener, ISelectionListener{ private ISelection selection = new StructuredSelection(); private List listeners = new ArrayList(); List selectedNodes = new ArrayList(); // selection is ordered //List selectedResources = new ArrayList(); List> selectedItems = new ArrayList>(); IEditorPart part; IMapping mapping; VTKNodeMap nodeMap; public NodeSelectionProvider2(IEditorPart part, IMapping mapping, VTKNodeMap nodeMap) { this.part = part; this.mapping = mapping; this.nodeMap = nodeMap; } @Override public void addSelectionChangedListener( ISelectionChangedListener listener) { listeners.add(listener); } @Override public void removeSelectionChangedListener( ISelectionChangedListener listener) { listeners.remove(listener); } @Override public ISelection getSelection() { return selection; } @Override public void setSelection(ISelection selection) { } // events coming from vtk @Override public void selectionChanged(SelectionChangedEvent event) { ISelection s = event.getSelection(); processSelection(s); fireSelectionChanged(event.getSource()); } @SuppressWarnings("unchecked") private void processSelection(ISelection s) { selectedNodes.clear(); selectedItems.clear(); Collection selectedActors = AdaptationUtils.adaptToCollection(s, vtkProp.class); if (selectedActors.size() > 0) { for (vtkProp a : selectedActors) { IG3DNode node = (IG3DNode)nodeMap.getNode((vtkProp)a); if (node == null) continue; if (!selectedNodes.contains(node)) selectedNodes.add(node); DBObject r = mapping.inverseGet((JavaObject)node); selectedItems.add(new VTKSelectionItem(a, node,r)); } } else { Collection selectedNds = AdaptationUtils.adaptToCollection(s, IG3DNode.class); for (INode node : selectedNds) { if (!selectedNodes.contains(node)) selectedNodes.add((IG3DNode)node); DBObject r = mapping.inverseGet((JavaObject)node); selectedItems.add(new VTKSelectionItem(null, (IG3DNode)node,r)); } } selection = new StructuredSelection(selectedItems); } private void fireSelectionChanged(Object source) { SelectionChangedEvent evt = new SelectionChangedEvent((ISelectionProvider)source, selection); for (ISelectionChangedListener l : listeners) { l.selectionChanged(evt); } } // events coming from workbench @Override public void selectionChanged(IWorkbenchPart part, ISelection selection) { if (part == this.part) return; processSelection(selection); } public List getSelectedNodes() { return selectedNodes; } @SuppressWarnings("unchecked") public List getSelectedResources() { List list = new ArrayList(); for (VTKSelectionItem i : selectedItems) { DBObject r = (DBObject)i.getAdapter(Resource.class); if (r == null) r = (DBObject)i.getAdapter(StructuralResource.class); if (r == null) continue; if (!list.contains(r)) list.add(r); } return list; } protected INode getNode(DBObject r) { return (INode)mapping.get(r); } }