/***************************************************************************** * Copyright (c) 2012 CEA LIST. * * 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: * Camille Letavernier (CEA LIST) camille.letavernier@cea.fr - Initial API and implementation *****************************************************************************/ package org.eclipse.papyrus.infra.widgets.strategy; import java.util.Arrays; import java.util.LinkedList; import java.util.List; import org.eclipse.core.resources.IResource; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.TreePath; import org.eclipse.jface.viewers.TreeSelection; import org.eclipse.jface.viewers.TreeViewer; /** * A Strategy to search for a Resource in the Workspace * * @author Camille Letavernier * */ public class WorkspaceRevealStrategy extends ProviderBasedBrowseStrategy { public WorkspaceRevealStrategy(ITreeContentProvider provider) { super(provider); } public WorkspaceRevealStrategy() { super(); } @Override public void revealSemanticElement(List<?> elementsToReveal) { if(viewer instanceof TreeViewer) { TreeViewer treeViewer = (TreeViewer)viewer; TreePath[] paths = new TreePath[elementsToReveal.size()]; int i = 0; List<?> roots = Arrays.asList(getElements()); for(Object elementToReveal : elementsToReveal) { LinkedList<IResource> segments = new LinkedList<IResource>(); if(elementToReveal instanceof IResource) { IResource currentElement = (IResource)elementToReveal; segments.add(currentElement); currentElement = currentElement.getParent(); while(currentElement != null) { segments.addFirst(currentElement); if(roots.contains(currentElement)) { break; //If the tree root is not the Workspace Root, stop now } currentElement = currentElement.getParent(); } } paths[i++] = new TreePath(segments.toArray()); } TreeSelection selection = new TreeSelection(paths); treeViewer.setSelection(selection, true); } else { super.revealSemanticElement(elementsToReveal); } } }