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