package jp.ne.mki.wedge.rule.client.component.table;

import javax.swing.JTable;
import javax.swing.table.TableColumn;

import jp.ne.mki.wedge.rule.base.AbstractClient;
import jp.ne.mki.wedge.run.client.data.Item;

/**
 *   <h2>列幅設定</h2><br/>
 *   <p>
 *   テーブル列の 列幅を設定します。<br>
 * <br>
 *   列幅に関しては、入力レコードか、あるいはパラメータで指定します。<br>
 * 列幅に0を指定した場合、自動的に最小列幅・最大列幅に0を指定します。<br>
 * 列幅に1 ~ 4を指定した場合、最小幅を同じ幅に合わせ、最大幅をInteger.MAX_VALUEとします。<br>
 * 列幅に5以上を指定した場合、最小幅を5とし、最大幅をInteger.MAX_VALUEとします。
 * <br>
 *
 *
 *
 *   </p>
 * <br/>
 * <h4>[I/O RECORD]</h4>
 * <table border="1" cellpadding="3" cellspacing="0" width="100%">
 *  <tr class="TableSubHeadingColor">
 *      <th style="width:50%;">InputRecord</th>
 *      <th>OutputRecord</th>
 *  </tr><tr class="TableRowColor">
 *      <td>
 *      <!--  InputRecordの内容を記述   -->
 * 		<ol>
 * 		<li>テーブル列アイテム(複数指定可能)</li>
 * 		</ol>
 *      <!--  ここまで   -->
 *      </td>
 *      <td>
 *      <!-- OutputRecordの内容を記述    -->
 * 		<ol>
 * 		<li>結果を格納するアイテム(複数指定可能)</li>
 * 		</ol>
 *      <!--  ここまで   -->
 *      </td>
 *  </tr></table>
 *
 * <h4>[RULE PARAMETER]</h4>
 * <table border="1" cellpadding="3" cellspacing="0" width="100%">
 *  <tr>
 *      <th style="width:100px;" class="TableSubHeadingColor">Parameter</th>
 *      <td class="TableRowColor">
 *      <!-- Parameterの内容を記述    -->
 * 入力レコードが省略された場合、カンマ区切りで列幅を指定します。<br>
 * 全列の幅が同じ場合は、カンマで区切らず 一つだけ数値を指定することも可能です。<br>
 *
 *
 *      <!--ここまで   -->
 *      </td>
 *  </tr></table>
 *
 * @author mki
 * @since 1.2.0
 * @version 1.0
 */

public class SetColumnWidth extends AbstractClient {
    private int[] intParams = null;

    /**
     * @see jp.ne.mki.wedge.rule.base.interfaces.CommonInterface#getIOParameter()
     */
    public int getIOParameter() throws Throwable {
        if (getOutRecordCount() == 0) {
            return IO_ERROR_OUT;
        }

        if (getInRecordCount() == 0) {

            // 入力レコードを省略したときのチェック
            if (getRuleParameter().length() == 0) {
                return IO_ERROR;
            } else {
                String[] strParams = getRuleParameters(",");
                intParams = new int[strParams.length];
                for (int i = 0; i < intParams.length; i++) {
                    try {
                        intParams[i] = Integer.parseInt(strParams[i]);
                    } catch (NumberFormatException e) {
                        return IO_ERROR_PARAMETER;
                    }
                }

            }
        } else {
            if (getInRecordCount() != getOutRecordCount()) {
                return IO_ERROR_IO_MUST_SAME_COUNT;
            }
        }

        return OK;
    }

    /**
     * @see jp.ne.mki.wedge.rule.base.interfaces.CommonInterface#execute()
     */
    public int execute() throws Throwable {

        if (getInRecordCount() == 0) {
            return loopOutItem();

        } else {
            return loopInOutItem();
        }

    }

    /**
     * ループ処理。パラメータで指定された列幅を、OutItemのテーブル列に設定します。
     * @see jp.ne.mki.wedge.rule.base.AbstractClient#loopOutItemSub(jp.ne.mki.wedge.run.client.data.Item, int)
     */

    protected int loopOutItemSub(Item outItem, int index) {
        if (index < intParams.length) {
            setColumn(outItem, intParams[index]);
        } else {
            setColumn(outItem, intParams[intParams.length - 1]);
        }

        return OK;
    }

    /**
     * ループ処理。InItemに設定された列幅を、OutItemのテーブル列に設定します。
     * @see jp.ne.mki.wedge.rule.base.AbstractClient#loopInItemSub(jp.ne.mki.wedge.run.client.data.Item, int)
     */
    protected int loopInOutItemSub(Item inItem, Item outItem, int index) {
        setColumn(outItem, inItem.getInt());
        return OK;
    }

    /**
     * @param outItem
     * @param i
     */
    private void setColumn(Item item, int width) {
        JTable table = (JTable) item.getComponent();
        TableColumn column = table.getColumn(item);

        if (width == 0) {
            column.setMinWidth(0);
            column.setMaxWidth(0);
            column.setPreferredWidth(0);
        }else if (width > 4) {
            column.setMinWidth(5);
            column.setMaxWidth(Integer.MAX_VALUE);
            column.setPreferredWidth(width);

        } else {
            column.setMinWidth(width);
            column.setMaxWidth(Integer.MAX_VALUE);
            column.setPreferredWidth(width);
        }

    }

    /**
     * @see jp.ne.mki.wedge.rule.base.interfaces.CommonInterface#exit()
     */
    public void exit() throws Throwable {
        intParams = null;
    }

}