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 * パラメーター変æ›({@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 }