blob: a809c3126e148c08ff4bfc3b762c60d95524d2b7 [file] [log] [blame]
package org.eclipse.gmf.tooling.runtime.providers;
import org.eclipse.emf.common.notify.AdapterFactory;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EClassifier;
import org.eclipse.emf.ecore.ENamedElement;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.edit.command.CreateChildCommand;
import org.eclipse.emf.edit.provider.IItemLabelProvider;
import org.eclipse.emf.edit.ui.provider.ExtendedImageRegistry;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.resource.ImageRegistry;
import org.eclipse.swt.graphics.Image;
public class DiagramElementTypeImages {
private AdapterFactory myAdapterFactory;
private ImageRegistry myImageRegistry;
public DiagramElementTypeImages(AdapterFactory adapterFactory) {
this(adapterFactory, new ImageRegistry());
}
public DiagramElementTypeImages(AdapterFactory adapterFactory, ImageRegistry imageRegistry) {
myAdapterFactory = adapterFactory;
myImageRegistry = imageRegistry;
}
public ImageRegistry getImageRegistry() {
if (myImageRegistry == null) {
myImageRegistry = new ImageRegistry();
}
return myImageRegistry;
}
public String getImageRegistryKey(ENamedElement element) {
return element.getName();
}
public Image getImage(ENamedElement element) {
if (element == null) {
return null;
}
getImageDescriptor(element); //ensures is cached in registry
String key = getImageRegistryKey(element);
return getImageRegistry().get(key);
}
public ImageDescriptor getImageDescriptor(ENamedElement element) {
if (element == null) {
return null;
}
String key = getImageRegistryKey(element);
ImageDescriptor imageDescriptor = getImageRegistry().getDescriptor(key);
if (imageDescriptor == null) {
imageDescriptor = getProvidedImageDescriptor(element);
if (imageDescriptor == null) {
imageDescriptor = ImageDescriptor.getMissingImageDescriptor();
}
getImageRegistry().put(key, imageDescriptor);
}
return imageDescriptor;
}
public ImageDescriptor getProvidedImageDescriptor(ENamedElement element) {
if (element instanceof EStructuralFeature) {
// ImageDescriptor feelingLucky = getReferenceImageDescritor((EStructuralFeature) element);
// if (feelingLucky != null) {
// return feelingLucky;
// }
EStructuralFeature feature = ((EStructuralFeature) element);
EClass eContainingClass = findNotAbstractEClassOrSubClass(feature.getEContainingClass());
EClass eType = findNotAbstractEClassOrSubClass(feature.getEType());
if (eContainingClass != null && !eContainingClass.isAbstract()) {
element = eContainingClass;
} else if (eType != null && !eType.isAbstract()) {
element = eType;
}
}
if (element instanceof EClass) {
EClass eClass = (EClass) element;
if (!eClass.isAbstract()) {
EObject instance = eClass.getEPackage().getEFactoryInstance().create(eClass);
return getItemImageDescriptor(instance);
}
}
// TODO : support structural features
return null;
}
public ImageDescriptor getItemImageDescriptor(EObject item) {
IItemLabelProvider labelProvider = (IItemLabelProvider) myAdapterFactory.adapt(item, IItemLabelProvider.class);
if (labelProvider != null) {
return ExtendedImageRegistry.getInstance().getImageDescriptor(labelProvider.getImage(item));
}
return null;
}
public ImageDescriptor getReferenceImageDescritor(EStructuralFeature feature) {
EObject containerInstance = instantiate(feature.getEContainingClass());
if (containerInstance == null) {
return null;
}
IItemLabelProvider labelProvider = (IItemLabelProvider) myAdapterFactory.adapt(containerInstance, IItemLabelProvider.class);
if (false == labelProvider instanceof CreateChildCommand.Helper) {
return null;
}
CreateChildCommand.Helper helper = (CreateChildCommand.Helper) labelProvider;
Object imageUrl = helper.getCreateChildImage(containerInstance, feature, null, null);
if (imageUrl == null) {
EObject child = instantiate(feature.getEType());
if (child != null) {
imageUrl = helper.getCreateChildImage(containerInstance, feature, child, null);
}
}
if (imageUrl == null) {
return null;
}
return ExtendedImageRegistry.getInstance().getImageDescriptor(imageUrl);
}
protected EObject instantiate(EClassifier classifier) {
if (false == classifier instanceof EClass) {
return null;
}
EClass instantiatable = findNotAbstractEClassOrSubClass((EClass) classifier);
return instantiatable == null ? null : instantiatable.getEPackage().getEFactoryInstance().create(instantiatable);
}
protected EClass findNotAbstractEClassOrSubClass(EClassifier classifier) {
if (false == classifier instanceof EClass) {
return null;
}
EClass eClass = (EClass) classifier;
if (!eClass.isAbstract()) {
return eClass;
}
for (EClassifier nextFromSameEPackage : eClass.getEPackage().getEClassifiers()) {
if (nextFromSameEPackage instanceof EClass) {
EClass nextEClass = (EClass) nextFromSameEPackage;
if (!nextEClass.isAbstract() && eClass.isSuperTypeOf(nextEClass)) {
return nextEClass;
}
}
}
return null;
}
}