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;
}
}