/*******************************************************************************
 * 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;

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