/*******************************************************************************
* Copyright (c) 2007, 2010 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.ui.utils;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.ui.PlatformUI;
import org.simantics.db.ReadGraph;
import org.simantics.db.Resource;
import org.simantics.db.common.ResourceArray;
import org.simantics.db.exception.DatabaseException;
import org.simantics.db.layer0.variable.Variable;
import org.simantics.utils.Container;
/**
* @author Tuukka Lehtonen
*/
public class ResourceAdaptionUtils {
/**
* Tries to adapt an object into a {@link Resource}. This is successful if
* the object already is a {@link ResourceContainer} or it is adaptable into
* a {@link Resource} via {@link IAdaptable}.
*
* @param o any object
* @return a Resource or null
if not adaptable to
* {@link Resource}
*/
public static Resource adaptToResource(Object o) {
if (o instanceof Container>) {
Object obj = ((Container>) o).get();
if (obj instanceof Resource)
return (Resource) obj;
} else if (o instanceof IAdaptable) {
IAdaptable a = (IAdaptable) o;
Resource r = (Resource) a.getAdapter(Resource.class);
return r;
}
return null;
}
public static Resource adaptToResource(ReadGraph graph, Object o) throws DatabaseException {
Resource r = adaptToResource(o);
if(r != null) return r;
if(o instanceof Variable) {
Variable var = (Variable)o;
return var.getPossibleRepresents(graph);
} else if (o instanceof IAdaptable) {
IAdaptable a = (IAdaptable) o;
Variable var = (Variable) a.getAdapter(Variable.class);
if(var != null)
return var.getPossibleRepresents(graph);
}
return null;
}
private static Resource[] toResources(IStructuredSelection iss) {
if (iss == null || iss.isEmpty())
return Resource.NONE;
ArrayList list = new ArrayList(iss.size());
for (Iterator> iterator = iss.iterator(); iterator.hasNext();) {
Object o = iterator.next();
Resource r = adaptToResource(o);
if (r != null)
list.add(r);
}
return list.toArray(Resource.NONE);
}
/**
* Tries to adapt any Object into a {@link Resource}. Successful if the
* object is an IStructuredSelection of size one and its content is
* adaptable to a {@link Resource} according to {@link #adaptToResource(Object)},
* or the object itself is adaptable by {@link #adaptToResource(Object)}.
*
* @param s any selection
* @return a Resource, or null
if not adaptable to Resource
* or selection size is not one.
*/
public static Resource toSingleResource(Object o) {
if (o instanceof IStructuredSelection) {
IStructuredSelection iss = (IStructuredSelection) o;
if (iss.size() != 1)
return null;
Object element = iss.getFirstElement();
return adaptToResource(element);
}
return adaptToResource(o);
}
public static Resource toSingleResource(ReadGraph graph, Object o) throws DatabaseException {
if (o instanceof IStructuredSelection) {
IStructuredSelection iss = (IStructuredSelection) o;
if (iss.size() != 1)
return null;
Object element = iss.getFirstElement();
return adaptToResource(graph, element);
}
return adaptToResource(graph, o);
}
/**
* Tries to adapt any Object into an array of {@link Resource}s. Only
* successful if {@link #adaptToResource(Object)} succeeds or the object is an
* IStructuredSelection that contains something adaptable to resources.
*
* @param s any selection
* @return every {@link Resource} that was adaptable or an array of size 0
* if nothing could be adapted.
*/
public static Resource[] toResources(Object o) {
if (o instanceof IStructuredSelection) {
return toResources((IStructuredSelection) o);
}
Resource r = adaptToResource(o);
return (r == null) ? Resource.NONE : new Resource[] { r };
}
///////////////////////////////////////////////////////////////////////////
/**
* Tries to adapt an object into a {@link ResourceArray}. This is successful if
* the object already is a {@link ResourceContainer} or it is adaptable into
* a {@link ResourceArray} via {@link IAdaptable}.
*
* @param o any object
* @return a Resource or null
if not adaptable to
* {@link Resource}
*/
private static ResourceArray adaptToResourceArray(Object o) {
if (o instanceof Container>) {
Object obj = ((Container>) o).get();
if (obj instanceof ResourceArray)
return (ResourceArray) obj;
if (obj instanceof Resource)
return new ResourceArray((Resource) obj);
}
if (o instanceof Resource[]) {
return new ResourceArray((Resource[]) o);
}
if (o instanceof ResourceArray) {
return (ResourceArray) o;
} else if (o instanceof IAdaptable) {
IAdaptable a = (IAdaptable) o;
ResourceArray r = (ResourceArray) a.getAdapter(ResourceArray.class);
if (r!=null) return r;
Resource[] r3 = (Resource[]) a.getAdapter(Resource[].class);
if (r3!=null) return new ResourceArray(r3);
Resource r2 = (Resource) a.getAdapter(Resource.class);
if (r2!=null) return new ResourceArray(r2);
}
return null;
}
/**
* Tries to adapt an object into a {@link ResourceArray}. This is successful if
* the object already is a {@link ResourceContainer} or it is adaptable into
* a {@link ResourceArray} via {@link IAdaptable}.
*
* @param o any object
* @return a Resource or null
if not adaptable to
* {@link ResourceArray[]}
*/
private static ResourceArray[] adaptToResourceArrays(Object o) {
if (o instanceof ResourceArray[]) {
return (ResourceArray[]) o;
} else if (o instanceof IAdaptable) {
IAdaptable a = (IAdaptable) o;
ResourceArray[] ras = (ResourceArray[]) a.getAdapter(ResourceArray[].class);
if (ras!=null) return ras;
}
ResourceArray ra = adaptToResourceArray(o);
return ra != null ? new ResourceArray[] { ra } : null;
}
private static ResourceArray[] toResourceArrays(IStructuredSelection iss) {
if (iss == null || iss.isEmpty())
return ResourceArray.NONE;
ArrayList list = new ArrayList(iss.size());
for (Iterator> iterator = iss.iterator(); iterator.hasNext();) {
Object o = iterator.next();
ResourceArray[] r = adaptToResourceArrays(o);
if (r != null)
for (ResourceArray ra : r)
list.add(ra);
}
return list.toArray(ResourceArray.NONE);
}
/**
* Tries to adapt any Object into a {@link Resource}. Successful if the
* object is an IStructuredSelection of size one and its content is
* adaptable to a {@link Resource} according to {@link #adaptToResource(Object)},
* or the object itself is adaptable by {@link #adaptToResource(Object)}.
*
* @param s any selection
* @return a Resource, or null
if not adaptable to Resource
* or selection size is not one.
*/
public static ResourceArray toSingleResourceArray(Object o) {
if (o instanceof IStructuredSelection) {
IStructuredSelection iss = (IStructuredSelection) o;
if (iss.size() != 1)
return null;
Object element = iss.getFirstElement();
return adaptToResourceArray(element);
}
return adaptToResourceArray(o);
}
/**
* Tries to adapt any Object into an array of {@link Resource}s. Only
* successful if the input object is directly adaptable to ResourceArray[],
* if {@link #adaptToResourceArray(Object)} succeeds or the object is an
* IStructuredSelection containing resources in some form.
*
* @param s any selection
* @return every {@link Resource} that was adaptable or an array of size 0
* if nothing could be adapted.
*/
public static ResourceArray[] toResourceArrays(Object o) {
if (o instanceof List>) {
List> list = (List>)o;
ArrayList out = new ArrayList(list.size());
for (Object i : list) {
ResourceArray[] r = adaptToResourceArrays(i);
if (r != null)
for (ResourceArray ra : r)
out.add(ra);
}
return out.toArray(ResourceArray.NONE);
}
if (o instanceof IStructuredSelection) {
return toResourceArrays((IStructuredSelection) o);
}
ResourceArray r = adaptToResourceArray(o);
return (r == null) ? ResourceArray.NONE : new ResourceArray[] { r };
}
public static Resource toSingleWorkbenchResource() {
return toSingleResource(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getSelectionService().getSelection());
}
}