package jp.co.nri.rid.search;

import javax.swing.table.DefaultTableColumnModel;
import javax.swing.table.TableColumn;


/**
 * 検索結果表示テーブルの列モデル
 */
class SPTableColumnModel extends DefaultTableColumnModel {
    /** SCCS ID */
    private static final String SCCSID = "@(#)SPTableColumnModel.java";

    /** RCS ID */
    private static final String RCSID =
	"$Id: SPTableColumnModel.java,v 1.21 2003-07-03 19:09:11+09 nsmr Exp $";

    /** 特定のカラムの幅 (ピクセル) */
    private static final int[][] WIDTH_ARRAY = {
        {SPColumnNames.ACTION,     125}, /* "Action" */
        {SPColumnNames.CONTENT,    300}, /* "Content" */
        {SPColumnNames.FILE,       175}, /* "File" */
        {SPColumnNames.HTTP_EQUIV, 125}, /* "Http-equiv" */
        {SPColumnNames.INPUT_TYPE, 100}, /* "Input Type" */
        {SPColumnNames.LANGUAGE,   100}, /* "Language" */
        {SPColumnNames.LINK,       100}, /* "Link" */
        {SPColumnNames.METHOD,      50}, /* "Method" */
        {SPColumnNames.SOURCE,     125}, /* "Source" */
        {SPColumnNames.TITLE,      175}, /* "Title" */
        {SPColumnNames.TYPE,       100}  /* "Type" */
    };

    /** その他各カラムの幅 (ピクセル) */
    static final int DEFAULT_COLUMN_WIDTH = 75;

    /** WIDTH_ARRAY の配列化 */
    static int[] initialWidths;

    /** 各 target ごとの adjustedWidths を保持する配列 */
    private static int[][] columnWidthArray;

    /**
     * 検索結果表示テーブルで、右寄せするカラムのカラム名
     * ソートの際に、整数値として扱うか判断するのにも使う
     */
    static final int[] INTEGER_COLUMNS = {
        SPColumnNames.HASH,      /* "#" */
        SPColumnNames.HEIGHT,    /* "Height" */
        SPColumnNames.HTML_ONLY, /* "HTML only" */
        SPColumnNames.COUNT,     /* "Count" */
        SPColumnNames.RESOURCES, /* "Resources" */
        SPColumnNames.SIZE,      /* "Size" */
        SPColumnNames.TOTAL,     /* "Total [Byte]" */
        SPColumnNames.WIDTH      /* "Width" */
    };

    /** 検索ターゲット名 */
    private int target;

    /**
     * コンストラクタ
     * @param target 検索対象の識別名
     */
    SPTableColumnModel(int target) {
	super();
	this.target = target;

        if (columnWidthArray == null) {
            columnWidthArray = new int[SPTableModel.NUMTARGETS][];
        }

        /* initialWidths の初期化 */
        if (initialWidths == null) {
            initDefaultColumnWidths();
        }

        int[] columnIDs = SPColumnNames.get(target);
	if (columnIDs == null) {
	    return;
	}

        /* adjustedWidths might be null */
        int[] adjustedWidths = getAdjustedWidths();

        SPCellRenderer cellRenderer = new SPCellRenderer(target);

	/* 列の追加 */
	for (int i = 0; i < columnIDs.length; i++) {
	    TableColumn tableColumn = new TableColumn(i);
            int columnID = columnIDs[i];
            String columnHeaderValue = SPColumnNames.toString(columnID);
	    tableColumn.setHeaderValue(columnHeaderValue);

	    /* カラムの幅の設定 */
            if (adjustedWidths == null) {
                setDefaultColumnWidth(tableColumn, columnID);
            } else if (i < 0 || adjustedWidths.length <= i) {
                setDefaultColumnWidth(tableColumn, columnID);
	    } else {
                tableColumn.setPreferredWidth(adjustedWidths[i]);
	    }

            tableColumn.setHeaderRenderer(new SPHeaderRenderer());

            /* form 解析の場合は背景色つき renderer を使用 */
            if (target == SPTableModel.FORM) {
                tableColumn.setCellRenderer(cellRenderer);
            }
	    addColumn(tableColumn);
	}

	addColumnModelListener(new SPColumnModelListener());
    } /* コンストラクタ */


    private void initDefaultColumnWidths() {
        initialWidths = new int[SPColumnNames.NUMCOLUMNS];

        for (int i = 0; i < SPColumnNames.NUMCOLUMNS; i++) {
            initialWidths[i] = DEFAULT_COLUMN_WIDTH;
        }

        for (int i = 0; i < WIDTH_ARRAY.length; i++) {
            if (WIDTH_ARRAY[i] == null) {
                continue;
            }
            if (WIDTH_ARRAY[i].length < 2) {
                continue;
            }
            initialWidths[WIDTH_ARRAY[i][0]] = WIDTH_ARRAY[i][1];
        }
    } /* initDefaultColumnWidths */


    /* カラムの幅を、初期値に設定する */
    private void setDefaultColumnWidth(TableColumn tableColumn, int columnID){
        if (columnID < 0 || initialWidths.length <= columnID) {
            tableColumn.setPreferredWidth(DEFAULT_COLUMN_WIDTH);
            return;
        }
        tableColumn.setPreferredWidth(initialWidths[columnID]);
    } /* setDefaultColumnWidth */


    public boolean getColumnSelectionAllowed() {
        return true;
    }


    /**
     * 現在の検索対象のカラム幅を保持する配列を返す
     * 
     * @return カラム名をキーに、カラム幅を値に持つハッシュテーブル
     */
    int[] getAdjustedWidths() {
        if (target < 0 || SPTableModel.NUMTARGETS < target) {
            return null;
        }
        return columnWidthArray[target];
    } /* getAdjustedWidths */


    static boolean isIntegerColumn(int columnID) {
        for (int i = 0; i < INTEGER_COLUMNS.length; i++) {
            if (INTEGER_COLUMNS[i] == columnID) {
                return true;
            }
        }
        return false;
    } /* isIntegerColumn */


    /**
     * 現在の検索対象のカラム幅を保持する配列を、与えられた配列で置き換える
     * 
     * @param newWidths カラム幅を保持する配列
     */
    void setAdjustedWidths(int[] newWidths) {
        if (target < 0 || SPTableModel.NUMTARGETS < target) {
            return;
        }
        columnWidthArray[target] = newWidths;
    } /* setAdjustedWidths */
} /* class SPTableColumnModel */
