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    }