/**
 * Copyright (C) 2006-2007  NTT DATA CORPORATION
 * 
 * Version: 1.0.0 2007/04/01
 *  
 */
package net.cellcomputing.himawari.display;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.TexturePaint;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;

import javax.swing.JPanel;

/**
 * @author NTT DATA Corporation
 * Imageを表示するためのPanel。
 * αチャンネルが指定されているImageを扱う場合は
 * チェック柄が背景に描画される。
 */
public strictfp class FrameBufferPanel extends JPanel {
	
	private static final long serialVersionUID = -983819772199207027L;
	
	private BufferedImage image;								//表示するImage
	private BufferedImage checkImage;							//チェック柄のimage
	
	private Rectangle2D.Double image_size;						//imageのサイズ
	private TexturePaint checkPaint;							//チェック柄のTexture
	
	private static int CHECK_SIZE = 32;						//チェック柄のサイズ
	private static  int CHECK_HALF_SIZE = CHECK_SIZE / 2 ;	//チェック柄の半分のサイズ
	
//	private static AffineTransform trans;						//倍率変換のための
	
	/**
	 * コンストラクタ
	 * 表示する画像を引数にとる
	 * 
	 * @param image 表示する画像
	 */
	public FrameBufferPanel(BufferedImage image){
		this.image = image;
		setSize(image.getWidth(),image.getHeight());
		setPreferredSize(new Dimension(image.getWidth(),image.getHeight()));

		//αチャンネルを指定されているのであればチェッカー柄を作成する
		createCheckerImage(image);
		
		//倍率指定をするためのインスタンス
//		trans = new AffineTransform();
		
		//--マウス処理を加える
		//------テスト
//		addMouseListener(new MouseAdapter() {
//            public void mousePressed(MouseEvent e) {
//            	if(SwingUtilities.isRightMouseButton(e))
//                	ZoomIn();
//            	else
//            		ZoomOut();
//            }
//		});
	}

//
//	/**
//	 * 倍率を0.2上げる
//	 *
//	 */
//	public void ZoomIn(){
//		trans.setToScale(trans.getScaleX()+0.2,trans.getScaleX()+0.2);
////		setSize(new Dimension((int)(image.getWidth()*trans.getScaleX()),(int)(image.getHeight()*trans.getScaleY())));
//		repaint();
//	}
//	/**
//	 * 倍率を0.2下げる
//	 *
//	 */
//	public void ZoomOut(){
//		trans.setToScale(trans.getScaleX()-0.2,trans.getScaleX()-0.2);
////		setSize(new Dimension((int)(image.getWidth()*trans.getScaleX()),(int)(image.getHeight()*trans.getScaleY())));
//		repaint();
//	}
	
	/**
	 * チェッカー柄のイメージを作成する
	 * @param image
	 */
	private void createCheckerImage(BufferedImage image) {
		if(image.getType() == BufferedImage.TYPE_INT_ARGB){
			checkImage = new BufferedImage(CHECK_SIZE,CHECK_SIZE,BufferedImage.TYPE_INT_ARGB);
			Graphics g = checkImage.getGraphics();
			g.setColor(Color.WHITE);
			g.fillRect(CHECK_HALF_SIZE,CHECK_HALF_SIZE,CHECK_HALF_SIZE,CHECK_HALF_SIZE);
			g.fillRect(0,0,CHECK_HALF_SIZE,CHECK_HALF_SIZE);
			g.setColor(Color.GRAY);
			g.fillRect(CHECK_HALF_SIZE,0,CHECK_HALF_SIZE,CHECK_HALF_SIZE);
			g.fillRect(0,CHECK_HALF_SIZE,CHECK_HALF_SIZE,CHECK_HALF_SIZE);
			
			checkPaint = new TexturePaint(checkImage,new Rectangle2D.Double(0,0,CHECK_SIZE,CHECK_SIZE));
			image_size = new Rectangle2D.Double(0,0,image.getWidth(),image.getHeight());
		}
	}
	
	/**
	 * 画面をリフレッシュされたときに
	 * 描画を行うメソッド。
	 * 
	 * @param g
	 */
	protected void paintComponent(Graphics g) {
		super.paintComponent(g);
//		((Graphics2D)g).setTransform(trans);
		//αチャンネルをしていされていたならば、check模様を書く
		if(image.getType() == BufferedImage.TYPE_INT_ARGB){
			paintCheckMark(g);
		}
		
		g.drawImage(image,0,0,this);
	}
	
	/**
	 * 画面をimageのサイズ分
	 * チェック柄で塗りつぶす。
	 * @param g
	 */
	private void paintCheckMark(Graphics g){
		((Graphics2D)g).setPaint(checkPaint);
		((Graphics2D)g).fill(image_size);
	}
}
