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="yourarea" autocomplete="on" list="tokyo" />
051     *
052     *  <og:datalist id="tokyo" >
053     *      <og:option value="渋谷" />
054     *      <og:option value="新宿" />
055     *      <og:option value="æ±?¢? />
056     *  </og:datalist><
057     * </pre>
058     *
059     * @og.group ã€HTML5ã€‘é¸æŠžãƒ‡ãƒ¼ã‚¿åˆ¶å¾¡
060     * @og.rev 5.7.1.0 (2013/12/06) æ–°è¦è¿½åŠ?
061     *
062     * @version  6.0
063     * @author       Kazuhiko Hasegawa
064     * @since    JDK5.0,
065     */
066    public class DatalistTag extends CommonTagSupport implements OptionAncestorIF {
067            //* ã“ã?プログラãƒ??VERSIONæ–?­—å?を設定ã—ã¾ã™ã?       {@value} */
068            private static final String VERSION = "5.7.1.0 (2013/12/06)" ;
069    
070            private static final long serialVersionUID = 571020131206L ;
071    
072            private transient Options option        = new Options();
073    
074            private String id       = null;         // フォーãƒ?¨é–¢é€£ä»˜ã‘ã‚‹id
075    
076            /**
077             * Taglibã®é–‹å§‹ã‚¿ã‚°ãŒè¦‹ã¤ã‹ã£ãŸã¨ãã«å‡¦ç?™ã‚?doStartTag() ã‚?オーãƒã?ライドã—ã¾ã™ã?
078             *
079             * @return      後続å?ç??æŒ?¤º( EVAL_BODY_INCLUDE )
080             */
081            @Override
082            public int doStartTag() {
083                    if( useTag() ) {
084                            return( EVAL_BODY_INCLUDE );    // Body インクルー� extends TagSupport �
085                    }
086                    return ( SKIP_BODY );                           // Body を評価ã—ãªã?
087            }
088    
089            /**
090             * Taglibã®çµ‚äº?‚¿ã‚°ãŒè¦‹ã¤ã‹ã£ãŸã¨ãã«å‡¦ç?™ã‚?doEndTag() ã‚?オーãƒã?ライドã—ã¾ã™ã?
091             *
092             * @return      後続å?ç?
093             */
094            @Override
095            public int doEndTag() {
096                    debugPrint();           // 4.0.0 (2005/02/28)
097                    // 5.2.2.0 (2010/11/01) caseKey ã€caseVal 属æ?対å¿?
098                    if( useTag() ) {
099                            StringBuilder rtn = new StringBuilder( HybsSystem.BUFFER_MIDDLE );
100                            // display:none ã¯ã€datalist ã® optionã®BODY部ãŒã?HTML5 以外ã§ã¯è¡¨ç¤ºã•れã¦ã—ã¾ã?Ÿã‚ã?
101                            rtn.append("<div style=\"display:none;\">" );
102                            rtn.append("<datalist id=\"").append( id ).append( "\" >" );
103                            rtn.append( option.getOption() );
104                            rtn.append( "</datalist>" );
105                            rtn.append( "</div>" );
106    
107                            jspPrint( rtn.toString() );
108                    }
109                    return(EVAL_PAGE);
110            }
111    
112            /**
113             * タグリブオブジェクトをリリースã—ã¾ã™ã?
114             * キャãƒ?‚·ãƒ¥ã•れã¦å†åˆ©ç”¨ã•れるã?ã§ã€ãƒ•ィールドã?åˆæœŸè¨­å®šã‚’行ã„ã¾ã™ã?
115             *
116             */
117            @Override
118            protected void release2() {
119                    super.release2();
120                    option  = new Options();
121                    id              = null;
122            }
123    
124            /**
125             * ãƒ??タリストã?é¸æŠžé?目を追åŠ?—ã¾ã™ã?
126             *
127             * datalist ã‚¿ã‚°ã®BODYè¦ç´?? OptionTag よりアクセスã•れã¾ã™ã?
128             *
129             * @param       opt      オプションタグæ–?­—å?
130             */
131            public void addOption( final String opt ) {
132                    option.add( opt );
133            }
134    
135            /**
136             * ã€HTML】è¦ç´?«å¯¾ã—ã¦å›ºæœ‰ã?åå‰(id)ã‚’ã¤ã‘ã‚‹å ´åˆã«è¨­å®šã—ã¾ã™ã?
137             *
138             * @og.tag
139             * ãƒ??タリスãƒ?ã® id 属æ?ã¯ã€ãƒ•ォーãƒ?? list 属æ?ã¨åŒã˜ã‚­ãƒ¼ã‚’指定ã™ã‚‹äº‹ã§é–¢é€£ä»˜ã‘ã—ã¾ã™ã?
140             *
141             * @param   id 固有ã?åå‰
142             */
143            @Override
144            public void setId( final String id ) {
145                    this.id = nval( getRequestParameter( id ), null );
146            }
147    
148            /**
149             * 値を外部ã‹ã‚‰å–り出ã—ã¾ã™ã?
150             *
151             * OptionTag ã§ã€value ã‚’å–りå?ã—ã¦ã€å?部ã®å€¤ã¨åŒã˜å ´åˆã?ã€?¸æŠžçŠ¶æ…‹ã«ã—ã¾ã™ã?
152             *
153             * @og.rev 3.5.4.0 (2003/11/25) æ–°è¦ä½œæ?
154             *
155             * @return      å†?ƒ¨ã«è¨­å®šã•れãŸå€¤
156             */
157            public String getValue() {
158                    // ã“ã“ã§ã¯ã€ä½•ã‚‚ã—ã¾ã›ã‚“ã€?
159                    return null;
160            }
161    
162            /**
163             * è¤?•°é¸æŠžå¯èƒ½æ™‚ã«å…¨é¸æŠžã‚’設定ã™ã‚‹ã‹ã©ã?‹ã‚’è¿”ã—ã¾ã™ã?
164             *
165             * ã“れã¯ã€ä¸Šä½å?れå­ã?ã‚¿ã‚°ã® OptionTag ã§ã€multipleAll ã‚’å–りå?ã—ã¦ã€?
166             * true ã§ã‚れã°ã€å?é¸æŠžã«è¨­å®šã—ã¾ã™ã?
167             *
168             * @og.rev 3.8.0.9 (2005/10/17) æ–°è¦ä½œæ?
169             *
170             * @return      免鏿Š?true / 通常:false
171             */
172            public boolean isMultipleAll() {
173                    // ã“ã“ã§ã¯ã€ä½•ã‚‚ã—ã¾ã›ã‚“ã€?
174                    return false;
175            }
176    
177            /**
178             * パラメーター変æ›({&#064;XXXX}ã®ç½®ãæ›ãˆã‚’ã—ãªã?Š¶æ…‹ã?パラメーターをセãƒ?ƒˆã—ã¾ã™ã?
179             *
180             * @og.rev 5.1.7.0 (2010/06/01) æ–°è¦ä½œæ?(動的プルãƒ?‚¦ãƒ³å®Ÿè£?¦‹ç›´ã?
181             * @og.rev 5.5.4.0 (2012/07/02) 予ç´?ªžå¯¾å¿?
182             *
183             * @param   param パラメーター
184             */
185            public void setRawParam( final String param ) {
186                    // ã“ã“ã§ã¯ã€ä½•ã‚‚ã—ã¾ã›ã‚“ã€?
187            }
188    
189            /**
190             * シリアライズ用ã®ã‚«ã‚¹ã‚¿ãƒ?‚·ãƒªã‚¢ãƒ©ã‚¤ã‚ºæ›¸ãè¾¼ã¿ãƒ¡ã‚½ãƒ?ƒ‰
191             *
192             * @serialData
193             *
194             * @param       strm    ObjectOutputStreamオブジェク�
195             */
196            private void writeObject( final ObjectOutputStream strm ) throws IOException {
197                    strm.defaultWriteObject();
198            }
199    
200            /**
201             * シリアライズ用ã®ã‚«ã‚¹ã‚¿ãƒ?‚·ãƒªã‚¢ãƒ©ã‚¤ã‚ºèª­ã¿è¾¼ã¿ãƒ¡ã‚½ãƒ?ƒ‰
202             *
203             * ã“ã“ã§ã¯ã€transient 宣è¨?•れãŸå†?ƒ¨å¤‰æ•°ã®å†??åˆæœŸåŒ–ãŒå¿?¦ãªãƒ•ィールドã?ã¿è¨­å®šã—ã¾ã™ã?
204             *
205             * @serialData
206             *
207             * @param       strm    ObjectInputStreamオブジェク�
208             * @see #release2()
209             */
210            private void readObject( final ObjectInputStream strm ) throws IOException , ClassNotFoundException {
211                    strm.defaultReadObject();
212                    option = new Options();
213            }
214    
215            /**
216             * ã“ã?オブジェクトã?æ–?­—å?表ç¾ã‚’è¿”ã—ã¾ã™ã?
217             * 基本çš?«ãƒ?ƒãƒ?‚°ç›®çš?«ä½¿ç”¨ã—ã¾ã™ã?
218             *
219             * @return ã“ã?ã‚¯ãƒ©ã‚¹ã®æ–?­—å?表ç¾
220             */
221            @Override
222            public String toString() {
223                    return org.opengion.fukurou.util.ToString.title( this.getClass().getName() )
224                                    .println( "VERSION"             ,VERSION                )
225                                    .println( "id"                  ,id                             )
226                                    .println( "Other..."    ,getAttributes().getAttribute() )
227                                    .fixForm().toString() ;
228            }
229    }