/*
 * 作成日: 2005/10/10
 */
package net.sourceforge.swingx.jspread;

import java.awt.Color;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.awt.font.FontRenderContext;
import java.awt.font.TextLayout;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JComponent;


public class JSpreadUtilities {
	//private static Logger logger = Logger.getLogger(JSpreadUtilities.class);
	static Graphics2D image_g2 = new BufferedImage(1, 1, BufferedImage.TYPE_4BYTE_ABGR).createGraphics(); 
    /**
     * 文字列を表示する領域を返す.
     */
	public static Rectangle2D.Float getTextRectangle(Graphics2D g2, String text, Font font) {
		//assert g2 != null: g2;
		assert text != null;
		assert font != null;
		// Graphics2Dが指定されていない場合は、画像から作成したGraphics2Dの設定値を使用して計算する。
		if (g2 == null) g2 = image_g2;
		assert text != null && text.length() > 0: text;
		// フォントのサイズ計算
        FontRenderContext frc = g2.getFontRenderContext();
        TextLayout tl = new TextLayout(text, font, frc);
        return new Rectangle2D.Float(0, -tl.getAscent(), 
        		tl.getAdvance(), tl.getAscent()+tl.getDescent());
	}	

	/**
	 * 文字列を指定した矩形内に表示する.
	 * 複数行には対応していない.
	 * @param g2
	 * @param rect
	 * @param text		改行は含まない
	 * @param font
	 * @param alignmentX
	 * @param alignmentY
	 * @param clipping
	 * TODO:clipping
	 */
    public static void drawText(Graphics2D g2, Rectangle rect, String text, Font font, float alignmentX, float alignmentY, boolean clipping) {
    	assert rect != null;
    	assert text != null: text;
    	assert font != null;
    	assert 0.0f <= alignmentX && alignmentX <= 1.0f: alignmentX;
    	assert 0.0f <= alignmentY && alignmentY <= 1.0f: alignmentY;
    	
    	if (text.length() == 0) return;
    	Rectangle2D.Float textrect = getTextRectangle(g2, text, font);
    	float x = rect.x + (rect.width - textrect.width) * alignmentX;
    	float y = rect.y + (rect.height - textrect.height) * alignmentY;
    	//logger.debug("textrect="+textrect+" x="+x+" y="+y);
    	g2.drawString(text, x, y - textrect.y);
    }

    /**
	 * リソースからURLを取得する.
	 * @param name	"/resources/xxx.png"など
	 * @return URL
	 */
	public static URL getUrl(String name) {
        return JSpreadUtilities.class.getResource(name);
	}
	public static Cursor getAutoResizeCursor(String resourcename, String cursorname, int x, int y) throws IOException {
		BufferedImage bi = ImageIO.read(JSpreadUtilities.getUrl(resourcename));
		Cursor cursor = Toolkit.getDefaultToolkit().createCustomCursor(
				bi, new Point(x, y), cursorname);
		return cursor;
	}
	public static Cursor getCursor(String resourcename, String cursorname, int x, int y) throws IOException {
		BufferedImage image = ImageIO.read(JSpreadUtilities.getUrl(resourcename));
        Toolkit toolkit = Toolkit.getDefaultToolkit();
        Dimension dim = toolkit.getBestCursorSize(image.getWidth(), image.getHeight());
        if (dim.width != image.getWidth() || dim.height != image.getHeight()) {
              BufferedImage newimage = new BufferedImage(dim.width, dim.height, BufferedImage.TYPE_4BYTE_ABGR);
              Graphics2D g2 = (Graphics2D) newimage.getGraphics();
              g2.drawImage(image, 0, 0, new Color(255,0,0,0), null);
              image = newimage;
        }
		Cursor cursor = toolkit.createCustomCursor(image, new Point(x, y), cursorname);
		return cursor;
	}
	
	/**
	 * リソースからアイコンを取得する.
	 * @param name	"/resources/xxx.png"など
	 * @return アイコン
	 */
	public static ImageIcon getImageIcon(String name) {
        java.net.URL url = JSpreadUtilities.class.getResource(name);
        return new ImageIcon(url);
	}
	/**
	 * 指定された名前を持つコンポーネントを探す。階層になっていればその下も探す。
	 * @param comp	
	 * @param name	コンポーネントの名前.
	 * @return	見つけたコンポーネント。見つからなかった場合はnullを返す。
	 */
	public static JComponent getComponent(JComponent comp, String name) {
		if (name.equals(comp.getName())) return comp;
		for (int i=0; i<comp.getComponentCount(); i++) {
			if (! (comp.getComponent(i) instanceof JComponent)) continue;
			JComponent c = (JComponent) comp.getComponent(i);
			JComponent result = getComponent(c, name);
			if (result != null) return result;
		}
		return null;		
	}
	public static String toString(Rectangle rect) {
		return "Rectangle[x="+rect.x+", y="+rect.y
			+", width="+rect.width+", height="+rect.height+"]";
	}
}
