/*
 * "Peko" Visual Novel System
 *
 * All Rights Reserved.
 * Copyright (c) 1999-2003 Tsukuba Bunko.
 *
 * $Id: Line.java,v 1.1.2.1 2003/12/11 10:22:54 ppoi Exp $
 */
package tsukuba_bunko.peko.canvas.text;

import	java.io.Serializable;

import	java.awt.Color;
import	java.awt.Graphics2D;
import	java.awt.Shape;

import	java.awt.font.TextAttribute;
import	java.awt.font.TextLayout;

import	java.text.AttributedString;


/**
 * ページに描画される行です。
 * @author	$Author: ppoi $
 * @version	$Revision: 1.1.2.1 $
 */
public class Line	implements Serializable	{

	/**
	 * 描画する TextLayout
	 */
	transient private TextLayout	_textLayout = null;

	/**
	 * shadow
	 */
	transient private Shape	_shape = null;

	/**
	 * line span
	 */
	private float	_lineSpan = 0f;

	/**
	 */
	private Color	_foreground = null;

	/**
	 */
	private Color	_shadowColor = Color.black;

	/**
	 * この行に描画される文字列
	 */
	private String	_text = null;


	/**
	 * <code>Line</code> のインスタンスを作成します。
	 */
	public Line()
	{
		super();
	}

	/**
	 * 描画に使用する前景色を指定します。
	 * @param	color	前景色
	 */
	public void setForeground( Color color )
	{
		_foreground = color;
	}

	/**
	 * 描画に使用する前景色を取得します。
	 * @return	前景色
	 */
	public Color getForeground()
	{
		return _foreground;
	}

	/**
	 * 描画に使用する影の色を指定します。
	 * @param	color	影の色
	 */
	public void setShadowColor( Color color )
	{
		_shadowColor = color;
	}

	/**
	 * 描画に使用する影の色を取得します。
	 * @return	描画に使用する影の色
	 */
	public Color getShadowColor()
	{
		return _shadowColor;
	}

	/**
	 * 描画する文字列を設定します。
	 * @param	text	描画する文字列
	 */
	public void setText( String text )
	{
		_text = text;
	}

	/**
	 * 描画する文字列を取得します。
	 * @return	描画する文字列
	 */
	public String getText()
	{
		return _text;
	}

	/**
	 * 描画する TextLayout を設定します。
	 * @param	layout	描画する TextLayout
	 */
	public void setTextLayout( TextLayout layout )
	{
		_textLayout = layout;
		_shape = layout.getOutline( null );
	}

	/**
	 * 描画する TextLayout を取得します。
	 * @return	描画する TextLayout
	 */
	public TextLayout getTextLayout()
	{
		return _textLayout;
	}

	/**
	 * 行間隔を設定します。
	 * @param	lineSpan	行間隔
	 */
	public void setLineSpan( float lineSpan )
	{
		_lineSpan = lineSpan;
	}

	/**
	 * 行間隔を取得します。
	 * @return	行間隔
	 */
	public float getLineSpan()
	{
		return _lineSpan;
	}

	/**
	 * ベースラインより上の部分の長さ(ascent)を取得します。ascent には、行間隔部分も含まれます。
	 * @return	ascent
	 */
	public float getAscent()
	{
		return _textLayout.getAscent() + _lineSpan;
	}

	/**
	 * ベースラインより下の部分の長さ(descent)を取得します。
	 * @return	descent
	 */
	public float getDescent()
	{
		return _textLayout.getDescent();
	}

	/**
	 * 行の長さ(advance)を取得します。
	 * @return	advance
	 */
	public float getAdavance()
	{
		return _textLayout.getAdvance();
	}

	/**
	 * 行を描画します。
	 * @param	g2	グラフィックコンテクスト
	 * @param	x	描画開始位置の x 座標
	 * @param	y	ベースラインの y 座標
	 */
	public void draw( Graphics2D g2, float x, float y )
	{
		Graphics2D	g = (Graphics2D)g2.create();
		g.translate( (int)x + 2, (int)y + 2 );
		if( _shadowColor == null )	{
			g.setColor( Color.black );
		}
		else	{
			g.setColor( _shadowColor );
		}
		g.setRenderingHint( java.awt.RenderingHints.KEY_ANTIALIASING, java.awt.RenderingHints.VALUE_ANTIALIAS_ON );
		g.fill( _shape );

		Color	original = g2.getColor();
		if( _foreground != null )	{
			g2.setColor( _foreground );
		}
		_textLayout.draw( g2, x, y );

		g2.setColor( original );
	}


	/**
	 * 描画の準備を行います。
	 */
	public void prepare( Page page )
	{
		if( _textLayout == null )	{
			AttributedString	astring = new AttributedString( _text );
			astring.addAttribute( TextAttribute.FONT, page.getDefaultFont() );
			astring.addAttribute( TextAttribute.FOREGROUND, page.getForeground() );

			setTextLayout( new TextLayout(astring.getIterator(), page.getFontRenderContext()) );
		}
	}
}
