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; // 6.4.3.4 (2016/03/11) 019import java.io.IOException; 020import java.io.ObjectInputStream; 021 022import org.opengion.fukurou.util.Options; 023import org.opengion.fukurou.util.StringUtil; 024import org.opengion.fukurou.util.TagBuffer; 025import org.opengion.fukurou.util.XHTMLTag; 026import org.opengion.fukurou.util.ToString; // 6.1.1.0 (2015/01/17) 027import org.opengion.fukurou.util.ArraySet; // 6.4.3.4 (2016/03/11) 028import org.opengion.hayabusa.common.HybsSystem; 029import org.opengion.hayabusa.common.HybsSystemException; 030import org.opengion.hayabusa.resource.ResourceManager; // 8.0.0.1 (2021/10/08) 031import org.opengion.hayabusa.db.DBColumn; // 8.0.0.1 (2021/10/08) 032 033import static org.opengion.fukurou.util.StringUtil.nval; 034 035/** 036 * プルダウンメニューを作成するHTML拡張タグです。 037 * 038 * プルダウンメニュー内の選択肢は、selectタグの内容であるoptionタグ、 039 * またはqueryOptionタグによって指定します。 040 * optionタグがセットされない場合は、name属性の、コードリソース からoption文字列より、 041 * プルダウンメニューの選択肢を作成します。 042 * name 属性に ラベルリソース のキーを与えることで、 ロケールにあわせたリソースを使用して、 043 * 画面に表示します。ロケールは、ユーザー情報の lang 属性を初期値で使用し、 044 * セットされていない場合は、リクエスト情報のロケールから取得します。 045 * language 属性で定義されている場合は、そちらを優先します。 046 * 047 * 8.0.0.1 (2021/10/08) 048 * 検索機能(絞り機能)付きのプルダウンメニューを作成する為には、文字パラメータに 049 * "class=sel2sel" と入力してください。 050 * 051 * @og.formSample 052 * ●形式:<og:select name="…" /> 053 * ●body:あり(EVAL_BODY_INCLUDE:BODYをインクルードし、{@XXXX} は解析しません) 054 * 055 * ●Tag定義: 056 * <og:select 057 * name ○【TAG】メニューの名称を指定します(必須)。 058 * value 【TAG】値を指定します 059 * defaultVal 【TAG】value属性に値がセットされていないとき使用する、初期値を指定します 060 * lbl 【TAG】ラベルリソースのラベルIDを指定します 061 * must 【TAG】必須入力を表す色に変えるかどうか[true/false]を指定します(初期値:false) 062 * mustAny 【TAG】選択必須入力(どれかひとつ必須)を表す色[true/mustAny/その他]を指定します(初期値:無指定) 063 * useMustHidden 【TAG】必須の自動チェック用Hiddenを出力するかどうか[true/false]を指定します(初期値:true) 064 * addNoValue 【TAG】値なしのOptionを含めるかどうか[true/false]を指定します(初期値:false) 065 * addKeyLabel 【TAG】セレクトメニューの場合、キー:ラベル形式で表示するかどうか[true/false/null]を指定します(初期値:null) 066 * td 【TAG】テーブル形式の <td> タグを使用するかどうか[yes/no/false]を指定します(初期値:yes) 067 * colspan 【TAG】フィールド部分の colspan を指定します 068 * rowspan 【TAG】ラベル、フィールド共に rowspan を指定します 069 * optionAttributes 【TAG】JavaScript などの HTML基本タグ以外の属性を、そのままタグとして使用します 070 * size 【TAG】リストボックスとして表示する場合の表示行数を指定します 071 * multiple 【TAG】複数選択を可能(multiple)にします(初期値:未設定) 072 * id 【HTML】要素に対して固有の名前(id)をつける場合に設定します 073 * caseKey 【TAG】このタグ自体を利用するかどうかの条件キーを指定します(初期値:null) 074 * caseVal 【TAG】このタグ自体を利用するかどうかの条件値を指定します(初期値:null) 075 * caseNN 【TAG】指定の値が、null/ゼロ文字列 でない場合(Not Null=NN)は、このタグは使用されます(初期値:判定しない) 076 * caseNull 【TAG】指定の値が、null/ゼロ文字列 の場合は、このタグは使用されます(初期値:判定しない) 077 * caseIf 【TAG】指定の値が、true/TRUE文字列の場合は、このタグは使用されます(初期値:判定しない) 078 * lang 【HTML】要素の内容と他の属性値の言語(lang,xml:lang)を指定します 079 * dir 【HTML】文字表記の方向(dir)を指定します 080 * title 【HTML】要素に対する補足的情報(title)を設定します 081 * style 【HTML】この要素に対して適用させるスタイルシート(style)を設定します 082 * disabled 【TAG】その部品に対して、選択や変更が出来ないように(disabled)指定します(サーバーに送信されない) 083 * tabindex 【HTML】タブの移動順(tabindex)を指定します(0 ~ 32767) 084 * clazz 【HTML】要素に対して class 属性を設定します 085 * language 【TAG】タグ内部で使用する言語コード[ja/en/zh/…]を指定します 086 * onClick 【HTML】JavaScriptのイベント onClick を設定します(例:onClick="renew('query.jsp','QUERY');") 087 * onChange 【HTML】JavaScriptのイベント onChange を設定します(例:onChange="renew('query.jsp','QUERY');") 088 * onBlur 【HTML】JavaScriptのイベント onBlur を設定します(例:onBlur="this.value=value.toUpperCase();") 089 * onFocus 【HTML】JavaScriptのイベント onFocus を設定します 090 * ondblClick 【HTML】JavaScriptのイベント ondblClick を設定します 091 * onMouseDown 【HTML】JavaScriptのイベント onMouseDown を設定します 092 * onMouseUp 【HTML】JavaScriptのイベント onMouseUp を設定します 093 * onMouseMove 【HTML】JavaScriptのイベント onMouseMove を設定します 094 * onMouseOut 【HTML】JavaScriptのイベント onMouseOut を設定します 095 * onMouseOver 【HTML】JavaScriptのイベント onMouseOver を設定します 096 * onSelect 【HTML】JavaScriptのイベント onSelect を設定します 097 * onKeydown 【HTML】JavaScriptのイベント onKeydown を設定します 098 * onKeypress 【HTML】JavaScriptのイベント onKeypress を設定します 099 * onKeyup 【HTML】JavaScriptのイベント onKeyup を設定します 100 * autofocus 【HTML5】指定した入力欄にカーソルが当たって自動的にフォーカスされます。 101 * roles 【TAG】ロールをセットします 102 * eventColumn 【TAG】イベントカラム(親カラム)を指定します 103 * eventValue 【TAG】イベントValueのSQL分 104 * eventURL 【TAG】イベントカラム指定時に呼び出すURL 105 * eventCallback 【TAG】eventColumn実行後のcallbak関数指定 106 * useRealTimeCheck 【TAG】(通常は使いません)リアルタイムチェックを行うかどうか(初期値:true:行う) 5.9.32.2 (2018/05/18) 107 * debug 【TAG】デバッグ情報を出力するかどうか[true/false]を指定します(初期値:false) 108 * > ... Body ... 109 * </og:select> 110 * 111 * ●使用例 112 * <og:select name="CDC"> CodeResource プロパティの値を使用したいときはcode属性を使います。 113 * <og:option code="CDC" /> 114 * </og:select> 115 * 116 * <og:select name="CDC"> 選択項目の一番上に項目を付け足すことも可能です。 117 * <og:option lbl="MSG0001" /> MessageResource プロパティの値を使用したいとききはlbl属性を使います。 118 * <og:option code="CDC" /> 119 * </og:select> 120 * 121 * <og:select name="CDC"> 選択項目の一番上に項目を付け足すことも可能です。 122 * <og:option lbl="CDC1" /> LabelResource プロパティの値を使用したいとききはlbl属性を使います。 123 * <og:option code="CDC" /> 124 * </og:select> 125 * 126 * <og:select name="CDC" multiple="multiple"> 選択肢の中から複数選択できるようにするときはmultiple属性を使います。 127 * <og:option code="CDC" /> 128 * </og:select> 129 * 130 * <og:select name="CDC" disabled="disabled"> 選択不可にするときはdisabled属性を使います。 131 * <og:option code="CDC" /> 132 * </og:select> 133 * 134 * <og:select name="CDC"> 選択肢をSELECT文の結果から作成したいときはqueryOptionタグと組み合わせて使います。 135 * <og:queryOption> 136 * select NOSYN,NOSYN,':',NMSYN from DB01 ORDER BY 1 137 * </og:queryOption> 138 * </og:select> 139 * 140 * <og:select name="CDC" eventColumn="OYA" > 親子関係のプルダウンを作る場合 141 * <og:queryOption> 142 * select NOSYN,NOSYN,':',NMSYN from DB01 143 * where CLM = "{@OYA}" ORDER BY 1 144 * </og:queryOption> 145 * </og:select> 146 * 147 * @og.group 選択データ制御 148 * 149 * @version 4.0 150 * @author Kazuhiko Hasegawa 151 * @since JDK5.0, 152 */ 153public class SelectTag extends HTMLTagSupport implements OptionAncestorIF { 154 /** このプログラムのVERSION文字列を設定します。 {@value} */ 155 private static final String VERSION = "8.0.0.1 (2021/10/08)" ; 156 private static final long serialVersionUID = 800120211008L ; 157 158 // 6.4.3.4 (2016/03/11) String配列 から、Setに置き換えます。 159 private static final Set<String> TD_SET = new ArraySet<>( "yes" , "no" , "false" ); 160 161 // 4.0.0 (2005/01/31) HTML_LABEL_SEPARATOR を boolean 変数として取得します。 162 private final String CLM = HybsSystem.sysBool( "HTML_LABEL_SEPARATOR" ) ? ":" : "" ; 163 164 private static final String STR_CLS = "class=" ; // 8.0.0.1 (2021/10/08) 165 private static final int LEN_CLS = STR_CLS.length() ; // 8.0.0.1 (2021/10/08) 166 167 // 4.0.0 (2005/01/31) USE_MULTI_KEY_SELECT を定義しておきます。 168// // 6.9.5.0 (2018/04/23) USE_MULTI_KEY_SELECT 廃止(IE8以降ブラウザ標準) 169// private final boolean USE_MULTI_KEY_SELECT = HybsSystem.sysBool( "USE_MULTI_KEY_SELECT" ) ; 170 171 private transient Options option = new Options(); 172 private String tdFlag = "yes"; // yes:<td> タグを使用 / false:フィールドのみ / no:ラベルとフィールド 173 174 // 3.0.1.3 (2003/03/11) colspan 属性を追加。 175 private String colspan = ""; // 6.1.0.0 (2014/12/26) refactoring 176 private String rowspan = ""; // 6.2.0.0 (2015/02/27) rowspan 属性を追加。 177 178 // 3.5.4.0 (2003/11/25) value ,defaultVal 属性を追加。 179 private String value ; 180 private String defaultVal ; // value がセットされていないときの初期値 181 private boolean multipleAll ; // 3.8.0.9 (2005/10/17) 複数選択可能時に全選択を設定する。 182 private String eventColumn ; // 4.3.6.0 (2009/04/01) イベントカラム 183 private String eventValue ; // 6.3.4.0 (2015/08/01) eventValue 追加 184 private String eventURL ; // 5.1.9.0 (2010/08/01) 動的プルダウン不具合対応 185 private String rawParam ; // 5.1.7.0 (2010/06/01) 動的プルダウン実装見直し 186 187 // 5.1.9.0 (2010/08/01) 値なしのOptionをSelectに含めるかどうか 新規追加 188 private boolean addNoValue ; // 互換性のため、初期値は、false になります。 189 private String addKeyLabel ; // 6.0.4.0 (2014/11/28) キー:ラベル形式で表示するかどうか 190 191 /** 192 * デフォルトコンストラクター 193 * 194 * @og.rev 6.4.2.0 (2016/01/29) PMD refactoring. Each class should declare at least one constructor. 195 */ 196 public SelectTag() { super(); } // これも、自動的に呼ばれるが、空のメソッドを作成すると警告されるので、明示的にしておきます。 197 198 /** 199 * Taglibの開始タグが見つかったときに処理する doStartTag() を オーバーライドします。 200 * 201 * @og.rev 5.0.2.0 (2009/11/01) 複数パラメーターの選択に対応 202 * @og.rev 5.1.7.0 (2010/06/01) command=RENEWの場合はdefaultValを無視する。 203 * @og.rev 5.1.9.0 (2010/08/01) addNoValue 対応 204 * @og.rev 5.2.2.0 (2010/11/01) caseKey 、caseVal 属性対応 205 * @og.rev 5.3.7.0 (2011/07/01) 5.1.7.0 (2010/06/01)の対応で判定条件が逆転しているバグを修正 206 * @og.rev 6.3.1.0 (2015/06/28) 個人リソースのUSE_ADD_KEY_LABELで初期値設定 207 * 208 * @return 後続処理の指示( EVAL_BODY_INCLUDE ) 209 */ 210 @Override 211 public int doStartTag() { 212 // 5.2.2.0 (2010/11/01) caseKey 、caseVal 属性対応 213 if( useTag() ) { 214 // 6.3.1.0 (2015/06/28) 個人リソースのUSE_ADD_KEY_LABELで初期値設定 215 if( addKeyLabel == null ) { addKeyLabel = nval( sys( "USE_ADD_KEY_LABEL" ) , null ); } // 4:個人設定可 216 217 if( value == null ) { 218 // value = nval( getRequestValue( get( "name" ) ),defaultVal ); 219 // 5.1.7.0 (2010/06/01) command=RENEWの場合はdefaultValを無視する。 220 final String cmd = pageContext.getRequest().getParameter( "command" ); 221 if( "RENEW".equals( cmd ) ) { 222 value = StringUtil.array2line( getRequestValues( get( "name" ) ), "|" ); 223 } 224 else { 225 value = nval( StringUtil.array2line( getRequestValues( get( "name" ) ), "|" ),defaultVal ); 226 } 227 } 228 229 // 5.1.9.0 (2010/08/01) addNoValue 対応:option を最初にセットする。 230 if( addNoValue ) { 231 option.add( "<option value=\"\" ></option>" ); 232 } 233 234 return EVAL_BODY_INCLUDE ; // Body インクルード( extends TagSupport 時) 235 } 236 return SKIP_BODY ; // Body を評価しない 237 } 238 239 /** 240 * タグリブオブジェクトをリリースします。 241 * キャッシュされて再利用されるので、フィールドの初期設定を行います。 242 * 243 * @og.rev 2.0.0.4 (2002/09/27) カスタムタグの release() メソッドを、追加 244 * @og.rev 2.0.0.8 (2002/10/09) yes/no/false で指定するように変更 245 * @og.rev 3.0.1.3 (2003/03/11) colspan 属性を追加。 246 * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応。release2() を doEndTag()で呼ぶ。 247 * @og.rev 3.5.4.0 (2003/11/25) value ,defaultVal 属性を追加。 248 * @og.rev 3.8.0.9 (2005/10/17) 複数選択可能時に全選択を設定する。 249 * @og.rev 4.1.2.1 (2008/03/13) must , mustAny 属性を自動化します。 250 * @og.rev 4.3.6.0 (2009/04/01) eventColumn,eventURL追加 251 * @og.rev 5.1.7.0 (2010/06/01) 動的プルダウン実装見直し 252 * @og.rev 5.1.9.0 (2010/08/01) columnタグで動的プルダウンが動作しない不具合に対応 253 * @og.rev 5.1.9.0 (2010/08/01) addNoValue 属性を追加。 254 * @og.rev 5.2.1.0 (2010/10/01) must , mustAny 属性の処理を、HTMLTagSupport に移します。 255 * @og.rev 6.0.4.0 (2014/11/28) addKeyLabel 属性を追加 256 * @og.rev 6.2.0.0 (2015/02/27) rowspan 属性を追加 257 * @og.rev 6.3.4.0 (2015/08/01) eventValue 追加 258 */ 259 @Override 260 protected void release2() { 261 super.release2(); 262 option = new Options(); 263 tdFlag = "yes"; // table形式の <td> タグを使用するかどうか 264 colspan = ""; // 6.1.0.0 (2014/12/26) refactoring 265 rowspan = ""; // 6.2.0.0 (2015/02/27) rowspan 属性を追加 266 value = null; 267 defaultVal = null; // value がセットされていないときの初期値 268 multipleAll = false; // 3.8.0.9 (2005/10/17) 複数選択可能時に全選択を設定する。 269 eventColumn = null; // 4.3.6.0 (2009/04/01) 270 eventValue = null; // 6.3.4.0 (2015/08/01) 271 eventURL = null; // 5.1.9.0 (2010/08/01) columnタグで動的プルダウンが動作しない不具合に対応 272 rawParam = null; // 5.1.7.0 (2010/06/01) 動的プルダウン実装見直し 273 addNoValue = false; // 5.1.9.0 (2010/08/01) 互換性のため、初期値は、false になります。 274 addKeyLabel = null; // 6.0.4.0 (2014/11/28) キー:ラベル形式で表示するかどうか 275 } 276 277 /** 278 * 入力用のプルダウンメニューを作成します。 279 * 280 * 表示順の項目名タグは、あらかじめ作成済みの値をここでは受け取ります。 281 * hasSelect 属性の値に応じて,タグの作成方法は変わります。 282 * 283 * @og.rev 2.0.0.8 (2002/10/09) yes/no/false で指定するように変更 284 * @og.rev 2.0.1.0 (2002/10/10) ラベルとフィールドのセパレーターとして、コロン(:)を使用するかどうかを指定できる 285 * @og.rev 3.0.1.3 (2003/03/11) colspan 属性を追加。 286 * @og.rev 3.5.4.0 (2003/11/25) value ,defaultVal 属性を追加。 287 * @og.rev 4.0.0.0 (2005/01/31) マルチセレクションのON/OFFをここで指定。 288 * @og.rev 4.1.2.1 (2008/03/13) must , mustAny 属性を自動化します。 289 * @og.rev 4.3.6.0 (2009/04/01) eventColumn対応 290 * @og.rev 4.3.7.1 (2009/06/08) id=labelのclass化 291 * @og.rev 5.1.7.0 (2010/06/01) 動的プルダウン実装見直し 292 * @og.rev 5.2.1.0 (2010/10/01) must , mustAny 属性の処理を、HTMLTagSupport に移します。 293 * @og.rev 5.5.3.0 (2012/06/01) idのセット見直し 294 * @og.rev 5.6.2.2 (2013/03/15) 自動must処理の出力位置を変更 295 * @og.rev 6.2.0.0 (2015/02/27) rowspan 属性を追加。makeMustHidden(String)対応 296 * @og.rev 6.3.4.0 (2015/08/01) eventValue 追加 297 * @og.rev 6.9.5.0 (2018/04/23) USE_MULTI_KEY_SELECT 廃止(IE8以降ブラウザ標準) 298 * @og.rev 8.0.0.1 (2021/10/08) dbType パラメータのclass属性対応 299 * 300 * @return 表示順選択用のプルダウンメニュータグ 301 * @og.rtnNotNull 302 */ 303 @Override 304 protected String makeTag() { 305 306 final String name = get( "name" ); 307 if( getMsglbl() == null ) { setLbl( name ); } 308 309 // 6.1.0.0 (2014/12/26) refactoring 310 311// // 4.0.0 (2005/01/31) XHTMLTag.java より移動) 312// // 6.9.5.0 (2018/04/23) USE_MULTI_KEY_SELECT 廃止(IE8以降ブラウザ標準) 313// if( USE_MULTI_KEY_SELECT ) { 314// set( "onkeydown", "setKeySelect(this);" ); 315// } 316 317 // 5.5.3.0 既にIDが指定されている場合はnameをセットしない 318 if( get("id")==null || get("id").isEmpty() ){ 319 set( "id", name ); 320 } 321 322 // class設定 8.0.0.1 (2021/10/08) 323 final ResourceManager resource = getResource(); 324 final DBColumn dbColumn = resource.getDBColumn( name ); 325 if( dbColumn != null ) { 326 final String dbTypeParam = dbColumn.getDbTypeParam(); // 文字パラメータ 327 if( dbTypeParam != null ) { 328 final int st = dbTypeParam.indexOf( STR_CLS ); 329 if( st >= 0 ) { 330 String newTypePram = dbTypeParam; 331 final int ed = newTypePram.indexOf( ';' , st ); 332 // 文字パラメータの文字列から class属性の文字列を取得する 333 if( ed >= 0 ) { 334 // [0-9]|class=sel2sel;[A-z] の場合、sel2sel を取得 335 newTypePram = newTypePram.substring( st + LEN_CLS , ed ); 336 } 337 else { 338 // [0-9A-z]class=sel2sel の場合、sel2sel を取得 339 newTypePram = newTypePram.substring( st + LEN_CLS ); 340 } 341 // 要素に対して class 属性を設定 342 setClazz( newTypePram ); 343 } 344 } 345 } 346 347 // 4.3.6.0 (2009/04/01) eventColumnの対応 348 // 5.1.7.0 (2010/06/01) 動的プルダウン実装見直し 349 String selTag = XHTMLTag.select( getAttributes(), option ); 350 351 // 5.1.7.0 (2010/06/01) 動的プルダウン実装見直し 352 if( eventColumn != null && eventColumn.length() > 0 ) { 353 String editor = null; 354 if( rawParam != null && rawParam.length() > 0 ) { 355 editor = "DBMENU"; 356 } 357 else { 358 editor = "MENU"; 359 } 360 addEventColumn( name, eventColumn, eventValue , eventURL, "", editor, "", rawParam ); // 6.3.4.0 (2015/08/01) 361 // 6.1.1.0 (2015/01/17) TagBufferの連結記述 362 selTag = new TagBuffer( "span" ) 363 .add( "class" , HybsSystem.EVENT_COLUMN_CLASS ) 364 .add( HybsSystem.EVENT_COLUMN_ID , name ) 365 .add( HybsSystem.EVENT_COLUMN_INITVAL , value ) 366 .add( HybsSystem.EVENT_COLUMN_WRITABLE , "true" ) 367 .addBody( selTag ) 368 .makeTag(); 369 } 370 371 final StringBuilder rtn = new StringBuilder( BUFFER_MIDDLE ); 372 if( "yes".equals( tdFlag ) ) { 373 // 4.3.7.1 (2009/06/08) id=labelのclass化 374 // rtn.append( "<td id=\"label\">" ); 375 rtn.append( "<td class=\"label\"" ) 376 .append( rowspan ).append( '>' ) // 6.2.0.0 (2015/02/27) 377 .append( getLongLabel() ) // 4.0.0 (2005/01/31) 378 .append( CLM ) 379 .append( "</td><td" ) 380 .append( colspan ) // 6.1.0.0 (2014/12/26) refactoring 381 .append( rowspan ) // 6.2.0.0 (2015/02/27) 382 .append( '>' ) // 6.0.2.5 (2014/10/31) char を append する。 383 .append( selTag ) 384 .append( makeMustHidden( name ) ) // 6.2.0.0 (2015/02/27) , 5.6.2.2 (2013/03/15) 385 .append( "</td>" ); 386 } 387 else if( "no".equals( tdFlag ) ) { 388 // 4.3.7.1 (2009/06/08) id=labelのclass化 389 // rtn.append( "<span id=\"label\">" ); 390 rtn.append( "<span class=\"label\">" ) 391 .append( getLongLabel() ) // 4.0.0 (2005/01/31) 392 .append( CLM ) 393 .append( "</span>" ) 394 .append( selTag ) 395 .append( makeMustHidden( name ) ); // 6.2.0.0 (2015/02/27) , 5.6.2.2 (2013/03/15) 396 } 397 // "false".equals( tdFlag ) の条件 398 else { 399 rtn.append( selTag ) 400 .append( makeMustHidden( name ) ); // 6.2.0.0 (2015/02/27) , 5.6.2.2 (2013/03/15) 401 } 402 403 return rtn.toString() ; 404 } 405 406 /** 407 * メニュー項目の選択項目を追加します。 408 * 409 * select タグのBODY要素の OptionTag よりアクセスされます。 410 * 411 * @og.rev 3.1.2.0 (2003/04/07) taglib パッケージ内部で使用している箇所を protected 化する。 412 * @param opt オプションタグ文字列 413 * @see org.opengion.hayabusa.taglib.OptionAncestorIF#addOption( String ) 414 */ 415 @Override // OptionAncestorIF 416 public void addOption( final String opt ) { 417 option.add( opt ); 418 } 419 420 /** 421 * メニュー項目の最後の項目を削除します。 422 * 423 * select タグのBODY要素の OptionTag よりアクセスされます。 424 * 425 * @og.rev 6.8.0.0 (2017/06/02) メニュー項目の最後の項目を削除。 426 * @see org.opengion.hayabusa.taglib.OptionAncestorIF#removeLast() 427 */ 428 @Override // OptionAncestorIF 429 public void removeLast() { 430 option.removeLast(); 431 } 432 433 /** 434 * 【TAG】メニューの名称を指定します。 435 * 436 * @og.tag メニューの名称を指定します。 437 * 438 * @param name 名称 439 */ 440 public void setName( final String name ) { 441 set( "name", getRequestParameter( name ) ); 442 } 443 444 /** 445 * 【TAG】リストボックスとして表示する場合の表示行数を指定します。 446 * 447 * @og.tag 表示行数を指定します。 448 * 449 * @param size 表示行数 450 */ 451 public void setSize( final String size ) { 452 set( "size",getRequestParameter( size ) ); 453 } 454 455 /** 456 * 【TAG】複数選択を可能(multiple)にします(初期値:未設定)。 457 * 458 * @og.tag 459 * multiple 値が "multiple" または "true" の場合、複数選択状態になります。 460 * また、"ALL" を設定する場合は、OptionTag上で、すべてのOption が選択状態に 461 * 初期設定されます。 462 * 大文字、小文字の種別はなくしますが、指定以外の文字が設定された場合は、エラーになります。 463 * 464 * @og.rev 3.8.0.9 (2005/10/17) 複数選択可能時に全選択を設定する。 465 * 466 * @param multi 複数選択指定 [multiple:複数選択/true:複数選択/ALL:初期値全選択] 467 */ 468 public void setMultiple( final String multi ) { 469 final String multiple = nval( getRequestParameter( multi ),null ); 470 if( "multiple".equalsIgnoreCase( multiple ) || "true".equalsIgnoreCase( multiple ) ) { 471 set( "multiple","multiple" ); 472 } 473 else if( "ALL".equalsIgnoreCase( multiple ) ) { 474 set( "multiple","multiple" ); 475 multipleAll = true; 476 } 477 else if( ! ( "false".equalsIgnoreCase( multiple ) || multiple == null ) ) { 478 final String errMsg = "multiple 属性には、[multiple,true,ALL] 以外は設定できません。" 479 + "multiple=" + multi ; 480 throw new HybsSystemException( errMsg ); 481 } 482 } 483 484 /** 485 * 【TAG】テーブル形式の <td> タグを使用するかどうか[yes/no/false]を指定します(初期値:yes)。 486 * 487 * @og.tag 488 * 初期値は、使用する("yes") です。 489 * 490 * @og.rev 2.0.0.8 (2002/10/09) yes/no/false で指定するように変更 491 * @og.rev 5.5.1.0 (2012/04/03) エラーメッセージ変更 492 * @og.rev 6.3.4.0 (2015/08/01) Arrays.toString から String.join に置き換え。 493 * @og.rev 6.4.3.4 (2016/03/11) String配列 から、Setに置き換えます。 494 * 495 * @param flag TDタグ使用 [yes:tdタグを使用/no:ラベルとフィールド/false:フィールドのみ] 496 */ 497 public void setTd( final String flag ) { 498 final String td = nval( getRequestParameter( flag ),tdFlag ); 499 500 if( check( td , TD_SET ) ) { 501 tdFlag = td; 502 } 503 else { 504 final String errMsg = "Error in SelectTag [td]: " 505 + td + " in [" + String.join( ", " , TD_SET ) + "] only used."; 506 throw new HybsSystemException( errMsg ); 507 } 508 } 509 510 /** 511 * 【TAG】フィールド部分の colspan を指定します。 512 * 513 * @og.tag 514 * 通常は、ラベルとフィールドが、別のtdで囲われます。しかし、場合によっては、 515 * フィールド部の長いカラムがある場合、上下のカラムとの位置関係がおかしくなり、 516 * ラベルとフィールドが離れて表示されるケースがあります。 517 * この場合、長いフィールド部を持つカラムに、colspan 属性を指定すると、 518 * その分のカラムを割り当てることにより、上下のカラムとの位置関係を 519 * 調節することが可能になります。 520 * 通常は、3 を指定して、tdが、フィールド、ラベル、フィールドの 521 * 組み合わせ部分に、長いフィールドが適用されるように使用します。 522 * 523 * <og:select name="CDK" colspan="3" /> 524 * 525 * @og.rev 3.0.1.3 (2003/03/11) colspan 属性を追加。 526 * 527 * @param sp フィールド部分のcolspan 528 */ 529 public void setColspan( final String sp ) { 530 colspan = nval( getRequestParameter( sp ),colspan ); 531 // 6.1.0.0 (2014/12/26) refactoring 532 if( colspan.length() > 0 ) { 533 colspan = " colspan=\"" + colspan + "\" "; 534 } 535 } 536 537 /** 538 * 【TAG】ラベル、フィールド共に rowspan を指定します。 539 * 540 * @og.tag 541 * 通常は、ラベルとフィールドが、別のtdで囲われます。rowspan は、 542 * そのどちらの TDフィールドにも、設定します。 543 * 初期値は、rowspan を付けないです。 544 * 545 * <og:select name="CDK" rowspan="3" /> 546 * 547 * @og.rev 6.2.0.0 (2015/02/27) rowspan 属性を追加 548 * 549 * @param sp ラベル、フィールド部分のrowspan 550 */ 551 public void setRowspan( final String sp ) { 552 rowspan = nval( getRequestParameter( sp ),rowspan ); 553 if( rowspan.length() > 0 ) { 554 rowspan = " rowspan=\"" + rowspan + "\" "; 555 } 556 } 557 558 /** 559 * 【TAG】値を指定します。 560 * 561 * @og.tag 562 * ここで指定された値が、optionタグの値と同じであれば、選択状態になります。 563 * 564 * <og:select name="CDC" value="{@ABC}" defaultVal="XYZ" > 565 * <og:option value="ABC" lbl="CDC1" /> 566 * <og:option value="XYZ" lbl="CDC2" /> 567 * </og:select> 568 * 569 * @og.rev 3.5.4.0 (2003/11/25) 新規作成 570 * @og.rev 5.0.2.0 (2009/11/01) 複数パラメーターの選択に対応 571 * 572 * @param val 値 573 */ 574 public void setValue( final String val ) { 575 value = nval( StringUtil.array2line( getRequestParameterValues( val ), "|" ),value ); 576 } 577 578 /** 579 * 値を外部から取り出します。 580 * 581 * OptionTag で、value を取り出して、内部の値と同じ場合は、選択状態にします。 582 * 583 * @og.rev 3.5.4.0 (2003/11/25) 新規作成 584 * @og.rev 5.7.1.0 (2013/12/06) OptionAncestorIF にする為、protected ⇒ public 化する。 585 * 586 * @return 内部に設定された値 587 * @see org.opengion.hayabusa.taglib.OptionAncestorIF#getValue() 588 */ 589 @Override // OptionAncestorIF 590 public String getValue() { 591 return value; 592 } 593 594 /** 595 * 【TAG】イベントカラム(親カラム)を設定します。 596 * 597 * @og.tag 598 * 親子関係のカラムを作成する場合に利用します。 599 * queryOptionタグとセットで利用して下さい。 600 * 601 * ※詳細はcolumnTagのeventColumn属性の説明をご覧下さい。 602 * 603 * @og.rev 4.3.6.0 (2009/04/01) 604 * 605 * @param col 親カラム名 606 */ 607 public void setEventColumn( final String col ) { 608 eventColumn = nval( getRequestParameter( col ), eventColumn ); 609 } 610 611 /** 612 * 【TAG】eventColumn使用時の値を、SQL文から求めるためのqueryをセットします。 613 * 614 * @og.tag 615 * eventColumn利用時は{@XXXX}はリクエストパラメータではなく 616 * xxxカラムの実際の値が利用されます。 617 * 618 * @og.rev 6.3.4.0 (2015/08/01) eventValue 追加 619 * @param val パラメータ 620 */ 621 public void setEventValue( final String val ) { 622 eventValue = nval( getReservedParameter( val ), eventValue ); // ここでは{@XXXX}変換をしない 623 } 624 625 /** 626 * 【TAG】イベントカラム指定時に呼び出すURLを指定します。 627 * 628 * @og.tag 629 * イベントカラム指定時に部品を作成するJSPを指定します。 630 * 初期値はシステムリソースのEVENT_COLUMN_URLです。 631 * (例:eventURL="makeColumn_custom.jsp") 632 * 633 * ※詳細はcolumnTagのeventURL属性の説明をご覧下さい。 634 * 635 * @og.rev 4.3.6.0 (2009/04/01) 636 * 637 * @param url 呼び出すURL 638 */ 639 public void setEventURL( final String url ) { 640 eventURL = nval( getRequestParameter( url ), eventURL ); 641 } 642 643 /** 644 * 複数選択可能時に全選択を設定するかどうかを返します。 645 * 646 * これは、上位入れ子のタグの OptionTag で、multipleAll を取り出して、 647 * true であれば、全選択に設定します。 648 * 649 * @og.rev 3.8.0.9 (2005/10/17) 新規作成 650 * @og.rev 5.7.1.0 (2013/12/06) OptionAncestorIF にする為、protected ⇒ public 化する。 651 * 652 * @return 全選択:true / 通常:false 653 * @see org.opengion.hayabusa.taglib.OptionAncestorIF#isMultipleAll() 654 */ 655 @Override // OptionAncestorIF 656 public boolean isMultipleAll() { 657 return multipleAll; 658 } 659 660 /** 661 * 【TAG】value属性に値がセットされていないとき使用する、初期値を指定します。 662 * 663 * @og.tag 664 * value属性に値がセットされていないときに、この初期値を使用します。 665 * 666 * なお、commandがRENEWの場合は、このdefaultValは適用されません。 667 * これは、defaultValの値が埋め込まれた項目が存在する画面に戻った際に、 668 * defaultValの項目の値がnullとなっていた場合に、defaultValの値が復元されると、 669 * 検索結果との不一致が発生するためです。 670 * 671 * 8.4.3.0 (2023/03/31) defaultVal の設定値の取り扱い(変更なし) 672 * 673 * {@XXXX} は、リクエスト変数 ⇒ valueタグセット値 を確認 674 * 値がなければ、null となる。… 初期値として認識されない。 675 * 通常の固定値は、そのまま使用されるが、""(空文字列)の場合は、 676 * null となる。… 初期値として認識されない。 677 * defaultVal属性を使用しない場合は、 678 * null となる。… 初期値として認識されない。 679 * 680 * @og.rev 3.5.4.0 (2003/11/25) 新規作成 681 * @og.rev 5.0.2.0 (2009/11/01) 複数パラメーターの選択に対応 682 * 683 * @param dv 初期値 684 */ 685 public void setDefaultVal( final String dv ) { 686 defaultVal = nval( StringUtil.array2line( getRequestParameterValues( dv ), "|" ),defaultVal ); 687 } 688 689 /** 690 * 【TAG】値なしのOptionを含めるかどうか[true/false]を指定します(初期値:false)。 691 * 692 * @og.tag 693 * カラムがプルダウンメニュー形式の場合、選択肢には通常データベース登録できる候補が 694 * 並びます。しかし、検索時には、候補を絞りたくない(指定しない)場合があり、 695 * その様な場合には、値なしのOptionを含める(true)ことで、対応可能です。 696 * 初期値:false(値なしのOptionを含めない)は、過去の互換性を重視しているため、column タグと異なります。 697 * 698 * @og.rev 5.1.9.0 (2010/08/01) 新規追加 699 * 700 * @param flag 値なしのOptionの有無 [true:含める/それ以外:含めない] 701 */ 702 public void setAddNoValue( final String flag ) { 703 addNoValue = nval( getRequestParameter( flag ),addNoValue ); 704 } 705 706 /** 707 * 【TAG】セレクトメニューの場合、キー:ラベル形式で表示するかどうか[true/false/null]を指定します(初期値:null)。 708 * 709 * @og.tag 710 * カラムがプルダウンメニュー形式の場合、キー:ラベル形式で表示するか、ラベルだけで表示するかを 711 * 選択できます。 712 * true を指定すると、「強制的に」キー:ラベル形式で表示します。 713 * false の場合は、「強制的に」ラベルのみで表示されます。 714 * 初期値の null の場合、コードリソースや、SQL文に準拠した指定通りの形式で表示します。 715 * 716 * <og:column name="CDC" addKeyLabel="true" /> 717 * 718 * @og.rev 6.0.4.0 (2014/11/28) キー:ラベル形式で表示するかどうか。新規追加 719 * 720 * @param flag キー:ラベル形式表示 [true:キー:ラベル形式/false:ラベルのみ/null:指定通り] 721 */ 722 public void setAddKeyLabel( final String flag ) { 723 addKeyLabel = nval( getRequestParameter( flag ),addKeyLabel ); 724 } 725 726 /** 727 * パラメーター変換({@XXXX}の置き換えをしない状態のパラメーターをセットします。 728 * 729 * @og.rev 5.1.7.0 (2010/06/01) 新規作成(動的プルダウン実装見直し) 730 * @og.rev 5.5.4.0 (2012/07/02) 予約語対応 731 * 732 * @param param パラメーター 733 * @see org.opengion.hayabusa.taglib.OptionAncestorIF#setRawParam( String ) 734 */ 735 @Override // OptionAncestorIF 736 public void setRawParam( final String param ) { 737 rawParam = nval( getReservedParameter(param), rawParam ); // 5.5.4.0 (2012/07/02) 738 } 739 740 /** 741 * セレクトメニューの場合、キー:ラベル形式で表示するかどうか[true/false/null]を返します。 742 * 743 * これは、上位入れ子のタグの OptionTag で、addKeyLabel を取り出して、 744 * true であれば、キー:ラベル形式 のオプションを、#addOption( String ) で 745 * 登録させます。 746 * 747 * @og.rev 6.0.4.0 (2014/11/28) キー:ラベル形式で表示するかどうか。新規追加 748 * 749 * @return true:キー:ラベル形式/false:ラベルのみ/null:指定通り 750 * @see #addOption( String ) 751 * @see org.opengion.hayabusa.taglib.OptionAncestorIF#getAddKeyLabel() 752 */ 753 @Override // OptionAncestorIF 754 public String getAddKeyLabel() { 755 return addKeyLabel; 756 } 757 758 /** 759 * 【TAG】eventColumn実行後のcallbak関数を指定します。 760 * 761 * @og.tag 762 * eventColumnの動作終了後に実行するCallback関数の指定を行います。 763 * 関数名のみを指定して下さい。 764 * ex) sampleCallback()を実行する場合はeventCallback="sampleCallback" 765 * 実行する関数の第一引数には自動的に次の要素が入った配列が渡されます 766 * [0] 変更された子カラムのID属性値 767 * [1] evnetColumn実行後の子カラムの値 768 * [2] eventColumn実行前の子カラムの値 769 * 770 * この属性は、optionAttributesへの設定と同様の動作を行います。 771 * 772 * @og.rev 5.5.4.0 (2012/07/02) 新規追加 773 * @og.rev 6.9.8.0 (2018/05/28) パラメータ引数が、未設定の場合の考慮不足 774 * 775 * @param callback callbak関数 776 */ 777 public void setEventCallback( final String callback ) { 778 // optionAttributes扱いで登録します。 779 final String clbk = getRequestParameter( callback ); 780 if( StringUtil.isNotNull( clbk ) ){ 781 add( "optionAttributes", "eventCallback='" + clbk + "'" ); 782 } 783 784// // optionAttributes扱いで登録します。 785// if( callback != null && callback.length() > 0 ){ 786// add( "optionAttributes", "eventCallback='"+getRequestParameter( callback )+"'" ); 787// } 788 } 789 790 /** 791 * 【TAG】リアルタイムチェックを行うかどうかを指定します(初期値:true)。 792 * 793 * @og.tag 794 * カラム単位でリアルタイムチェックを行うかどうかを設定をします。 795 * タグに独自属性としてrealTimeCheck="true/false"を追記します。 796 * falseを設定した場合にチェックが行われなくなります。 797 * 初期値はリアルタイムチェックを行う(true)です。 798 * 799 * この属性は、optionAttributesへの設定と同様の動作を行います。 800 * 引数の文字列の、true/false 判定を行っていません。そのままの文字列が設定されます。 801 * JavaScript 側では、false 判定のみ行っているので、不正な文字列の場合は、 802 * 初期値(true:リアルタイムチェックを行う)が適用されます。 803 * これは、Ver5 とロジックを合わせておくための処置です。 804 * 805 * @og.rev 5.9.32.2 (2018/05/18) 新規追加 806 * @og.rev 6.9.8.0 (2018/05/28) Ver5 とロジックを合わせます。 807 * 808 * @param flag リアルタイムチェックを行うかどうか [true:行う/false:行わない] 809 */ 810 public void setUseRealTimeCheck( final String flag ) { 811 // optionAttributes扱いで登録します。 812 final String rtcf = getRequestParameter( flag ); 813 814 if( StringUtil.isNotNull( rtcf ) ){ 815 add( "optionAttributes", "realTimeChk=\"" + rtcf + "\"" ); // 連結時のスペースは、Attributes クラスで処理 816 } 817 818// // optionAttributes扱いで登録します。 819// final boolean useRtc = nval( getRequestParameter( flag ) , true ); 820// 821// if( !useRtc ) { // true 以外の場合のみ、optionAttributes に属性を追加します。 822// add( "optionAttributes", "realTimeChk=\"false\"" ); // 連結時のスペースは、Attributes クラスで処理 823// } 824 } 825 826 /** 827 * シリアライズ用のカスタムシリアライズ読み込みメソッド 828 * 829 * ここでは、transient 宣言された内部変数の内、初期化が必要なフィールドのみ設定します。 830 * 831 * @og.rev 4.0.0.0 (2006/09/31) 新規追加 832 * @serialData 一部のオブジェクトは、シリアライズされません。 833 * 834 * @param strm ObjectInputStreamオブジェクト 835 * @see #release2() 836 * @throws IOException シリアライズに関する入出力エラーが発生した場合 837 * @throws ClassNotFoundException クラスを見つけることができなかった場合 838 */ 839 private void readObject( final ObjectInputStream strm ) throws IOException , ClassNotFoundException { 840 strm.defaultReadObject(); 841 option = new Options(); 842 } 843 844 /** 845 * このオブジェクトの文字列表現を返します。 846 * 基本的にデバッグ目的に使用します。 847 * 848 * @return このクラスの文字列表現 849 * @og.rtnNotNull 850 */ 851 @Override 852 public String toString() { 853 return ToString.title( this.getClass().getName() ) 854 .println( "VERSION" ,VERSION ) 855 .println( "tdFlag" ,tdFlag ) 856 .println( "colspan" ,colspan ) 857 .println( "rowspan" ,rowspan ) 858 .println( "value" ,value ) 859 .println( "defaultVal" ,defaultVal ) 860 .println( "multipleAll" ,multipleAll ) 861 .println( "Other..." ,getAttributes().getAttribute() ) 862 .fixForm().toString() ; 863 } 864}