001package org.opengion.plugin.column; 002 003import org.opengion.fukurou.util.Attributes; 004import org.opengion.fukurou.util.TagBuffer; 005import org.opengion.fukurou.util.XHTMLTag; 006import org.opengion.fukurou.util.StringFormat; 007import org.opengion.hayabusa.common.HybsSystem; 008import org.opengion.hayabusa.db.AbstractEditor; 009import org.opengion.hayabusa.db.CellEditor; 010import org.opengion.hayabusa.db.DBColumn; 011import org.opengion.hayabusa.db.Selection; 012import org.opengion.hayabusa.db.SelectionCellEditor; // 6.2.2.0 (2015/03/27) 013import org.opengion.hayabusa.db.SelectionFactory; // 5.7.3.0 (2014/02/07) 014 015import static org.opengion.fukurou.util.StringUtil.isNull; // 6.1.1.0 (2015/01/17) 016 017/** 018 * DATALIST_R エディターは、コードリソースから取得した値より、datalistを作成して 019 * 入力候補となるデータリストを定義する編集用エディタークラスです。 020 * datalist は、HTML5 から採用されたタグです。 021 * 022 * 入力フィールドとdatalistタグの関係付は、カラムIDに、"カラムID.sel" で結びつけます。 023 * 024 * <input name="カラムID" list="カラムID.sel" /> 025 * <div style="display:none;"> 026 * <datalist id="カラムID.sel"> 027 * <option value="KEY1">LABEL1</option> 028 * <option value="KEY2">LABEL2</option> 029 * <option value="KEY3">LABEL3</option> 030 * </datalist> 031 * </div> 032 * 033 * divタグは、HTML5 非対応ブラウザを使用した場合、datalist の option がそのまま 034 * テキストとして見えてしまうのを避けるためです。 035 * 036 * @og.rev 5.9.18.1 (2017/03/24) 037 * @og.group データ編集 038 * 039 * @version 5.9.18.1 040 * @author T.OTA 041 * @since JDK6.0 042 * 043 */ 044public class Editor_DATALIST_R extends AbstractEditor implements SelectionCellEditor { 045 private static final String VERSION = "6.8.1.5 (2017/09/08)"; 046 private static final String DIV1 = "<div style=\"display:none;\">"; 047 private static final String DIV2 = "</div>"; 048 049 /** セレクションオブジェクト */ 050 protected Selection selection ; 051 private Selection bkSel ; // Selection オブジェクトのキャッシュ機能 052// private final boolean seqFlag ; // 6.9.7.0 (2018/05/14) 削除 053 private final String useSLabel ; // 6.2.0.0 (2015/02/27) SLABEL 対応 054 private final String addKeyLabel ; // 6.2.0.0 (2015/02/27) キー:ラベル形式 055 private final TagBuffer selTagBuffer = new TagBuffer(); 056 057 /** 058 * デフォルトコンストラクター。 059 * このコンストラクターで、基本オブジェクトを作成します。 060 * 061 * @og.rev 6.8.1.5 (2017/09/08) PMD refactoring. It is a good practice to call super() in a constructor 062 */ 063 public Editor_DATALIST_R() { 064 super(); // 6.8.1.5 (2017/09/08) PMD refactoring. It is a good practice to call super() in a constructor 065 066 selection = null; 067// seqFlag = false; // 6.9.7.0 (2018/05/14) 削除 068 useSLabel = "auto"; // 6.2.0.0 (2015/02/27) SLABEL 対応 069 addKeyLabel = null; // 6.2.0.0 (2015/02/27) キー:ラベル形式 070 } 071 072 /** 073 * コンストラクター。 074 * 075 * @param clm DBColumnオブジェクト 076 */ 077 private Editor_DATALIST_R( final DBColumn clm ) { 078 super( clm ); 079 080 tagBuffer.add( XHTMLTag.inputAttri( attributes ) ); 081// seqFlag = "SEQ".equals( clm.getEditorParam() ); // 6.9.7.0 (2018/05/14) 削除 082 useSLabel = clm.getUseSLabel() ; // 6.2.0.0 (2015/02/27) SLABEL 対応 083 addKeyLabel = clm.getAddKeyLabel(); // 6.2.0.0 (2015/02/27) キー:ラベル形式 084 085 final String disabled = clm.isWritable() ? null : "disabled"; 086 087 // 6.1.1.0 (2015/01/17) Attributesの連結記述 088 final Attributes selAttri = new Attributes() 089 .set( "disabled" ,disabled ) 090 .set( clm.getEditorAttributes() ); // #addAttributes( Attributes ) の代替え 091 092 // 6.1.1.0 (2015/01/17) TagBufferの連結記述 093 selTagBuffer.add( XHTMLTag.selectAttri( selAttri ) ) 094 .add( selAttri.get( "optionAttributes" ) ); // 6.0.4.0 (2014/11/28) 095 096 // 6.0.4.0 (2014/11/28) selection は、Column から取得するのではなく、Factory で作成する。 097 selection = SelectionFactory.newSelection( "MENU",clm.getCodeData(),addKeyLabel ); // 6.2.0.0 (2015/02/27) 098 } 099 100 /** 101 * 各オブジェクトから自分のインスタンスを返します。 102 * 自分自身をキャッシュするのか、新たに作成するのかは、各サブクラスの実装に 103 * まかされます。 104 * 105 * @param clm DBColumnオブジェクト 106 * 107 * @return CellEditorオブジェクト 108 */ 109 @Override 110 public CellEditor newInstance( final DBColumn clm ) { 111 return new Editor_DATALIST_R( clm ); 112 } 113 114 /** 115 * データの編集用文字列を返します。 116 * 117 * @param value 入力値 118 * 119 * @return データの編集用文字列 120 */ 121 @Override 122 public String getValue( final String value ) { 123 final String newValue = StringFormat.getValue( value ); // 6.4.5.3 (2016/05/13) コロン区切りの先頭だけ 124 125 // input タグの作成 126 // 6.1.1.0 (2015/01/17) TagBufferの連結記述 127 final String intag = new TagBuffer( "input" ) 128 .add( "name" , name ) 129 .add( "id" , name , isNull( attributes.get( "id" ) ) ) // 4.3.7.2 (2009/06/15) 130 .add( "list" , name + ".sel" ) 131 .add( "value" , newValue ) 132 .add( "size" , size1 ) 133 .add( tagBuffer.makeTag() ) 134 .makeTag(); 135 136 final boolean useSlbl = "true".equalsIgnoreCase( useSLabel ); // 6.2.0.0 (2015/02/27) 137 138 // datalist タグの作成 139 // 6.1.1.0 (2015/01/17) TagBufferの連結記述 140 final String dltag = getOption( 141 new TagBuffer( "datalist" ) 142 .add( "id" , name + ".sel" ) // inputタグとの関係付けるためのキーワード 143 , value 144 , false // キャッシュは使用しない。(つまり、null は返らない) 145 , useSlbl // 6.2.0.0 (2015/02/27) SLABEL 対応 146 ).makeTag() ; 147 148 // DIV1 の display:none は、datalist の optionのBODY部が、HTML5 以外では表示されてしまうのを防ぐため。 149 return intag + CR + DIV1 + dltag + DIV2 + CR; 150 } 151 152 /** 153 * name属性を変えた、データ表示/編集用のHTML文字列を作成します。 154 * テーブル上の name に 行番号を付加して、名前_行番号 で登録するキーを作成し、 155 * リクエスト情報を1つ毎のフィールドで処理できます。 156 * 157 * @param row 行番号 158 * @param value 入力値 159 * 160 * @return データ表示/編集用の文字列 161 */ 162 @Override 163 public String getValue( final int row, final String value ) { 164 final String name2 = name + HybsSystem.JOINT_STRING + row; 165 166 // Selection オブジェクトのキャッシュ機能 (true:使用可能) 167 final boolean useSelCache = value != null && value.indexOf( ':' ) < 0; 168 169 final String listId = useSelCache ? name : name2; // キャッシュを使用する場合は、共通の name を使う。 170 171 final String newValue = StringFormat.getValue( value ); // 6.4.5.3 (2016/05/13) コロン区切りの先頭だけ 172 173 // input タグの作成 174 // 6.1.1.0 (2015/01/17) TagBufferの連結記述 175 final String intag = new TagBuffer( "input" ) 176 .add( "name" , name2 ) 177 .add( "id" , name2 , isNull( attributes.get( "id" ) ) ) // 4.3.7.2 (2009/06/15) 178 .add( "list" , listId + ".sel" ) 179 .add( "value" , newValue ) 180 .add( "size" , size2 ) 181 .add( tagBuffer.makeTag() ) 182 .makeTag( row,newValue ); // 6.4.5.3 (2016/05/13) 183 184 final boolean useSlbl = "auto".equalsIgnoreCase( useSLabel ) || "true".equalsIgnoreCase( useSLabel ); // 6.2.0.0 (2015/02/27) 185 186 // datalist タグの作成 187 // 6.1.1.0 (2015/01/17) TagBufferの連結記述 188 final TagBuffer dltag = getOption( 189 new TagBuffer( "datalist" ) 190 .add( "id" , listId + ".sel" ) // inputタグとの関係付けるためのキーワード 191 , value 192 , useSelCache 193 , useSlbl // 6.2.0.0 (2015/02/27) SLABEL 対応 194 ); 195 196 // キャッシュが効くと、getOption の戻り値は、null になる。 197 // 6.1.1.0 (2015/01/17) TagBufferの連結記述 198 // 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 199 // 反転注意 200 return dltag == null 201 ? intag + CR 202 : intag + CR + DIV1 + dltag.makeTag( row,newValue ) + DIV2 + CR ; // 6.4.5.3 (2016/05/13) 203 } 204 205 /** 206 * コードリソースから取得した、選択肢(オプション)をTagBuffer に反映します。 207 * 208 * 第3引数は、Selection オブジェクトのキャッシュ機能を使用するかどうかを指定します。 209 * true で、使用する事を前提に、チェックを行います。 210 * 211 * @param buf タグ文字列のバッファー 212 * @param value 選択されている値 213 * @param useSelCache Selection オブジェクトのキャッシュ 214 * @param useSlbl ラベル(短)をベースとしたオプション表示を行うかどうか。 215 * 216 * @return buf オプションタグ 217 */ 218 private TagBuffer getOption( final TagBuffer buf,final String value,final boolean useSelCache,final boolean useSlbl ) { 219 220 if( useSelCache ) { 221 if( selection == bkSel ) { return null; } 222 bkSel = selection; 223 } 224 225 return buf.addBody( selection.getOption( value, false, useSlbl ) ); // 6.2.0.0 (2015/02/27) SLABEL 対応 226 } 227}