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 static org.opengion.fukurou.util.StringUtil.nval;
019    import org.opengion.hayabusa.common.HybsSystemException;
020    
021    /**
022     * タブ形å¼ã?リンクを表示ã™ã‚‹å ´åˆã«ã€ã‚¿ãƒ–ãã®ã‚‚ã?を表示ã™ã‚‹ã‚¿ã‚°ã§ã™ã?
023     *
024     * tabLinkタグを親タグã¨ã—ã?listType="TAG"を指定ã—ãŸå?åˆã«ã€ã“ã®ã‚¿ã‚°ã‚’使用ã—ã¦
025     * タブを個別ã«å®šç¾©ã—ã¾ã™ã?
026     *
027     * ã‚¿ã‚°ã®ä½¿ç”¨æ–¹æ³•ã«ã¤ã?¦ã¯ã€tabLinkã‚¿ã‚°ã®ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã‚’å‚ç?ã—ã¦ä¸‹ã•ã??
028     *
029     * å?±žæ?ã¯ã€{@XXXX} 変数ãŒä½¿ç”¨ã§ãã¾ã™ã?
030     * ã“れã¯ã€ServletRequest ã‹ã‚‰ã€XXXXをキーã«å€¤ã‚’å–りå?ã?ã“ã?変数ã«å‰²ã‚Šå½“ã¦ã¾ã™ã?
031     * ã¤ã¾ã‚Šã?ã“ã?XXXXをキーã«ãƒªã‚¯ã‚¨ã‚¹ãƒˆã™ã‚Œã?ã€ã“ã®å¤‰æ•°ã«å€¤ã‚’ã‚»ãƒ?ƒˆã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã?
032     *
033     * @og.formSample
034     * â—å½¢å¼ï¼?lt;og:tabLink href="…" > <og:tabList name="TAB1" … /> … </og:tabLink >
035     * â—body?šãªã?
036     *
037     * â—Tag定義??
038     *   <og:tabList
039     *       name             â—‹ã?TAG】è¦ç´?«å¯¾ã—ã¦å›ºæœ‰ã?åå‰ã‚’ã¤ã‘ã¾ã™ã?(å¿??)
040     *       lbl                ã€TAG】ラベルリソースã®ãƒ©ãƒ™ãƒ«IDを指定ã—ã¾ã?
041     *       href               ã€TAG】リンク先ã?JSPを指定ã—ã¾ã?åˆæœŸå€¤:result.jsp)
042     *       term               ã€TAG】å?ç?™ã‚‹æ¡ä»¶ã‚’指定ã—ã¾ã?åˆæœŸå€¤:null)
043     *       termList           ã€TAG】å?ç?™ã‚‹æ¡ä»¶ã‚’å«ã‚?‚ˆã?ªæ–?­—å?を指定ã—ã¾ã?
044     *       delTerm            ã€TAG】å?ç?—ãªã?‚¿ãƒ–ã‚’é¸æŠžã™ã‚‹æ¡ä»¶ã‚’指定ã—ã¾ã?åˆæœŸå€¤:null)
045     *       delTermList        ã€TAG】å?ç?—ãªã?¡ä»¶ã‚’å«ã‚?‚ˆã?ªæ–?­—å?を指定ã—ã¾ã?
046     *       unselClass         ã€TAG】éžé¸æŠžã‚¿ãƒ–ã?クラスを指定ã—ã¾ã?åˆæœŸå€¤:unselTab)
047     *       keys               ã€TAG】リンク先ã?JSPã«å¼•æ•°ã¨ã—ã¦æ¸¡ã™ã‚­ãƒ¼ã‚’CSVå½¢å¼ã§æŒ?®šã—ã¾ã?
048     *       vals               ã€TAG】リンク先ã?JSPã«å¼•æ•°ã¨ã—ã¦æ¸¡ã™å?ã‚’CSVå½¢å¼ã§æŒ?®šã—ã¾ã?
049     *       roles              ã€TAG】ロールをセãƒ?ƒˆã—ã¾ã?
050     *       debug              ã€TAG】デãƒãƒƒã‚°æƒ??ã‚’å?力ã™ã‚‹ã‹ã©ã?‹[true/false]を指定ã—ã¾ã?åˆæœŸå€¤:false)
051     *   />
052     *
053     * â—使用ä¾?
054     *   tabListã‚¿ã‚°ã‹ã‚‰ã‚¿ãƒ–リストを生æ?ã™ã‚‹å ´å?
055     *      <og:tabLink
056     *          listType        = "DB"                      タブã?ä¸?¦§ã‚’ã©ã“ã‹ã‚‰å–å¾—ã™ã‚‹ã‹
057     *          href            = "result.jsp"              リンク先ã?JSP
058     *          target          = "RESULT"                  リンクターゲãƒ?ƒˆ
059     *          openTab         = "[true/false]"            タブ表示後ã«ã‚¿ãƒ–を自動ã§é–‹ã
060     *          openTabName     = "{@PN}               自動ã§é–‹ãタブã?åå‰
061     *          constKeys       = "KEY1"                    次画é¢ã«å›ºå®šã§æ¸¡ã™ã‚­ãƒ¼ä¸?¦§
062     *          constVals       = "{@VAL1}"            次画é¢ã«å›ºå®šã§æ¸¡ã™å?ä¸?¦§
063     *          listCount       = "10"                      1行辺りã«è¡¨ç¤ºã™ã‚‹ã‚¿ãƒ–ã?æ•°
064     *          selClass        = "selTab"                  é¸æŠžã‚¿ãƒ–ã?クラス
065     *          unselClass      = "unselTab"                éžé¸æŠžã‚¿ãƒ–ã?クラス
066     *          width           = "100px"                   タブリンクã®å¹?
067     *          height          = "50px"                    タブリンクã®é«˜ã•
068     *       >
069     *          <og:tabList name="TAB1" href="result1.jsp" keys="PN,CDK" vals="ABC,V" />
070     *          <og:tabList name="TAB2" href="result2.jsp" keys="PN,CDK" vals="BCD,W" />
071     *          <og:tabList name="TAB3" href="result3.jsp" keys="PN,CDK" vals="CDE,X" />
072     *      </og:tabLink>
073     *
074     * @og.group ç”»é¢è¡¨ç¤º
075     *
076     * @version 4.3.5.0 (2008/02/01)
077     * @author Nakamura
078     * @since JDK1.4,
079     */
080    public class TabListTag extends CommonTagSupport {
081            //* ã“ã?プログラãƒ??VERSIONæ–?­—å?を設定ã—ã¾ã™ã?       {@value} */
082            private static final String VERSION = "4.3.5.0 (2009/02/01)" ;
083    
084            private static final long serialVersionUID = 435020090201L ;
085    
086            private String  name            = null;
087            private String  href            = null;
088            private String  unselClass      = null;
089    
090            private String[] keys           = null;
091            private String[] vals           = null;
092    
093            private String  term            = null;
094            private String  termList        = null;
095            private String  delTerm         = null;
096            private String  delTermList     = null;
097            private boolean visible         = false;
098            private TabLinkTag tabLink  = null;
099    
100            /**
101             * Taglibã®é–‹å§‹ã‚¿ã‚°ãŒè¦‹ã¤ã‹ã£ãŸã¨ãã«å‡¦ç?™ã‚?doStartTag() ã‚?オーãƒã?ライドã—ã¾ã™ã?
102             *
103             * @return      後続å?ç??æŒ?¤º( SKIP_BODY )
104             */
105            @Override
106            public int doStartTag() {
107                    tabLink = (TabLinkTag)findAncestorWithClass( this,TabLinkTag.class );
108                    if( tabLink == null ) {
109                            String errMsg = "tabLink ã‚¿ã‚°ã® BODY部ã§ä½¿ç”¨ã—ã¦ãã ã•ã„ã€?;
110                            throw new HybsSystemException( errMsg );
111                    }
112                    return( SKIP_BODY );    // Body を評価ã™ã‚‹ã€? extends BodyTagSupport æ™?
113            }
114    
115            /**
116             * Taglibã®çµ‚äº?‚¿ã‚°ãŒè¦‹ã¤ã‹ã£ãŸã¨ãã«å‡¦ç?™ã‚?doEndTag() ã‚?オーãƒã?ライドã—ã¾ã™ã?
117             *
118             * @return      後続å?ç??æŒ?¤º
119             */
120            @Override
121            public int doEndTag() {
122                    debugPrint();
123    
124                    visible = getUser().isAccess( get( "roles" ) );
125    
126                    // delTermãŒå„ªå…?
127                    if( visible ) {
128                            visible = ( delTermList == null || delTerm == null || delTermList.indexOf( delTerm ) < 0 );
129                    }
130    
131                    // delTermã§è¡¨ç¤ºå¯¾è±¡ã¨ãªã£ãŸå?åˆã«ã€termã‚’å?ç?
132                    if( visible ) {
133                            visible = ( termList == null || term == null || termList.indexOf( term ) >= 0 );
134                    }
135    
136                    tabLink.addTag( href, name, getMsglbl(), unselClass, visible, keys, vals );
137    
138                    return( EVAL_PAGE );
139            }
140    
141            /**
142             * タグリブオブジェクトをリリースã—ã¾ã™ã?
143             * キャãƒ?‚·ãƒ¥ã•れã¦å†åˆ©ç”¨ã•れるã?ã§ã€ãƒ•ィールドã?åˆæœŸè¨­å®šã‚’行ã„ã¾ã™ã?
144             */
145            @Override
146            protected void release2() {
147                    super.release2();
148                    name                    = null;
149                    href                    = null;
150                    term                    = null;
151                    termList                = null;
152                    delTerm                 = null;
153                    delTermList             = null;
154                    unselClass              = null;
155                    keys                    = null;
156                    vals                    = null;
157                    visible                 = false;
158                    tabLink                 = null;
159            }
160    
161            /**
162             * ã€TAG】è¦ç´?«å¯¾ã—ã¦å›ºæœ‰ã?åå‰ã‚’ã¤ã‘ã¾ã™ã?
163             *
164             * @og.tag
165             * è¦ç´?«å¯¾ã—ã¦å›ºæœ‰ã?åå‰ã‚’ã¤ã‘ã¾ã™ã?
166             * ã“ã“ã§è¨­å®šã•れãŸåç§°ã¯ã€è?å‹•ã§ã‚¿ãƒ–を表示ã™ã‚‹ãŸã‚ã®openTabName属æ?判定ã«ã‚‚使用ã•れã¾ã™ã?
167             *
168             * @param   nm タブå
169             */
170            public void setName( final String nm ) {
171                    name = nval( getRequestParameter( nm ), name );
172            }
173    
174            /**
175             * ã€TAG】リンク先ã?JSPを指定ã—ã¾ã?åˆæœŸå€¤:result.jsp)ã€?
176             *
177             * @og.tag
178             * リンク先ã?JSPを指定ã—ã¾ã™ã?
179             * ã“ã“ã§æŒ?®šã—ãªã??åˆã?ã€tagLinkã‚¿ã‚°ã®å€¤ãŒé©ç”¨ã•れã¾ã™ã?
180             *
181             * @param       hr リンク先ã?JSP
182             */
183            public void setHref( final String hr ) {
184                    href = nval( getRequestParameter( hr ), href );
185            }
186    
187            /**
188             * ã€TAG】å?ç?™ã‚‹æ¡ä»¶ã‚’指定ã—ã¾ã?åˆæœŸå€¤:null)ã€?
189             *
190             * @og.tag
191             * termListã§ä¸Žãˆã‚‰ã‚ŒãŸæ–‡å­—å?ã«ã€termæ–?­—å?(大æ–?­?å°æ–‡å­—ã?区別ã‚り)ã?
192             * å«ã¾ã‚Œã¦ã?‚Œã°ã€OPENé¸æŠžã‚¿ãƒ–ã¨ã—ã¦å‡¦ç?—ã¾ã™ã?
193             * OPENé¸æŠžã‚¿ãƒ–ã§ãªã?‚¿ãƒ–ã?ã€å?期å?OPENã«ãªã‚‰ãªã? ã‘ã§ã€ã‚¿ãƒ–ãã®ã‚‚ã?ã¯è¡¨ç¤ºã•れã¾ã™ã?
194             * OPENé¸æŠžã¨DELETEé¸æŠžãŒç«¶åˆã—ãŸå?åˆã?ã€DELETEé¸æŠžãŒå„ªå…ˆã•れã¾ã™ã?
195             * åˆæœŸå€¤ã¯ã€?null ã§ã™ã?
196             *
197             * @param       flag 処ç?™ã‚‹æ¡ä»¶æ–?­—å?
198             */
199            public void setTerm( final String flag ) {
200                    term = nval( getRequestParameter( flag ),term );
201            }
202    
203            /**
204             * ã€TAG】å?ç?™ã‚‹æ¡ä»¶ã‚’å«ã‚?‚ˆã?ªæ–?­—å?を指定ã—ã¾ã™ã?
205             *
206             * @og.tag
207             * termListã§ä¸Žãˆã‚‰ã‚ŒãŸæ–‡å­—å?ã«ã€termæ–?­—å?(大æ–?­?å°æ–‡å­—ã?区別ã‚り)ã?
208             * å«ã¾ã‚Œã¦ã?‚Œã°ã€OPENé¸æŠžã‚¿ãƒ–ã¨ã—ã¦å‡¦ç?—ã¾ã™ã?
209             * 例ãˆã°ã€?A","B","C" ã¨ã?†æ–?­—å?ãŒã?term ã§æŒ?®šã•れãŸ
210             * å ´åˆã«å‡¦ç?™ã‚‹ã‚ˆã?«ã—ãŸã??åˆã?ã€?A|B|C" ã‚’ã‚»ãƒ?ƒˆã—ã¾ã™ã?
211             * åˆæœŸå€¤ã¯ã€?null ã§ã™ã?
212             * 判定ã?ã€æ–‡å­—å?ã‚’å«ã‚?‹ã©ã?‹ãªã®ã§ã€?¼‘文字ã?ã¿ã®å ´åˆã?ã€?|"区åˆ?‚Šã«ã™ã‚‹
213             * å¿?¦ã?ã‚りã¾ã›ã‚“ã€?
214             * OPENé¸æŠžã¨DELETEé¸æŠžãŒç«¶åˆã—ãŸå?åˆã?ã€DELETEé¸æŠžãŒå„ªå…ˆã•れã¾ã™ã?
215             *
216             * @param       list 処ç?™ã‚‹æ¡ä»¶(indexOf ã«ã‚ˆã‚‹å«ã‚?å«ã¾ãªã?ˆ¤å®?
217             */
218            public void setTermList( final String list ) {
219                    termList = nval( getRequestParameter( list ),termList );
220            }
221    
222            /**
223             * ã€TAG】å?ç?—ãªã?‚¿ãƒ–ã‚’é¸æŠžã™ã‚‹æ¡ä»¶ã‚’指定ã—ã¾ã?åˆæœŸå€¤:null)ã€?
224             *
225             * @og.tag
226             * delTermListã§ä¸Žãˆã‚‰ã‚ŒãŸæ–‡å­—å?ã«ã€delTermæ–?­—å?(大æ–?­?å°æ–‡å­—ã?区別ã‚り)ã?
227             * å«ã¾ã‚Œã¦ã?‚Œã°ã€DELETEé¸æŠžã‚¿ãƒ–ã¨ã—ã¦å‡¦ç?—ã¾ã™ã?
228             * DELETEé¸æŠžã‚¿ãƒ–ã?ã€ã‚¿ãƒ–ãã®ã‚‚ã?ãŒè¡¨ç¤ºã•れã¾ã›ã‚“ã€?
229             * ãŸã ã—ã?タブã?selectIndex ã¯ã€DELETEã•れãŸã‚¿ãƒ–ã‚‚å«ã‚ã¦ã€ã‚«ã‚¦ãƒ³ãƒˆã•れã¾ã™ã?ã§ã€?
230             * JSPã§ã®è¨­å®šæ™‚ã®é ?•ªãŒã‚¤ãƒ³ãƒ?ƒƒã‚¯ã‚¹ç•ªå·ã«ãªã‚Šã¾ã™ã?
231             * OPENé¸æŠžã¨DELETEé¸æŠžãŒç«¶åˆã—ãŸå?åˆã?ã€DELETEé¸æŠžãŒå„ªå…ˆã•れã¾ã™ã?
232             * åˆæœŸå€¤ã¯ã€?null ã§ã™ã?
233             *
234             * @param       flag DELETEé¸æŠžã‚¿ãƒ–æ–‡å­—å?
235             */
236            public void setDelTerm( final String flag ) {
237                    delTerm = nval( getRequestParameter( flag ),delTerm );
238            }
239    
240            /**
241             * ã€TAG】å?ç?—ãªã?¡ä»¶ã‚’å«ã‚?‚ˆã?ªæ–?­—å?を指定ã—ã¾ã™ã?
242             *
243             * @og.tag
244             * delTermListã§ä¸Žãˆã‚‰ã‚ŒãŸæ–‡å­—å?ã«ã€delTermæ–?­—å?(大æ–?­?å°æ–‡å­—ã?区別ã‚り)ã?
245             * å«ã¾ã‚Œã¦ã?‚Œã°ã€DELETEé¸æŠžã‚¿ãƒ–ã¨ã—ã¦å‡¦ç?—ã¾ã™ã?
246             * 例ãˆã°ã€?A","B","C" ã¨ã?†æ–?­—å?ãŒã?delTerm ã§æŒ?®šã•れãŸ
247             * å ´åˆã«å‡¦ç?—ãªã?‚ˆã?«ã—ãŸã??åˆã?ã€?A|B|C" ã‚’ã‚»ãƒ?ƒˆã—ã¾ã™ã?
248             * åˆæœŸå€¤ã¯ã€?null ã§ã™ã?
249             * 判定ã?ã€æ–‡å­—å?ã‚’å«ã‚?‹ã©ã?‹ãªã®ã§ã€?¼‘文字ã?ã¿ã®å ´åˆã?ã€?|"区åˆ?‚Šã«ã™ã‚‹
250             * å¿?¦ã?ã‚りã¾ã›ã‚“ã€?
251             * OPENé¸æŠžã¨DELETEé¸æŠžãŒç«¶åˆã—ãŸå?åˆã?ã€DELETEé¸æŠžãŒå„ªå…ˆã•れã¾ã™ã?
252             *
253             * @param       list DELETEé¸æŠžã‚¿ãƒ–æ¡ä»¶æ–?­—å?(indexOf ã«ã‚ˆã‚‹å«ã‚?å«ã¾ãªã?ˆ¤å®?
254             */
255            public void setDelTermList( final String list ) {
256                    delTermList = nval( getRequestParameter( list ),delTermList );
257            }
258    
259            /**
260             * ã€TAG】éžé¸æŠžã‚¿ãƒ–ã?クラスを指定ã—ã¾ã?åˆæœŸå€¤:unselTab)ã€?
261             *
262             * @og.tag
263             * タブãŒé¸æŠžã•れã¦ã?ªã?Š¶æ…‹ã«ã‚ã‚‹å ´åˆã?ã€ã‚¿ãƒ–部åˆ??クラスåã‚’æŒ?®šã—ã¾ã™ã?
264             * ã“ã?クラスåを変更ã™ã‚‹å ´åˆã?ã€ãã®ã‚¯ãƒ©ã‚¹ã‚’custom/custom.cssç­‰ã§å†å®šç¾©ã—ã¦ä¸‹ã•ã??
265             * tabListã‚¿ã‚°ã§æŒ?®šã•れãŸå€¤ã¯ã€tabLinkã‚¿ã‚°ã§æŒ?®šã•れãŸã‚‚ã?より優先ã•れã¾ã™ã?
266             * åˆæœŸå€¤ã¯ã€unselTabã§ã™ã?
267             *
268             * @param       cls é¸æŠžã‚¿ãƒ–ã?クラスå?
269             */
270            public void setUnselClass( final String cls ) {
271                    unselClass = nval( getRequestParameter( cls ), unselClass );
272            }
273    
274            /**
275             * ã€TAG】リンク先ã?JSPã«å¼•æ•°ã¨ã—ã¦æ¸¡ã™ã‚­ãƒ¼ã‚’CSVå½¢å¼ã§æŒ?®šã—ã¾ã™ã?
276             *
277             * @og.tag
278             * リンク先ã?JSPã«å¼•æ•°ã¨ã—ã¦æ¸¡ã™ã‚­ãƒ¼ã‚’CSVå½¢å¼ã§æŒ?®šã—ã¾ã™ã?
279             *
280             * @param       key キー(CSV形�
281             */
282            public void setKeys( final String key ) {
283                    keys = getCSVParameter( key );
284            }
285    
286            /**
287             * ã€TAG】リンク先ã?JSPã«å¼•æ•°ã¨ã—ã¦æ¸¡ã™å?ã‚’CSVå½¢å¼ã§æŒ?®šã—ã¾ã™ã?
288             *
289             * @og.tag
290             * リンク先ã?JSPã«å¼•æ•°ã¨ã—ã¦æ¸¡ã™å?ã‚’CSVå½¢å¼ã§æŒ?®šã—ã¾ã™ã?
291             *
292             * @param       val 値(CSV形�
293             */
294            public void setVals( final String val ) {
295                    vals = getCSVParameter( val );
296            }
297    
298            /**
299             * ã€TAG】ロールをセãƒ?ƒˆã—ã¾ã™ã?
300             *
301             * @og.tag
302             * ã“ã“ã§æŒ?®šã—ãŸã‚«ãƒ©ãƒ?ƒ­ãƒ¼ãƒ«ã‚’å?ã«ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼æ¯Žã?アクセス許å¯ãŒãƒã‚§ãƒ?‚¯ã•れã¾ã™ã?
303             * アクセス許å¯ã•れãªã?¨ã€è¡¨ç¤ºã•れã¾ã›ã‚“ã€?
304             * ã“ã?ロールを指定ã—ãªã??åˆã?ã€ã‚«ãƒ©ãƒ?ƒªã‚½ãƒ¼ã‚¹ã®ãƒ­ãƒ¼ãƒ«ãŒä½¿ç”¨ã•れã¾ã™ã?
305             *
306             * @param       roles パラメータ
307             */
308            public void setRoles( final String roles ) {
309                    set( "roles",getRequestParameter( roles ) );
310            }
311    
312            /**
313             * ã“ã?オブジェクトã?æ–?­—å?表ç¾ã‚’è¿”ã—ã¾ã™ã?
314             * 基本çš?«ãƒ?ƒãƒ?‚°ç›®çš?«ä½¿ç”¨ã—ã¾ã™ã?
315             *
316             * @return ã“ã?ã‚¯ãƒ©ã‚¹ã®æ–?­—å?表ç¾
317             */
318            @Override
319            public String toString() {
320                    return org.opengion.fukurou.util.ToString.title( this.getClass().getName() )
321                                    .println( "VERSION"             ,VERSION        )
322                                    .println( "name"                ,name           )
323                                    .println( "href"                ,href           )
324                                    .println( "term"                ,term           )
325                                    .println( "termList"    ,termList       )
326                                    .println( "delTerm"             ,delTerm        )
327                                    .println( "delTermList" ,delTermList)
328                                    .println( "Other..."    ,getAttributes().getAttribute() )
329                                    .fixForm().toString() ;
330            }
331    }