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 *       useRealTimeCheck       【TAG】リアルタイムチェックを行うかどうか(初期値:行う)
094 *       debug              【TAG】デバッグ情報を出力するかどうか[true/false]を指定します(初期値:false)
095 *   >   ... Body ...
096 *   </og:select>
097 *
098 * ●使用例
099 *    <og:select name="CDC">                       CodeResource プロパティの値を使用したいときはcode属性を使います。
100 *        <og:option code="CDC" />
101 *    </og:select>
102 *
103 *    <og:select name="CDC">                       選択項目の一番上に項目を付け足すことも可能です。
104 *        <og:option lbl="MSG0001" />              MessageResource プロパティの値を使用したいとききはlbl属性を使います。
105 *        <og:option code="CDC" />
106 *    </og:select>
107 *
108 *    <og:select name="CDC">                       選択項目の一番上に項目を付け足すことも可能です。
109 *        <og:option lbl="CDC1" />                 LabelResource プロパティの値を使用したいとききはlbl属性を使います。
110 *        <og:option code="CDC" />
111 *    </og:select>
112 *
113 *    <og:select name="CDC" multiple="multiple">   選択肢の中から複数選択できるようにするときはmultiple属性を使います。
114 *        <og:option code="CDC" />
115 *    </og:select>
116 *
117 *    <og:select name="CDC" disabled="disabled">   選択不可にするときはdisabled属性を使います。
118 *        <og:option code="CDC" />
119 *    </og:select>
120 *
121 *    <og:select name="CDC">                       選択肢をSELECT文の結果から作成したいときはqueryOptionタグと組み合わせて使います。
122 *        <og:queryOption>
123 *                    select NOSYN,NOSYN,':',NMSYN from DB01 ORDER BY 1
124 *        </og:queryOption>
125 *    </og:select>
126 *
127 *    <og:select name="CDC" eventColumn="OYA" >    親子関係のプルダウンを作る場合
128 *        <og:queryOption>
129 *                    select NOSYN,NOSYN,':',NMSYN from DB01
130 *                     where CLM = "{@OYA}" ORDER BY 1
131 *        </og:queryOption>
132 *    </og:select>
133 *
134 * @og.group 選択データ制御
135 *
136 * @version  4.0
137 * @author       Kazuhiko Hasegawa
138 * @since    JDK5.0,
139 */
140public class SelectTag extends HTMLTagSupport implements OptionAncestorIF {
141        //* このプログラムのVERSION文字列を設定します。   {@value} */
142        private static final String VERSION = "5.7.1.0 (2013/12/06)" ;
143
144        private static final long serialVersionUID = 571020131206L ;
145
146        // 4.0.0 (2005/01/31) HTML_LABEL_SEPARATOR を boolean 変数として取得します。
147        private final String CLM = ( HybsSystem.sysBool( "HTML_LABEL_SEPARATOR" ) ) ? ":" : "" ;
148
149        // 4.0.0 (2005/01/31) USE_MULTI_KEY_SELECT を定義しておきます。
150        private final boolean USE_MULTI_KEY_SELECT =  HybsSystem.sysBool( "USE_MULTI_KEY_SELECT" ) ;
151
152        // 4.3.6.0 (2009/04/01) JSPの位置を取っておく
153//      private static final String JSP = HybsSystem.sys( "JSP" );
154
155        private transient Options option                = new Options();
156        private String  td_flag         = "yes";        // yes:<td> タグを使用 / false:フィールドのみ / no:ラベルとフィールド
157
158        // 3.0.1.3 (2003/03/11) colspan 属性を追加。
159        private String  colspan     = null;
160
161        // 3.5.4.0 (2003/11/25) value ,defaultVal  属性を追加。
162        private String  value       = null;
163        private String  defaultVal      = null;         // value がセットされていないときの初期値
164        private boolean multipleAll     = false;        // 3.8.0.9 (2005/10/17) 複数選択可能時に全選択を設定する。
165        private String eventColumn      = null;         // 4.3.6.0 (2009/04/01) イベントカラム
166//      private String eventURL         = JSP + "/" + HybsSystem.sys( "EVENT_COLUMN_URL" ); // 4.3.6.0 (2009/04/01) 処理JSPの設定
167        private String eventURL         = null;         // 5.1.9.0 (2010/08/01) 動的プルダウン不具合対応
168
169        // 4.1.2.1 (2008/03/13) must , mustAny 属性を自動化します。
170        // 5.2.1.0 (2010/10/01) must , mustAny 属性の処理を、HTMLTagSupport に移します。
171//      private String  mustType        = null;         // 4.1.2.1 (2008/03/13)
172
173        private String  rawParam        = null;         // 5.1.7.0 (2010/06/01) 動的プルダウン実装見直し
174
175        // 5.1.9.0 (2010/08/01) 値なしのOptionをSelectに含めるかどうか 新規追加
176        private boolean addNoValue  = false;    // 互換性のため、初期値は、false になります。
177
178        /**
179         * Taglibの開始タグが見つかったときに処理する doStartTag() を オーバーライドします。
180         *
181         * @og.rev 5.0.2.0 (2009/11/01) 複数パラメーターの選択に対応
182         * @og.rev 5.1.7.0 (2010/06/01) command=RENEWの場合はdefaultValを無視する。
183         * @og.rev 5.1.9.0 (2010/08/01) addNoValue 対応
184         * @og.rev 5.2.2.0 (2010/11/01) caseKey 、caseVal 属性対応
185         * @og.rev 5.3.7.0 (2011/07/01) 5.1.7.0 (2010/06/01)の対応で判定条件が逆転しているバグを修正
186         *
187         * @return      後続処理の指示( EVAL_BODY_INCLUDE )
188         */
189        @Override
190        public int doStartTag() {
191                // 5.2.2.0 (2010/11/01) caseKey 、caseVal 属性対応
192                if( useTag() ) {
193                        if( value == null ) {
194        //                      value = nval( getRequestValue( get( "name" ) ),defaultVal );
195                                // 5.1.7.0 (2010/06/01) command=RENEWの場合はdefaultValを無視する。
196                                String cmd = pageContext.getRequest().getParameter( "command" );
197                                if( "RENEW".equals( cmd ) ) {
198                                        value = StringUtil.array2line( getRequestValues( get( "name" ) ), "|" );
199                                }
200                                else {
201                                        value = nval( StringUtil.array2line( getRequestValues( get( "name" ) ), "|" ),defaultVal );
202                                }
203                        }
204
205                        // 5.1.9.0 (2010/08/01) addNoValue 対応:option を最初にセットする。
206                        if( addNoValue ) {
207                                option.add( "<option value=\"\" ></option>" );
208                        }
209
210                        return( EVAL_BODY_INCLUDE );    // Body インクルード( extends TagSupport 時)
211                }
212                return ( SKIP_BODY );                           // Body を評価しない
213        }
214
215        /**
216         * タグリブオブジェクトをリリースします。
217         * キャッシュされて再利用されるので、フィールドの初期設定を行います。
218         *
219         * @og.rev 2.0.0.4 (2002/09/27) カスタムタグの release() メソッドを、追加
220         * @og.rev 2.0.0.8 (2002/10/09) yes/no/false で指定するように変更
221         * @og.rev 3.0.1.3 (2003/03/11) colspan 属性を追加。
222         * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応。release2() を doEndTag()で呼ぶ。
223         * @og.rev 3.5.4.0 (2003/11/25) value ,defaultVal  属性を追加。
224         * @og.rev 3.8.0.9 (2005/10/17) 複数選択可能時に全選択を設定する。
225         * @og.rev 4.1.2.1 (2008/03/13) must , mustAny 属性を自動化します。
226         * @og.rev 4.3.6.0 (2009/04/01) eventColumn,eventURL追加
227         * @og.rev 5.1.7.0 (2010/06/01) 動的プルダウン実装見直し
228         * @og.rev 5.1.9.0 (2010/08/01) columnタグで動的プルダウンが動作しない不具合に対応
229         * @og.rev 5.1.9.0 (2010/08/01) addNoValue  属性を追加。
230         * @og.rev 5.2.1.0 (2010/10/01) must , mustAny 属性の処理を、HTMLTagSupport に移します。
231         *
232         */
233        @Override
234        protected void release2() {
235                super.release2();
236                option          = new Options();
237                td_flag     = "yes";    // table形式の <td> タグを使用するかどうか
238                colspan     = null;
239                value       = null;
240                defaultVal      = null;         // value がセットされていないときの初期値
241                multipleAll     = false;        // 3.8.0.9 (2005/10/17) 複数選択可能時に全選択を設定する。
242//              mustType        = null;         // 4.1.2.1 (2008/03/13)         // HTMLTagSupport に移します。
243                eventColumn     = null;         // 4.3.6.0 (2009/04/01)
244//              eventURL        = JSP + "/" + HybsSystem.sys( "EVENT_COLUMN_URL" ); // 4.3.6.0 (2009/04/01)
245                eventURL        = null;         // 5.1.9.0 (2010/08/01) columnタグで動的プルダウンが動作しない不具合に対応
246                rawParam        = null;         // 5.1.7.0 (2010/06/01) 動的プルダウン実装見直し
247                addNoValue  = false;    // 5.1.9.0 (2010/08/01) 互換性のため、初期値は、false になります。
248        }
249
250        /**
251         * 入力用のプルダウンメニューを作成します。
252         *
253         * 表示順の項目名タグは、あらかじめ作成済みの値をここでは受け取ります。
254         * hasSelect 属性の値に応じて,タグの作成方法は変わります。
255         *
256         * @og.rev 2.0.0.8 (2002/10/09) yes/no/false で指定するように変更
257         * @og.rev 2.0.1.0 (2002/10/10) ラベルとフィールドのセパレーターとして、コロン(:)を使用するかどうかを指定できる
258         * @og.rev 3.0.1.3 (2003/03/11) colspan 属性を追加。
259         * @og.rev 3.5.4.0 (2003/11/25) value ,defaultVal  属性を追加。
260         * @og.rev 4.0.0.0 (2005/01/31) マルチセレクションのON/OFFをここで指定。
261         * @og.rev 4.1.2.1 (2008/03/13) must , mustAny 属性を自動化します。
262         * @og.rev 4.3.6.0 (2009/04/01) eventColumn対応
263         * @og.rev 4.3.7.1 (2009/06/08) id=labelのclass化
264         * @og.rev 5.1.7.0 (2010/06/01) 動的プルダウン実装見直し
265         * @og.rev 5.2.1.0 (2010/10/01) must , mustAny 属性の処理を、HTMLTagSupport に移します。
266         * @og.rev 5.5.3.0 (2012/06/01) idのセット見直し
267         * @og.rev 5.6.2.2 (2013/03/15) 自動must処理の出力位置を変更
268         *
269         * @return      表示順選択用のプルダウンメニュータグ
270         */
271        @Override
272        protected String makeTag() {
273
274                String name = get( "name" );
275                if( getMsglbl() == null ) { setLbl( name ); }
276
277                if( colspan != null ) {
278                        colspan = " colspan=\"" + colspan + "\" ";
279                }
280                else {
281                        colspan = "";
282                }
283
284                // 4.0.0 (2005/01/31) XHTMLTag.java より移動)
285                if( USE_MULTI_KEY_SELECT ) {
286                        set( "onkeydown", "setKeySelect(this);" );
287                }
288
289                StringBuilder rtn = new StringBuilder( HybsSystem.BUFFER_MIDDLE );
290
291                // 5.5.3.0 既にIDが指定されている場合はnameをセットしない
292                if( get("id")==null || get("id").length() == 0 ){
293                        set( "id", name );
294                }
295
296                // 4.3.6.0 (2009/04/01) eventColumnの対応
297                // 5.1.7.0 (2010/06/01) 動的プルダウン実装見直し
298//              if( eventColumn != null && eventColumn.length() > 0 ) {
299//                      String[] evntCols = StringUtil.csv2Array( eventColumn );
300//                      for( int i = 0; i < evntCols.length; i++ ) {
301//                              // SelectTagは"DBMENU"をmakeColumnに渡す。
302//                              String javaScript =
303//                                      "<script type=\"text/javascript\">" +
304//                                      "$(function(){$('#" + evntCols[i] + "').change(function(){" +
305//                                      "makeColumn('" + name + "','" + name + "',EC_" + name + ",'DBMENU','" + eventURL + "');}).change();});"+
306//                                      "</script>"
307//                                      ;
308//                              rtn.append( javaScript );
309//                      }
310//              }
311
312                String selTag = XHTMLTag.select( getAttributes(), option );
313
314                // 5.1.7.0 (2010/06/01) 動的プルダウン実装見直し
315                if( eventColumn != null && eventColumn.length() > 0 ) {
316                        String editor = null;
317                        if( rawParam != null && rawParam.length() > 0 ) {
318                                editor = "DBMENU";
319                        }
320                        else {
321                                editor = "MENU";
322                        }
323                        addEventColumn( name, eventColumn, eventURL, "", editor, "", rawParam );
324                        TagBuffer span = new TagBuffer( "span" );
325                        span.add( "class", HybsSystem.EVENT_COLUMN_CLASS );
326                        span.add( HybsSystem.EVENT_COLUMN_ID, name );
327                        span.add( HybsSystem.EVENT_COLUMN_INITVAL, value );
328                        span.add( HybsSystem.EVENT_COLUMN_WRITABLE, "true" );
329                        span.setBody( selTag );
330                        selTag = span.makeTag();
331                }
332
333                if( "yes".equals( td_flag ) ) {
334                        // 4.3.7.1 (2009/06/08) id=labelのclass化
335                        // rtn.append( "<td id=\"label\">" );
336                        rtn.append( "<td class=\"label\">" );
337                        rtn.append( getLongLabel() );           // 4.0.0 (2005/01/31)
338                        rtn.append( CLM );
339                        rtn.append( "</td>" );
340                        rtn.append( "<td" );
341                        rtn.append( colspan );
342                        rtn.append( ">" );
343//                      rtn.append( XHTMLTag.select( getAttributes(), option ) );
344                        rtn.append( selTag );
345                        if( getMustType() != null ) { rtn.append( makeMustHidden( name ) ); } // 5.6.2.2 (2013/03/15)
346                        rtn.append( "</td>" );
347                }
348                else if( "no".equals( td_flag ) ) {
349                        // 4.3.7.1 (2009/06/08) id=labelのclass化
350                        // rtn.append( "<span id=\"label\">" );
351                        rtn.append( "<span class=\"label\">" );
352                        rtn.append( getLongLabel() );           // 4.0.0 (2005/01/31)
353                        rtn.append( CLM );
354                        rtn.append( "</span>" );
355//                      rtn.append( XHTMLTag.select( getAttributes(), option ) );
356                        rtn.append( selTag );
357                        if( getMustType() != null ) { rtn.append( makeMustHidden( name ) ); } // 5.6.2.2 (2013/03/15)
358                }
359                else {
360//                      rtn.append( XHTMLTag.select( getAttributes(), option ) );
361                        rtn.append( selTag );
362                        if( getMustType() != null ) { rtn.append( makeMustHidden( name ) ); } // 5.6.2.2 (2013/03/15)
363                }
364
365                // 4.1.2.1 (2008/03/13) must , mustAny 属性を自動化します。
366//              if( mustType != null ) {
367//                      rtn.append( XHTMLTag.hidden( HybsSystem.MUST_KEY + mustType, name ) );
368//              }
369                // 5.2.1.0 (2010/10/01) must , mustAny 属性を自動化します。
370                // 5.6.2.2 (2013/03/15) tdの外に出力される不正形を正します
371//              if( getMustType() != null ) { rtn.append( makeMustHidden( name ) ); }
372
373                return rtn.toString() ;
374        }
375
376        /**
377         * メニュー項目の選択項目を追加します。
378         *
379         * select タグのBODY要素の OptionTag よりアクセスされます。
380         *
381         * @og.rev 3.1.2.0 (2003/04/07) taglib パッケージ内部で使用している箇所を protected 化する。
382         * @param       opt      オプションタグ文字列
383         */
384        public void addOption( final String opt ) {
385                option.add( opt );
386        }
387
388        /**
389         * 【TAG】メニューの名称を指定します。
390         *
391         * @og.tag メニューの名称を指定します。
392         *
393         * @param       name 名称
394         */
395        public void setName( final String name ) {
396                set( "name", getRequestParameter( name ) );
397        }
398
399        /**
400         * 【TAG】リストボックスとして表示する場合の表示行数を指定します。
401         *
402         * @og.tag 表示行数を指定します。
403         *
404         * @param       size 表示行数
405         */
406        public void setSize( final String size ) {
407                set( "size",getRequestParameter( size ) );
408        }
409
410        /**
411         * 【TAG】複数選択を可能(multiple)にします(初期値:未設定)。
412         *
413         * @og.tag
414         * multiple 値が "multiple" または "true" の場合、複数選択状態になります。
415         * また、"ALL" を設定する場合は、OptionTag上で、すべてのOption が選択状態に
416         * 初期設定されます。
417         * 大文字、小文字の種別はなくしますが、指定以外の文字が設定された場合は、エラーになります。
418         *
419         * @og.rev 3.8.0.9 (2005/10/17) 複数選択可能時に全選択を設定する。
420         *
421         * @param       multi 複数選択("multiple" または "true") ,初期値全選択( "ALL" )
422         */
423        public void setMultiple( final String multi ) {
424                String multiple = nval( getRequestParameter( multi ),null );
425                if( "multiple".equalsIgnoreCase( multiple ) || "true".equalsIgnoreCase( multiple ) ) {
426                        set( "multiple","multiple" );
427                }
428                else if( "ALL".equalsIgnoreCase( multiple ) ) {
429                        set( "multiple","multiple" );
430                        multipleAll = true;
431                }
432                else if( ! ( "false".equalsIgnoreCase( multiple ) || multiple == null ) ) {
433                        String errMsg = "multiple 属性には、[multiple,true,ALL] 以外は設定できません。"
434                                                + "multiple=" + multi ;
435                        throw new HybsSystemException( errMsg );
436                }
437        }
438
439        /**
440         * 【TAG】必須入力を表す色に変えるかどうか[true/false]指定します(初期値:false)。
441         *
442         * @og.tag
443         * 初期値は、必須でない("false") です。
444         *
445         * @og.rev 4.0.0.0 (2005/02/28) must属性の登録を、id属性から、class 属性に変更します。
446         * @og.rev 4.1.2.1 (2008/03/13) must属性を自動化します。
447         * @og.rev 5.2.1.0 (2010/10/01) must , mustAny 属性の処理を、HTMLTagSupport に移します。
448         *
449         * @param       flag 必須入力 ("true")/必須でない (それ以外)
450         */
451//      public void setMust( final String flag ) {
452////            boolean must = nval( getRequestParameter( flag ),false );
453//              mustType = nval( getRequestParameter( flag ),null );
454//              if( "true".equalsIgnoreCase( mustType ) ) {
455//                      mustType = "must";
456//                      add( "class","must" );
457//              }
458//      }
459
460        /**
461         * 【TAG】選択必須入力(どれかひとつ必須)を表す色(true|mustAny|その他)を指定します(初期値:無指定)。
462         *
463         * @og.tag
464         * 複数のカラムのうち、どれかひとつを必須とする選択必須入力を示す色を指定します。
465         * true または、mustAny を設定すると、class属性に、mustAny がセットされます。
466         * mustAny は、CSSファイルに初期設定されています。true または、mustAny 以外の値をセット
467         * すると、その値がそのまま、class属性にセットされますので、選択必須のグループ化が
468         * 可能です。
469         * なお、実際の選択必須入力チェックは、ここではなく、columnCheck タグで指定が必要です。
470         * 自動処理は、mustAny="true" 指定の場合のみ有効です。
471         * 初期値は、無指定です。
472         *
473         * @og.rev 3.8.0.9 (2005/10/17) 新規追加
474         * @og.rev 4.1.2.1 (2008/03/13) mustAny属性を自動化します。
475         * @og.rev 5.2.1.0 (2010/10/01) must , mustAny 属性の処理を、HTMLTagSupport に移します。
476         *
477         * @param       flag 選択必須入力(どれかひとつ必須)を表す色を指定(true|mustAny|その他)
478         */
479//      public void setMustAny( final String flag ) {
480//              if( mustType == null ) {        // must 属性と同時設定時には、must 属性を優先します。
481//                      mustType = nval( getRequestParameter( flag ),null );
482//                      if( "true".equalsIgnoreCase( mustType ) ) {
483//                              mustType = "mustAny";
484//                      }
485//                      add( "class",mustType );        // mustType == null の場合は、add されません。
486//              }
487//
488////            String str = nval( getRequestParameter( flag ),null );
489////            if( str != null ) {
490////                    if( str.equalsIgnoreCase( "true" ) ) {
491////                            add( "class","mustAny" );
492////                    }
493////                    else {
494////                            add( "class",str );
495////                    }
496////            }
497//      }
498
499        /**
500         * 【TAG】テーブル形式の &lt;td&gt; タグを使用するかどうか[yes/no/false]を指定します(初期値:yes)。
501         *
502         * @og.tag
503         * 初期値は、使用する("yes") です。
504         *
505         * @og.rev 2.0.0.8 (2002/10/09) yes/no/false で指定するように変更
506         * @og.rev 5.5.1.0 (2012/04/03) エラーメッセージ変更
507         *
508         * @param   flag [yes:tdタグを使用/no:ラベルとフィールド/false:フィールドのみ]
509         */
510        public void setTd( final String flag ) {
511                String td = nval( getRequestParameter( flag ),td_flag );
512
513                if( check( "|" + td + "|" , "|yes|no|false|" ) ) {
514                        td_flag = td;
515                }
516                else {
517                        String errMsg = "Error in SelectTag [td]: " + td;
518                        //errMsg = errMsg + "  in [|true|false|label|] only used";
519                        errMsg = errMsg + "  in [|yes|no|false|] only used"; // 5.5.1.0 (2012/04/03)
520                        throw new HybsSystemException( errMsg );
521                }
522        }
523
524        /**
525         * 【TAG】フィールド部分の colspan を指定します。
526         *
527         * @og.tag
528         * 通常は、3 を指定して、フィールド、ラベル、フィールドの
529         * 組み合わせ部分に、長いフィールドが適用されるように使用します。
530         *
531         *  &lt;og:select name="CDK" colspan="3" /&gt;
532         *
533         * @og.rev 3.0.1.3 (2003/03/11) colspan 属性を追加。
534         *
535         * @param   sp フィールド部分の colspan
536         */
537        public void setColspan( final String sp ) {
538                colspan = nval( getRequestParameter( sp ),colspan );
539        }
540
541        /**
542         * 【TAG】値を指定します。
543         *
544         * @og.tag
545         *   ここで指定された値が、optionタグの値と同じであれば、選択状態になります。
546         *
547         *    &lt;og:select name="CDC" value="{&#064;ABC}" defaultVal="XYZ"  &gt;
548         *         &lt;og:option value="ABC" lbl="CDC1" /&gt;
549         *         &lt;og:option value="XYZ" lbl="CDC2" /&gt;
550         *    &lt;/og:select&gt;
551         *
552         * @og.rev 3.5.4.0 (2003/11/25) 新規作成
553         * @og.rev 5.0.2.0 (2009/11/01) 複数パラメーターの選択に対応
554         *
555         * @param   val 値
556         */
557        public void setValue( final String val ) {
558//              value = nval( getRequestParameter( val ),value );
559                value = nval( StringUtil.array2line( getRequestParameterValues( val ), "|" ),value );
560        }
561
562        /**
563         * 値を外部から取り出します。
564         *
565         * OptionTag で、value を取り出して、内部の値と同じ場合は、選択状態にします。
566         *
567         * @og.rev 3.5.4.0 (2003/11/25) 新規作成
568         * @og.rev 5.7.1.0 (2013/12/06) OptionAncestorIF にする為、protected ⇒ public 化する。
569         *
570         * @return      内部に設定された値
571         */
572//      protected String getValue() {
573        public String getValue() {
574                return value;
575        }
576
577//      /**
578//       * 親のカラムを取得
579//       *
580//       * QueryOptiontagで、eventColumnを取り出して生SQL文の
581//       * セッションへの登録判断をします
582//       *
583//       * @og.rev 4.3.6.0 (2009/04/01)
584//       *
585//       * @return イベントカラム
586//       */
587//      protected String getEventColumn() {
588//              return eventColumn;
589//      }
590
591        /**
592         * 【TAG】イベントカラム(親カラム)を指定します。
593         *
594         * @og.tag
595         *   親子関係のカラムを作成する場合に利用します。
596         *   queryOptionタグとセットで利用して下さい。
597         *
598         *   ※詳細はcolumnTagのeventColumn属性の説明をご覧下さい。
599         *
600         * @og.rev 4.3.6.0 (2009/04/01)
601         *
602         * @param   col 親カラム名
603         */
604        public void setEventColumn( final String col ) {
605                eventColumn = nval( getRequestParameter( col ), eventColumn );
606        }
607
608        /**
609         * 【TAG】イベントカラム指定時に呼び出すURL。
610         *
611         * @og.tag
612         *   イベントカラム指定時に部品を作成するJSPを指定します。
613         *   初期値はシステムリソースのEVENT_COLUMN_URLです。
614         *   (例:eventURL="makeColumn_custom.jsp")
615         *
616         *   ※詳細はcolumnTagのeventURL属性の説明をご覧下さい。
617         *
618         * @og.rev 4.3.6.0 (2009/04/01)
619         *
620         * @param       url     呼び出すURL
621         */
622        public void setEventURL( final String url ) {
623                eventURL = nval( getRequestParameter( url ), eventURL );
624        }
625
626        /**
627         * 複数選択可能時に全選択を設定するかどうかを返します。
628         *
629         * これは、上位入れ子のタグの OptionTag で、multipleAll を取り出して、
630         * true であれば、全選択に設定します。
631         *
632         * @og.rev 3.8.0.9 (2005/10/17) 新規作成
633         * @og.rev 5.7.1.0 (2013/12/06) OptionAncestorIF にする為、protected ⇒ public 化する。
634         *
635         * @return      全選択:true / 通常:false
636         */
637//      protected boolean isMultipleAll() {
638        public boolean isMultipleAll() {
639                return multipleAll;
640        }
641
642        /**
643         * 【TAG】value属性に値がセットされていないとき使用する、初期値を指定します。
644         *
645         * @og.tag
646         * value属性に値がセットされていないときに、初期値をセットします。
647         *
648         * なお、commandがRENEWの場合は、このdefaultValは適用されません。
649         * これは、defaultValの値が埋め込まれた項目が存在する画面に戻った際に、
650         * defaultValの項目の値がnullとなっていた場合に、defaultValの値が復元されると、
651         * 検索結果との不一致が発生するためです。
652         *
653         * @og.rev 3.5.4.0 (2003/11/25) 新規作成
654         * @og.rev 5.0.2.0 (2009/11/01) 複数パラメーターの選択に対応
655         *
656         * @param       dv 初期値
657         */
658        public void setDefaultVal( final String dv ) {
659//              defaultVal = nval( getRequestParameter( dv ),defaultVal );
660                defaultVal = nval( StringUtil.array2line( getRequestParameterValues( dv ), "|" ),defaultVal );
661        }
662
663        /**
664         * 【TAG】値なしのOptionを含めるかどうか[true/false]を指定します(初期値:false)。
665         *
666         * @og.tag
667         * カラムがプルダウンメニュー形式の場合、選択肢には通常データベース登録できる候補が
668         * 並びます。しかし、検索時には、候補を絞りたくない(指定しない)場合があり、
669         * その様な場合には、値なしのOptionを含める(true)ことで、対応可能です。
670         * 初期値:false(値なしのOptionを含めない)は、過去の互換性を重視しているため、column タグと異なります。
671         *
672         * @og.rev 5.1.9.0 (2010/08/01) 新規追加
673         *
674         * @param   flag  [true:含める/それ以外:含めない]
675         */
676        public void setAddNoValue( final String flag ) {
677                addNoValue = nval( getRequestParameter( flag ),addNoValue );
678        }
679
680        /**
681         * パラメーター変換({&#064;XXXX}の置き換えをしない状態のパラメーターをセットします。
682         *
683         * @og.rev 5.1.7.0 (2010/06/01) 新規作成(動的プルダウン実装見直し)
684         * @og.rev 5.5.4.0 (2012/07/02) 予約語対応
685         *
686         * @param   param パラメーター
687         */
688        public void setRawParam( final String param ) {
689//              rawParam = nval( param, rawParam );
690                rawParam = nval( getReservedParameter(param), rawParam ); // 5.5.4.0 (2012/07/02)
691        }
692
693        /**
694         * 【TAG】eventColumn実行後のcallbak関数指定。
695         *
696         * @og.tag
697         * eventColumnの動作終了後に実行するCallback関数の指定を行います。
698         * 関数名のみを指定して下さい。
699         *  ex) sampleCallback()を実行する場合はeventCallback="sampleCallback"
700         * 実行する関数の第一引数には自動的に次の要素が入った配列が渡されます
701         *  [0] 変更された子カラムのID属性値
702         *  [1] evnetColumn実行後の子カラムの値
703         *  [2] eventColumn実行前の子カラムの値
704         *
705         * この属性は、optionAttributesへの設定と同様の動作を行います。
706         *
707         * @og.rev 5.5.4.0 (2012/07/02) 新規追加
708         *
709         * @param   callback callbak関数
710         */
711        public void setEventCallback( final String callback ) {
712                // optionAttributes扱いで登録します。
713                if( callback != null && callback.length() > 0 ){
714                        add( "optionAttributes", "eventCallback='"+getRequestParameter( callback )+"'" );
715                }
716        }
717        
718        /**
719         * 【TAG】リアルタイムチェックを行わない指定。
720         *
721         * @og.tag
722         * カラム単位でリアルタイムチェックを行わない設定をします。
723         * タグに独自属性としてrealTimeChk="xxx"を追記します。
724         * falseを設定した場合にチェックが行われなくなります。
725         * 初期値はリアルタイムチェックを行う(何も指定しない)です。
726         * 
727         * この属性は、optionAttributesへの設定と同様の動作を行います。
728         *
729         * @og.rev 5.9.32.2 (2018/05/18) 新規追加
730         *
731         * @param   flg リアルタイムチェックを行うかどうか
732         */
733        public void setUseRealTimeCheck( final String flg ) {
734                String rtcf = getRequestParameter( flg );
735                // optionAttributes扱いで登録します。
736                if( rtcf != null && rtcf.length() > 0 ){
737                        add( "optionAttributes", " realTimeChk=\""+getRequestParameter( flg )+"\"" );
738                }
739        }
740
741        /**
742         * シリアライズ用のカスタムシリアライズ書き込みメソッド
743         *
744         * @og.rev 4.0.0.0 (2006/09/31) 新規追加
745         * @serialData 一部のオブジェクトは、シリアライズされません。
746         *
747         * @param       strm    ObjectOutputStreamオブジェクト
748         * @throws IOException  入出力エラーが発生した場合
749         */
750        private void writeObject( final ObjectOutputStream strm ) throws IOException {
751                strm.defaultWriteObject();
752        }
753
754        /**
755         * シリアライズ用のカスタムシリアライズ読み込みメソッド
756         *
757         * ここでは、transient 宣言された内部変数の内、初期化が必要なフィールドのみ設定します。
758         *
759         * @og.rev 4.0.0.0 (2006/09/31) 新規追加
760         * @serialData 一部のオブジェクトは、シリアライズされません。
761         *
762         * @param       strm    ObjectInputStreamオブジェクト
763         * @see #release2()
764         * @throws IOException  シリアライズに関する入出力エラーが発生した場合
765         * @throws ClassNotFoundException       クラスを見つけることができなかった場合
766         */
767        private void readObject( final ObjectInputStream strm ) throws IOException , ClassNotFoundException {
768                strm.defaultReadObject();
769                option = new Options();
770        }
771
772        /**
773         * このオブジェクトの文字列表現を返します。
774         * 基本的にデバッグ目的に使用します。
775         *
776         * @return このクラスの文字列表現
777         */
778        @Override
779        public String toString() {
780                return org.opengion.fukurou.util.ToString.title( this.getClass().getName() )
781                                .println( "VERSION"             ,VERSION                )
782                                .println( "td_flag"             ,td_flag                )
783                                .println( "colspan"             ,colspan                )
784                                .println( "value"               ,value                  )
785                                .println( "defaultVal"  ,defaultVal             )
786                                .println( "multipleAll" ,multipleAll    )
787                                .println( "Other..."    ,getAttributes().getAttribute() )
788                                .fixForm().toString() ;
789        }
790}