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.hayabusa.db;
017    
018    import org.opengion.hayabusa.common.HybsSystem;
019    import org.opengion.fukurou.util.LogWriter;
020    import org.opengion.hayabusa.resource.CodeData;
021    
022    /**
023     * ãƒ??タのコード情報を取り扱ã�?‚¯ラスですã?
024     *
025     * コードã?キーとラベルのæƒ??から、HTMLのメニューã‚?ƒªストを作æ?するための オプション
026     * タグを作æ?したりã?与えられたキーをもとに、チェãƒ?‚¯済みのオプションタグを作æ?したã‚?
027     * しますã?
028     *
029     * @og.rev 5.7.7.1 (2014/06/13) Selection_NULL ã‚?基本実è£?�¨しますã?
030     * @og.group 選択データ制御
031     *
032     * @version  4.0
033     * @author   Kazuhiko Hasegawa
034     * @since    JDK5.0,
035     */
036    // public class Selection_CODE implements Selection {
037    public class Selection_CODE extends Selection_NULL {
038            private final CodeData codeData ;
039    
040            private final int[]    ADRS  ;
041            private final String   CACHE ;
042            private final int      LEN   ;
043    
044            private final int[]    LADRS  ; // 5.1.3.0 (2010/02/01)
045            private final String   LCACHE ; // 5.1.3.0 (2010/02/01)
046            private final int      LLEN   ; // 5.1.3.0 (2010/02/01)
047    
048            /**
049             * コンストラクター
050             *
051             * @og.rev 4.0.0.0 (2007/11/07) コードリソースの有無はDBColumnでチェãƒ?‚¯するã€?
052             * @og.rev 4.3.8.0 (2009/08/01) ãƒ??ルチップ表示機è?追åŠ?
053             * @og.rev 5.1.3.0 (2010/02/01) ä¸?¦§表示以外ã?、ツールチップ表示しなã�?
054             * @og.rev 5.1.9.0 (2010/08/01) グループ機è?とパラメータ機è?の追åŠ?
055             * @og.rev 5.6.8.2 (2013/09/20) ãƒ??ルチップã?未åŠ?·¥のlongLabelを利用に修正
056             * @og.rev 5.7.7.1 (2014/06/13) Selection_NULL ã‚?継承するため、super( null ); を追åŠ?�—ますã?
057             *
058             * @param       cdData  コードデータオブジェクãƒ?
059             */
060            public Selection_CODE( final CodeData cdData ) {
061                    codeData = cdData ;
062                    int size = codeData.getSize();
063    
064                    // 5.1.9.0 (2010/08/01) グループ機è?とパラメータの判å®?
065                    boolean isLbl = codeData.useLebel();
066                    boolean isCls = codeData.useParam();
067                    boolean isLblSet = false;
068    
069                    ADRS  = new int[size];
070                    StringBuilder buf = new StringBuilder( HybsSystem.BUFFER_MIDDLE );
071                    boolean useTitle = false; // 4.3.8.0 (2009/08/01) title属æ?付加フラグ
072                    for( int i=0; i<size; i++ ) {
073                            if( ! codeData.isUse(i) ) { continue; }
074    
075                            String rslbl = codeData.getRawShortLabel(i);
076                            // String lblb  = codeData.getLongLabel(i);
077                            String lblb  = codeData.getRawLongLabel(i); // 5.6.8.2 (2013/09/20) ここでは生ã?名称長を取ã‚?
078    
079                            // 5.1.9.0 (2010/08/01) コードレベルの判å®?
080                            if( isLbl && "0".equals( codeData.getCodeLebel(i) ) ) {
081                                    if( isLblSet ) { buf.append( "</optgroup>" ); }
082    
083                                    buf.append( "<optgroup label=\"" + rslbl + "\">" );
084                                    isLblSet = true;
085                                    continue;
086                            }
087    
088                            buf.append( "<option value=\"" ).append( codeData.getCodeKey(i) ).append( "\"" );
089                            ADRS[i] = buf.length() ;
090    
091                            // 5.1.9.0 (2010/08/01) パラメータの利用
092                            if( isCls ) {
093                                    String classKey = codeData.getCodeParam(i);
094                                    if( ! "".equals( classKey ) ) {
095                                            buf.append( " class=\"" ).append( classKey ).append( "\"" );
096                                    }
097                            }
098    
099                            // 4.3.8.0 (2009/08/01) LongLabelはRawShortLabelと異なるときにãƒ??ルチップとして表示させã‚?
100                            if( ! rslbl.equals( lblb ) ){
101                                    buf.append(" title=\"").append( lblb ).append("\"");
102                                    useTitle = true;
103                            }
104                            // ShortLabelをBODYにするã€?
105                            buf.append( ">" ).append( rslbl ).append( "</option>" );
106                    }
107                    if( isLbl ) {
108                            buf.append( "</optgroup>" );
109                    }
110    
111                    CACHE = buf.toString();
112                    LEN   = CACHE.length() + 30;
113    
114                    // 5.1.3.0 (2010/02/01) ãƒ??ルチップ表示が適用されてã�?‚‹場合ã?み、ツールチップなしã?状態ã?optionをキャãƒ?‚·ュするã€?
115                    if( useTitle ) {
116                            isLblSet = false;
117    
118                            LADRS  = new int[size];
119                            StringBuilder lbuf = new StringBuilder( HybsSystem.BUFFER_MIDDLE );
120                            for( int i=0; i<size; i++ ) {
121                                    String lblb  = codeData.getLongLabel(i);
122                                    // 5.1.9.0 (2010/08/01) グループ機è?の判å®?
123                                    if( isLbl && "0".equals( codeData.getCodeLebel(i) ) ) {
124                                            if( isLblSet ) { lbuf.append( "</optgroup>" ); }
125    
126                                            lbuf.append( "<optgroup label=\"" + lblb + "\">" );
127                                            isLblSet = true;
128                                            continue;
129                                    }
130    
131                                    lbuf.append( "<option value=\"" ).append( codeData.getCodeKey(i) ).append( "\"" );
132                                    LADRS[i] = lbuf.length() ;
133    
134                                    // 5.1.9.0 (2010/08/01) パラメータの利用
135                                    if( isCls ) {
136                                            String classKey = codeData.getCodeParam(i);
137                                            if( ! "".equals( classKey ) ) {
138                                                    lbuf.append( " class=\"" ).append( classKey ).append( "\"" );
139                                            }
140                                    }
141    
142                                    lbuf.append( ">" ).append( lblb ).append( "</option>" );
143                            }
144                            if( isLbl ) {
145                                    buf.append( "</optgroup>" );
146                            }
147    
148                            LCACHE = lbuf.toString();
149                            LLEN   = LCACHE.length() + 30;
150                    }
151                    else {
152                            LADRS  = ADRS;
153                            LCACHE = CACHE;
154                            LLEN   = LEN;
155                    }
156            }
157    
158            /**
159             * 初期値が選択済みの 選択肢(オプション)を返しますã?
160             * こã?オプションは、引数の値をå?期å?とするオプションタグを返しますã?
161             * こã?メソãƒ?ƒ‰では、ラベル(短)が設定されてã�?‚‹場合でもã?これを使用せずにå¿?�šラベル(長)を使用しますã?
162             *
163             * @og.rev 3.6.0.6 (2004/10/22) シーケンスアクセス機è?を指定すã‚?seqFlag を導å?
164             * @og.rev 4.0.0.0 (2005/01/31) selectValue がã?null/ゼロæ–?­—å?でなã�??合にã€?�¸択肢になã�??合ã?、エラー
165             * @og.rev 5.7.7.1 (2014/06/13) Selection_NULL ã‚?継承するため、削除
166             *
167             * @param   selectValue  選択されてã�?‚‹値
168             * @param   seqFlag  シーケンスアクセス機è? [true:ON/false:OFF]
169             *
170             * @return  オプションタグ
171             * @see     #getOption( String, boolean, boolean )
172             */
173    //      public String getOption( final String selectValue,final boolean seqFlag ) {
174    //              return getOption( selectValue, seqFlag, false );
175    //      }
176    
177            /**
178             * 初期値が選択済みの 選択肢(オプション)を返しますã?
179             * こã?オプションは、引数の値をå?期å?とするオプションタグを返しますã?
180             * こã?メソãƒ?ƒ‰では、引数のuseShortLabelがtrueにæŒ?®šされた場合に、ラベル(短)をã?ースとした
181             * ãƒ??ルチップ表示を行いますã?
182             *
183             * @og.rev 5.1.3.0 (2010/02/01) 追åŠ?
184             *
185             * @param   selectValue  選択されてã�?‚‹値
186             * @param   seqFlag  シーケンスアクセス機è? [true:ON/false:OFF]
187             * @param   useShortLabel ラベル(短)をã?ースとしたオプション表示を行うかどã�?�‹ã€?
188             *
189             * @return  オプションタグ
190             * @see     #getOption( String, boolean )
191             */
192            @Override
193            public String getOption( final String selectValue,final boolean seqFlag, final boolean useShortLabel ) {
194                    int[] adrs = null;
195                    String cache = null;
196                    int len = 0;
197                    if( useShortLabel ) {
198                            adrs  = ADRS;
199                            cache = CACHE;
200                            len   = LEN;
201                    }
202                    else {
203                            adrs  = LADRS;
204                            cache = LCACHE;
205                            len   = LLEN;
206                    }
207    
208                    // マッチするアドレスを探すã?
209                    int selected = codeData.getAddress( selectValue );
210    
211                    if( selected < 0 ) {
212                            // 4.0.0 (2005/01/31)
213                            if( selectValue != null && selectValue.length() > 0 ) {
214                                    String errMsg = "コードに存在しなã�??が指定されましたã€?
215                                                            + " value=[" + selectValue + "]"
216                                                            + HybsSystem.CR + codeData ;
217                                    LogWriter.log( errMsg );
218                            }
219                            return cache;
220                    }
221                    else {
222                            StringBuilder buf = new StringBuilder( len );
223                            // 3.6.0.6 (2004/10/22) シーケンスアクセス機è?を指定すã‚?seqFlag を導å?
224                            if( seqFlag ) {
225                                    buf.append( "<option value=\"" ).append( codeData.getCodeKey(selected) ).append( "\"" );
226                            }
227                            else {
228                                    buf.append( cache.substring( 0,adrs[selected] ) );
229                            }
230                            buf.append( " selected=\"selected\"" );
231                            buf.append( cache.substring( adrs[selected] ) );
232                            return buf.toString() ;
233                    }
234            }
235    
236            /**
237             * 初期値が選択済みの 選択肢(オプション)を返しますã?
238             * こã?オプションは、引数の値をå?期å?とするオプションタグを返しますã?
239             * ※ こã?クラスでは実è£?�•れてã�?�¾せんã€?
240             *
241             * @og.rev 2.1.0.1 (2002/10/17) 選択リストを、正方向にしか選べなã�?‚ˆã�?�«する sequenceFlag を導å?する
242             * @og.rev 3.8.6.0 (2006/09/29) useLabel 属æ? 追åŠ?
243             * @og.rev 5.7.7.1 (2014/06/13) Selection_NULL ã‚?継承するため、削除
244             *
245             * @param   name         ラジオの name
246             * @param   selectValue  選択されてã�?‚‹値
247             * @param   useLabel     ラベル表示の有無 [true:æœ?false:無]
248             *
249             * @return  オプションタグ
250             */
251    //      public String getRadio( final String name,final String selectValue,final boolean useLabel ) {
252    //              String errMsg = "こã?クラスでは実è£?�•れてã�?�¾せんã€?;
253    //              throw new UnsupportedOperationException( errMsg );
254    //      }
255    
256            /**
257             * 初期値が選択済みの 選択肢(オプション)を返しますã?
258             * こã?オプションは、引数の値をå?期å?とするオプションタグを返しますã?
259             * ※ こã?クラスでは実è£?�•れてã�?�¾せんã€?
260             *
261             * @og.rev 5.7.7.1 (2014/06/13) Selection_NULL ã‚?継承するため、削除
262             *
263             * @param   selectValue  選択されてã�?‚‹値
264             *
265             * @return  オプションタグ
266             */
267    //      public String getRadioLabel( final String selectValue ) {
268    //              String errMsg = "こã?クラスでは実è£?�•れてã�?�¾せんã€?;
269    //              throw new UnsupportedOperationException( errMsg );
270    //      }
271    
272            /**
273             * 選択肢(value)に対するラベルを返しますã?
274             * 選択肢(value)がã?存在しなかったå?合ã?ã€?�¸択肢そã?もã?を返しますã?
275             * getValueLabel( XX ) は、getValueLabel( XX,false ) と同じですã?
276             *
277             * @og.rev 5.7.7.1 (2014/06/13) Selection_NULL ã‚?継承するため、削除
278             *
279             * @param   selectValue 選択肢の値
280             *
281             * @return  選択肢のラベル
282             * @see     #getValueLabel( String,boolean )
283             */
284    //      public String getValueLabel( final String selectValue ) {
285    //              return getValueLabel( selectValue,false );
286    //      }
287    
288            /**
289             * 選択肢(value)に対するラベルを返しますã?
290             * 選択肢(value)がã?存在しなかったå?合ã?ã€?�¸択肢そã?もã?を返しますã?
291             * こã?メソãƒ?ƒ‰では、短縮ラベルを返すかどã�?�‹を指定するフラグを指定しますã?
292             * getValueLabel( XX,false ) は、getValueLabel( XX ) と同じですã?
293             *
294             * @og.rev 4.0.0.0 (2005/11/30) を追åŠ?
295             *
296             * @param       selectValue     選択肢の値
297             * @param       flag    短縮ラベルã‚?[true:使用する/false:しない]
298             *
299             * @return  選択肢のラベル
300             * @see     #getValueLabel( String )
301             */
302            @Override
303            public String getValueLabel( final String selectValue,final boolean flag ) {
304                    // マッチするアドレスを探すã?
305                    int selected = codeData.getAddress( selectValue );
306    
307                    if( selected < 0 ) {
308                            // マッチしなければã€?�¸択肢そã?もã?を返すã€?
309                            return selectValue;
310                    }
311                    else {
312                            if( flag ) {
313                                    return codeData.getShortLabel(selected);
314                            }
315                            else {
316                                    return codeData.getLongLabel(selected);
317                            }
318                    }
319            }
320    
321            /**
322             * マルチã?キーセレクトを使用するかどã�?�‹を返しますã?
323             * true?š使用する。false:使用しなã�?ですã?
324             * ただしã?実際に使用するかどã�?�‹は、HTML出力時に決めることがå?来ますã?
325             * ここでは、USE_MULTI_KEY_SELECT ã�?true で、USE_SIZE(=20)以上ã?場合に
326             * true を返しますã?
327             *
328             * @og.rev 3.5.5.7 (2004/05/10) 新規作æ?
329             *
330             * @return  選択リストで、ã?ルチã?キーセレクトを使用するかどã�?�‹(true:使用する)
331             */
332            @Override
333            public boolean useMultiSelect() {
334                    return codeData.useMultiSelect();
335            }
336    
337            /**
338             * オブジェクトã?キャãƒ?‚·ュが時間å?れかどã�?�‹を返しますã?
339             * キャãƒ?‚·ュが時間å?ã‚?無効)であれば、true をã?有効であればã€?
340             * false を返しますã?
341             *
342             * @og.rev 4.0.0.0 (2005/01/31) 新規作æ?
343             * @og.rev 5.7.7.1 (2014/06/13) Selection_NULL ã‚?継承するため、削除
344             *
345             * @return  キャãƒ?‚·ュが時間å?れなã‚?true
346             */
347    //      public boolean isTimeOver() {
348    //              return false;
349    //      }
350    }