/**
 * 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.BorderLayout;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.GridLayout;

import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSeparator;
import javax.swing.JTextField;

/**
 * B-treeシミュレータのメインパネル．
 * このパネルをapplet/java applicationの両方から使用する．
 * @author satoshi akabane@logical-paradox.org
 * @version 1.0
 */
public class BtreeSimulatorMainPanel extends JPanel {
	private Diagram diagram;
	private static FontMetrics metrics;
	protected DiagramCanvas canvas;
	protected JTextField keyInputField;
	protected JButton btnAdd;
	protected JButton btnRemove;
	protected JButton btnChange;
	protected BTSEventHandler handler;

	/**
	 * デフォルトコンストラクタ
	 */
	public BtreeSimulatorMainPanel() throws Exception {
		init();
	}
	/**
	 * ダイアグラムを返す
	 * @return ダイアグラム
	 */
	public Diagram getDiagram() {
		return diagram;
	}
	/**
	 * キャンバスのサイズを返す
	 * @return キャンバスのサイズ
	 */
	public Dimension getCanvasSize() {
		return canvas.getPreferredSize();
	}
	/**
	 * フォントメトリックスを返す
	 * このメソッドは主にDrawableBtreeKeyから呼び出される
	 * @return メトリック
	 */
	public static FontMetrics getFontMetrics() {
		return metrics;
	}
	/**
	 * このパネルの初期化処理．
	 * 初期化処理では必要なコンポーネントの配置を実行するが，表示は行わない
	 */
	public void init() throws Exception {
		// 図面クラスの作成
		diagram = new Diagram(this);

		// イベントハンドラの作成
		handler = new BTSEventHandler(this);

		// キャンバスの作成
		canvas = new DiagramCanvas();

		// 画面上部のコントロールパネル作成
		JPanel controlPanel = new JPanel();
		JPanel buttonPanel = new JPanel();
		
		// コントロールパネルに配置する部品を生成
		keyInputField = new JTextField();
		keyInputField.addActionListener(handler);

		btnAdd = new JButton("追加");
		btnRemove = new JButton("削除");
		btnChange = new JButton("変更");
		btnAdd.addActionListener(handler);
		btnRemove.addActionListener(handler);
		btnChange.addActionListener(handler);

		// コントロールパネルに部品を配置
		buttonPanel.setLayout(new GridLayout(1, 3));
		buttonPanel.add(btnAdd);
		buttonPanel.add(btnChange);
		buttonPanel.add(btnRemove);

		controlPanel.setLayout(new BorderLayout());
		controlPanel.add(keyInputField, BorderLayout.CENTER);
		controlPanel.add(buttonPanel, BorderLayout.EAST);
		controlPanel.add(new JLabel("  key    "), BorderLayout.WEST);
		controlPanel.add(new JSeparator(), BorderLayout.SOUTH);

		// メインパネルにキャンバスとコントロールパネルを配置
		setLayout(new BorderLayout());
		add(canvas, BorderLayout.CENTER);
		add(controlPanel, BorderLayout.NORTH);

		validate();
	}
	/**
	 * テキスト入力欄を返す
	 * @return テキスト入力欄のインスタンス
	 */
	public JTextField getTextField() {
		return keyInputField;
	}
	/**
	 * 追加ボタンを返す
	 * @return ボタンのインスタンス
	 */
	public JButton getAddButton() {
		return btnAdd;
	}
	/**
	 * 削除ボタンを返す
	 * @return ボタンのインスタンス
	 */
	public JButton getRemoveButton() {
		return btnRemove;
	}
	/**
	 * 変更ボタンを返す
	 * @return ボタンのインスタンス
	 */
	public JButton getChangeButton() {
		return btnChange;
	}
	/**
	 * このパネルを描画する
	 * 描画順序が重要であるため，オーバーライドして描画順を指示する．
	 * @param g 描画対象のグラフィックリージョン
	 */
	public void paint(Graphics g) {
		super.paint(g);

		// フォントの設定
		g.setFont(new Font("SanSelif", 0, 10));
		metrics = g.getFontMetrics();

		diagram.paint(g);
	}

}
