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.hayabusa.common.HybsSystem;
026    
027    /**
028     * フォーãƒ??入力æ¬?�ªどで入力å?補となるデータリストを定義するHTML拡張タグですã?
029     * HTML5 から、新たに追åŠ?�•れた要ç´?�§すã?
030     *
031     * ãƒ??タリストå?の選択肢は、optionタグ、queryOptionタグによってæŒ?®šしますã?
032     * ãƒ??タリスãƒ?の id 属æ?は、フォーãƒ?? list 属æ?と同じキーを指定する事で関連付けしますã?
033     *
034     * @og.formSample
035     * ●形式ï¼?lt;og:datalist id="…" />
036     * ●body?šあã‚?EVAL_BODY_INCLUDE:BODYをインクルードし、{@XXXX} は解析しません)
037     *
038     * ●Tag定義??
039     *   <og:datalist
040     *       id               ○ã?TAG】å?力å?補を表示するフォーãƒ?? list 属æ?に設定すã‚?id (å¿??)
041     *       caseKey            【TAG】このタグ自体を利用するかどã�?�‹の条件キーを指定しまã�?初期値:null)
042     *       caseVal            【TAG】このタグ自体を利用するかどã�?�‹の条件値を指定しまã�?初期値:null)
043     *       caseNN             【TAG】指定ã?値がã?null/ゼロæ–?­—å? でなã�??å�?Not Null=NN)は、このタグは使用されまã�?初期値:true)
044     *       caseNull           【TAG】指定ã?値がã?null/ゼロæ–?­—å? の場合ã?、このタグは使用されまã�?初期値:true)
045     *       debug              【TAG】デバッグæƒ??をå?力するかどã�?�‹[true/false]を指定しまã�?初期値:false)
046     *   >   ... Body ...
047     *   </og:datalist>
048     *
049     * ●使用ä¾?
050     * <og:input type="text" name="tokyo" autocomplete="on" list="tokyo.sel" />
051     *
052     *  <og:datalist id="tokyo.sel" >
053     *      <og:option value="渋谷" />
054     *      <og:option value="新宿" />
055     *      <og:option value="æ±?¢? />
056     *  </og:datalist><
057     *
058     * @og.group 【HTML5】選択データ制御
059     * @og.rev 5.7.1.0 (2013/12/06) 新規追åŠ?
060     *
061     * @version  6.0
062     * @author       Kazuhiko Hasegawa
063     * @since    JDK5.0,
064     */
065    public class DatalistTag extends CommonTagSupport implements OptionAncestorIF {
066            //* こã?プログラãƒ??VERSIONæ–?­—å?を設定しますã?       {@value} */
067            private static final String VERSION = "5.7.6.2 (2014/05/16)" ;
068    
069            private static final long serialVersionUID = 576220140516L ;
070    
071            private transient Options option        = new Options();
072    
073            private String id       = null;         // フォーãƒ?�¨関連付けるid
074    
075            /**
076             * Taglibの開始タグが見つかったときに処ç�?�™ã‚?doStartTag() ã‚?オーバã?ライドしますã?
077             *
078             * @return      後続å?ç�??æŒ?¤º( EVAL_BODY_INCLUDE )
079             */
080            @Override
081            public int doStartTag() {
082                    if( useTag() ) {
083                            return EVAL_BODY_INCLUDE ;      // Body インクルーãƒ? extends TagSupport æ™?
084                    }
085                    return SKIP_BODY ;                              // Body を評価しなã�?
086            }
087    
088            /**
089             * Taglibの終äº?‚¿グが見つかったときに処ç�?�™ã‚?doEndTag() ã‚?オーバã?ライドしますã?
090             *
091             * @og.rev 5.7.6.2 (2014/05/16) IEのHTML5機è?が無効の場合ã?INDBMENU を作æ?しますã?
092             *
093             * @return      後続å?ç�?
094             */
095            @Override
096            public int doEndTag() {
097                    debugPrint();           // 4.0.0 (2005/02/28)
098                    // 5.2.2.0 (2010/11/01) caseKey 、caseVal 属æ?対å¿?
099                    if( useTag() ) {
100                            StringBuilder rtn = new StringBuilder( HybsSystem.BUFFER_MIDDLE );
101    
102                            // 5.7.6.2 (2014/05/16) IEのHTML5機è?が無効の場合ã?処ç�?
103                            String ieHTML5 = (String)getSessionAttribute( HybsSystem.IE_HTML5_KEY );
104                            if( "FALSE".equalsIgnoreCase( ieHTML5 ) ) {
105                                    String inName = id.endsWith( ".sel" ) ? id.substring( 0,id.length()-4 ) : id ;
106    
107                                    rtn.append("<select id='").append( id )
108                                            .append( "' style='position:absolute;' onChange='selChanged(this);' >" )
109                                            .append( option.getOption() )
110                                            .append( "</select>" )
111                                            .append( "<script type='text/javascript'>makeInputMenu('" )
112                                            .append( inName ).append( "');</script>" );
113                            }
114                            else {
115                                    // display:none は、datalist の optionのBODY部がã?HTML5 以外では表示されてしまã�?�Ÿめã?
116                                    rtn.append("<div style='display:none;'>" )
117                                            .append("<datalist id='").append( id ).append( "' >" )
118                                            .append( option.getOption() )
119                                            .append( "</datalist>" )
120                                            .append( "</div>" );
121                            }
122    
123                            jspPrint( rtn.toString() );
124                    }
125                    return EVAL_PAGE ;
126            }
127    
128            /**
129             * タグリブオブジェクトをリリースしますã?
130             * キャãƒ?‚·ュされて再利用されるã?で、フィールドã?初期設定を行いますã?
131             *
132             */
133            @Override
134            protected void release2() {
135                    super.release2();
136                    option  = new Options();
137                    id              = null;
138            }
139    
140            /**
141             * ãƒ??タリストã?選択é?目を追åŠ?�—ますã?
142             *
143             * datalist タグのBODY要ç´?? OptionTag よりアクセスされますã?
144             *
145             * @param       opt      オプションタグæ–?­—å?
146             */
147            public void addOption( final String opt ) {
148                    option.add( opt );
149            }
150    
151            /**
152             * 【HTML】要ç´?�«対して固有ã?名前(id)をつける場合に設定しますã?
153             *
154             * @og.tag
155             * ãƒ??タリスãƒ?の id 属æ?は、フォーãƒ?? list 属æ?と同じキーを指定する事で関連付けしますã?
156             *
157             * ※
158             * å†?ƒ¨事情で、inputタグ(columnタグ)の list属æ? に設定するキーもã?id属æ?に設定するキーもã?
159             * inputタグ(columnタグ)の name属æ???.sel" を標準的に使用してくださいã€?
160             *
161             * @param   id 固有ã?名前
162             */
163            @Override
164            public void setId( final String id ) {
165                    this.id = nval( getRequestParameter( id ), null );
166            }
167    
168            /**
169             * 値を外部から取り出しますã?
170             *
171             * OptionTag で、value を取りå?して、å?部の値と同じ場合ã?ã€?�¸択状態にしますã?
172             *
173             * @og.rev 3.5.4.0 (2003/11/25) 新規作æ?
174             *
175             * @return      å†?ƒ¨に設定された値
176             */
177            public String getValue() {
178                    // ここでは、何もしませんã€?
179                    return null;
180            }
181    
182            /**
183             * è¤?•°選択可能時に全選択を設定するかどã�?�‹を返しますã?
184             *
185             * これは、上位å?れ子ã?タグの OptionTag で、multipleAll を取りå?してã€?
186             * true であれば、å?選択に設定しますã?
187             *
188             * @og.rev 3.8.0.9 (2005/10/17) 新規作æ?
189             *
190             * @return      全選æŠ?true / 通常:false
191             */
192            public boolean isMultipleAll() {
193                    // ここでは、何もしませんã€?
194                    return false;
195            }
196    
197            /**
198             * パラメーター変換({&#064;XXXX}の置き換えをしなã�?ж態ã?パラメーターをセãƒ?ƒˆしますã?
199             *
200             * @og.rev 5.1.7.0 (2010/06/01) 新規作æ?(動的プルãƒ?‚¦ン実è£?¦‹直ã�?
201             * @og.rev 5.5.4.0 (2012/07/02) 予ç´?ªž対å¿?
202             *
203             * @param   param パラメーター
204             */
205            public void setRawParam( final String param ) {
206                    // ここでは、何もしませんã€?
207            }
208    
209            /**
210             * シリアライズ用のカスタãƒ?‚·リアライズ書き込みメソãƒ?ƒ‰
211             *
212             * @serialData ä¸?ƒ¨のオブジェクトã?、シリアライズされませんã€?
213             *
214             * @param       strm    ObjectOutputStreamオブジェクãƒ?
215             * @throws IOException  シリアライズに関する入出力エラーが発生したå?å�?
216             */
217            private void writeObject( final ObjectOutputStream strm ) throws IOException {
218                    strm.defaultWriteObject();
219            }
220    
221            /**
222             * シリアライズ用のカスタãƒ?‚·リアライズ読み込みメソãƒ?ƒ‰
223             *
224             * ここでは、transient 宣è¨?�•れたå†?ƒ¨変数のå†??初期化がå¿?¦�なフィールドã?み設定しますã?
225             *
226             * @serialData ä¸?ƒ¨のオブジェクトã?、シリアライズされませんã€?
227             *
228             * @param       strm    ObjectInputStreamオブジェクãƒ?
229             * @see #release2()
230             * @throws IOException  シリアライズに関する入出力エラーが発生したå?å�?
231             * @throws ClassNotFoundException       クラスを見つけることができなかったå?å�?
232             */
233            private void readObject( final ObjectInputStream strm ) throws IOException , ClassNotFoundException {
234                    strm.defaultReadObject();
235                    option = new Options();
236            }
237    
238            /**
239             * こã?オブジェクトã?æ–?­—å?表現を返しますã?
240             * 基本çš?�«ãƒ?ƒ�ãƒ?‚°目çš?�«使用しますã?
241             *
242             * @return こã?クラスのæ–?­—å?表現
243             */
244            @Override
245            public String toString() {
246                    return org.opengion.fukurou.util.ToString.title( this.getClass().getName() )
247                                    .println( "VERSION"             ,VERSION                )
248                                    .println( "id"                  ,id                             )
249                                    .println( "Other..."    ,getAttributes().getAttribute() )
250                                    .fixForm().toString() ;
251            }
252    }