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.plugin.column;
017
018 import org.opengion.hayabusa.common.HybsSystem;
019 import org.opengion.hayabusa.common.HybsSystemException;
020 import org.opengion.hayabusa.db.AbstractEditor;
021 import org.opengion.hayabusa.db.CellEditor;
022 import org.opengion.hayabusa.db.DBColumn;
023 import org.opengion.hayabusa.db.Selection;
024 import org.opengion.hayabusa.db.SelectionFactory;
025 import org.opengion.fukurou.util.StringFormat;
026 import org.opengion.fukurou.util.XHTMLTag;
027 import org.opengion.fukurou.util.TagBuffer;
028
029 /**
030 * カラãƒ??編é›?ƒ‘ラメーターの?³?±?¬æ–??実行結果より、datalistを作æ?して
031 * 入力å?補となるデータリストを定義する編é›?”¨エãƒ?‚£タークラスですã?
032 * datalist は、HTML5 から採用されたタグですã?
033 *
034 * 編é›?ƒ‘ラメータには、datalistを作æ?するための、SQLæ–?‚’記述しますã?
035 * こã?SQLæ–??、select KEY,LABEL from xx ?¥?¥?¥ とã�?�†構文で、KEY部åˆ?�¨LABEL部åˆ?�Œ
036 * 選択されますã?
037 * datalist 自身がã?HTML5からの新機è?なので、現時点では、これ以上ã?機è?はありませんã€?
038 * å°?�¥çš?�«、DBMENU などと同様に、第三カラãƒ?»¥降を利用可能になると思いますã?でã€?
039 * 今ã?使わなã�?�§ください。(å°?�¥の機è?追åŠ?™‚に互換性問題を引き起こすかもしれませんので??
040 *
041 * 入力フィールドとdatalistタグとの関係付ã?、カラãƒ?Dにã€?カラãƒ?D.sel" で結ã?つけますã?
042 *
043 * <input name="カラãƒ?D" list="カラãƒ?D.sel" />
044 * <div style="display:none;">
045 * <datalist id="カラãƒ?D.sel">
046 * <option value="KEY1">LABEL1</option>
047 * <option value="KEY2">LABEL2</option>
048 * <option value="KEY3">LABEL3</option>
049 * </datalist>
050 * </div>
051 *
052 * divタグは、HTML5 非対応ブラウザを使用した場合ã?datalist の option がそのまま
053 * ãƒ?‚ストとして見えてしまã�??を避けるためですã?
054 *
055 * ä¸?¦§表出力時の getValue( int ,String ) 処ç�?�§は、Selection オブジェクトã?
056 * キャãƒ?‚·ュ機è?を利用して、同ä¸?election オブジェクトã?間ã?、datalist はã€?
057 * ?‘度しか、å?力しなã�?§˜に制御してã�?�¾すã?これにより、å?有ã?datalist を使用する為ã€?
058 * HTMLの出力データ量を抑えることが可能になりますã?
059 * (キャãƒ?‚·ュを利用しなã�?�¨?‘00行å?力すると?‘00å?のdatalistをå?力する事になりますã?)
060 * (同様ã?機è?を持つ INDBMENU では、行ごとにプルãƒ?‚¦ンãƒ??タを作æ?してã�?�¾すã?)
061 * ただしã?行単位にSQLの条件を変える機è?(AAA:BBB:CCC:DDD引数)が指定された場合ã?ã€?
062 * 行ごとに出力しますã?
063 *
064 * å�?‚«ラãƒ??値(value値)に、AAA:BBB:CCC:DDD とã�?�†値を設定できますã?これはã€?
065 * $1,$2,$3,$4 に割り当てなおして、QUERYを実行しますã?またã?$1 は、本来の値としてã€?
066 * メニューの初期値設定等に使用しますã?上記ã?例では、AAA がå?で、それ以降ã?ã€?
067 * 引数になりますã?
068 * 又ã?$Cには自åˆ??身のカラãƒ?��を割り当てますã?
069 * こã?機è?を使用すれば、動çš?ƒ¡ニューを行ごとに条件を変えて作æ?することã�?
070 * 可能になりますã?
071 * 例:select KEY,LABEL from xx where KUBUN='$2' and CDK='$3'
072 * さらに、å?のæ–?—å?"AAA:BBB:CCC:DDD"はã€?0 に割り当てられますã?割り当てがなã�?
073 * 変数はã€?"(ゼロæ–?—å?)として、扱われますã?
074 *
075 * カラãƒ??表示にå¿?¦�な属æ?は, DBColumn オブジェクãƒ?より取り出しますã?
076 * こã?クラスは、DBColumn オブジェクト毎に?‘つ作æ?されますã?
077 *
078 * @og.rev 5.7.4.3 (2014/03/28) 新規作æ?
079 * @og.group ãƒ??タ編é›?HTML5)
080 *
081 * @version 4.0
082 * @author Kazuhiko Hasegawa
083 * @since JDK5.0,
084 */
085 public class Editor_DATALIST extends AbstractEditor {
086 //* こã?プログラãƒ??VERSIONæ–?—å?を設定しますã? {@value} */
087 private static final String VERSION = "5.7.6.2 (2014/05/16)" ;
088
089 // 5.7.5.0 (2014/04/04) datalist 使用時ã?、display:none にして、HTML5未対応ã?ブラウザに備えるã?
090 private static final String DIV1 = "<div style=\"display:none;\">" ;
091 private static final String DIV2 = "</div>" ;
092
093 private final String query ;
094 private final String dbid ;
095 private final String lang ;
096
097 private Selection bkSel= null; // 5.7.5.0 (2014/04/04) Selection オブジェクトã?キャãƒ?‚·ュ機è?
098
099 /**
100 * ãƒ?ƒ•ォルトコンストラクターã€?
101 * こã?コンストラクターで、基本オブジェクトを作æ?しますã?
102 *
103 */
104 public Editor_DATALIST() {
105 // super();
106 query = null;
107 dbid = null;
108 lang = null;
109 }
110
111 /**
112 * コンストラクターã€?
113 *
114 * @param clm DBColumnオブジェクãƒ?
115 */
116 private Editor_DATALIST( final DBColumn clm ) {
117 super( clm );
118 tagBuffer.add( XHTMLTag.inputAttri( attributes ) );
119
120 query = clm.getEditorParam();
121 dbid = clm.getDbid();
122 lang = clm.getLang(); // 4.0.0 (2006/11/15)
123
124 // 3.5.5.9 (2004/06/07)
125 if( query == null || query.length() == 0 ) {
126 String errMsg = "DATALIST Editor では、編é›?ƒ‘ラメータはå¿??ですã?"
127 + " name=[" + name + "]" + HybsSystem.CR ;
128 throw new HybsSystemException( errMsg );
129 }
130 }
131
132 /**
133 * å�?‚ªブジェクトからè?åˆ??インスタンスを返しますã?
134 * 自åˆ??身をキャãƒ?‚·ュするのかã?新たに作æ?するのかã?、各サブクラスの実è£?�«
135 * まかされますã?
136 *
137 * @param clm DBColumnオブジェクãƒ?
138 *
139 * @return CellEditorオブジェクãƒ?
140 */
141 public CellEditor newInstance( final DBColumn clm ) {
142 return new Editor_DATALIST( clm );
143 }
144
145 /**
146 * ãƒ??タの編é›?”¨æ–?—å?を返しますã?
147 *
148 * ここでは、AAA:BBB:CCC:DDD とã�?�†値をã?$1,$2,$3,$4 に割り当てなおしてã€?
149 * QUERYを実行しますã?またã?$1 は、本来の値として、メニューの初期値設定等に
150 * 使用しますã?上記ã?例では、AAA がå?で、それ以降ã?、引数になりますã?
151 * さらに、å?のæ–?—å?"AAA:BBB:CCC:DDD"はã€?0 に割り当てられますã?割り当てがなã�?
152 * 変数はã€?"(ゼロæ–?—å?)として、扱われますã?
153 * 又ã?$Cには自åˆ??身のカラãƒ?��を割り当てますã?
154 *
155 * @og.rev 5.7.5.0 (2014/04/04) datalist 使用時ã?、display:none にして、HTML5未対応ã?ブラウザに備えるã?
156 * @og.rev 5.7.6.2 (2014/05/16) list属æ?とid属æ?の結ã?つきを、name+".sel" に変更
157 *
158 * @param value 入力å?
159 *
160 * @return ãƒ??タの編é›?”¨æ–?—å?
161 */
162 @Override
163 public String getValue( final String value ) {
164 // input タグの作æ?
165 TagBuffer intag = new TagBuffer( "input" );
166 intag.add( "name" , name );
167 if( attributes.get( "id" ) == null || attributes.get( "id" ).length() == 0 ) {
168 intag.add( "id" , name );
169 }
170 // intag.add( "list" , "dl_" + name ); // datalistタグとの関係付けるためã?キーワーãƒ?
171 intag.add( "list" , name + ".sel" ); // datalistタグとの関係付けるためã?キーワーãƒ?
172 intag.add( "value" , value );
173 intag.add( "size" , size1 );
174 intag.add( tagBuffer.makeTag() );
175 intag.add( optAttr );
176
177 // datalist タグの作æ?
178 TagBuffer dltag = new TagBuffer( "datalist" );
179 // dltag.add( "id" , "dl_" + name ); // inputタグとの関係付けるためã?キーワーãƒ?
180 dltag.add( "id" , name + ".sel" ); // inputタグとの関係付けるためã?キーワーãƒ?
181
182 dltag = getOption( dltag,value,false ); // キャãƒ?‚·ュは使用しなã�??
183
184 // display:none は、datalist の optionのBODY部がã?HTML5 以外では表示されてしまã�??を防ぐためã?
185 return intag.makeTag() + HybsSystem.CR +
186 DIV1 + dltag.makeTag() + DIV2 + HybsSystem.CR;
187 }
188
189 /**
190 * name属æ?を変えたã?ãƒ??タ表示/編é›?”¨のHTMLæ–?—å?を作æ?しますã?
191 * ãƒ??ブル上ã? name に 行番号を付加して、名前_行番号 で登録するキーを作æ?ã�?
192 * リクエスト情報を1つ毎ã?フィールドで処ç�?�§きますã?
193 *
194 * ここでは、AAA:BBB:CCC:DDD とã�?�†値をã?$1,$2,$3,$4 に割り当てなおしてã€?
195 * QUERYを実行しますã?またã?$1 は、本来の値として、メニューの初期値設定等に
196 * 使用しますã?上記ã?例では、AAA がå?で、それ以降ã?、引数になりますã?
197 * さらに、å?のæ–?—å?"AAA:BBB:CCC:DDD"はã€?0 に割り当てられますã?割り当てがなã�?
198 * 変数はã€?"(ゼロæ–?—å?)として、扱われますã?
199 * 又ã?$Cには自åˆ??身のカラãƒ?��を割り当てますã?
200 *
201 * @og.rev 5.7.5.0 (2014/04/04) datalist 使用時ã?、display:none にして、HTML5未対応ã?ブラウザに備えるã?
202 * @og.rev 5.7.5.0 (2014/04/04) Selection オブジェクトã?キャãƒ?‚·ュ機è?
203 * @og.rev 5.7.6.2 (2014/05/16) list属æ?とid属æ?の結ã?つきを、name+".sel" に変更
204 *
205 * @param row 行番号
206 * @param value 入力å?
207 *
208 * @return ãƒ??タ表示/編é›?”¨のæ–?—å?
209 */
210 @Override
211 public String getValue( final int row,final String value ) {
212 String name2 = name + HybsSystem.JOINT_STRING + row ;
213
214 // 5.7.5.0 (2014/04/04) Selection オブジェクトã?キャãƒ?‚·ュ機è? (true:使用可能)
215 boolean useSelCache = value != null && value.indexOf( ':' ) < 0 ;
216
217 String listId = useSelCache ? name : name2; // キャãƒ?‚·ュを使用する場合ã?、å?通ã? name を使ã�??
218
219 // input タグの作æ?
220 TagBuffer intag = new TagBuffer( "input" );
221 intag.add( "name" , name2 );
222 if( attributes.get( "id" ) == null || attributes.get( "id" ).length() == 0 ) {
223 intag.add( "id" , name2 );
224 }
225 // intag.add( "list" , "dl_" + listId ); // datalistタグとの関係付けるためã?キーワーãƒ?
226 intag.add( "list" , listId + ".sel" ); // datalistタグとの関係付けるためã?キーワーãƒ?
227 intag.add( "value" , value );
228 intag.add( "size" , size2 );
229 intag.add( tagBuffer.makeTag() );
230 intag.add( optAttr );
231
232 // datalist タグの作æ?
233 TagBuffer dltag = new TagBuffer( "datalist" );
234 // dltag.add( "id" , "dl_" + listId ); // inputタグとの関係付けるためã?キーワーãƒ?
235 dltag.add( "id" , listId + ".sel" ); // inputタグとの関係付けるためã?キーワーãƒ?
236
237 dltag = getOption( dltag,value,useSelCache );
238
239 // キャãƒ?‚·ュが効くと、getOption の戻りå?は、null になるã?
240 if( dltag != null ) {
241 return intag.makeTag( row,value ) + HybsSystem.CR +
242 DIV1 + dltag.makeTag( row,value ) + DIV2 + HybsSystem.CR ;
243 }
244 else {
245 return intag.makeTag( row,value ) + HybsSystem.CR ;
246 }
247 }
248
249 /**
250 * 初期値が選択済みの 選択肢(オプション)をTagBuffer に反映しますã?
251 * こã?オプションは、引数の値をå?期å?とするオプションタグ作æ?しã?TagBuffer
252 * に値を設定して返しますã?
253 *
254 * 第?“引数は、Selection オブジェクトã?キャãƒ?‚·ュ機è?を使用するかどã�?�‹æŒ?®šしますã?
255 * true で、使用する事を前提に、チェãƒ?‚¯を行いますã?
256 * DBMENU など、他ã?メソãƒ?ƒ‰では、ラベル(短)の使用有無として使用してã�?‚‹ため、異なりますã?
257 *
258 * ここでは、AAA:BBB:CCC:DDD とã�?�†値をã?$1,$2,$3,$4 に割り当てなおしてã€?
259 * QUERYを実行しますã?またã?$1 は、本来の値として、メニューの初期値設定等に
260 * 使用しますã?上記ã?例では、AAA がå?で、それ以降ã?、引数になりますã?
261 * さらに、å?のæ–?—å?"AAA:BBB:CCC:DDD"はã€?0 に割り当てられますã?割り当てがなã�?
262 * 変数はã€?"(ゼロæ–?—å?)として、扱われますã?
263 * 又ã?$Cには自åˆ??身のカラãƒ?��を割り当てますã?
264 *
265 * @param buf タグæ–?—å?のバッファー
266 * @param value 選択されてã�?‚‹値
267 * @param useSelCache Selection オブジェクトã?キャãƒ?‚·ュ機è?を使用するかどã�?�‹ã€?
268 *
269 * @return オプションタグ
270 */
271 private TagBuffer getOption( final TagBuffer buf,final String value,final boolean useSelCache ) {
272
273 StringFormat format = new StringFormat( query, value, name );
274 String newQuery = format.format();
275 String newValue = format.getValue();
276
277 Selection selection = SelectionFactory.newDBSelection( newQuery, dbid, lang );
278
279 if( useSelCache ) {
280 if( selection == bkSel ) { return null; }
281 bkSel = selection ;
282 }
283
284 buf.setBody( selection.getOption( newValue, false ) );
285
286 return buf;
287 }
288 }