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.taglib;
017    
018    import org.opengion.hayabusa.common.HybsSystem;
019    import org.opengion.hayabusa.common.HybsSystemException;
020    import org.opengion.fukurou.util.XHTMLTag;
021    
022    
023    /**
024     * プルãƒ?‚¦ンメニューの選択é?目を作æ?するHTML拡張タグですã?
025     *
026     * name 属æ?は、ラベルリソース のキーを与えることで、使用する上位ã?タグの
027     * ロケールにあわせたリソースを使用して、画面に表示しますã?
028     * 従って、このタグでは ロケールはæŒ?®šできませんã€?
029     * selected属æ?は、そのタグが選ばれてã�?‚‹場合をã€?true" でæŒ?®šしますã? 初期値はã€?false" ですã?
030     *
031     * @og.formSample
032     * ●形式ï¼?lt;og:option value="…" lbl ="…" selected="…" />
033     * ●body?šなã�?
034     *
035     * ●Tag定義??
036     *   <og:option
037     *       value              【TAG】å?を指定しまã�?
038     *       selected           【TAG】オプションを選択済みの状æ…?selected)にセãƒ?ƒˆしまã�?初期値:未選æŠ?
039     *       lbl                【TAG】ラベルリソースのラベルIDを指定しまã�?
040     *       lbls               【TAG】ラベルをCSV形式でè¤?•°æŒ?®šしまã�?
041     *       label              【TAG】optionタグのラベルを指定しまã�?
042     *       caseKey            【TAG】このタグ自体を利用するかどã�?�‹の条件キーを指定しまã�?初期値:null)
043     *       caseVal            【TAG】このタグ自体を利用するかどã�?�‹の条件値を指定しまã�?初期値:null)
044     *       caseNN             【TAG】指定ã?値がã?null/ゼロæ–?­—å? でなã�??å�?Not Null=NN)は、このタグは使用されまã�?初期値:true)
045     *       caseNull           【TAG】指定ã?値がã?null/ゼロæ–?­—å? の場合ã?、このタグは使用されまã�?初期値:true)
046     *       id                 【HTML】要ç´?�«対して固有ã?名前(id)をつける場合に設定しまã�?
047     *       lang               【HTML】要ç´??å†?®¹と他ã?属æ?値のè¨?ª?lang,xml:lang)を指定しまã�?
048     *       dir                【HTML】文字表記ã?方å�?dir)を指定しまã�?
049     *       title              【HTML】要ç´?�«対する補足çš?ƒ…報(title)を設定しまã�?
050     *       style              【HTML】この要ç´?�«対して適用させるスタイルシーãƒ?style)を設定しまã�?
051     *       disabled           【TAG】その部品に対してã€?�¸択や変更がå?来なã�?‚ˆã�?�«(disabled)æŒ?®šしまã�?サーバã?に送信されなã�?
052     *       clazz              【HTML】要ç´?�«対して class 属æ?を設定しまã�?
053     *       language           【TAG】タグå†?ƒ¨で使用するè¨?ªžコード[ja/en/zh/…]を指定しまã�?
054     *       roles              【TAG】ロールをセãƒ?ƒˆしまã�?
055     *       debug              【TAG】デバッグæƒ??をå?力するかどã�?�‹[true/false]を指定しまã�?初期値:false)
056     *   />
057     *
058     * ●使用ä¾?
059     *     プルãƒ?‚¦ンで選択すã‚?値(value) に対して ラベル(lbl) を付けられますã?
060     *     <og:select name="ORDER_BY" msg="ORDER_BY">
061     *         <og:option value="SYSTEM_ID,CLM,LANG" lbl ="CLM" selected="selected" />
062     *     </og:select>
063     *
064     *     ラベルがè¤?•°ある場合ã?、lbls 属æ?を使用しますã?
065     *     <og:select name="ORDER_BY" msg="ORDER_BY">
066     *         <og:option value="SYSTEM_ID,CLM,LANG" lbls="LANG,NAME_JA" />
067     *     </og:select>
068     *
069     *     MessageResource プロパティの値を使用したã�?�¨ききはmsg属æ?を使ã�?�¾すã?
070     *     <og:select name="CDC">
071     *         <og:option msg="MSG0001" />
072     *     </og:select>
073     *
074     *     LabelResource プロパティの値を使用したã�?�¨ききはlbl属æ?を使ã�?�¾すã?
075     *     <og:select name="CDC">
076     *         <og:option lbl="CDC1" />
077     *     </og:select>
078     *
079     *     選択肢の中からè¤?•°選択できるようにするときã?multiple属æ?を使ã�?�¾すã?
080     *     <og:select name="CDC" multiple="multiple">
081     *         <og:option value="AAA" />
082     *     </og:select>
083     *
084     *     選択不可にするときã?disabled属æ?を使ã�?�¾すã?
085     *     <og:select name="CDC" disabled="disabled">
086     *         <og:option value="AAA" />
087     *     </og:select>
088     *
089     *     選択肢をSELECTæ–??結果から作æ?したã�?�¨きã?queryOptionタグとçµ?�¿合わせて使ã�?�¾すã?
090     *     <og:select name="CDC">
091     *         <og:queryOption>
092     *                     select NOSYN,NOSYN,':',NMSYN from DB01 ORDER BY 1
093     *         </og:queryOption>
094     *     </og:select>
095     *
096     * @og.group 選択データ制御
097     *
098     * @version  4.0
099     * @author   Kazuhiko Hasegawa
100     * @since    JDK5.0,
101     */
102    public class OptionTag extends HTMLTagSupport {
103            //* こã?プログラãƒ??VERSIONæ–?­—å?を設定しますã?       {@value} */
104            private static final String VERSION = "5.2.2.0 (2010/11/01)" ;
105    
106            private static final long serialVersionUID = 522020101101L ;
107    
108    //      private String code = null;
109    
110            // 3.5.4.0 (2003/11/25) selVal 属æ?を追åŠ??
111            private String selVal = null;
112            private boolean multipleAll     = false;        // 3.8.0.9 (2005/10/17) è¤?•°選択可能時に全選択を設定するã?
113    
114            /**
115             * Taglibの終äº?‚¿グが見つかったときに処ç�?�™ã‚?doEndTag() ã‚?オーバã?ライドしますã?
116             *
117             * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応ã?release2() ã‚?doEndTag()で呼ぶã€?
118             * @og.rev 3.5.4.0 (2003/11/25) selVal 属æ?を追åŠ??
119             * @og.rev 3.8.0.9 (2005/10/17) è¤?•°選択可能時に全選択を設定するã?
120             * @og.rev 4.3.0.0 (2008/07/04) ロールモードã?ルチ対å¿?
121             * @og.rev 5.0.2.0 (2009/11/01) è¤?•°パラメーターの選択に対å¿?
122             * @og.rev 5.2.2.0 (2010/11/01) caseKey 、caseVal 属æ?対å¿?
123             *
124             * @return      後続å?ç�??æŒ?¤º
125             */
126            @Override
127            public int doEndTag() {
128                    debugPrint();           // 4.0.0 (2005/02/28)
129                    // 5.2.2.0 (2010/11/01) caseKey 、caseVal 属æ?対å¿?
130                    if( !useTag() ) { return(EVAL_PAGE); }
131    
132                    // 4.0.0 (2005/11/30) æŒ?®šã?ロールがã?アクセス許可の場合ã?、å?力しますã?
133                    String roles = get( "roles" );
134    //              if( roles != null && ! getUser().isAccess( roles ) ) {
135    //                      return(EVAL_PAGE);
136    //              }
137                    // 4.3.0.0 (2008/07/04) ロールモードã?ルチ対å¿?
138                    if( ! getUser().isAccess( roles ) ) {
139                            return(EVAL_PAGE);
140                    }
141    
142                    SelectTag select = (SelectTag)findAncestorWithClass( this,SelectTag.class );
143                    if( select == null ) {
144                            String errMsg = "こã?タグは、SelectTag のBODY に記述するå¿?¦�がありますã?";
145                            throw new HybsSystemException( errMsg );
146                    }
147    //              selVal = select.getValue();                     // 3.5.4.0 (2003/11/25)
148                    selVal = "|" + select.getValue() + "|"; // 5.0.2.0 (2009/11/01)
149                    multipleAll     = select.isMultipleAll();       // 3.8.0.9 (2005/10/17) è¤?•°選択可能時に全選択を設定するã?
150                    select.addOption( makeTag() );
151    
152                    return(EVAL_PAGE);
153            }
154    
155            /**
156             * タグリブオブジェクトをリリースしますã?
157             * キャãƒ?‚·ュされて再利用されるã?で、フィールドã?初期設定を行いますã?
158             *
159             * @og.rev 2.0.0.4 (2002/09/27) カスタãƒ?‚¿グの release() メソãƒ?ƒ‰をã?追åŠ?
160             * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応ã?release2() ã‚?doEndTag()で呼ぶã€?
161             * @og.rev 3.5.4.0 (2003/11/25) selVal 属æ?を追åŠ??
162             *
163             */
164            @Override
165            protected void release2() {
166                    super.release2();
167    //              code            = null;
168                    selVal          = null;
169                    multipleAll     = false;        // 3.8.0.9 (2005/10/17) è¤?•°選択可能時に全選択を設定するã?
170            }
171    
172            /**
173             * ラベルを作æ?しますã?
174             *
175             * lbl 属æ??�msg 属æ?でセãƒ?ƒˆされたå?合ã??Œそちらを優先しますã?
176             * セãƒ?ƒˆされてã�?�ªã�??合ã??Œvalue 属æ?をキーにã€?
177             * LabelResource プロパティの値をセãƒ?ƒˆしますã?
178             * value 属æ?に、カンãƒ?,)で区åˆ?‚‰れたè¤?•°の Label ã‚?
179             * セãƒ?ƒˆできますã?
180             *
181             * @og.rev 3.5.4.0 (2003/11/25) selVal 属æ?を追åŠ??
182             * @og.rev 3.5.5.7 (2004/05/10) DBColumn.getOption( String ) メソãƒ?ƒ‰å»?­¢
183             * @og.rev 3.8.0.9 (2005/10/17) è¤?•°選択可能時に全選択を設定するã?
184             * @og.rev 5.0.2.0 (2009/11/01) è¤?•°パラメーターの選択に対å¿?
185             *
186             * @return  オプションタグのラベル
187             */
188            @Override
189            protected String makeTag() {
190    //              if( code != null ) {
191    //                      String val = nval( get( "value" ),selVal );
192    //
193    //                      // 次期バージョンでは、削除したã�?�¨思いますã?
194    //                      String tag = getDBColumn( code ).getEditorValue( val );
195    //                      int st  = tag.indexOf( '>' );
196    //                      int end = tag.lastIndexOf( "</select" );
197    //                      return tag.substring( st+1,end );
198    //              }
199    
200                    // 3.5.4.0 (2003/11/25) selVal 属æ?を追åŠ??
201    //              if( ( selVal != null && selVal.length() > 0 && selVal.equals( get( "value" ) ) ) || multipleAll ) {
202                    // 5.0.2.0 (2009/11/01)
203                    if( ( selVal != null && selVal.length() > 0 && selVal.indexOf( "|" + get( "value" ) + "|" ) >= 0 ) || multipleAll ) {
204                            set( "selected","selected" );
205                    }
206    
207                    String msglbl = getMsglbl();
208                    if( msglbl != null ) {
209                            set( "body", msglbl );
210                    }
211    
212                    return XHTMLTag.option( getAttributes() );
213            }
214    
215            /**
216             * 【TAG】å?を指定しますã?
217             *
218             * @og.tag
219             * ここでæŒ?®šしたå?がã?ルãƒ?‚¦ンメニュー中に存在する場合ã?選択状態になりますã?
220             *
221             * @param   val 値を指å®?
222             */
223            public void setValue( final String val ) {
224                    set( "value",getRequestParameter( val ) );
225            }
226    
227            /**
228             * 【TAG】optionタグのラベルを指定しますã?
229             *
230             * @og.tag
231             * ここでのラベルは、optionタグのラベルですã?(lbl属æ?は、異なりますã?)
232             * これは、optgroup とともに使用される階層化メニュー時に使用されますã?
233             *
234             * @param   label ラベル
235             */
236            public void setLabel( final String label ) {
237                    set( "label",getRequestParameter( label ) );
238            }
239    
240            /**
241             * 【TAG】オプションを選択済みの状æ…?selected)にセãƒ?ƒˆしまã�?初期値:未選æŠ?ã€?
242             *
243             * @og.tag
244             * selected="selected" またã? selected="true" 以外ã?値はセãƒ?ƒˆできなã�?‚ˆã�?�«
245             * 制限をかけますã?
246             * 初期値は、未選æŠ?ですã?
247             *
248             * @param   sel  [selected:選択済み/それ以å¤?未選択]
249             */
250            public void setSelected( final String sel ) {
251                    String select = getRequestParameter( sel );
252                    if( "selected".equalsIgnoreCase( select ) || "true".equalsIgnoreCase( select ) ) {
253                            set( "selected","selected" );
254                    }
255            }
256    
257    //      /**
258    //       * 【å»?­¢】コードリソースのコードID を指定しますã?
259    //       *
260    //       * @og.tag
261    //       * コードリソースで定義されてã�?‚‹å†?®¹をå?利用しますã?基本çš?�«は、カラãƒ?ƒªソースでã€?
262    //       * コードカラãƒ?±žæ?を定義して使用してくださいã€?
263    //       *
264    //       * @og.rev 4.0.0.0 (2007/06/18) å»?­¢
265    //       *
266    //       * @param   code String
267    //       * @deprecated
268    //       */
269    //      @Deprecated public void setCode( final String code ) {
270    //              this.code = getRequestParameter( code ) ;
271    //      }
272    
273            /**
274             * 【TAG】ラベルをCSV形式でè¤?•°æŒ?®šしますã?
275             *
276             * @og.tag
277             * シングルラベルの lbl 属æ?との違いは,ここではラベルをè¤?•° カンマ区åˆ?‚Šで
278             * 渡すことが可能であることですã?これによりã€?A,B,C" とã�?�†値に対してã€?
279             * "Aのラベル表示,Bのラベル表示,Cのラベル表示" とã�?�†具合にæ–?­—å?ã‚?
280             * 再合成しますã?
281             * これは、SQLæ–??Ordr By 句で、ソートé?を指定するå?合などに便利ですã?
282             * &lt;og:option lbls="MKNMJP,MKCD,MKNMEN" /&gt;
283             *
284             * åˆ?§£方法ã?、CSV変数をå?にåˆ?§£してから、getRequestParameter で値を取得しますã?
285             * こうしなã�?�¨ãƒ??タ自身にカンマを持ってã�?‚‹場合にåˆ?§£をミスる為ですã?
286             *
287             * @og.rev 3.5.6.2 (2004/07/05) 先に配å?にåˆ?§£してからリクエスト変数の値を取å¾?
288             * @og.rev 5.2.2.0 (2010/11/01) setMsglbl å»?­¢ â‡?setLbl に置換え
289             *
290             * @param   lbls è¤?•°ラベルID(カンマ区åˆ?‚Š)
291             */
292            public void setLbls( final String lbls ) {
293    
294                    String[] keys = getCSVParameter( lbls );
295                    if( keys == null || keys.length == 0 ) { return ; }
296    
297                    StringBuilder buf = new StringBuilder( HybsSystem.BUFFER_MIDDLE );
298                    buf.append( getLabel( keys[0] ) );
299                    for( int i=1; i<keys.length; i++ ) {
300                            buf.append( "," );
301                            buf.append( getLabel( keys[i] ) );
302                    }
303    //              setMsglbl( buf.toString() );
304                    setLbl( buf.toString() );               // 5.2.2.0 (2010/11/01) setMsglbl å»?­¢ â‡?setLbl に置換え
305            }
306    
307            /**
308             * こã?オブジェクトã?æ–?­—å?表現を返しますã?
309             * 基本çš?�«ãƒ?ƒ�ãƒ?‚°目çš?�«使用しますã?
310             *
311             * @return こã?クラスのæ–?­—å?表現
312             */
313            @Override
314            public String toString() {
315                    return org.opengion.fukurou.util.ToString.title( this.getClass().getName() )
316                                    .println( "VERSION"             ,VERSION        )
317    //                              .println( "code"                ,code           )
318                                    .println( "selVal"              ,selVal         )
319                                    .println( "multipleAll" ,multipleAll)
320                                    .println( "Other..."    ,getAttributes().getAttribute() )
321                                    .fixForm().toString() ;
322            }
323    }