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    }