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 *
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.1.0 (2013/12/06)" ;
068
069 private static final long serialVersionUID = 571020131206L ;
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 * @return 後続å?ç�?
092 */
093 @Override
094 public int doEndTag() {
095 debugPrint(); // 4.0.0 (2005/02/28)
096 // 5.2.2.0 (2010/11/01) caseKey 、caseVal 属æ?対å¿?
097 if( useTag() ) {
098 StringBuilder rtn = new StringBuilder( HybsSystem.BUFFER_MIDDLE );
099 // display:none は、datalist の optionのBODY部がã?HTML5 以外では表示されてしまã�?�Ÿめã?
100 rtn.append("<div style=\"display:none;\">" );
101 rtn.append("<datalist id=\"").append( id ).append( "\" >" );
102 rtn.append( option.getOption() );
103 rtn.append( "</datalist>" );
104 rtn.append( "</div>" );
105
106 jspPrint( rtn.toString() );
107 }
108 return(EVAL_PAGE);
109 }
110
111 /**
112 * タグリブオブジェクトをリリースしますã?
113 * キャãƒ?‚·ュされて再利用されるã?で、フィールドã?初期設定を行いますã?
114 *
115 */
116 @Override
117 protected void release2() {
118 super.release2();
119 option = new Options();
120 id = null;
121 }
122
123 /**
124 * ãƒ??タリストã?選択é?目を追åŠ?�—ますã?
125 *
126 * datalist タグのBODY要ç´?? OptionTag よりアクセスされますã?
127 *
128 * @param opt オプションタグæ–?—å?
129 */
130 public void addOption( final String opt ) {
131 option.add( opt );
132 }
133
134 /**
135 * 【HTML】要ç´?�«対して固有ã?名前(id)をつける場合に設定しますã?
136 *
137 * @og.tag
138 * ãƒ??タリスãƒ?の id 属æ?は、フォーãƒ?? list 属æ?と同じキーを指定する事で関連付けしますã?
139 *
140 * @param id 固有ã?名前
141 */
142 @Override
143 public void setId( final String id ) {
144 this.id = nval( getRequestParameter( id ), null );
145 }
146
147 /**
148 * 値を外部から取り出しますã?
149 *
150 * OptionTag で、value を取りå?して、å?部の値と同じ場合ã?ã€?�¸択状態にしますã?
151 *
152 * @og.rev 3.5.4.0 (2003/11/25) 新規作æ?
153 *
154 * @return å†?ƒ¨に設定された値
155 */
156 public String getValue() {
157 // ここでは、何もしませんã€?
158 return null;
159 }
160
161 /**
162 * è¤?•°選択可能時に全選択を設定するかどã�?�‹を返しますã?
163 *
164 * これは、上位å?れ子ã?タグの OptionTag で、multipleAll を取りå?してã€?
165 * true であれば、å?選択に設定しますã?
166 *
167 * @og.rev 3.8.0.9 (2005/10/17) 新規作æ?
168 *
169 * @return 全選æŠ?true / 通常:false
170 */
171 public boolean isMultipleAll() {
172 // ここでは、何もしませんã€?
173 return false;
174 }
175
176 /**
177 * パラメーター変換({@XXXX}の置き換えをしなã�?ж態ã?パラメーターをセãƒ?ƒˆしますã?
178 *
179 * @og.rev 5.1.7.0 (2010/06/01) 新規作æ?(動的プルãƒ?‚¦ン実è£?¦‹直ã�?
180 * @og.rev 5.5.4.0 (2012/07/02) 予ç´?ªž対å¿?
181 *
182 * @param param パラメーター
183 */
184 public void setRawParam( final String param ) {
185 // ここでは、何もしませんã€?
186 }
187
188 /**
189 * シリアライズ用のカスタãƒ?‚·リアライズ書き込みメソãƒ?ƒ‰
190 *
191 * @serialData ä¸?ƒ¨のオブジェクトã?、シリアライズされませんã€?
192 *
193 * @param strm ObjectOutputStreamオブジェクãƒ?
194 * @throws IOException シリアライズに関する入出力エラーが発生したå?å�?
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 * @throws IOException シリアライズに関する入出力エラーが発生したå?å�?
210 * @throws ClassNotFoundException クラスを見つけることができなかったå?å�?
211 */
212 private void readObject( final ObjectInputStream strm ) throws IOException , ClassNotFoundException {
213 strm.defaultReadObject();
214 option = new Options();
215 }
216
217 /**
218 * こã?オブジェクトã?æ–?—å?表現を返しますã?
219 * 基本çš?�«ãƒ?ƒ�ãƒ?‚°目çš?�«使用しますã?
220 *
221 * @return こã?クラスのæ–?—å?表現
222 */
223 @Override
224 public String toString() {
225 return org.opengion.fukurou.util.ToString.title( this.getClass().getName() )
226 .println( "VERSION" ,VERSION )
227 .println( "id" ,id )
228 .println( "Other..." ,getAttributes().getAttribute() )
229 .fixForm().toString() ;
230 }
231 }