/******************************************************************************* * Copyright (c) 2007 Exadel, Inc. and Red Hat, Inc. * Distributed under license by Red Hat, Inc. All rights reserved. * This program is 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: * Exadel, Inc. and Red Hat, Inc. - initial API and implementation ******************************************************************************/ package org.jboss.tools.common.model.ui.navigator; import java.util.*; import org.eclipse.core.resources.IMarker; import org.eclipse.jface.resource.CompositeImageDescriptor; import org.eclipse.jface.resource.ImageRegistry; import org.eclipse.jface.viewers.*; import org.eclipse.swt.graphics.*; import org.jboss.tools.common.model.XModelObject; import org.jboss.tools.common.model.markers.XMarkerManager; import org.jboss.tools.common.model.ui.ModelUIImages; import org.jboss.tools.common.model.ui.ModelUIPlugin; public class LabelDecoratorImpl implements ILabelDecorator { public static Image emptyImage = ModelUIImages.getImage("empty_co.gif"); //$NON-NLS-1$ public static Image errorImage = ModelUIImages.getImage("error_co.gif"); //$NON-NLS-1$ public static Image warningImage = ModelUIImages.getImage("warning_co.gif"); //$NON-NLS-1$ List<ILabelProviderListener> listeners = new ArrayList<ILabelProviderListener>(); static Map<Image,Image> errorImages = new HashMap<Image,Image>(); static Map<Image,Image> warningImages = new HashMap<Image,Image>(); public LabelDecoratorImpl() {} public static ILabelProvider decorateLabelProvider(ILabelProvider provider) { ILabelDecorator decorator = new LabelDecoratorImpl(); return new DecoratingLabelProviderExt(provider, decorator); } static Set<String> missingImages = new HashSet<String>(); public Image decorateImage(Image image, Object element) { int severity = getErrorState(element); if(image == null && element instanceof XModelObject && severity > 0) { String entity = ((XModelObject)element).getModelEntity().getName(); if(!missingImages.contains(entity)) { missingImages.add(entity); ModelUIPlugin.getDefault().logWarning("Problem in " + LabelDecoratorImpl.class.getName() + ": Cannot find icon for entity " + entity); //$NON-NLS-1$ //$NON-NLS-2$ } } else if(severity == IMarker.SEVERITY_ERROR) { return getErrorImage(image); } else if(severity == IMarker.SEVERITY_WARNING) { return getWarningImage(image); } return image; } private Image getErrorImage(Image image) { Image i = (Image)errorImages.get(image); if(i == null || i.isDisposed()) { ErrorImageDescriptor d = new ErrorImageDescriptor(image, IMarker.SEVERITY_ERROR); i = d.createImage(); registerImage(i); errorImages.put(image, i); } return i; } private Image getWarningImage(Image image) { Image i = (Image)warningImages.get(image); if(i == null || i.isDisposed()) { ErrorImageDescriptor d = new ErrorImageDescriptor(image, IMarker.SEVERITY_WARNING); i = d.createImage(); registerImage(i); warningImages.put(image, i); } return i; } private void registerImage(Image i) { ImageRegistry registry = ModelUIPlugin.getDefault().getImageRegistry(); String key = "" + Math.random(); //We retrieve created images by maps, let use unique random key for registry. synchronized(registry) { registry.remove(key); //Just in case, to be on the safe side. registry.put(key, i); } } int getErrorState(Object element) { if(!(element instanceof XModelObject)) return 0; return XMarkerManager.getInstance().getErrorState((XModelObject)element); } public String decorateText(String text, Object element) { return text; } public void addListener(ILabelProviderListener listener) { listeners.add(listener); } public void dispose() {} public boolean isLabelProperty(Object element, String property) { return true; } public void removeListener(ILabelProviderListener listener) { listeners.remove(listener); } } class ErrorImageDescriptor extends CompositeImageDescriptor { Image image; int severity = 0; public ErrorImageDescriptor(Image image, int severity) { this.image = image; this.severity = severity; } protected void drawCompositeImage(int width, int height) { ImageData bg= image.getImageData(); drawImage(bg, 0, 0); drawBottomLeft(); } protected Point getSize() { Rectangle r = image.getBounds(); return new Point(r.width, r.height); } private void drawBottomLeft() { Point size= getSize(); int x= 0; if (severity == IMarker.SEVERITY_ERROR && LabelDecoratorImpl.errorImage != null) { ImageData data= LabelDecoratorImpl.errorImage.getImageData(); ///getImageData(JavaPluginImages.DESC_OVR_ERROR); drawImage(data, x, size.y - data.height); x+= data.width; } if (severity == IMarker.SEVERITY_WARNING && LabelDecoratorImpl.warningImage != null) { ImageData data= LabelDecoratorImpl.warningImage.getImageData(); drawImage(data, x, size.y - data.height); x+= data.width; } } } class DecoratingLabelProviderExt extends DecoratingLabelProvider implements IColorProvider { IColorProvider colorProvider; public DecoratingLabelProviderExt(ILabelProvider provider, ILabelDecorator decorator) { super(provider, decorator); colorProvider = (provider instanceof IColorProvider) ? (IColorProvider)provider : null; } public Color getForeground(Object element) { return (colorProvider != null) ? colorProvider.getForeground(element) : null; } public Color getBackground(Object element) { return null; } }