org.eclipse.emf.edit.provider.IChildCreationExtender Maven / Gradle / Ivy
/**
* Copyright (c) 2008 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 - Initial API and implementation
*/
package org.eclipse.emf.edit.provider;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import org.eclipse.emf.common.util.ResourceLocator;
import org.eclipse.emf.edit.EMFEditPlugin;
import org.eclipse.emf.edit.domain.EditingDomain;
/**
* An interface used by objects that can extend the results of
* {@link IEditingDomainItemProvider#getNewChildDescriptors(Object, EditingDomain, Object) IEditingDomainItemProvider.getNewChildDescriptors}.
*/
public interface IChildCreationExtender
{
/**
* Returns a collection of objects describing the children that can be added
* under the given object in the editing domain.
*/
Collection> getNewChildDescriptors(Object object, EditingDomain editingDomain);
/**
* Returns a resource locator than can locate resources related to the child descriptors.
*/
ResourceLocator getResourceLocator();
/**
* A descriptor can create a child creation extender.
* They are used as the values in a {@link Descriptor.Registry registry}.
*/
interface Descriptor
{
/**
* Creates a child creation extender.
* @return a new child creation extender.
*/
IChildCreationExtender createChildCreationExtender();
/**
* A registry is an index that takes a namespace and maps it to a collection of {@link Descriptor descriptor}s.
*/
interface Registry
{
/**
* The global registry typically populated by plugin registration.
*/
Registry INSTANCE = EMFEditPlugin.getChildCreationExtenderDescriptorRegistry();
/**
* Returns collection of descriptors that can create a child creation extenders.
* @param namespace a key which will typically be the namespace of the package for which to create child creation extenders.
* @return a collection of descriptors that can create a child creation extender.
*/
Collection getDescriptors(String namespace);
/**
* A simple registry implementation that supports delegation.
*/
class Impl extends HashMap> implements Registry
{
private static final long serialVersionUID = 1L;
/**
* The delegate registry should lookup fail locally.
*/
protected Registry delegateRegistry;
/**
* Creates an instance.
* @param delegateRegistry null
or a registration that should act as the delegate.
*/
public Impl(Registry delegateRegistry)
{
this.delegateRegistry = delegateRegistry;
}
public Collection getDescriptors(String namespace)
{
Collection descriptor = get(namespace);
return descriptor == null ? delegatedGetDescriptors(namespace) : descriptor;
}
/**
* This is called when local lookup fails.
*/
protected Collection delegatedGetDescriptors(String namespace)
{
if (delegateRegistry != null)
{
return delegateRegistry.getDescriptors(namespace);
}
return Collections.emptyList();
}
}
}
}
}