package	jp.co.nri.rid.rhedgehog.panel;

import	java.awt.*;
import	javax.swing.*;

/**
 * メイン画面の各タブに表示するコンテナの基底クラス。
 * <p>
 * 画面に表示する部品を、きれいに配置するための API を定義。
 * このオブジェクト上には、同じサイズの JPanel オブジェクト child があり、
 * 配置した部品は、すべてこの child の JPanel オブジェクトに乗る。
 */
public class GridPanel extends JPanel{
	private GridBagLayout		gridbag		= new GridBagLayout();
	private GridBagConstraints	constraints	= new GridBagConstraints();
	private JPanel				child		= new JPanel();
	
    /**
     * コンストラクタ。
     * <p>
     * 実際に部品を乗せる child オブジェクトを GridBag レイアウトに設定。
     */
	public GridPanel(){
		super(new BorderLayout());
		child.setLayout(gridbag);
		add(child, BorderLayout.NORTH);
	}
	
    /**
     * 入力項目名付きのコンポーネントを追加。
     * <p>
     * データ入力用テキストフィールドのように、入力内容を表すタイトルが付いた
     * 入力コンポーネントを追加する。タイトルは左側、部品は右側に１行ごとに
     * 表示される。
     * @param caption 入力項目名
     * @param c 追加するコンポーネント
     */
	public void addCaptionedComponent(String caption, Component c) {
		
		// rowspan
//		c.gridheight = 
		
		
		addConstraintsComponent(new JLabel(caption));
		
		constraints.weightx = 1;
		constraints.fill = GridBagConstraints.HORIZONTAL;
		addConstraintsComponent(c, GridBagConstraints.REMAINDER);
		constraints.weightx = 0.0;
		constraints.fill = GridBagConstraints.NONE;
	}
	
    /**
     * タイトルの追加
     * <p>
     * 次の行に、JLabel コンポーネントを追加する。
     * コンポーネントの幅は、画面の幅と同じ。
     * 指定されたタイトル文字列が、コンポーネントの中央に表示される。
     * @param caption タイトル文字列
     */
	public void addCaption(String caption) {
		addConstraintsComponent(new JLabel(caption, SwingConstants.LEFT), GridBagConstraints.REMAINDER);
	}
	
    /**
     * 入力項目名のないコンポーネントの追加
     * <p>
     * 次の行に、指定されたコンポーネントを追加する。
     * コンポーネントの幅は、画面の幅と同じ。
     * @param comp 追加するコンポーネント
     */
	public void addComponent(Component comp) {
		constraints.weightx	= 1;
		constraints.fill	= GridBagConstraints.HORIZONTAL;
		addConstraintsComponent(comp, GridBagConstraints.REMAINDER);
		constraints.weightx	= 0.0;
		constraints.fill	= GridBagConstraints.NONE;
		constraints.anchor	= GridBagConstraints.WEST;
		constraints.insets	= new Insets(2,2,2,2);
	}
	
    /**
     * 指定されたコンポーネントを指定位置に追加。
     * <p>
     * パラメータ width が GridBagConstraints の gridwidth フィールドに
     * 設定されてコンポーネントを配置する。たとえば、width が 1 の場合は
     * 行全体に配置され、GridBagConstraints.REMAINDER の場合は行の右側に
     * 配置される。
     * @param comp 追加するコンポーネント
     * @param width １行の列数
     */
	private void addConstraintsComponent(Component comp, int width){
		constraints.gridwidth = width;
		gridbag.setConstraints(comp, constraints);
		child.add(comp);
	}
	
    /**
     * 指定されたコンポーネントを次の行全体に配置。
     * <p>
     * addConstraintsComponent(comp, 1) を実行する。
     * @param comp 追加するコンポーネント
     */
	private void addConstraintsComponent(Component comp){
		addConstraintsComponent(comp, 1);
	}


}
