/**
 * LOGICAL-PARADOX.ORG b-tree library
 * Copyright (C)2004 satoshi akabane(akabane@logical-paradox.org)
 *
 * Release 1.0
 * ・初期パージョン
 */
package org.logical_paradox.common.btree.simulation.bts;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.Rectangle;

import org.logical_paradox.common.btree.BtreeException;
import org.logical_paradox.common.btree.BtreeKey;
import org.logical_paradox.common.util.StringUtils;

/**
 * 描画可能なレクタングル情報を持つBtreeKey
 * @author satoshi akabane@logical-paradox.org
 * @version 1.0
 */
public class DrawableBtreeKey extends BtreeKey implements Drawable {
	public static final int KEY_BYTE_SIZE = 16;
	protected Rectangle rectangle;
	protected String _key;

	/**
	 * バイトストリームからキーを復元するタイプのコンストラクタ
	 * @param bstream バイトストリーム
	 * @throws BtreeException バイトストリームからキーの復元ができなかった
	 */
	public DrawableBtreeKey(byte[] bstream) throws BtreeException {
		super(bstream);
	}
	/**
	 * オブジェクトからキーを復元するコンストラクタ
	 * @param o オブジェクト
	 * @throws BtreeException 指定されたオブジェクトからキーを復元できなかった
	 */
	public DrawableBtreeKey(Object o) throws BtreeException {
		super(o);
	}
	/**
	 * オブジェクトからBtreeKeyの実体を生成する．<br>
	 * ※このメソッドは公開されない．通常は<br>
	 * ※public void objectToBtreeKey(String str)<br>
	 * ※のほうを使用する
	 * @param o オブジェクト
	 * @throws BtreeException 実体化に失敗した
	 */
	protected void objectToBtreeKey(Object o) throws BtreeException {
		if(o instanceof java.lang.String == false) {
			throw new BtreeException("引数オブジェクトはjava.lang.Stringのみ有効です");
		}
		_key = (String)o;
	}

	/**
	 * オブジェクトからBtreeKeyの実体を生成する．<br>
	 * ※このメソッドは公開されない．通常は<br>
	 * ※public void objectToBtreeKey(String str)<br>
	 * ※のほうを使用する
	 * @param o オブジェクト
	 * @throws BtreeException 実体化に失敗した
	 */
	protected void byteStreamToBtreeKey(byte[] bstream) throws BtreeException {
		_key = new String(bstream).trim();
	}

	/**
	 * キーの文字列形式を返す．
	 * @return String キーの文字列形式
	 */
	public String toString() {
		return _key;
	}

	/**
	 * キーを比較する．
	 * @param obj 比較対象
	 * @return boolean true: 同じである / false: 違う
	 */
	public boolean equals(Object obj) {
		return _key.equals(obj.toString());
	}

	/**
	 * 指定されたキーより小さいかどうかを返す
	 * @param key 比較対象
	 * @return boolean true: this < key / false: this >= key
	 */
	public boolean isLessThan(BtreeKey key) {
		return _key.compareTo(key.toString()) < 0;
	}

	/**
	 * 指定されたキーより大きいかどうかを返す
	 * @param key 比較対象
	 * @return boolean true: this > key / false: this <= key
	 */
	public boolean isGreaterThan(BtreeKey key) {
		return _key.compareTo(key.toString()) > 0;
	}

	/**
	 * バイト列からBtreeKeyの実体を生成する．
	 * @param bstream バイト列
	 * @exception BtreeException
	 */
	public byte[] byteStream() {
		byte[] bytearray = new byte[KEY_BYTE_SIZE];
		byte[] thiskey = _key.getBytes();
		
		System.arraycopy(thiskey, 0, bytearray, 0, thiskey.length);
		return bytearray;
	}

	/**
	 * オブジェクトの描画メソッド
	 * @param g 描画対象のビュー
	 * @param position 描画開始位置(レクタングルの左上の頂点の座標)
	 */
	public void draw(Graphics g, Point position) {
		int width = getSize().width;
		int height = getSize().height;

		// 輪郭を描画		
		g.setColor(Color.ORANGE);
		g.fillRect(position.x, position.y, width, height);
		g.setColor(Color.BLACK);
		g.drawRect(position.x, position.y, width, height);

		// 文字を描画
		FontMetrics metrics = BtreeSimulatorMainPanel.getFontMetrics();
		g.drawString(StringUtils.trimControlChars(_key.trim()), position.x +2, position.y + metrics.getAscent() +2);
	}
	/**
	 * このオブジェクトの描画に必要なサイズ(px)を返す
	 * @return 描画に必要なピクセルサイズ
	 */
	public Dimension getSize() {
		// 現在設定されているフォントメトリックを取得する
		FontMetrics metrics = BtreeSimulatorMainPanel.getFontMetrics();
		char[] keychars = StringUtils.trimControlChars(_key.trim()).toCharArray();
		int width = metrics.charsWidth(keychars, 0, keychars.length);
		int height = metrics.getHeight();

		return new Dimension(width + 4, height + 4);
	}
}
