/*******************************************************************************
 * Copyright (c) 2000, 2003 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials 
 * are made available under the terms of the Common Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/cpl-v10.html
 * 
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package net.sourceforge.phpeclipse.phpeditor;

import net.sourceforge.phpdt.internal.ui.PHPUiImages;
import net.sourceforge.phpdt.ui.PreferenceConstants;

import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.resource.ImageRegistry;
import org.eclipse.jface.text.source.Annotation;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.texteditor.IAnnotationImageProvider;
//import net.sourceforge.phpdt.internal.ui.text.correction.JavaCorrectionProcessor;

/**
 * Image provider for annotations based on Java problem markers.
 * 
 * @since 3.0
 */
public class JavaAnnotationImageProvider implements IAnnotationImageProvider {
	
	private final static int NO_IMAGE= 0;
	private final static int GRAY_IMAGE= 1;
	private final static int OVERLAY_IMAGE= 2;
	private final static int QUICKFIX_IMAGE= 3;
	private final static int QUICKFIX_ERROR_IMAGE= 4;
	
	
	private static Image fgQuickFixImage;
	private static Image fgQuickFixErrorImage;
	private static ImageRegistry fgImageRegistry;
	
	private boolean fShowQuickFixIcon;
	private int fCachedImageType;
	private Image fCachedImage;
	
	
	public JavaAnnotationImageProvider() {
		fShowQuickFixIcon= PreferenceConstants.getPreferenceStore().getBoolean(PreferenceConstants.EDITOR_CORRECTION_INDICATION);
	}
	
	/*
	 * @see org.eclipse.jface.text.source.IAnnotationImageProvider#getManagedImage(org.eclipse.jface.text.source.Annotation)
	 */
	public Image getManagedImage(Annotation annotation) {
		if (annotation instanceof IJavaAnnotation) {
			IJavaAnnotation javaAnnotation= (IJavaAnnotation) annotation;
			int imageType= getImageType(javaAnnotation);
			return getImage(javaAnnotation, imageType, Display.getCurrent());
		}
		return null;
	}
	
	/*
	 * @see org.eclipse.jface.text.source.IAnnotationImageProvider#getImageDescriptorId(org.eclipse.jface.text.source.Annotation)
	 */
	public String getImageDescriptorId(Annotation annotation) {
		// unmanaged images are not supported
		return null;
	}

	/*
	 * @see org.eclipse.jface.text.source.IAnnotationImageProvider#getImageDescriptor(java.lang.String)
	 */
	public ImageDescriptor getImageDescriptor(String symbolicName) {
		// unmanaged images are not supported
		return null;
	}
	
	
	private boolean showQuickFix(IJavaAnnotation annotation) {
	//	return fShowQuickFixIcon && annotation.isProblem() && JavaCorrectionProcessor.hasCorrections(annotation);
	  return false;
	}
	
	private Image getQuickFixImage() {
		if (fgQuickFixImage == null)
			fgQuickFixImage= PHPUiImages.get(PHPUiImages.IMG_OBJS_FIXABLE_PROBLEM);
		return fgQuickFixImage;
	}

	private Image getQuickFixErrorImage() {
		if (fgQuickFixErrorImage == null)
			fgQuickFixErrorImage= PHPUiImages.get(PHPUiImages.IMG_OBJS_FIXABLE_ERROR);
		return fgQuickFixErrorImage;
	}
	
	private ImageRegistry getImageRegistry(Display display) {
		if (fgImageRegistry == null)
			fgImageRegistry= new ImageRegistry(display);
		return fgImageRegistry;
	}
	
	private int getImageType(IJavaAnnotation annotation) {
		int imageType= NO_IMAGE;
		if (annotation.hasOverlay())
			imageType= OVERLAY_IMAGE;
		else if (!annotation.isMarkedDeleted()) {
			if (showQuickFix(annotation))
				imageType= JavaMarkerAnnotation.ERROR_ANNOTATION_TYPE.equals(annotation.getType()) ? QUICKFIX_ERROR_IMAGE : QUICKFIX_IMAGE; 
		} else {
			imageType= GRAY_IMAGE;
		}
		return imageType;
	}

	private Image getImage(IJavaAnnotation annotation, int imageType, Display display) {
		if (fCachedImageType == imageType)
			return fCachedImage;
		
		Image image= null;
		switch (imageType) {
			case OVERLAY_IMAGE:
				IJavaAnnotation overlay= annotation.getOverlay();
				image= overlay.getImage(display);
				break;
			case QUICKFIX_IMAGE:
				image= getQuickFixImage();
				break;
			case QUICKFIX_ERROR_IMAGE:
				image= getQuickFixErrorImage();
				break;
			case GRAY_IMAGE: {
				ISharedImages sharedImages= PlatformUI.getWorkbench().getSharedImages();
				String annotationType= annotation.getType();
				if (JavaMarkerAnnotation.ERROR_ANNOTATION_TYPE.equals(annotationType)) {
					image= sharedImages.getImage(ISharedImages.IMG_OBJS_ERROR_TSK);
				} else if (JavaMarkerAnnotation.WARNING_ANNOTATION_TYPE.equals(annotationType)) {
					image= sharedImages.getImage(ISharedImages.IMG_OBJS_WARN_TSK);
				} else if (JavaMarkerAnnotation.INFO_ANNOTATION_TYPE.equals(annotationType)) {
					image= sharedImages.getImage(ISharedImages.IMG_OBJS_INFO_TSK);
				}
				if (image != null) {
					ImageRegistry registry= getImageRegistry(display);
					String key= Integer.toString(image.hashCode());
					Image grayImage= registry.get(key);
					if (grayImage == null) {
						grayImage= new Image(display, image, SWT.IMAGE_GRAY);
						registry.put(key, grayImage);
					}
					image= grayImage;
				}
				break;
			}
		}
		
		fCachedImageType= imageType;
		fCachedImage= image;
		return fCachedImage;
	}
}