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.Attributes;
028    import org.opengion.fukurou.util.TagBuffer;
029    
030    /**
031     * INDBMENU エãƒ?‚£ターは、カラãƒ??表示パラメーターの?³?±?¬æ–?‚’実行結果よりã€?
032     * 作æ?したプルãƒ?‚¦ンメニューと、テキストフィールドによる入力ã?両方をサポã?トするã?
033     * 編é›?�«使用するクラスですã?
034     *
035     * JavaScript によりãƒ?‚­ストフィールドとメニュー(コンボã?ãƒ?‚¯ス)を重ね合わせて
036     * 表示しておき、メニューで選択したå?をã?ãƒ?‚­ストフィールドに設定してã�?�¾すã?
037     * こã?エãƒ?‚£タを使用するには、jsp/common/inputMenu.js を予め使用できるように
038     * 設定しておくå¿?¦�がありますã?
039     *
040     * こã?エãƒ?‚£タはeventColumnに対応してã�?�¾せんã€?
041     *
042     *  カラãƒ??表示にå¿?¦�な属æ?は, DBColumn オブジェクãƒ?より取り出しますã?
043     * こã?クラスは、DBColumn オブジェクト毎に?‘つ作æ?されますã?
044     *
045     * @og.rev 3.5.6.2 (2004/07/05) 新規作æ?
046     * @og.group ãƒ??タ編é›?
047     *
048     * @version  4.0
049     * @author       Kazuhiko Hasegawa
050     * @since    JDK5.0,
051     */
052    public class Editor_INDBMENU extends AbstractEditor {
053            //* こã?プログラãƒ??VERSIONæ–?­—å?を設定しますã?       {@value} */
054            private static final String VERSION = "5.6.3.0 (2013/04/01)" ;
055    
056            private static final String SEL1 = "<script type=\"text/javascript\">makeInputMenu('" ;
057            private static final String SEL2 = "');</script>" ;
058    
059            private final String query ;
060            private final String dbid ;
061            private final String lang ;                             // 4.0.0 (2006/11/15)
062            private final boolean addNoValue ;              // 3.5.5.7 (2004/05/10)
063            private final boolean seqFlag ;                 // 3.6.0.6 (2004/10/22)
064            private final TagBuffer selTagBuffer = new TagBuffer() ;
065    
066            /**
067             * ãƒ?ƒ•ォルトコンストラクターã€?
068             * こã?コンストラクターで、基本オブジェクトを作æ?しますã?
069             *
070             * @og.rev 3.6.0.6 (2004/10/22) シーケンスアクセス機è?(seqFlag)を追åŠ?�—まã�?
071             */
072            public Editor_INDBMENU() {
073                    // 4.3.4.4 (2009/01/01)
074    //              super();
075                    query   = null;
076                    dbid    = null;
077                    lang    = null;                 // 4.0.0 (2006/11/15)
078                    addNoValue = false;             // 3.5.5.7 (2004/05/10)
079                    seqFlag    = false;             // 3.6.0.6 (2004/10/22)
080                    name    = null;                 // 4.3.4.0 (2008/12/01)
081            }
082    
083            /**
084             * コンストラクターã€?
085             *
086             * @og.rev 3.6.0.6 (2004/10/22) シーケンスアクセス機è?(seqFlag)を追åŠ?�—まã�?
087             * @og.rev 4.0.0.0 (2006/11/24) TextFieldåˆ??属æ?設å®?
088             * @og.rev 5.6.3.0 (2013/04/01) プルãƒ?‚¦ンのonChangeの設定å?æ‰?‚’変更
089             *
090             * @param       clm     DBColumnオブジェクãƒ?
091             */
092            private Editor_INDBMENU( final DBColumn clm ) {
093                    super( clm );
094                    tagBuffer.add( XHTMLTag.inputAttri( attributes ) );
095    
096                    addNoValue      = clm.isAddNoValue() ;          // 3.5.5.7 (2004/05/10)
097                    query           = clm.getEditorParam();
098                    dbid            = clm.getDbid();
099                    lang            = clm.getLang();                        // 4.0.0 (2006/11/15)
100                    seqFlag         = false;                // 3.6.0.6 (2004/10/22)
101                    name            = clm.getName(); //4.3.4.0 (2008/12/01)
102    
103                    if( query == null || query.length() == 0 ) {
104                            String errMsg = "DBMENU Editor では、編é›?ƒ‘ラメータはå¿??ですã?"
105                                            + " name=[" + name + "]" + HybsSystem.CR ;
106                            throw new HybsSystemException( errMsg );
107                    }
108    
109                    String  disabled = clm.isWritable() ? null : "disabled" ;
110    
111                    Attributes selAttri = new Attributes();
112                    selAttri.set( "disabled"        ,disabled );
113    //              selAttri.set( "onChange" ,"selChanged(this);" );        // INDBMENU 特有ã?JavaScript
114    
115                    selAttri.addAttributes( clm.getEditorAttributes() );
116                    
117                    selAttri.set( "onChange" ,"selChanged(this);" );        // INDBMENU 特有ã?JavaScript 5.6.3.0 (2013/03/01) 場æ‰?¤‰更
118                    
119                    selTagBuffer.add( XHTMLTag.selectAttri( selAttri ) );
120            }
121    
122            /**
123             * å�?‚ªブジェクトからè?åˆ??インスタンスを返しますã?
124             * 自åˆ??身をキャãƒ?‚·ュするのかã?新たに作æ?するのかã?、各サブクラスの実è£?�«
125             * まかされますã?
126             *
127             * @param       clm     DBColumnオブジェクãƒ?
128             *
129             * @return      CellEditorオブジェクãƒ?
130             */
131            public CellEditor newInstance( final DBColumn clm ) {
132                    return new Editor_INDBMENU( clm );
133            }
134    
135            /**
136             * ãƒ??タの編é›?”¨æ–?­—å?を返しますã?
137             *
138             * ここでは、AAA:BBB:CCC:DDD とã�?�†値をã?$1,$2,$3,$4 に割り当てなおしてã€?
139             * QUERYを実行しますã?またã?$1 は、本来の値として、メニューの初期値設定等に
140             * 使用しますã?上記ã?例では、AAA がå?で、それ以降ã?、引数になりますã?
141             * さらに、å?のæ–?­—å?"AAA:BBB:CCC:DDD"はã€?0 に割り当てられますã?割り当てがなã�?
142             * 変数はã€?"(ゼロæ–?­—å?)として、扱われますã?
143             *
144             * @og.rev 3.8.5.3 (2006/06/30) 位置を絶対位置æŒ?®?position:absolute;)
145             * @og.rev 4.3.7.2 (2009/06/15) 属æ?でidがå?力される場合ã?、idをå?力しなã�?
146             *
147             * @param       value 入力å?
148             *
149             * @return      ãƒ??タの編é›?”¨æ–?­—å?
150             */
151            @Override
152            public String getValue( final String value ) {
153    
154                    // input タグの作æ?
155                    TagBuffer intag = new TagBuffer( "input" );
156                    intag.add( "name"    , name );
157                    if( attributes.get( "id" ) == null || attributes.get( "id" ).length() == 0 ) { // 4.3.7.2 (2009/06/15)
158                            intag.add( "id"      , name );          // INDBMENU 特有ã?JavaScript用のキー
159                    }
160                    intag.add( "value"   , value );
161                    intag.add( "size"    , size1 );
162                    intag.add( tagBuffer.makeTag() );
163                    intag.add( optAttr );
164    
165                    // select タグの作æ?
166                    TagBuffer seltag = new TagBuffer( "select" );
167                    seltag.add( "id"      , name + ".sel" );        // INDBMENU 特有ã?JavaScript用のキー
168                    seltag.add( "style"   , "position:absolute;" ); // 3.8.5.3 (2006/06/30) 位置を絶対位置æŒ?®?
169                    seltag.add( selTagBuffer.makeTag() );
170                    seltag.add( optAttr );
171    
172                    seltag = getOption( seltag,value );
173    
174                    return intag.makeTag() + HybsSystem.CR +
175                                    seltag.makeTag() + HybsSystem.CR +
176                                    SEL1 + name + SEL2;
177            }
178    
179            /**
180             * name属æ?を変えたã?ãƒ??タ表示/編é›?”¨のHTMLæ–?­—å?を作æ?しますã?
181             * ãƒ??ブル上ã? name に 行番号を付加して、名前_行番号 で登録するキーを作æ?ã�?
182             * リクエスト情報を1つ毎ã?フィールドで処ç�?�§きますã?
183             *
184             * ここでは、AAA:BBB:CCC:DDD とã�?�†値をã?$1,$2,$3,$4 に割り当てなおしてã€?
185             * QUERYを実行しますã?またã?$1 は、本来の値として、メニューの初期値設定等に
186             * 使用しますã?上記ã?例では、AAA がå?で、それ以降ã?、引数になりますã?
187             * さらに、å?のæ–?­—å?"AAA:BBB:CCC:DDD"はã€?0 に割り当てられますã?割り当てがなã�?
188             * 変数はã€?"(ゼロæ–?­—å?)として、扱われますã?
189             *
190             * @og.rev 3.8.5.1 (2006/04/28) makeInputMenu 呼び出し時の引数記述ミスを修正
191             * @og.rev 3.8.5.3 (2006/06/30) 位置を絶対位置æŒ?®?position:absolute;)
192             * @og.rev 4.3.7.2 (2009/06/15) 属æ?でidがå?力される場合ã?、idをå?力しなã�?
193             *
194             * @param       row   行番号
195             * @param       value 入力å?
196             *
197             * @return      ãƒ??タ表示/編é›?”¨のæ–?­—å?
198             */
199            @Override
200            public String getValue( final int row,final String value ) {
201    
202                    String name2 = name + HybsSystem.JOINT_STRING + row ;
203    
204                    // input タグの作æ?
205                    TagBuffer intag = new TagBuffer( "input" );
206                    intag.add( "name"    , name2 );
207                    if( attributes.get( "id" ) == null || attributes.get( "id" ).length() == 0 ) { // 4.3.7.2 (2009/06/15)
208                            intag.add( "id"      , name2 );         // INDBMENU 特有ã?JavaScript用のキー
209                    }
210                    intag.add( "value"   , value );
211                    intag.add( "size"    , size2 );
212                    intag.add( tagBuffer.makeTag() );
213                    intag.add( optAttr );
214    
215                    // select タグの作æ?
216                    TagBuffer seltag = new TagBuffer( "select" );
217                    seltag.add( "id"      , name2 + ".sel" );               // INDBMENU 特有ã?JavaScript用のキー
218                    seltag.add( "style"   , "position:absolute;" ); // 3.8.5.3 (2006/06/30) 位置を絶対位置æŒ?®?
219                    seltag.add( selTagBuffer.makeTag() );
220                    seltag.add( optAttr );
221    
222                    seltag = getOption( seltag,value );
223    
224                    return intag.makeTag( row,value ) + HybsSystem.CR +
225                                    seltag.makeTag( row,value ) + HybsSystem.CR +
226                                    SEL1 + name2 + SEL2;
227            }
228    
229            /**
230             * 初期値が選択済みの 選択肢(オプション)をTagBuffer に反映しますã?
231             * こã?オプションは、引数の値をå?期å?とするオプションタグ作æ?しã?TagBuffer
232             * に値を設定して返しますã?
233             *
234             * ここでは、AAA:BBB:CCC:DDD とã�?�†値をã?$1,$2,$3,$4 に割り当てなおしてã€?
235             * QUERYを実行しますã?またã?$1 は、本来の値として、メニューの初期値設定等に
236             * 使用しますã?上記ã?例では、AAA がå?で、それ以降ã?、引数になりますã?
237             * さらに、å?のæ–?­—å?"AAA:BBB:CCC:DDD"はã€?0 に割り当てられますã?割り当てがなã�?
238             * 変数はã€?"(ゼロæ–?­—å?)として、扱われますã?
239             * 又ã?$Cには自åˆ??身のカラãƒ?��を割り当てますã?
240             *
241             * @og.rev 3.5.5.7 (2004/05/10) getOption( String value )のå»?­¢を受けて、新規作æ?
242             * @og.rev 3.6.0.6 (2004/10/22) シーケンスアクセス機è?(seqFlag)を追åŠ?�—まã�?
243             * @og.rev 4.0.0.0 (2006/11/15) SelectionFactory に lang 属æ?を追åŠ?�—ますã?
244             * @og.rev 4.3.4.0 (2008/12/01) $C対å¿?
245             *
246             * @param       buf  反映させるTagBufferオブジェクãƒ?
247             * @param       value 選択されてã�?‚‹値
248             *
249             * @return      オプションタグ
250             */
251            private TagBuffer getOption( final TagBuffer buf,final String value ) {
252    
253                    // StringFormat format = new StringFormat( query,value );
254                    StringFormat format = new StringFormat( query, value, name ); // 4.3.4.0 (2008/12/01)
255                    String newQuery = format.format();
256                    String newValue = format.getValue();
257    
258                    Selection selection = SelectionFactory.newDBSelection( newQuery, dbid, lang );
259    
260                    if( addNoValue ) {
261                            buf.setBody( Selection.NO_VALUE_OPTION + selection.getOption( newValue, seqFlag ) );
262                    }
263                    else {
264                            buf.setBody( selection.getOption( newValue, seqFlag ) );
265                    }
266    
267                    return buf;
268            }
269    }