package org.newdawn.slick.tools.packulike;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.TexturePaint;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.util.ArrayList;

import javax.swing.JPanel;

/**
 * The panel displaying the currently generated sprite sheet
 * 
 * @author kevin
 */
public class SheetPanel extends JPanel {
	/** The image currently generated */
	private Image image;
	/** The background paint to show transparency */
	private TexturePaint background;
	/** The width of the image */
	private int width;
	/** The height of the image */
	private int height;
	/** The sheet that has been generated */
	private Sheet sheet;
	/** The packer tool this panel is part of */
	private Packer packer;
	/** The list of selected sprites */
	private ArrayList selected = new ArrayList();
	
	/**
	 * Create a panel showing a sprite sheet
	 * 
	 * @param p The GUI tool this panel is part of
	 */
	public SheetPanel(Packer p) {
		this.packer = p;
		
		Color base = Color.gray;
		BufferedImage image = new BufferedImage(50, 50,
				BufferedImage.TYPE_INT_ARGB);
		Graphics2D g = (Graphics2D) image.getGraphics();
		g.setColor(base);
		g.fillRect(0, 0, image.getWidth(), image.getHeight());
		g.setColor(base.darker());
		g.fillRect(image.getWidth() / 2, 0, image.getWidth() / 2, image
				.getHeight() / 2);
		g.fillRect(0, image.getHeight() / 2, image.getWidth() / 2, image
				.getHeight() / 2);

		background = new TexturePaint(image, new Rectangle(0, 0, image
				.getWidth(), image.getHeight()));
		
		addMouseListener(new MouseAdapter() {
			public void mousePressed(MouseEvent e) {
				Sprite sprite = packer.getSpriteAt(e.getX(), e.getY());
				
				if (sprite != null) {
					ArrayList selection = new ArrayList();
					if ((e.getModifiersEx() & MouseEvent.SHIFT_DOWN_MASK) != 0) {
						selection.addAll(selected);
					}
					selection.add(sprite);
					
					packer.select(selection);
				}
			}
		});
	}
	
	/**
	 * Set the list of selected sprites
	 * 
	 * @param sprites THe list of selected sprites
	 */
	public void setSelection(ArrayList sprites) {
		this.selected = sprites;
		repaint(0);
	}
	
	/**
	 * Set the size of the sprite sheet
	 * 
	 * @param width The width of the sheet
	 * @param height The height of the sheet
	 */
	public void setTextureSize(int width, int height) {
		setPreferredSize(new Dimension(width, height));
		setSize(new Dimension(width, height));
		this.width = width;
		this.height = height;
	}
	
	/**
	 * Set the image to be displayed (the sprite sheet)
	 * 
	 * @param sheet The sheet to be displayed
	 */
	public void setImage(Sheet sheet) {
		this.sheet = sheet;
		this.image = sheet.getImage();
		repaint(0);
	}
	
	/**
	 * @see javax.swing.JComponent#paint(java.awt.Graphics)
	 */
	public void paint(Graphics g1d) {
        Graphics2D g = (Graphics2D) g1d;
        
		g.setPaint(background);
		g.fillRect(0,0,getWidth(), getHeight());
		g.setColor(Color.yellow);
		g.drawRect(0,0,width,height);
		
		if (image != null) {
			g.drawImage(image, 0, 0, null);
		}
		
		g.setColor(Color.green);
		for (int i=0;i<selected.size();i++) {
			Sprite sprite = (Sprite) selected.get(i);
			
			g.drawRect(sprite.getX(), sprite.getY(), sprite.getWidth(), sprite.getHeight());
		}
	}
}