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    }