package cc.char_indexingtool;

import java.awt.BasicStroke;
import java.awt.Font;
import java.awt.font.FontRenderContext;
import java.awt.font.GlyphVector;
import java.awt.geom.Area;

import cc.movabletype.ChineseCharacterMovableTypeTzu;
import cc.movabletype.PieceMovableTypeWen;
import cc.movabletype.SeprateMovabletype;
import idsrend.charcomponent.FinalCharComponent;
import idsrend.charcomponent.NonFinalCharComponent;
import cc.movabletype.PlaneGeometry;

/**
 * 物件活字設定工具。將部件結構(<code>ChineseCharacter</code>)轉換成活字結構(
 * <code>PieceMovableType</code>)。把活字的資訊全部集中在同一個物件上(<code>Piece</code>,
 * <code>RectangularArea</code>型態 ),方便函式傳遞與使用,而且物件上也有相對應操縱的函式。
 * <p>
 * <code>SimplePiece</code>是在設定時兩兩配對後定框,調整時更改部件大小,但無法物件難實作距離貼近或拉開。
 * 
 * @author Ihc
 */
public abstract class SimplePieceSetter extends ObjMovableTypeBasicSettingTool
{
	/** 活字字型的名稱 */
	private String fontName;
	/** 活字字型的選項 */
	private int fontStyle;
	/** 活字的點距 */
	private int fontResolution;
	/** 活字的渲染屬性 */
	protected FontRenderContext fontRenderContext;
	/** 活字的字體 */
	protected Font font;

	/**
	 * 建立物件活字設定工具
	 * 
	 * @param fontName
	 *            活字字型的名稱
	 * @param fontStyle
	 *            活字字型的選項
	 * @param fontResolution
	 *            活字的點距
	 * @param fontRenderContext
	 *            活字的渲染屬性
	 */
	public SimplePieceSetter(String fontName, int fontStyle,
			int fontResolution, FontRenderContext fontRenderContext)
	{
		super(null, null);
		this.fontName = fontName;
		this.fontStyle = fontStyle;
		this.fontResolution = fontResolution;
		this.fontRenderContext = fontRenderContext;
		this.font = new Font(fontName, fontStyle, fontResolution);
		GlyphVector glyphVector = font.createGlyphVector(fontRenderContext,
				SimplePieceSetter.tzuModelCharacter);
		this.tzuModelTerritory = glyphVector.getOutline().getBounds2D();
		BasicStroke basicStroke = new BasicStroke();
		this.pieceForNoBuiltInWen = new Area(
				basicStroke.createStrokedShape(tzuModelTerritory));
	}

	@Override
	public PieceMovableTypeWen setWen(ChineseCharacterMovableTypeTzu parent,
			NonFinalCharComponent chineseCharacterWen)
	{
		SeprateMovabletype rectangularArea = null;
		if (font.canDisplay(chineseCharacterWen.Unicode編號()))
		{
			GlyphVector glyphVector = font.createGlyphVector(fontRenderContext,
					chineseCharacterWen.部件組字式());
			rectangularArea = new SeprateMovabletype(new PlaneGeometry(glyphVector.getOutline()));
			rectangularArea.設字範圍(tzuModelTerritory);
			rectangularArea.設目標範圍(rectangularArea.這馬字範圍());
		}
		else
		{
			rectangularArea = findWenForNoBuiltIn(chineseCharacterWen);
		}
		rectangularArea.徙轉原點();

		PieceMovableTypeWen pieceMovableTypeWen = new PieceMovableTypeWen(
				parent, chineseCharacterWen, rectangularArea);
		return pieceMovableTypeWen;
	}

	/**
	 * 設定底下活字部件
	 * 
	 * @param chineseCharacterMovableTypeTzu
	 *            目前設定的合體活字
	 * @param chineseCharacterTzu
	 *            目前設定的字部件
	 */
	protected void setChildrenRecursively(
			ChineseCharacterMovableTypeTzu chineseCharacterMovableTypeTzu,
			FinalCharComponent chineseCharacterTzu)
	{
		for (int i = 0; i < chineseCharacterMovableTypeTzu.getChildren().length; ++i)
		{
			chineseCharacterMovableTypeTzu.getChildren()[i] = chineseCharacterTzu
					.底下元素()[i].typeset(this,
					chineseCharacterMovableTypeTzu);
		}
		return;
	}

	/**
	 * 取得活字字型的名稱
	 * 
	 * @return 活字字型的名稱
	 */
	public String getFontName()
	{
		return fontName;
	}

	/**
	 * 取得活字字型的選項
	 * 
	 * @return 活字字型的選項
	 */
	public int getFontStyle()
	{
		return fontStyle;
	}

	/**
	 * 取得活字的點距
	 * 
	 * @return 活字的點距
	 */
	public int getFontResolution()
	{
		return fontResolution;
	}

	/**
	 * 取得活字的渲染屬性
	 * 
	 * @return 活字的渲染屬性
	 */
	public FontRenderContext getFontRenderContext()
	{
		return fontRenderContext;
	}
}