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    }