package com.android.ide.eclipse.adt.internal.editors.ui;

import static org.eclipse.ui.ISharedImages.IMG_DEC_FIELD_ERROR;
import static org.eclipse.ui.ISharedImages.IMG_DEC_FIELD_WARNING;
import static org.eclipse.ui.ISharedImages.IMG_OBJS_ERROR_TSK;
import static org.eclipse.ui.ISharedImages.IMG_OBJS_WARN_TSK;

import org.eclipse.jface.resource.CompositeImageDescriptor;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.DecorationOverlayIcon;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.graphics.Point;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.PlatformUI;

/**
 * ImageDescriptor that adds a error marker.
 * Based on {@link DecorationOverlayIcon} only available in Eclipse 3.3
 */
public class ErrorImageComposite extends CompositeImageDescriptor {

    private Image mBaseImage;
    private ImageDescriptor mErrorImageDescriptor;
    private Point mSize;

    /**
     * Creates a new {@link ErrorImageComposite}
     *
     * @param baseImage the base image to overlay an icon on top of
     */
    public ErrorImageComposite(Image baseImage) {
        this(baseImage, false);
    }

    /**
     * Creates a new {@link ErrorImageComposite}
     *
     * @param baseImage the base image to overlay an icon on top of
     * @param warning if true, add a warning icon, otherwise an error icon
     */
    public ErrorImageComposite(Image baseImage, boolean warning) {
        mBaseImage = baseImage;
        ISharedImages sharedImages = PlatformUI.getWorkbench().getSharedImages();
        mErrorImageDescriptor = sharedImages.getImageDescriptor(
                warning ? IMG_DEC_FIELD_WARNING : IMG_DEC_FIELD_ERROR);
        if (mErrorImageDescriptor == null) {
            mErrorImageDescriptor = sharedImages.getImageDescriptor(
                    warning ? IMG_OBJS_WARN_TSK : IMG_OBJS_ERROR_TSK);
        }
        mSize = new Point(baseImage.getBounds().width, baseImage.getBounds().height);
    }

    @Override
    protected void drawCompositeImage(int width, int height) {
        ImageData baseData = mBaseImage.getImageData();
        drawImage(baseData, 0, 0);

        ImageData overlayData = mErrorImageDescriptor.getImageData();
        if (overlayData.width == baseData.width && overlayData.height == baseData.height) {
            overlayData = overlayData.scaledTo(14, 14);
            drawImage(overlayData, -3, mSize.y - overlayData.height + 3);
        } else {
            drawImage(overlayData, 0, mSize.y - overlayData.height);
        }
    }

    @Override
    protected Point getSize() {
        return mSize;
    }
}
