/** * Copyright (c) 2002-2006 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.mapping.presentation; import java.util.Collection; import java.util.HashMap; import org.eclipse.jface.resource.CompositeImageDescriptor; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.ImageData; import org.eclipse.swt.graphics.Point; import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider; import org.eclipse.emf.mapping.Mapping; import org.eclipse.emf.mapping.MappingPlugin; import org.eclipse.emf.mapping.domain.AdapterFactoryMappingDomain; import org.eclipse.emf.mapping.provider.MappedObjectItemProvider; public class MappingDomainLabelProvider extends AdapterFactoryLabelProvider { static class Key { public Image mainImage; public Image overlayImage; public Key (Image mainImage, Image overlayImage) { this.mainImage = mainImage; this.overlayImage = overlayImage; } @Override public int hashCode() { return mainImage.hashCode() + overlayImage.hashCode(); } @Override public boolean equals(Object object) { if (object instanceof Key) { Key key = (Key)object; return key.mainImage == mainImage && key.overlayImage == overlayImage; } else { return false; } } } protected static HashMap<Key, Object> images = new HashMap<Key, Object>(); protected AdapterFactoryMappingDomain mappingDomain; public MappingDomainLabelProvider(AdapterFactoryMappingDomain mappingDomain) { super(mappingDomain.getAdapterFactory()); this.mappingDomain = mappingDomain; } class MappingIndicatorCompositeImage extends CompositeImageDescriptor { protected ImageData mainImage; protected ImageData overlayImage; public MappingIndicatorCompositeImage(ImageData mainImage, ImageData overlayImage) { this.mainImage = mainImage; this.overlayImage = overlayImage; } @Override public void drawCompositeImage(int width, int height) { drawImage(mainImage, 0, 0); drawImage(overlayImage, mainImage.width, 0); } @Override public Point getSize() { return new Point(mainImage.width + overlayImage.width, Math.max(mainImage.height, overlayImage.height)); } @Override public int hashCode() { return mainImage.hashCode() + overlayImage.hashCode(); } @Override public boolean equals(Object object) { if (object instanceof MappingIndicatorCompositeImage) { MappingIndicatorCompositeImage that = (MappingIndicatorCompositeImage)object; return that.mainImage == mainImage && that.overlayImage == overlayImage; } else { return false; } } } @Override public Image getColumnImage(Object object, int columnIndex) { return getImage(object); } @Override public Image getImage(Object object) { Image result = super.getImage(object); if (result != null) { Object overlayImage; Object mappedObject = object instanceof MappedObjectItemProvider ? ((MappedObjectItemProvider)object).getMappedObject() : object; Collection<? extends Mapping> mappings = mappingDomain.getMappingRoot().getMappings(mappedObject); if (mappingDomain.getMappingRoot().isTopObject(mappedObject)) { overlayImage = MappingPlugin.getPlugin().getImage(mappings.isEmpty() ? "full/ovr16/OverlayBlank" : "full/ovr16/OverlayMappedTop"); } else if (mappingDomain.getMappingRoot().isBottomObject(mappedObject)) { overlayImage = MappingPlugin.getPlugin().getImage(mappings.isEmpty() ? "full/ovr16/OverlayBlank" : "full/ovr16/OverlayMappedBottom"); } else { overlayImage= MappingPlugin.getPlugin().getImage("full/ovr16/OverlayBlank"); } Image image = getImageFromObject(overlayImage); Key key = new Key(result, image); Image cachedImage = (Image)images.get(key); if (cachedImage == null) { result = new MappingIndicatorCompositeImage(result.getImageData(), image.getImageData()).createImage(); images.put(key, result); } else { result = cachedImage; } } return result; } }