/******************************************************************************* * 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.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.swt.widgets.Composite; import org.simantics.g3d.scenegraph.IG3DNode; import org.simantics.g3d.scenegraph.base.INode; import org.simantics.g3d.scenegraph.base.ParentNode; import org.simantics.g3d.tools.AdaptationUtils; import org.simantics.g3d.ui.ScenegraphOutlinePage; public class VTKContentOutlinePage extends ScenegraphOutlinePage{ private NodeSelectionProvider2 provider; public VTKContentOutlinePage(ParentNode rootNode, NodeSelectionProvider2 selectionProvider) { super(rootNode); this.provider = selectionProvider; } private boolean outsideSelection = false; @Override public void createControl(Composite parent) { super.createControl(parent); provider.addSelectionChangedListener(new ISelectionChangedListener() { @Override public void selectionChanged(SelectionChangedEvent event) { Object source = event.getSource(); if (source == VTKContentOutlinePage.this) return; ISelection s = event.getSelection(); Collection nodes = AdaptationUtils.adaptToCollection(s, INode.class); outsideSelection = true; getTreeViewer().setSelection(new StructuredSelection(nodes.toArray()),true); outsideSelection = false; } }); } List selectedNodes = new ArrayList(); @SuppressWarnings("unchecked") @Override protected void fireSelectionChanged(ISelection selection) { if (outsideSelection) return; // TreeViewer provides selected object in tree order, not in selected order. Collection selectedUnsortedNodes = AdaptationUtils.adaptToCollection(selection, INode.class); List toRemove = new ArrayList(); for (INode node : selectedNodes) { if (!selectedUnsortedNodes.contains(node)) toRemove.add(node); } for (INode node : toRemove) selectedNodes.remove(node); for (INode node : selectedUnsortedNodes) { if (!selectedNodes.contains(node)) selectedNodes.add(node); } List> selectedItems = new ArrayList>(); for (INode node : selectedNodes) { DBObject r = provider.mapping.inverseGet((JavaObject)node); selectedItems.add(new VTKSelectionItem(null, (IG3DNode)node, r)); } super.fireSelectionChanged(new StructuredSelection(selectedItems)); } }