| 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; |
| } |
| |
| } |