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 */ 016package org.opengion.hayabusa.taglib; 017 018import java.util.Set; // 7.0.7.0 (2019/12/13) 019 020import org.opengion.hayabusa.common.HybsSystem; // 7.0.7.0 (2019/12/13) 021import org.opengion.hayabusa.common.HybsSystemException; // 7.0.7.0 (2019/12/13) 022import org.opengion.fukurou.util.XHTMLTag; 023import org.opengion.fukurou.util.StringUtil; 024import org.opengion.fukurou.util.ArraySet; // 7.0.7.0 (2019/12/13) 025import static org.opengion.fukurou.util.StringUtil.nval ; // 7.0.7.0 (2019/12/13) 026 027/** 028 * 【入力】複数行の入力が可能なテキスト入力フィールドを作成するHTML拡張タグです。 029 * 030 * name 属性に ラベルリソース のキーを与えることで、 ロケールにあわせたリソースを使用して、 031 * 画面に表示します。 032 * ロケールは、ユーザー情報の lang 属性を初期値で使用し、 セットされていない場合は、 033 * リクエスト情報のロケールから取得します。 034 * ラベル部分と入力フィールド部分がテーブルタグの <td> により左右に分割されます。 035 * HTML 表示時は、前後に<tr>タグで囲って、 整形できます。 036 * 037 * @og.formSample 038 * ●形式:<og:queryOption > 039 * SELECT文 040 * </og:queryOption > 041 * ●body:あり(EVAL_BODY_BUFFERED:BODYを評価し、{@XXXX} を解析します) 042 * 043 * ●Tag定義: 044 * <og:textarea 045 * name ○【HTML】名前を指定します(必須)。 046 * lbl 【TAG】ラベルリソースのラベルIDを指定します 047 * rows 【HTML】高さ(行数)を指定します 048 * cols 【HTML】横幅(カラム数)を指定します 049 * td 【TAG】テーブル形式の <td> タグを使用するかどうか[yes/no/false]を指定します(初期値:yes) 050 * colspan 【TAG】フィールド部分の colspan を指定します 051 * rowspan 【TAG】ラベル、フィールド共に rowspan を指定します 052 * must 【TAG】必須入力を表す色に変えるかどうか[true/false]を指定します(初期値:false) 053 * mustAny 【TAG】選択必須入力(どれかひとつ必須)を表す色[true/mustAny/その他]を指定します(初期値:無指定) 054 * useMustHidden 【TAG】必須の自動チェック用Hiddenを出力するかどうか[true/false]を指定します(初期値:true) 055 * aimai 【TAG】曖昧検索可能フィールドとして、曖昧検索方法を指定します(初期値:null) 056 * id 【HTML】要素に対して固有の名前(id)をつける場合に設定します 057 * lang 【HTML】要素の内容と他の属性値の言語(lang,xml:lang)を指定します 058 * dir 【HTML】文字表記の方向(dir)を指定します 059 * title 【HTML】要素に対する補足的情報(title)を設定します 060 * style 【HTML】この要素に対して適用させるスタイルシート(style)を設定します 061 * readonly 【TAG】その部品に対して変更が出来ないように(readonly)指定します(サーバーに送信される) 062 * disabled 【TAG】その部品に対して、選択や変更が出来ないように(disabled)指定します(サーバーに送信されない) 063 * tabindex 【HTML】タブの移動順(tabindex)を指定します(0 ~ 32767) 064 * accesskey 【HTML】アクセスキー(alt+キーで直接指定)を割り当てます 065 * clazz 【HTML】要素に対して class 属性を設定します 066 * language 【TAG】タグ内部で使用する言語コード[ja/en/zh/…]を指定します 067 * onClick 【HTML】JavaScriptのイベント onClick を設定します(例:onClick="renew('query.jsp','QUERY');") 068 * onBlur 【HTML】JavaScriptのイベント onBlur を設定します(例:onBlur="this.value=value.toUpperCase();") 069 * onFocus 【HTML】JavaScriptのイベント onFocus を設定します 070 * ondblClick 【HTML】JavaScriptのイベント ondblClick を設定します 071 * onMouseDown 【HTML】JavaScriptのイベント onMouseDown を設定します 072 * onMouseUp 【HTML】JavaScriptのイベント onMouseUp を設定します 073 * onMouseMove 【HTML】JavaScriptのイベント onMouseMove を設定します 074 * onMouseOut 【HTML】JavaScriptのイベント onMouseOut を設定します 075 * onMouseOver 【HTML】JavaScriptのイベント onMouseOver を設定します 076 * onSelect 【HTML】JavaScriptのイベント onSelect を設定します 077 * onKeydown 【HTML】JavaScriptのイベント onKeydown を設定します 078 * onKeypress 【HTML】JavaScriptのイベント onKeypress を設定します 079 * onKeyup 【HTML】JavaScriptのイベント onKeyup を設定します 080 * autofocus 【HTML5】指定した入力欄にカーソルが当たって自動的にフォーカスされます。 081 * placeholder 【HTML5】入力欄に初期表示する内容を指定します。 082 * required 【HTML5】入力必須を指定します 083 * roles 【TAG】ロールをセットします 084 * useRealTimeCheck 【TAG】(通常は使いません)リアルタイムチェックを行うかどうか(初期値:true:行う) 5.9.32.2 (2018/05/18) 085 * caseKey 【TAG】このタグ自体を利用するかどうかの条件キーを指定します(初期値:null) 086 * caseVal 【TAG】このタグ自体を利用するかどうかの条件値を指定します(初期値:null) 087 * caseNN 【TAG】指定の値が、null/ゼロ文字列 でない場合(Not Null=NN)は、このタグは使用されます(初期値:判定しない) 088 * caseNull 【TAG】指定の値が、null/ゼロ文字列 の場合は、このタグは使用されます(初期値:判定しない) 089 * caseIf 【TAG】指定の値が、true/TRUE文字列の場合は、このタグは使用されます(初期値:判定しない) 090 * debug 【TAG】デバッグ情報を出力するかどうか[true/false]を指定します(初期値:false) 091 * > ... Body ... 092 * </og:textarea> 093 * 094 * ●使用例 095 * <og:textarea name="BUN" /> 096 * 097 * <og:textarea name="BUN"> 初期値に値をセットしたいとき 098 * test 099 * </og:textarea name="BUN"> 100 * 101 * @og.group 画面部品 102 * 103 * @version 4.0 104 * @author Kazuhiko Hasegawa 105 * @since JDK5.0, 106 */ 107public class TextareaTag extends HTMLTagSupport { 108 /** このプログラムのVERSION文字列を設定します。 {@value} */ 109 private static final String VERSION = "7.0.7.0 (2019/12/13)" ; 110 private static final long serialVersionUID = 707020191213L ; 111 112 private static final Set<String> TD_SET = new ArraySet<>( "yes" , "no" , "false" ); // 7.0.7.0 (2019/12/13) 113 114 // 7.0.7.0 (2019/12/13) 115 private final String CLM = HybsSystem.sysBool( "HTML_LABEL_SEPARATOR" ) ? ":" : "" ; 116 117 private String tdFlag = "yes"; // 7.0.7.0 (2019/12/13) yes:<td> タグを使用 / false:フィールドのみ / no:ラベルとフィールド 118 private String colspan = ""; // 7.0.7.0 (2019/12/13) colspan 属性を追加。 119 private String rowspan = ""; // 7.0.7.0 (2019/12/13) rowspan 属性を追加。 120 121 /** 122 * デフォルトコンストラクター 123 * 124 * @og.rev 6.4.2.0 (2016/01/29) PMD refactoring. Each class should declare at least one constructor. 125 */ 126 public TextareaTag() { super(); } // これも、自動的に呼ばれるが、空のメソッドを作成すると警告されるので、明示的にしておきます。 127 128 /** 129 * Taglibの開始タグが見つかったときに処理する doStartTag() を オーバーライドします。 130 * 131 * @og.rev 6.3.4.0 (2015/08/01) caseKey,caseVal,caseNN,caseNull,caseIf 属性対応 132 * 133 * @return 後続処理の指示( EVAL_BODY_BUFFERED ) 134 */ 135 @Override 136 public int doStartTag() { 137 // 6.4.1.1 (2016/01/16) PMD refactoring. A method should have only one exit point, and that should be the last statement in the method 138 // 反転注意 139 return useTag() 140 ? EVAL_BODY_BUFFERED // Body を評価する。( extends BodyTagSupport 時) 141 : SKIP_BODY ; 142 } 143 144 /** 145 * Taglibのタグ本体を処理する doAfterBody() を オーバーライドします。 146 * 147 * @og.rev 3.1.1.0 (2003/03/28) ボディの内容を取得する処理を、CommonTagSupport で行う。 148 * @og.rev 3.1.1.0 (2003/03/28) body 属性に、 {@XXXX} パース機能を付加する。 149 * 150 * @return 後続処理の指示(SKIP_BODY) 151 */ 152 @Override 153 public int doAfterBody() { 154 final String str = getBodyString(); 155 156 if( str != null && str.length() > 0 ) { 157 final String label = StringUtil.htmlFilter( str ); 158 if( label != null && label.length() > 0 ) { 159 set( "body",label ); 160 } 161 } 162 163 return SKIP_BODY ; 164 } 165 166 /** 167 * タグリブオブジェクトをリリースします。 168 * キャッシュされて再利用されるので、フィールドの初期設定を行います。 169 * 170 * @og.rev 7.0.7.0 (2019/12/13) td,colspan,rowspan 属性の追加。 171 */ 172 @Override 173 protected void release2() { 174 super.release2(); 175 tdFlag = "yes"; // table形式の <td> タグを使用するかどうか 176 colspan = ""; 177 rowspan = ""; // 6.2.0.0 (2015/02/27) rowspan 属性を追加 178 } 179 180 /** 181 * 検索条件の入力用のテキストフィールドを作成します。 182 * 183 * テーブルタグによりフィールドは分割されます。 184 * 使用時は、テーブルタグを前後に使用して下さい。 185 * 186 * @og.rev 4.3.7.1 (2009/06/08) id=labelのclass化 187 * @og.rev 5.2.1.0 (2010/10/01) must , mustAny 属性を自動化します。 188 * @og.rev 6.2.0.0 (2015/02/27) aimai 属性を追加。 189 * @og.rev 7.0.7.0 (2019/12/13) td,colspan,rowspan 属性の追加。 190 * 191 * @return 入力用のテキストフィールドタグ 192 * @og.rtnNotNull 193 */ 194 @Override 195 protected String makeTag() { 196 final String name = get( "name" ); // 6.2.0.0 (2015/02/27) 後で使うので変数化 197 198 if( getMsglbl() == null ) { setLbl( name ); } 199 200 final StringBuilder rtn = new StringBuilder( BUFFER_MIDDLE ); 201 // 4.3.7.1 (2009/06/08) id=labelのclass化 202 // rtn.append( "<td id=\"label\">" ); 203// .append( "<td class=\"label\">" ) 204 // 7.0.7.0 (2019/12/13) td,colspan,rowspan 属性の追加。 205 if( "yes".equals( tdFlag ) ) { 206 rtn.append( "<td class=\"label\" " ) // 7.0.7.0 (2019/12/13) 207 .append( rowspan ) // 7.0.7.0 (2019/12/13) 208 .append( '>' ) // 7.0.7.0 (2019/12/13) 209 .append( getLongLabel() ) // 4.0.0 (2005/01/31) 210 // .append( "</td>" ) 211 // .append( "<td>" ) 212 .append( "</td><td " ) // 7.0.7.0 (2019/12/13) 213 .append( colspan ) // 7.0.7.0 (2019/12/13) 214 .append( rowspan ) // 7.0.7.0 (2019/12/13) 215 .append( '>' ) // 7.0.7.0 (2019/12/13) 216 .append( XHTMLTag.textarea( getAttributes() ) ) 217 .append( "</td>" ) 218 .append( makeAimaiPicker( name ) ) // 6.2.0.0 (2015/02/27) aimai 属性を追加 219 .append( makeMustHidden( name ) ); // 6.2.0.0 (2015/02/27) , 5.6.2.2 (2013/03/15) 220 } 221 else if( "no".equals( tdFlag ) ) { 222 rtn.append( "<span class=\"label\">" ) 223 .append( getLongLabel() ) // 4.0.0 (2005/01/31) 224 .append( CLM ) 225 .append( "</span>" ) 226 .append( XHTMLTag.textarea( getAttributes() ) ) 227 .append( makeAimaiPicker( name ) ) // 6.2.0.0 (2015/02/27) aimai 属性を追加 228 .append( makeMustHidden( name ) ); // 6.2.0.0 (2015/02/27) , 5.6.2.2 (2013/03/15) 229 // "flase".equals( tdFlag ) の条件 230 } 231 else { 232 rtn.append( XHTMLTag.textarea( getAttributes() ) ) 233 .append( makeAimaiPicker( name ) ) // 6.2.0.0 (2015/02/27) aimai 属性を追加 234 .append( makeMustHidden( name ) ); // 6.2.0.0 (2015/02/27) , 5.6.2.2 (2013/03/15) 235 } 236 237 return rtn.toString() ; 238 } 239 240 /** 241 * 【HTML】名前を指定します。 242 * 243 * @og.tag 名前を指定します。 244 * 245 * @param name 名前 246 */ 247 public void setName( final String name ) { 248 set( "name",getRequestParameter( name ) ); 249 } 250 251 /** 252 * 【HTML】高さ(行数)を指定します。 253 * 254 * @og.tag 高さ(行数)を指定します。 255 * 256 * @param rows 高さ(行数) 257 */ 258 public void setRows( final String rows ) { 259 set( "rows",getRequestParameter( rows ) ); 260 } 261 262 /** 263 * 【HTML】横幅(カラム数)を指定します。 264 * 265 * @og.tag 横幅を指定します。 266 * 267 * @param cols 横幅(カラム数) 268 */ 269 public void setCols( final String cols ) { 270 set( "cols",getRequestParameter( cols ) ); 271 } 272 273 /** 274 * 【TAG】テーブル形式の <td> タグを使用するかどうか[yes/no/false]を指定します(初期値:yes)。 275 * 276 * @og.tag 277 * 通常(初期値:yes)は、テーブル形式の<td> タグを使用して、ラベルとフィールドを整列させます。 278 * no の場合は、tdタグを使用せず、ラベルとフィールドを連続して出力します。 279 * false は、ラベルを出力せず、フィールドのみ出力します。 280 * <og:input name="PN" td="false" /> 281 * 282 * @og.rev 7.0.7.0 (2019/12/13) td,colspan,rowspan 属性の追加。 283 * 284 * @param flag tdタグ使用 [yes:tdタグを使用/no:ラベルとフィールド/false:フィールドのみ] 285 */ 286 public void setTd( final String flag ) { 287 final String td = nval( getRequestParameter( flag ),tdFlag ); 288 289 if( check( td , TD_SET ) ) { 290 tdFlag = td; 291 } 292 else { 293 final String errMsg = "Error in SelectTag [td]: " 294 + td + " in [" + String.join( ", " , TD_SET ) + "] only used."; 295 throw new HybsSystemException( errMsg ); 296 } 297 } 298 299 /** 300 * 【TAG】フィールド部分の colspan を指定します。 301 * 302 * @og.tag 303 * 通常は、ラベルとフィールドが、別のtdで囲われます。しかし、場合によっては、 304 * フィールド部の長いカラムがある場合、上下のカラムとの位置関係がおかしくなり、 305 * ラベルとフィールドが離れて表示されるケースがあります。 306 * この場合、長いフィールド部を持つカラムに、colspan 属性を指定すると、 307 * その分のカラムを割り当てることにより、上下のカラムとの位置関係を 308 * 調節することが可能になります。 309 * 通常は、3 を指定して、tdが、フィールド、ラベル、フィールドの 310 * 組み合わせ部分に、長いフィールドが適用されるように使用します。 311 * 312 * <og:input name="PN" colspan="3" /> 313 * 314 * @og.rev 7.0.7.0 (2019/12/13) td,colspan,rowspan 属性の追加。 315 * 316 * @param sp フィールド部分のcolspan 317 */ 318 public void setColspan( final String sp ) { 319 colspan = nval( getRequestParameter( sp ),colspan ); 320 if( colspan.length() > 0 ) { 321 colspan = " colspan=\"" + colspan + "\" "; 322 } 323 } 324 325 /** 326 * 【TAG】ラベル、フィールド共に rowspan を指定します。 327 * 328 * @og.tag 329 * 通常は、ラベルとフィールドが、別のtdで囲われます。rowspan は、 330 * そのどちらの TDフィールドにも、設定します。 331 * 初期値は、rowspan を付けないです。 332 * 333 * <og:input name="PN" rowspan="3" /> 334 * 335 * @og.rev 7.0.7.0 (2019/12/13) td,colspan,rowspan 属性の追加。 336 * 337 * @param sp ラベル、フィールド部分のrowspan 338 */ 339 public void setRowspan( final String sp ) { 340 rowspan = nval( getRequestParameter( sp ),rowspan ); 341 if( rowspan.length() > 0 ) { 342 rowspan = " rowspan=\"" + rowspan + "\" "; 343 } 344 } 345 346 /** 347 * 【TAG】リアルタイムチェックを行うかどうかを指定します(初期値:true)。 348 * 349 * @og.tag 350 * カラム単位でリアルタイムチェックを行うかどうかを設定をします。 351 * タグに独自属性としてrealTimeCheck="true/false"を追記します。 352 * falseを設定した場合にチェックが行われなくなります。 353 * 初期値はリアルタイムチェックを行う(true)です。 354 * 355 * この属性は、optionAttributesへの設定と同様の動作を行います。 356 * 引数の文字列の、true/false 判定を行っていません。そのままの文字列が設定されます。 357 * JavaScript 側では、false 判定のみ行っているので、不正な文字列の場合は、 358 * 初期値(true:リアルタイムチェックを行う)が適用されます。 359 * これは、Ver5 とロジックを合わせておくための処置です。 360 * 361 * @og.rev 5.9.32.2 (2018/05/18) 新規追加 362 * @og.rev 6.9.8.0 (2018/05/28) Ver5 とロジックを合わせます。 363 * 364 * @param flag リアルタイムチェックを行うかどうか [true:行う/false:行わない] 365 */ 366 public void setUseRealTimeCheck( final String flag ) { 367 // optionAttributes扱いで登録します。 368 final String rtcf = getRequestParameter( flag ); 369 370 if( StringUtil.isNotNull( rtcf ) ){ 371 add( "optionAttributes", "realTimeChk=\"" + rtcf + "\"" ); // 連結時のスペースは、Attributes クラスで処理 372 } 373 374// // optionAttributes扱いで登録します。 375// final boolean useRtc = StringUtil.nval( getRequestParameter( flag ) , true ); 376// 377// if( !useRtc ) { // true 以外の場合のみ、optionAttributes に属性を追加します。 378// add( "optionAttributes", "realTimeChk=\"false\"" ); // 連結時のスペースは、Attributes クラスで処理 379// } 380 } 381}