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 }