/**
* This file is protected by Copyright.
* Please refer to the COPYRIGHT file distributed with this source distribution.
*
* This file is part of REDHAWK IDE.
*
* 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.
*
*/
package gov.redhawk.ui.util;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.StructuredViewer;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
/**
* @since 8.0
*/
public class ViewerUtil {
/**
* Utility class, cannot instantiate
*/
private ViewerUtil() {
}
private static class EmptySelection implements ISelection {
@Override
public boolean isEmpty() {
return false;
}
}
/**
* Returns the equivalent selection in a viewer for the given items. If an item cannot be found in the viewer,
* it is not included in the returned selection.
*
* @param viewer the viewer
* @param items the items to select
* @return selection
*/
public static ISelection itemsToSelection(final Viewer viewer, final Collection< ? > items) {
if (viewer instanceof TreeViewer) {
return ViewerUtil.itemsToSelection((TreeViewer) viewer, items);
} else if (viewer instanceof StructuredViewer) {
return ViewerUtil.itemsToSelection((StructuredViewer) viewer, items);
}
return new EmptySelection();
}
/**
* Returns the equivalent selection in a tree viewer for the given items. If an item cannot be found via the
* viewer's content provider, it is not included in the returned selection.
*
* @param viewer the tree viewer
* @param items the items to select
* @return selection
*/
public static ISelection itemsToSelection(final TreeViewer viewer, final Collection< ? > items) {
final List<Object> targets = new ArrayList<Object>();
// A TreeViewer's content provider always has to be an ITreeContentProvider
final ITreeContentProvider provider = (ITreeContentProvider) viewer.getContentProvider();
final Object input = viewer.getInput();
for (final Object object : items) {
final Object target = ViewerUtil.findItemInProvider(provider, input, object);
if (target != null) {
targets.add(target);
}
}
return new StructuredSelection(targets.toArray());
}
/**
* Returns the equivalent selection in a structured viewer for the given items. If an item cannot be found via the
* viewer's content provider, it is not included in the returned selection.
*
* @param viewer the structured viewer
* @param items the items to select
* @return selection
*/
public static ISelection itemsToSelection(final StructuredViewer viewer, final Collection< ? > items) {
final List<Object> targets = new ArrayList<Object>();
final IStructuredContentProvider provider = (IStructuredContentProvider) viewer.getContentProvider();
final Object input = viewer.getInput();
for (Object object : items) {
final Object target = ViewerUtil.findItemInProvider(provider, input, object);
if (target != null) {
targets.add(target);
}
}
return new StructuredSelection(targets.toArray());
}
private static Object findItemInProvider(ITreeContentProvider provider, Object input, Object object) {
if (ViewerUtil.checkEquivalent(input, object)) {
return input;
}
for (final Object child : provider.getChildren(input)) {
final Object target = findItemInProvider(provider, child, object);
if (target != null) {
return target;
}
}
return null;
}
private static Object findItemInProvider(IStructuredContentProvider provider, Object input, Object object) {
for (final Object element : provider.getElements(input)) {
if (ViewerUtil.checkEquivalent(element, object)) {
return element;
}
}
return null;
}
private static boolean checkEquivalent(Object first, Object second) {
if (first == null) {
return (second == null);
} else {
return AdapterFactoryEditingDomain.unwrap(first).equals(AdapterFactoryEditingDomain.unwrap(second));
}
}
}