// $codepro.audit.disable com.instantiations.assist.eclipse.analysis.audit.rule.effectivejava.alwaysOverridetoString.alwaysOverrideToString, com.instantiations.assist.eclipse.analysis.deserializeabilitySecurity, com.instantiations.assist.eclipse.analysis.disallowReturnMutable, com.instantiations.assist.eclipse.analysis.enforceCloneableUsageSecurity, packageJavadoc, explicitThisUsage
/*******************************************************************************
 * Copyright (c) 2012 Ericsson AB 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:
 *     Ericsson AB - initial API and implementation
 *******************************************************************************/

package org.eclipse.mylyn.reviews.r4e.ui.internal.utils;

import org.eclipse.jface.resource.CompositeImageDescriptor;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;

/**
 * This class implements an image descriptor that is used to overlay multiple images into one. It is used to decorate
 * icons
 * 
 * @author Sebastien Dubois
 * @version $Revision: 1.0 $
 */
public class OverlayImageIcon extends CompositeImageDescriptor {

	// ------------------------------------------------------------------------
	// Constants
	// ------------------------------------------------------------------------

	/**
	 * Field TOP_LEFT. (value is 0)
	 */
	public static final int TOP_LEFT = 0;

	/**
	 * Field TOP_RIGHT. (value is 1)
	 */
	public static final int TOP_RIGHT = 1;

	/**
	 * Field BOTTOM_LEFT. (value is 2)
	 */
	public static final int BOTTOM_LEFT = 2;

	/**
	 * Field BOTTOM_RIGHT. (value is 3)
	 */
	public static final int BOTTOM_RIGHT = 3;

	// ------------------------------------------------------------------------
	// Member variables
	// ------------------------------------------------------------------------

	/**
	 * Field fBaseImage. Base image of the object
	 */
	private final Image fBaseImage;

	/**
	 * Field fOverlayImage. Image to overlay on base image
	 */
	private final Image fOverlayImage;

	/**
	 * Field fSizeOfBaseImage. Size of the base image
	 */
	private final Point fSizeOfBaseImage;

	/**
	 * Field fLocation. Location of the overlay image, relative to the base image
	 */
	private final int fLocation;

	// ------------------------------------------------------------------------
	// Constructors
	// ------------------------------------------------------------------------

	/**
	 * Constructor for overlayImageIcon.
	 * 
	 * @param aBaseImage
	 *            Image
	 * @param aOverlayImage
	 *            Image
	 * @param aLocation
	 *            int
	 */
	public OverlayImageIcon(Image aBaseImage, Image aOverlayImage, int aLocation) {
		fBaseImage = aBaseImage;
		fOverlayImage = aOverlayImage;
		fSizeOfBaseImage = new Point(fBaseImage.getBounds().width, fBaseImage.getBounds().height);
		fLocation = aLocation;
	}

	// ------------------------------------------------------------------------
	// Methods
	// ------------------------------------------------------------------------

	/**
	 * Method drawCompositeImage.
	 * 
	 * @param aWidth
	 *            int
	 * @param aHeight
	 *            int
	 */
	@Override
	protected void drawCompositeImage(int aWidth, int aHeight) {

		// To draw a composite image, the base image should be  
		// drawn first (first layer) and then the overlay image  
		// (second layer) 
		// Draw the base image using the base image's image data 
		drawImage(fBaseImage.getImageData(), 0, 0);

		// Overlaying the icon in the top left corner i.e. x and y  
		// coordinates are both zero 
		switch (fLocation) {
		// Draw on the top left corner
		case TOP_LEFT:
			drawImage(fOverlayImage.getImageData(), 0, 0);
			break;

		// Draw on top right corner  
		case TOP_RIGHT:
			drawImage(fOverlayImage.getImageData(), fSizeOfBaseImage.x - fOverlayImage.getImageData().width, 0);
			break;

		// Draw on bottom left  
		case BOTTOM_LEFT:
			drawImage(fOverlayImage.getImageData(), 0, fSizeOfBaseImage.y - fOverlayImage.getImageData().height);
			break;

		// Draw on bottom right corner  
		case BOTTOM_RIGHT:
		default:
			drawImage(fOverlayImage.getImageData(), fSizeOfBaseImage.x - fOverlayImage.getImageData().width,
					fSizeOfBaseImage.y - fOverlayImage.getImageData().height);
			break;

		}
	}

	/**
	 * Method getSize.
	 * 
	 * @return Point
	 */
	@Override
	protected Point getSize() {
		return fSizeOfBaseImage;
	}

	/**
	 * Get the image formed by overlaying different images on the base image
	 * 
	 * @return composite image
	 */
	public Image getImage() {
		return createImage();
	}
}
