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