001/*
002 * Copyright (c) 2009 The openGion Project.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 *     http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
013 * either express or implied. See the License for the specific language
014 * governing permissions and limitations under the License.
015 */
016package org.opengion.hayabusa.taglib;
017
018import static org.opengion.fukurou.util.StringUtil.nval;
019
020import java.io.IOException;
021import java.io.ObjectInputStream;
022import java.io.ObjectOutputStream;
023
024import org.opengion.fukurou.util.Options;
025import org.opengion.fukurou.util.StringUtil;
026import org.opengion.fukurou.util.TagBuffer;
027import org.opengion.fukurou.util.XHTMLTag;
028import org.opengion.hayabusa.common.HybsSystem;
029import org.opengion.hayabusa.common.HybsSystemException;
030
031/**
032 * プルダウンメニューを作成するHTML拡張タグです。
033 *
034 * プルダウンメニュー内の選択肢は、selectタグの内容であるoptionタグ、
035 * またはqueryOptionタグによって指定します。
036 * optionタグがセットされない場合は、name属性の、コードリソース からoption文字列より、
037 * プルダウンメニューの選択肢を作成します。
038 * name 属性に ラベルリソース のキーを与えることで、 ロケールにあわせたリソースを使用して、
039 * 画面に表示します。ロケールは、ユーザー情報の lang 属性を初期値で使用し、
040 * セットされていない場合は、リクエスト情報のロケールから取得します。
041 * language 属性で定義されている場合は、そちらを優先します。
042 *
043 * @og.formSample
044 * ●形式:<og:select name="…" />
045 * ●body:あり(EVAL_BODY_INCLUDE:BODYをインクルードし、{@XXXX} は解析しません)
046 *
047 * ●Tag定義:
048 *   <og:select
049 *       name             ○【TAG】メニューの名称を指定します(必須)。
050 *       value              【TAG】値を指定します
051 *       defaultVal         【TAG】value属性に値がセットされていないとき使用する、初期値を指定します
052 *       lbl                【TAG】ラベルリソースのラベルIDを指定します
053 *       must               【TAG】必須入力を表す色に変えるかどうか[true/false]を指定します(初期値:false)
054 *       mustAny            【TAG】選択必須入力(どれかひとつ必須)を表す色[true/mustAny/その他]を指定します(初期値:無指定)
055 *       addNoValue         【TAG】値なしのOptionを含めるかどうか[true/false]を指定します(初期値:false)
056 *       td                 【TAG】テーブル形式の <td> タグを使用するかどうか[yes/no/false]を指定します(初期値:yes)
057 *       colspan            【TAG】フィールド部分の colspan を指定します
058 *       optionAttributes   【TAG】JavaScript などの HTML基本タグ以外の属性を、そのままタグとして使用します
059 *       size               【TAG】リストボックスとして表示する場合の表示行数を指定します
060 *       multiple           【TAG】複数選択を可能(multiple)にします(初期値:未設定)
061 *       id                 【HTML】要素に対して固有の名前(id)をつける場合に設定します
062 *       caseKey            【TAG】このタグ自体を利用するかどうかの条件キーを指定します(初期値:null)
063 *       caseVal            【TAG】このタグ自体を利用するかどうかの条件値を指定します(初期値:null)
064 *       caseNN             【TAG】指定の値が、null/ゼロ文字列 でない場合(Not Null=NN)は、このタグは使用されます(初期値:true)
065 *       caseNull           【TAG】指定の値が、null/ゼロ文字列 の場合は、このタグは使用されます(初期値:true)
066 *       lang               【HTML】要素の内容と他の属性値の言語(lang,xml:lang)を指定します
067 *       dir                【HTML】文字表記の方向(dir)を指定します
068 *       title              【HTML】要素に対する補足的情報(title)を設定します
069 *       style              【HTML】この要素に対して適用させるスタイルシート(style)を設定します
070 *       disabled           【TAG】その部品に対して、選択や変更が出来ないように(disabled)指定します(サーバーに送信されない)
071 *       tabindex           【HTML】タブの移動順(tabindex)を指定します(0 ~ 32767)
072 *       clazz              【HTML】要素に対して class 属性を設定します
073 *       language           【TAG】タグ内部で使用する言語コード[ja/en/zh/…]を指定します
074 *       onClick            【HTML】JavaScriptのイベント onClick を設定します(例:onClick="renew('query.jsp','QUERY');")
075 *       onChange           【HTML】JavaScriptのイベント onChange を設定します(例:onChange="renew('query.jsp','QUERY');")
076 *       onBlur             【HTML】JavaScriptのイベント onBlur を設定します(例:onBlur="this.value=value.toUpperCase();")
077 *       onFocus            【HTML】JavaScriptのイベント onFocus を設定します
078 *       ondblClick         【HTML】JavaScriptのイベント ondblClick を設定します
079 *       onMouseDown        【HTML】JavaScriptのイベント onMouseDown を設定します
080 *       onMouseUp          【HTML】JavaScriptのイベント onMouseUp を設定します
081 *       onMouseMove        【HTML】JavaScriptのイベント onMouseMove を設定します
082 *       onMouseOut         【HTML】JavaScriptのイベント onMouseOut を設定します
083 *       onMouseOver        【HTML】JavaScriptのイベント onMouseOver を設定します
084 *       onSelect           【HTML】JavaScriptのイベント onSelect を設定します
085 *       onKeydown          【HTML】JavaScriptのイベント onKeydown を設定します
086 *       onKeypress         【HTML】JavaScriptのイベント onKeypress を設定します
087 *       onKeyup            【HTML】JavaScriptのイベント onKeyup を設定します
088 *       autofocus          【HTML5】指定した入力欄にカーソルが当たって自動的にフォーカスされます。
089 *       roles              【TAG】ロールをセットします
090 *       eventColumn        【TAG】イベントカラム(親カラム)を指定します
091 *       eventURL           【TAG】イベントカラム指定時に呼び出すURL
092 *       eventCallback      【TAG】eventColumn実行後のcallbak関数指定
093 *       debug              【TAG】デバッグ情報を出力するかどうか[true/false]を指定します(初期値:false)
094 *   >   ... Body ...
095 *   </og:select>
096 *
097 * ●使用例
098 *    <og:select name="CDC">                       CodeResource プロパティの値を使用したいときはcode属性を使います。
099 *        <og:option code="CDC" />
100 *    </og:select>
101 *
102 *    <og:select name="CDC">                       選択項目の一番上に項目を付け足すことも可能です。
103 *        <og:option lbl="MSG0001" />              MessageResource プロパティの値を使用したいとききはlbl属性を使います。
104 *        <og:option code="CDC" />
105 *    </og:select>
106 *
107 *    <og:select name="CDC">                       選択項目の一番上に項目を付け足すことも可能です。
108 *        <og:option lbl="CDC1" />                 LabelResource プロパティの値を使用したいとききはlbl属性を使います。
109 *        <og:option code="CDC" />
110 *    </og:select>
111 *
112 *    <og:select name="CDC" multiple="multiple">   選択肢の中から複数選択できるようにするときはmultiple属性を使います。
113 *        <og:option code="CDC" />
114 *    </og:select>
115 *
116 *    <og:select name="CDC" disabled="disabled">   選択不可にするときはdisabled属性を使います。
117 *        <og:option code="CDC" />
118 *    </og:select>
119 *
120 *    <og:select name="CDC">                       選択肢をSELECT文の結果から作成したいときはqueryOptionタグと組み合わせて使います。
121 *        <og:queryOption>
122 *                    select NOSYN,NOSYN,':',NMSYN from DB01 ORDER BY 1
123 *        </og:queryOption>
124 *    </og:select>
125 *
126 *    <og:select name="CDC" eventColumn="OYA" >    親子関係のプルダウンを作る場合
127 *        <og:queryOption>
128 *                    select NOSYN,NOSYN,':',NMSYN from DB01
129 *                     where CLM = "{@OYA}" ORDER BY 1
130 *        </og:queryOption>
131 *    </og:select>
132 *
133 * @og.group 選択データ制御
134 *
135 * @version  4.0
136 * @author       Kazuhiko Hasegawa
137 * @since    JDK5.0,
138 */
139public class SelectTag extends HTMLTagSupport implements OptionAncestorIF {
140        //* このプログラムのVERSION文字列を設定します。   {@value} */
141        private static final String VERSION = "5.7.1.0 (2013/12/06)" ;
142
143        private static final long serialVersionUID = 571020131206L ;
144
145        // 4.0.0 (2005/01/31) HTML_LABEL_SEPARATOR を boolean 変数として取得します。
146        private final String CLM = HybsSystem.sysBool( "HTML_LABEL_SEPARATOR" ) ? ":" : "" ;
147
148        // 4.0.0 (2005/01/31) USE_MULTI_KEY_SELECT を定義しておきます。
149        private final boolean USE_MULTI_KEY_SELECT =  HybsSystem.sysBool( "USE_MULTI_KEY_SELECT" ) ;
150
151        private transient Options option                = new Options();
152        private String  td_flag         = "yes";        // yes:<td> タグを使用 / false:フィールドのみ / no:ラベルとフィールド
153
154        // 3.0.1.3 (2003/03/11) colspan 属性を追加。
155        private String  colspan     = null;
156
157        // 3.5.4.0 (2003/11/25) value ,defaultVal  属性を追加。
158        private String  value       = null;
159        private String  defaultVal      = null;         // value がセットされていないときの初期値
160        private boolean multipleAll     = false;        // 3.8.0.9 (2005/10/17) 複数選択可能時に全選択を設定する。
161        private String eventColumn      = null;         // 4.3.6.0 (2009/04/01) イベントカラム
162        private String eventURL         = null;         // 5.1.9.0 (2010/08/01) 動的プルダウン不具合対応
163
164        private String  rawParam        = null;         // 5.1.7.0 (2010/06/01) 動的プルダウン実装見直し
165
166        // 5.1.9.0 (2010/08/01) 値なしのOptionをSelectに含めるかどうか 新規追加
167        private boolean addNoValue  = false;    // 互換性のため、初期値は、false になります。
168
169        /**
170         * Taglibの開始タグが見つかったときに処理する doStartTag() を オーバーライドします。
171         *
172         * @og.rev 5.0.2.0 (2009/11/01) 複数パラメーターの選択に対応
173         * @og.rev 5.1.7.0 (2010/06/01) command=RENEWの場合はdefaultValを無視する。
174         * @og.rev 5.1.9.0 (2010/08/01) addNoValue 対応
175         * @og.rev 5.2.2.0 (2010/11/01) caseKey 、caseVal 属性対応
176         * @og.rev 5.3.7.0 (2011/07/01) 5.1.7.0 (2010/06/01)の対応で判定条件が逆転しているバグを修正
177         *
178         * @return      後続処理の指示( EVAL_BODY_INCLUDE )
179         */
180        @Override
181        public int doStartTag() {
182                // 5.2.2.0 (2010/11/01) caseKey 、caseVal 属性対応
183                if( useTag() ) {
184                        if( value == null ) {
185        //                      value = nval( getRequestValue( get( "name" ) ),defaultVal );
186                                // 5.1.7.0 (2010/06/01) command=RENEWの場合はdefaultValを無視する。
187                                String cmd = pageContext.getRequest().getParameter( "command" );
188                                if( "RENEW".equals( cmd ) ) {
189                                        value = StringUtil.array2line( getRequestValues( get( "name" ) ), "|" );
190                                }
191                                else {
192                                        value = nval( StringUtil.array2line( getRequestValues( get( "name" ) ), "|" ),defaultVal );
193                                }
194                        }
195
196                        // 5.1.9.0 (2010/08/01) addNoValue 対応:option を最初にセットする。
197                        if( addNoValue ) {
198                                option.add( "<option value=\"\" ></option>" );
199                        }
200
201                        return EVAL_BODY_INCLUDE ;      // Body インクルード( extends TagSupport 時)
202                }
203                return SKIP_BODY ;                              // Body を評価しない
204        }
205
206        /**
207         * タグリブオブジェクトをリリースします。
208         * キャッシュされて再利用されるので、フィールドの初期設定を行います。
209         *
210         * @og.rev 2.0.0.4 (2002/09/27) カスタムタグの release() メソッドを、追加
211         * @og.rev 2.0.0.8 (2002/10/09) yes/no/false で指定するように変更
212         * @og.rev 3.0.1.3 (2003/03/11) colspan 属性を追加。
213         * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応。release2() を doEndTag()で呼ぶ。
214         * @og.rev 3.5.4.0 (2003/11/25) value ,defaultVal  属性を追加。
215         * @og.rev 3.8.0.9 (2005/10/17) 複数選択可能時に全選択を設定する。
216         * @og.rev 4.1.2.1 (2008/03/13) must , mustAny 属性を自動化します。
217         * @og.rev 4.3.6.0 (2009/04/01) eventColumn,eventURL追加
218         * @og.rev 5.1.7.0 (2010/06/01) 動的プルダウン実装見直し
219         * @og.rev 5.1.9.0 (2010/08/01) columnタグで動的プルダウンが動作しない不具合に対応
220         * @og.rev 5.1.9.0 (2010/08/01) addNoValue  属性を追加。
221         * @og.rev 5.2.1.0 (2010/10/01) must , mustAny 属性の処理を、HTMLTagSupport に移します。
222         *
223         */
224        @Override
225        protected void release2() {
226                super.release2();
227                option          = new Options();
228                td_flag     = "yes";    // table形式の <td> タグを使用するかどうか
229                colspan     = null;
230                value       = null;
231                defaultVal      = null;         // value がセットされていないときの初期値
232                multipleAll     = false;        // 3.8.0.9 (2005/10/17) 複数選択可能時に全選択を設定する。
233                eventColumn     = null;         // 4.3.6.0 (2009/04/01)
234                eventURL        = null;         // 5.1.9.0 (2010/08/01) columnタグで動的プルダウンが動作しない不具合に対応
235                rawParam        = null;         // 5.1.7.0 (2010/06/01) 動的プルダウン実装見直し
236                addNoValue  = false;    // 5.1.9.0 (2010/08/01) 互換性のため、初期値は、false になります。
237        }
238
239        /**
240         * 入力用のプルダウンメニューを作成します。
241         *
242         * 表示順の項目名タグは、あらかじめ作成済みの値をここでは受け取ります。
243         * hasSelect 属性の値に応じて,タグの作成方法は変わります。
244         *
245         * @og.rev 2.0.0.8 (2002/10/09) yes/no/false で指定するように変更
246         * @og.rev 2.0.1.0 (2002/10/10) ラベルとフィールドのセパレーターとして、コロン(:)を使用するかどうかを指定できる
247         * @og.rev 3.0.1.3 (2003/03/11) colspan 属性を追加。
248         * @og.rev 3.5.4.0 (2003/11/25) value ,defaultVal  属性を追加。
249         * @og.rev 4.0.0.0 (2005/01/31) マルチセレクションのON/OFFをここで指定。
250         * @og.rev 4.1.2.1 (2008/03/13) must , mustAny 属性を自動化します。
251         * @og.rev 4.3.6.0 (2009/04/01) eventColumn対応
252         * @og.rev 4.3.7.1 (2009/06/08) id=labelのclass化
253         * @og.rev 5.1.7.0 (2010/06/01) 動的プルダウン実装見直し
254         * @og.rev 5.2.1.0 (2010/10/01) must , mustAny 属性の処理を、HTMLTagSupport に移します。
255         * @og.rev 5.5.3.0 (2012/06/01) idのセット見直し
256         * @og.rev 5.6.2.2 (2013/03/15) 自動must処理の出力位置を変更
257         *
258         * @return      表示順選択用のプルダウンメニュータグ
259         */
260        @Override
261        protected String makeTag() {
262
263                String name = get( "name" );
264                if( getMsglbl() == null ) { setLbl( name ); }
265
266                if( colspan != null ) {
267                        colspan = " colspan=\"" + colspan + "\" ";
268                }
269                else {
270                        colspan = "";
271                }
272
273                // 4.0.0 (2005/01/31) XHTMLTag.java より移動)
274                if( USE_MULTI_KEY_SELECT ) {
275                        set( "onkeydown", "setKeySelect(this);" );
276                }
277
278                StringBuilder rtn = new StringBuilder( HybsSystem.BUFFER_MIDDLE );
279
280                // 5.5.3.0 既にIDが指定されている場合はnameをセットしない
281                if( get("id")==null || get("id").length() == 0 ){
282                        set( "id", name );
283                }
284
285                // 4.3.6.0 (2009/04/01) eventColumnの対応
286                // 5.1.7.0 (2010/06/01) 動的プルダウン実装見直し
287                String selTag = XHTMLTag.select( getAttributes(), option );
288
289                // 5.1.7.0 (2010/06/01) 動的プルダウン実装見直し
290                if( eventColumn != null && eventColumn.length() > 0 ) {
291                        String editor = null;
292                        if( rawParam != null && rawParam.length() > 0 ) {
293                                editor = "DBMENU";
294                        }
295                        else {
296                                editor = "MENU";
297                        }
298                        addEventColumn( name, eventColumn, eventURL, "", editor, "", rawParam );
299                        TagBuffer span = new TagBuffer( "span" );
300                        span.add( "class", HybsSystem.EVENT_COLUMN_CLASS );
301                        span.add( HybsSystem.EVENT_COLUMN_ID, name );
302                        span.add( HybsSystem.EVENT_COLUMN_INITVAL, value );
303                        span.add( HybsSystem.EVENT_COLUMN_WRITABLE, "true" );
304                        span.setBody( selTag );
305                        selTag = span.makeTag();
306                }
307
308                if( "yes".equals( td_flag ) ) {
309                        // 4.3.7.1 (2009/06/08) id=labelのclass化
310                        // rtn.append( "<td id=\"label\">" );
311                        rtn.append( "<td class=\"label\">" );
312                        rtn.append( getLongLabel() );           // 4.0.0 (2005/01/31)
313                        rtn.append( CLM );
314                        rtn.append( "</td>" );
315                        rtn.append( "<td" );
316                        rtn.append( colspan );
317                        rtn.append( ">" );
318                        rtn.append( selTag );
319                        if( getMustType() != null ) { rtn.append( makeMustHidden( name ) ); } // 5.6.2.2 (2013/03/15)
320                        rtn.append( "</td>" );
321                }
322                else if( "no".equals( td_flag ) ) {
323                        // 4.3.7.1 (2009/06/08) id=labelのclass化
324                        // rtn.append( "<span id=\"label\">" );
325                        rtn.append( "<span class=\"label\">" );
326                        rtn.append( getLongLabel() );           // 4.0.0 (2005/01/31)
327                        rtn.append( CLM );
328                        rtn.append( "</span>" );
329                        rtn.append( selTag );
330                        if( getMustType() != null ) { rtn.append( makeMustHidden( name ) ); } // 5.6.2.2 (2013/03/15)
331                }
332                else {
333                        rtn.append( selTag );
334                        if( getMustType() != null ) { rtn.append( makeMustHidden( name ) ); } // 5.6.2.2 (2013/03/15)
335                }
336
337                return rtn.toString() ;
338        }
339
340        /**
341         * メニュー項目の選択項目を追加します。
342         *
343         * select タグのBODY要素の OptionTag よりアクセスされます。
344         *
345         * @og.rev 3.1.2.0 (2003/04/07) taglib パッケージ内部で使用している箇所を protected 化する。
346         * @param       opt      オプションタグ文字列
347         */
348        public void addOption( final String opt ) {
349                option.add( opt );
350        }
351
352        /**
353         * 【TAG】メニューの名称を指定します。
354         *
355         * @og.tag メニューの名称を指定します。
356         *
357         * @param       name 名称
358         */
359        public void setName( final String name ) {
360                set( "name", getRequestParameter( name ) );
361        }
362
363        /**
364         * 【TAG】リストボックスとして表示する場合の表示行数を指定します。
365         *
366         * @og.tag 表示行数を指定します。
367         *
368         * @param       size 表示行数
369         */
370        public void setSize( final String size ) {
371                set( "size",getRequestParameter( size ) );
372        }
373
374        /**
375         * 【TAG】複数選択を可能(multiple)にします(初期値:未設定)。
376         *
377         * @og.tag
378         * multiple 値が "multiple" または "true" の場合、複数選択状態になります。
379         * また、"ALL" を設定する場合は、OptionTag上で、すべてのOption が選択状態に
380         * 初期設定されます。
381         * 大文字、小文字の種別はなくしますが、指定以外の文字が設定された場合は、エラーになります。
382         *
383         * @og.rev 3.8.0.9 (2005/10/17) 複数選択可能時に全選択を設定する。
384         *
385         * @param       multi 複数選択("multiple" または "true") ,初期値全選択( "ALL" )
386         */
387        public void setMultiple( final String multi ) {
388                String multiple = nval( getRequestParameter( multi ),null );
389                if( "multiple".equalsIgnoreCase( multiple ) || "true".equalsIgnoreCase( multiple ) ) {
390                        set( "multiple","multiple" );
391                }
392                else if( "ALL".equalsIgnoreCase( multiple ) ) {
393                        set( "multiple","multiple" );
394                        multipleAll = true;
395                }
396                else if( ! ( "false".equalsIgnoreCase( multiple ) || multiple == null ) ) {
397                        String errMsg = "multiple 属性には、[multiple,true,ALL] 以外は設定できません。"
398                                                + "multiple=" + multi ;
399                        throw new HybsSystemException( errMsg );
400                }
401        }
402
403        /**
404         * 【TAG】テーブル形式の &lt;td&gt; タグを使用するかどうか[yes/no/false]を指定します(初期値:yes)。
405         *
406         * @og.tag
407         * 初期値は、使用する("yes") です。
408         *
409         * @og.rev 2.0.0.8 (2002/10/09) yes/no/false で指定するように変更
410         * @og.rev 5.5.1.0 (2012/04/03) エラーメッセージ変更
411         *
412         * @param   flag [yes:tdタグを使用/no:ラベルとフィールド/false:フィールドのみ]
413         */
414        public void setTd( final String flag ) {
415                String td = nval( getRequestParameter( flag ),td_flag );
416
417                if( check( "|" + td + "|" , "|yes|no|false|" ) ) {
418                        td_flag = td;
419                }
420                else {
421                        String errMsg = "Error in SelectTag [td]: " + td;
422                        //errMsg = errMsg + "  in [|true|false|label|] only used";
423                        errMsg = errMsg + "  in [|yes|no|false|] only used"; // 5.5.1.0 (2012/04/03)
424                        throw new HybsSystemException( errMsg );
425                }
426        }
427
428        /**
429         * 【TAG】フィールド部分の colspan を指定します。
430         *
431         * @og.tag
432         * 通常は、3 を指定して、フィールド、ラベル、フィールドの
433         * 組み合わせ部分に、長いフィールドが適用されるように使用します。
434         *
435         *  &lt;og:select name="CDK" colspan="3" /&gt;
436         *
437         * @og.rev 3.0.1.3 (2003/03/11) colspan 属性を追加。
438         *
439         * @param   sp フィールド部分の colspan
440         */
441        public void setColspan( final String sp ) {
442                colspan = nval( getRequestParameter( sp ),colspan );
443        }
444
445        /**
446         * 【TAG】値を指定します。
447         *
448         * @og.tag
449         *   ここで指定された値が、optionタグの値と同じであれば、選択状態になります。
450         *
451         *    &lt;og:select name="CDC" value="{&#064;ABC}" defaultVal="XYZ"  &gt;
452         *         &lt;og:option value="ABC" lbl="CDC1" /&gt;
453         *         &lt;og:option value="XYZ" lbl="CDC2" /&gt;
454         *    &lt;/og:select&gt;
455         *
456         * @og.rev 3.5.4.0 (2003/11/25) 新規作成
457         * @og.rev 5.0.2.0 (2009/11/01) 複数パラメーターの選択に対応
458         *
459         * @param   val 値
460         */
461        public void setValue( final String val ) {
462                value = nval( StringUtil.array2line( getRequestParameterValues( val ), "|" ),value );
463        }
464
465        /**
466         * 値を外部から取り出します。
467         *
468         * OptionTag で、value を取り出して、内部の値と同じ場合は、選択状態にします。
469         *
470         * @og.rev 3.5.4.0 (2003/11/25) 新規作成
471         * @og.rev 5.7.1.0 (2013/12/06) OptionAncestorIF にする為、protected ⇒ public 化する。
472         *
473         * @return      内部に設定された値
474         */
475        public String getValue() {
476                return value;
477        }
478
479        /**
480         * 【TAG】イベントカラム(親カラム)を指定します。
481         *
482         * @og.tag
483         *   親子関係のカラムを作成する場合に利用します。
484         *   queryOptionタグとセットで利用して下さい。
485         *
486         *   ※詳細はcolumnTagのeventColumn属性の説明をご覧下さい。
487         *
488         * @og.rev 4.3.6.0 (2009/04/01)
489         *
490         * @param   col 親カラム名
491         */
492        public void setEventColumn( final String col ) {
493                eventColumn = nval( getRequestParameter( col ), eventColumn );
494        }
495
496        /**
497         * 【TAG】イベントカラム指定時に呼び出すURL。
498         *
499         * @og.tag
500         *   イベントカラム指定時に部品を作成するJSPを指定します。
501         *   初期値はシステムリソースのEVENT_COLUMN_URLです。
502         *   (例:eventURL="makeColumn_custom.jsp")
503         *
504         *   ※詳細はcolumnTagのeventURL属性の説明をご覧下さい。
505         *
506         * @og.rev 4.3.6.0 (2009/04/01)
507         *
508         * @param       url     呼び出すURL
509         */
510        public void setEventURL( final String url ) {
511                eventURL = nval( getRequestParameter( url ), eventURL );
512        }
513
514        /**
515         * 複数選択可能時に全選択を設定するかどうかを返します。
516         *
517         * これは、上位入れ子のタグの OptionTag で、multipleAll を取り出して、
518         * true であれば、全選択に設定します。
519         *
520         * @og.rev 3.8.0.9 (2005/10/17) 新規作成
521         * @og.rev 5.7.1.0 (2013/12/06) OptionAncestorIF にする為、protected ⇒ public 化する。
522         *
523         * @return      全選択:true / 通常:false
524         */
525        public boolean isMultipleAll() {
526                return multipleAll;
527        }
528
529        /**
530         * 【TAG】value属性に値がセットされていないとき使用する、初期値を指定します。
531         *
532         * @og.tag
533         * value属性に値がセットされていないときに、初期値をセットします。
534         *
535         * なお、commandがRENEWの場合は、このdefaultValは適用されません。
536         * これは、defaultValの値が埋め込まれた項目が存在する画面に戻った際に、
537         * defaultValの項目の値がnullとなっていた場合に、defaultValの値が復元されると、
538         * 検索結果との不一致が発生するためです。
539         *
540         * @og.rev 3.5.4.0 (2003/11/25) 新規作成
541         * @og.rev 5.0.2.0 (2009/11/01) 複数パラメーターの選択に対応
542         *
543         * @param       dv 初期値
544         */
545        public void setDefaultVal( final String dv ) {
546                defaultVal = nval( StringUtil.array2line( getRequestParameterValues( dv ), "|" ),defaultVal );
547        }
548
549        /**
550         * 【TAG】値なしのOptionを含めるかどうか[true/false]を指定します(初期値:false)。
551         *
552         * @og.tag
553         * カラムがプルダウンメニュー形式の場合、選択肢には通常データベース登録できる候補が
554         * 並びます。しかし、検索時には、候補を絞りたくない(指定しない)場合があり、
555         * その様な場合には、値なしのOptionを含める(true)ことで、対応可能です。
556         * 初期値:false(値なしのOptionを含めない)は、過去の互換性を重視しているため、column タグと異なります。
557         *
558         * @og.rev 5.1.9.0 (2010/08/01) 新規追加
559         *
560         * @param   flag  [true:含める/それ以外:含めない]
561         */
562        public void setAddNoValue( final String flag ) {
563                addNoValue = nval( getRequestParameter( flag ),addNoValue );
564        }
565
566        /**
567         * パラメーター変換({&#064;XXXX}の置き換えをしない状態のパラメーターをセットします。
568         *
569         * @og.rev 5.1.7.0 (2010/06/01) 新規作成(動的プルダウン実装見直し)
570         * @og.rev 5.5.4.0 (2012/07/02) 予約語対応
571         *
572         * @param   param パラメーター
573         */
574        public void setRawParam( final String param ) {
575                rawParam = nval( getReservedParameter(param), rawParam ); // 5.5.4.0 (2012/07/02)
576        }
577
578        /**
579         * 【TAG】eventColumn実行後のcallbak関数指定。
580         *
581         * @og.tag
582         * eventColumnの動作終了後に実行するCallback関数の指定を行います。
583         * 関数名のみを指定して下さい。
584         *  ex) sampleCallback()を実行する場合はeventCallback="sampleCallback"
585         * 実行する関数の第一引数には自動的に次の要素が入った配列が渡されます
586         *  [0] 変更された子カラムのID属性値
587         *  [1] evnetColumn実行後の子カラムの値
588         *  [2] eventColumn実行前の子カラムの値
589         *
590         * この属性は、optionAttributesへの設定と同様の動作を行います。
591         *
592         * @og.rev 5.5.4.0 (2012/07/02) 新規追加
593         *
594         * @param   callback callbak関数
595         */
596        public void setEventCallback( final String callback ) {
597                // optionAttributes扱いで登録します。
598                if( callback != null && callback.length() > 0 ){
599                        add( "optionAttributes", "eventCallback='"+getRequestParameter( callback )+"'" );
600                }
601        }
602
603        /**
604         * シリアライズ用のカスタムシリアライズ書き込みメソッド
605         *
606         * @og.rev 4.0.0.0 (2006/09/31) 新規追加
607         * @serialData 一部のオブジェクトは、シリアライズされません。
608         *
609         * @param       strm    ObjectOutputStreamオブジェクト
610         * @throws IOException  入出力エラーが発生した場合
611         */
612        private void writeObject( final ObjectOutputStream strm ) throws IOException {
613                strm.defaultWriteObject();
614        }
615
616        /**
617         * シリアライズ用のカスタムシリアライズ読み込みメソッド
618         *
619         * ここでは、transient 宣言された内部変数の内、初期化が必要なフィールドのみ設定します。
620         *
621         * @og.rev 4.0.0.0 (2006/09/31) 新規追加
622         * @serialData 一部のオブジェクトは、シリアライズされません。
623         *
624         * @param       strm    ObjectInputStreamオブジェクト
625         * @see #release2()
626         * @throws IOException  シリアライズに関する入出力エラーが発生した場合
627         * @throws ClassNotFoundException       クラスを見つけることができなかった場合
628         */
629        private void readObject( final ObjectInputStream strm ) throws IOException , ClassNotFoundException {
630                strm.defaultReadObject();
631                option = new Options();
632        }
633
634        /**
635         * このオブジェクトの文字列表現を返します。
636         * 基本的にデバッグ目的に使用します。
637         *
638         * @return このクラスの文字列表現
639         */
640        @Override
641        public String toString() {
642                return org.opengion.fukurou.util.ToString.title( this.getClass().getName() )
643                                .println( "VERSION"             ,VERSION                )
644                                .println( "td_flag"             ,td_flag                )
645                                .println( "colspan"             ,colspan                )
646                                .println( "value"               ,value                  )
647                                .println( "defaultVal"  ,defaultVal             )
648                                .println( "multipleAll" ,multipleAll    )
649                                .println( "Other..."    ,getAttributes().getAttribute() )
650                                .fixForm().toString() ;
651        }
652}