blob: 0674eb6e058b1f606d31482fd4fb7a8c989dc907 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2005 IBM Corporation and others.
* 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.ui.internal.ide.model;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.mapping.ResourceMapping;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IAdapterFactory;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.ui.IContributorResourceAdapter;
import org.eclipse.ui.IWorkingSet;
import org.eclipse.ui.ide.IContributorResourceAdapter2;
import org.eclipse.ui.model.IWorkbenchAdapter;
/**
* Adapter factory which provides a ResourceMapping for a working set
*/
public class WorkingSetAdapterFactory implements IAdapterFactory {
/*
* Adapter for converting a working set to a resource mapping for
* use by object contributions.
*/
class ContributorResourceAdapter implements IContributorResourceAdapter2 {
public ResourceMapping getAdaptedResourceMapping(IAdaptable adaptable) {
if (adaptable instanceof IWorkingSet) {
IWorkingSet workingSet = (IWorkingSet) adaptable;
IAdaptable[] elements = workingSet.getElements();
List result = new ArrayList();
for (int i = 0; i < elements.length; i++) {
IAdaptable element = elements[i];
ResourceMapping mapping = getContributedResourceMapping(element);
if (mapping == null) {
mapping = getResourceMapping(element);
}
if (mapping != null) {
result.add(mapping);
}
}
if (!result.isEmpty())
return new CompositeResourceMapping(adaptable, (ResourceMapping[]) result.toArray(new ResourceMapping[result.size()]));
}
return null;
}
public IResource getAdaptedResource(IAdaptable adaptable) {
// Working sets don't adapt to IResource
return null;
}
}
class WorkbenchAdapter implements IWorkbenchAdapter {
public Object[] getChildren(Object o) {
if (o instanceof IWorkingSet) {
IWorkingSet set = (IWorkingSet) o;
return set.getElements();
}
return null;
}
public ImageDescriptor getImageDescriptor(Object o) {
if (o instanceof IWorkingSet) {
IWorkingSet set = (IWorkingSet) o;
return set.getImage();
}
return null;
}
public String getLabel(Object o) {
if (o instanceof IWorkingSet) {
IWorkingSet set = (IWorkingSet) o;
return set.getLabel();
}
return null;
}
public Object getParent(Object o) {
return null;
}
}
private IContributorResourceAdapter2 contributorResourceAdapter = new ContributorResourceAdapter();
private IWorkbenchAdapter workbenchAdapter = new WorkbenchAdapter();
/* (non-Javadoc)
* @see org.eclipse.core.runtime.IAdapterFactory#getAdapter(java.lang.Object, java.lang.Class)
*/
public Object getAdapter(Object adaptableObject, Class adapterType) {
if (adaptableObject instanceof IWorkingSet) {
if (adapterType == IContributorResourceAdapter.class) {
return contributorResourceAdapter;
}
if (adapterType == IWorkbenchAdapter.class) {
return workbenchAdapter ;
}
if (adapterType == ResourceMapping.class) {
IWorkingSet workingSet = (IWorkingSet) adaptableObject;
IAdaptable[] elements = workingSet.getElements();
List result = new ArrayList();
for (int i = 0; i < elements.length; i++) {
IAdaptable element = elements[i];
ResourceMapping mapping = getResourceMapping(element);
if (mapping != null) {
result.add(mapping);
}
}
if (!result.isEmpty())
return new CompositeResourceMapping(adaptableObject, (ResourceMapping[]) result.toArray(new ResourceMapping[result.size()]));
}
}
return null;
}
/* (non-Javadoc)
* @see org.eclipse.core.runtime.IAdapterFactory#getAdapterList()
*/
public Class[] getAdapterList() {
return new Class[] { IContributorResourceAdapter2.class, IWorkbenchAdapter.class, ResourceMapping.class };
}
/* package */ ResourceMapping getResourceMapping(Object o) {
// First, ask the object directly for a resource mapping
Object mapping = internalGetAdapter(o, ResourceMapping.class);
if (mapping instanceof ResourceMapping) {
return (ResourceMapping)mapping;
}
// If this fails, ask for a resource and convert to a resource mapping
Object resource = internalGetAdapter(o, IResource.class);
if (resource != null) {
mapping = internalGetAdapter(resource, ResourceMapping.class);
if (mapping instanceof ResourceMapping) {
return (ResourceMapping)mapping;
}
}
return null;
}
/* package */ ResourceMapping getContributedResourceMapping(IAdaptable element) {
Object resourceAdapter = internalGetAdapter(element, IContributorResourceAdapter.class);
if (resourceAdapter != null) {
if (resourceAdapter instanceof IContributorResourceAdapter2) {
// First, use the mapping contributor adapter to get the mapping
IContributorResourceAdapter2 mappingAdapter = (IContributorResourceAdapter2) resourceAdapter;
ResourceMapping mapping = mappingAdapter.getAdaptedResourceMapping(element);
if (mapping != null) {
return mapping;
}
}
if (resourceAdapter instanceof IContributorResourceAdapter) {
// Next, use the resource adapter to get a resource and then get the mapping for that resource
IResource resource = ((IContributorResourceAdapter)resourceAdapter).getAdaptedResource(element);
if (resource != null) {
Object mapping = internalGetAdapter(resource, ResourceMapping.class);
if (mapping instanceof ResourceMapping) {
return (ResourceMapping)mapping;
}
}
}
}
return null;
}
/* package */ Object internalGetAdapter(Object o, Class adapter) {
if (o instanceof IAdaptable) {
IAdaptable element = (IAdaptable) o;
Object adapted = element.getAdapter(adapter);
if (adapted != null)
return adapted;
}
// Fallback to the adapter manager in case the object doesn't
// implement getAdapter or in the case where the implementation
// doesn't consult the manager
return Platform.getAdapterManager().getAdapter(o, adapter);
}
}