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