/*******************************************************************************
 * Copyright (C) 2007 The University of Manchester   
 * 
 *  Modifications to the initial code base are copyright of their
 *  respective authors, or their employers as appropriate.
 * 
 *  This program is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public License
 *  as published by the Free Software Foundation; either version 2.1 of
 *  the License, or (at your option) any later version.
 *    
 *  This program is distributed in the hope that it will be useful, but
 *  WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *    
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
 ******************************************************************************/
package net.sf.taverna.t2.lang.ui;

import java.awt.Color;
import java.awt.GradientPaint;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.SystemColor;
import java.awt.RenderingHints.Key;
import java.awt.geom.GeneralPath;
import java.awt.geom.Line2D;
import java.awt.image.BufferedImage;
import java.util.HashMap;
import java.util.Map;

/**
 * A BufferedImage of one of four types of arrow (up, down, left or right) drawn
 * to the size specified on the constructor.
 */
public class CArrowImage extends BufferedImage {
	// Constants...
	public static final int ARROW_UP = 0;

	public static final int ARROW_DOWN = 1;

	public static final int ARROW_LEFT = 2;

	public static final int ARROW_RIGHT = 3;

	// Member variables...
	private GeneralPath _pathArrow = new GeneralPath();

	// Constructor...
	public CArrowImage(int nArrowDirection) {
		this(15, 9, nArrowDirection);
	}

	public CArrowImage(int nWidth, int nHeight, int nArrowDirection) {
		super(nWidth, nHeight, TYPE_INT_ARGB_PRE); // Set the width, height and
		// image type

		Map<Key, Object> map = new HashMap<Key, Object>();
		map.put(RenderingHints.KEY_ANTIALIASING,
				RenderingHints.VALUE_ANTIALIAS_ON);
		map.put(RenderingHints.KEY_RENDERING,
				RenderingHints.VALUE_RENDER_QUALITY);
		RenderingHints hints = new RenderingHints(map);

		Graphics2D g2 = this.createGraphics(); // Create a graphics context for
		// this buffered image
		g2.setRenderingHints(hints);

		float h = getHeight();
		float w = getWidth();
		float w13 = w / 3;
		float w12 = w / 2;
		float w23 = w * 2 / 3;
		float h13 = h / 3;
		float h12 = h / 2;
		float h23 = h * 2 / 3;

		switch (nArrowDirection) {
		case ARROW_UP:
			_pathArrow.moveTo(w12, h12);
			_pathArrow.lineTo(w12, 0);
			_pathArrow.lineTo(w, h - 1);
			_pathArrow.lineTo(0, h - 1);
			_pathArrow.closePath();
			g2.setPaint(new GradientPaint(w13, h13,
					SystemColor.controlLtHighlight, w, h - 1,
					SystemColor.controlShadow));

			g2.fill(_pathArrow);

			g2.setColor(SystemColor.controlDkShadow);
			g2.draw(new Line2D.Float(0, h - 1, w, h - 1));
			g2.setColor(SystemColor.controlShadow);
			g2.draw(new Line2D.Float(w12, 0, w, h - 1));
			g2.setColor(SystemColor.controlLtHighlight);
			g2.draw(new Line2D.Float(0, h - 1, w12, 0));
			break;

		case ARROW_DOWN:
			_pathArrow.moveTo(w12, h12);
			_pathArrow.lineTo(w, 0);
			_pathArrow.lineTo(w12, h - 1);
			_pathArrow.closePath();
			g2.setPaint(new GradientPaint(0, 0, SystemColor.controlLtHighlight,
					w23, h23, SystemColor.controlShadow));
			g2.fill(_pathArrow);

			g2.setColor(SystemColor.controlDkShadow);
			g2.draw(new Line2D.Float(w, 0, w12, h - 1));
			g2.setColor(SystemColor.controlShadow);
			g2.draw(new Line2D.Float(w12, h - 1, 0, 0));
			g2.setColor(SystemColor.controlLtHighlight);
			g2.draw(new Line2D.Float(0, 0, w, 0));
			break;

		case ARROW_LEFT:
			_pathArrow.moveTo(w - 1, h13);
			_pathArrow.lineTo(w13, h13);
			_pathArrow.lineTo(w13, 0);
			_pathArrow.lineTo(0, h12);
			_pathArrow.lineTo(w13, h - 1);
			_pathArrow.lineTo(w13, h23);
			_pathArrow.lineTo(w - 1, h23);
			_pathArrow.closePath();
			g2.setPaint(new GradientPaint(0, 0, Color.white, // SystemColor.
																// controlLtHighlight
																// ,
					0, h, SystemColor.controlShadow));
			g2.fill(_pathArrow);

			_pathArrow.reset();
			_pathArrow.moveTo(w13, 0);
			_pathArrow.lineTo(w13, h13);
			_pathArrow.moveTo(w - 1, h13);
			_pathArrow.lineTo(w - 1, h23);
			_pathArrow.lineTo(w13, h23);
			_pathArrow.lineTo(w13, h - 1);
			g2.setColor(SystemColor.controlDkShadow);
			g2.draw(_pathArrow);

			g2.setColor(SystemColor.controlShadow);
			g2.draw(new Line2D.Float(0, h12, w13, h - 1));

			_pathArrow.reset();
			_pathArrow.moveTo(0, h12);
			_pathArrow.lineTo(w13, 0);
			_pathArrow.moveTo(w13, h13);
			_pathArrow.lineTo(w - 1, h13);
			g2.setColor(SystemColor.controlLtHighlight);
			g2.draw(_pathArrow);
			break;

		case ARROW_RIGHT:
		default: {
			_pathArrow.moveTo(0, h13);
			_pathArrow.lineTo(w23, h13);
			_pathArrow.lineTo(w23, 0);
			_pathArrow.lineTo(w - 1, h12);
			_pathArrow.lineTo(w23, h - 1);
			_pathArrow.lineTo(w23, h23);
			_pathArrow.lineTo(0, h23);
			_pathArrow.closePath();
			g2.setPaint(new GradientPaint(0, 0, Color.white, // SystemColor.
																// controlLtHighlight
																// ,
					0, h, SystemColor.controlShadow));
			g2.fill(_pathArrow);

			_pathArrow.reset();
			_pathArrow.moveTo(0, h23);
			_pathArrow.lineTo(w23, h23);
			_pathArrow.moveTo(w23, h - 1);
			_pathArrow.lineTo(w - 1, h12);
			g2.setColor(SystemColor.controlDkShadow);
			g2.draw(_pathArrow);

			g2.setColor(SystemColor.controlShadow);
			g2.draw(new Line2D.Float(w - 1, h12, w23, 0));

			_pathArrow.reset();
			_pathArrow.moveTo(w23, 0);
			_pathArrow.lineTo(w23, h13);
			_pathArrow.lineTo(0, h13);
			_pathArrow.lineTo(0, h23);
			_pathArrow.moveTo(w23, h23);
			_pathArrow.lineTo(w23, h - 1);
			g2.setColor(SystemColor.controlLtHighlight);
			g2.draw(_pathArrow);
			break;
		}
		}

	}

}
