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.HybsSystemException;
019    import org.opengion.hayabusa.html.TabData;
020    import static org.opengion.fukurou.util.StringUtil.nval ;
021    
022    /**
023     * 【å»?­¢】タブã?インでã€??目をå?割して表示するタグのタブそのもã?を作æ?しますã?
024     *
025     * ※ こã?タグはå»?­¢予定ですã?tabLink、tabList の使用をご検討くã�?�•ã�??
026     *
027     * ä¸?�¤の大きなHTMLをã?タブを使用することでè¤?•°の塊にåˆ?‰²表示できますã?
028     * åˆ?‰²された各タブã?、ä¸?�¤のHTMLのため、タブ間の移動によるæƒ??の消失はありませんã€?
029     * またã?ä¸?�¤のHTMLのため、タブにまたがって入力したå?は、すべて ä¸?‹¬送信することã‚?
030     * 可能ですã?(Formタグで、å?てのタブをまとめて記述してã�?‚Œば)
031     * 個ã?のタブã?æŒ?®šã?、この tab タグを使用しますã?
032     * それらを、タブテーブル の BODY 部に記述しますã?タブã?、記述されたé?番にã€?
033     * 設定されますã?
034     * タブテーブル の BODY 部に記述するタブã?、å¿?�šä¸?�¤以上å¿?¦�ですã?
035     *
036     * @og.formSample
037     * ●形式ï¼?lt;og:tabTable  ...  >
038     *             <og:tab name="paGE1" lbl="page 1" >
039     *                    <jsp:directive.include file="paGE1.jsp" />
040     *             </og:tab>
041     *             <og:tab name="page2" lbl="page 2" >
042     *                    <jsp:directive.include file="page2.jsp" />
043     *             </og:tab>
044     *         </og:tabTable >
045     * ●body?šあã‚?EVAL_BODY_BUFFERED:BODYを評価しã?{@XXXX} を解析しまã�?
046     *
047     * ●Tag定義??
048     *   <og:tab
049     *       lbl                【TAG】ラベルリソースのラベルIDを指定しまã�?
050     *       name               【å»?­¢】要ç´?�«対して固有ã?名前(id)をつける場合に設定しまã�?
051     *       term               【å»?­¢】å?ç�?�™る条件を指定しまã�?初期値:null)
052     *       termList           【å»?­¢】å?ç�?�™る条件を含ã‚?‚ˆã�?�ªæ–?­—å?を指定しまã�?
053     *       delTerm            【å»?­¢】å?ç�?�—なã�?‚¿ブを選択する条件を指定しまã�?初期値:null)
054     *       delTermList        【å»?­¢】å?ç�?�—なã�?�¡件を含ã‚?‚ˆã�?�ªæ–?­—å?を指定しまã�?
055     *       style              【TAG】タブに与えã‚?初期 style 属æ?を指定しまã�?
056     *       keys               【å»?­¢】タブが選択状æ…?OPEN選択タブ時)に使用するキーをCSV形式でè¤?•°æŒ?®šしまã�?
057     *       vals               【å»?­¢】タブが選択状æ…?OPEN選択タブ時)に使用する値をCSV形式でè¤?•°æŒ?®šしまã�?
058     *       debug              【TAG】デバッグæƒ??をå?力するかどã�?�‹[true/false]を指定しまã�?初期値:false)
059     *   >   ... Body ...
060     *   </og:tab>
061     *
062     * ●使用ä¾?
063     *  <og:tabTable>
064     *    <og:tab lbl="page 1">
065     *      <table summary="layout" >
066     *        <tr>
067     *          <og:column name="SYSTEM_ID" must="true" />
068     *          <og:column name="COLUMN_NAME" />
069     *          <og:column name="RENDERER"    />
070     *        </tr>
071     *      </table>
072     *    </og:tab>
073     *    <og:tab lbl="page 2">
074     *      <table summary="layout" >
075     *        <tr>
076     *          <og:column name="DBTYPE"      />
077     *          <og:column name="NAME_JA"     />
078     *          <og:column name="EDITOR"      />
079     *        </tr>
080     *      </table>
081     *    </og:tab>
082     *  </og:tabTable>
083     *
084     * @og.rev 3.5.6.5 (2004/08/09) 新規作æ?
085     * @og.group (å»?­¢)画面部å“?
086     *
087     * @version  4.0
088     * @author       Kazuhiko Hasegawa
089     * @since    JDK5.0,
090     * @deprecated マイクロソフトのスクリプトに依存するためã?å»?­¢しますã?tabLink、tabList の使用をご検討くã�?�•ã�??
091     */
092    @Deprecated public class TabTag extends CommonTagSupport {
093            //* こã?プログラãƒ??VERSIONæ–?­—å?を設定しますã?       {@value} */
094            private static final String VERSION = "4.0.0.0 (2005/08/31)" ;
095    
096            private static final long serialVersionUID = 400020050831L ;
097    
098            private String text = null;
099            private String name = null;
100            private String body = null;
101            private String style = null;    // 3.8.6.1 (2006/10/24)
102    
103            private String[] keys           = null;         // 3.8.6.2 (2006/11/01)
104            private String[] vals           = null;         // 3.8.6.2 (2006/11/01)
105            private Object[] backVals       = null;         // 3.8.6.2 (2006/11/01)
106    
107            // 3.8.6.1 (2006/10/20)
108            private String  term            = null;
109            private String  termList        = null;
110            private String  delTerm         = null;
111            private String  delTermList     = null;
112            private boolean isOpen          = false;                // term    ã�?termList    に含まれてã�?‚‹場å�?true
113            private boolean isDelete        = false;                // delTerm ã�?delTermList に含まれてã�?‚‹場å�?true
114            private TabTableTag tabTable = null;
115    
116            /**
117             * Taglibの開始タグが見つかったときに処ç�?�™ã‚?doStartTag() ã‚?オーバã?ライドしますã?
118             *
119             * @og.rev 3.8.6.2 (2006/11/01) keys,vals属æ?の処ç�?‚’追åŠ?
120             *
121             * @return      後続å?ç�??æŒ?¤º
122             */
123            @Override
124            public int doStartTag() {
125                    tabTable = (TabTableTag)findAncestorWithClass( this,TabTableTag.class );
126                    // isSelected の判断は、OPEN/DELETE 関係なくã?タブã?数ã�?�‘実行するå¿?¦�があるã€?
127                    if( tabTable != null ) {
128                            isOpen = tabTable.isSelected();
129                    }
130                    else {
131                            String errMsg = "tabTable タグの BODY部で使用してくださいã€?;
132                            throw new HybsSystemException( errMsg );
133                    }
134    
135                    // del条件リストに存在する場合ã?、DELETE選択タブとして認識されるã€?
136                    isDelete = ( delTermList != null && delTerm != null && delTermList.indexOf( delTerm ) >= 0 ) ;
137                    if( isDelete ) { return(SKIP_BODY); }                   // Body を評価しなã�?
138    
139                    // isSelected の判断 が優先されるã€?
140                    if( !isOpen ) {
141                            // 条件リストに存在する場合ã?、OPEN選択タブとして認識されるã€?
142                            isOpen = ( termList != null && term != null && termList.indexOf( term ) >= 0 ) ;
143                    }
144    
145                    // keys変数のå…??値のé€?�¿とvals 値の設定ã?
146                    if( isOpen && keys != null && keys.length > 0 ) {
147                            int size = keys.length;
148                            backVals = new Object[size];
149                            for( int i=0; i<size; i++ ) {
150                                    String key = keys[i];
151                                    if( key != null && key.length() > 0 ) {
152                                            backVals[i] = getRequestAttribute( key );
153                                            setRequestAttribute( key,vals[i] );
154                                    }
155                            }
156                    }
157    
158                    return( EVAL_BODY_BUFFERED );   // Body を評価するã€? extends BodyTagSupport æ™?
159            }
160    
161            /**
162             * Taglibのタグ本体を処ç�?�™ã‚?doAfterBody() ã‚?オーバã?ライドしますã?
163             *
164             * @return      後続å?ç�??æŒ?¤º(SKIP_BODY)
165             */
166            @Override
167            public int doAfterBody() {
168                    body = getBodyString();
169                    return(SKIP_BODY);
170            }
171    
172            /**
173             * Taglibの終äº?‚¿グが見つかったときに処ç�?�™ã‚?doEndTag() ã‚?オーバã?ライドしますã?
174             *
175             * @og.rev 3.8.6.1 (2006/10/20) term、termList、action属æ?を追åŠ?
176             * @og.rev 3.8.6.2 (2006/11/01) keys,vals属æ?の処ç�?‚’追åŠ?
177             *
178             * @return      後続å?ç�??æŒ?¤º
179             */
180            @Override
181            public int doEndTag() {
182                    debugPrint();           // 4.0.0 (2005/02/28)
183                    if( !isDelete ) {
184                            // keys変数のå…??値の戻しã?
185                            if( isOpen && keys != null && keys.length > 0 ) {
186                                    int size = keys.length;
187                                    for( int i=0; i<size; i++ ) {
188                                            String key = keys[i];
189                                            if( key != null && key.length() > 0 ) {
190                                                    if( backVals[i] != null ) {
191                                                            setRequestAttribute( key,backVals[i] );
192                                                    }
193                                                    else {
194                                                            removeRequestAttribute( key );
195                                                    }
196                                            }
197                                    }
198                            }
199    
200                            text = getMsglbl();
201    
202                            TabData tab = new TabData( text,name,body,isOpen,style );
203                            tabTable.addTabData( tab );
204                    }
205                    return(EVAL_PAGE);
206            }
207    
208            /**
209             * タグリブオブジェクトをリリースしますã?
210             * キャãƒ?‚·ュされて再利用されるã?で、フィールドã?初期設定を行いますã?
211             *
212             * @og.rev 3.8.6.1 (2006/10/20) term、termList、action属æ?を追åŠ?
213             * @og.rev 3.8.6.2 (2006/11/01) keys, vals, isOpen, delTerm, delTermList 属æ?を追åŠ?
214             */
215            @Override
216            protected void release2() {
217                    super.release2();
218                    text            = null;
219                    name            = null;
220                    body            = null;
221                    term            = null;
222                    termList        = null;
223                    delTerm         = null;
224                    delTermList     = null;
225                    style           = null;
226                    keys            = null;         // 3.8.6.2 (2006/11/01)
227                    vals            = null;         // 3.8.6.2 (2006/11/01)
228                    isOpen          = false;        // 3.8.6.2 (2006/11/01)
229                    isDelete        = false;        // 3.8.6.2 (2006/11/01)
230                    tabTable        = null;
231            }
232    
233            /**
234             * 【å»?­¢】要ç´?�«対して固有ã?名前(id)をつける場合に設定しますã?
235             *
236             * @og.tag 名前セãƒ?ƒˆ
237             *
238             * @param   name 名前
239             * @deprecated クラスがå»?­¢されましたã€?
240             */
241            @Deprecated public void setName( final String name ) {
242                    this.name = getRequestParameter( name );
243            }
244    
245            /**
246             * 【å»?­¢】å?ç�?�™る条件を指定しまã�?初期値:null)ã€?
247             *
248             * @og.tag
249             * termListで与えられた文字å?に、termæ–?­—å?(大æ–?­?小文字ã?区別あり)ã�?
250             * 含まれてã�?‚Œば、OPEN選択タブとして処ç�?�—ますã?
251             * OPEN選択タブでなã�?‚¿ブã?、å?期å?OPENにならなã�?� けで、タブそのもã?は表示されますã?
252             * OPEN選択とDELETE選択が競合したå?合ã?、DELETE選択が優先されますã?
253             * 初期値はã€?null ですã?
254             *
255             * @og.rev 3.8.6.1 (2006/10/20) 新規追åŠ?
256             *
257             * @param       flag 処ç�?�™る条件
258             * @deprecated クラスがå»?­¢されましたã€?
259             */
260            @Deprecated public void setTerm( final String flag ) {
261                    term = nval( getRequestParameter( flag ),term );
262            }
263    
264            /**
265             * 【å»?­¢】å?ç�?�™る条件を含ã‚?‚ˆã�?�ªæ–?­—å?を指定しますã?
266             *
267             * @og.tag
268             * termListで与えられた文字å?に、termæ–?­—å?(大æ–?­?小文字ã?区別あり)ã�?
269             * 含まれてã�?‚Œば、OPEN選択タブとして処ç�?�—ますã?
270             * 例えばã€?A","B","C" とã�?�†æ–?­—å?がã?term でæŒ?®šされた
271             * 場合に処ç�?�™るよã�?�«したã�??合ã?ã€?A|B|C" をセãƒ?ƒˆしますã?
272             * 初期値はã€?null ですã?
273             * 判定ã?、文字å?を含ã‚?�‹どã�?�‹なのでã€?¼‘文字ã?みの場合ã?ã€?|"区åˆ?‚Šにする
274             * å¿?¦�ã?ありませんã€?
275             * OPEN選択とDELETE選択が競合したå?合ã?、DELETE選択が優先されますã?
276             *
277             * @og.rev 3.8.6.1 (2006/10/20) 新規追åŠ?
278             *
279             * @param       list 処ç�?�™る条件(indexOf による含ã‚?含まなã�?ˆ¤å®?
280             * @deprecated クラスがå»?­¢されましたã€?
281             */
282            @Deprecated public void setTermList( final String list ) {
283                    termList = nval( getRequestParameter( list ),termList );
284            }
285    
286            /**
287             * 【å»?­¢】å?ç�?�—なã�?‚¿ブを選択する条件を指定しまã�?初期値:null)ã€?
288             *
289             * @og.tag
290             * delTermListで与えられた文字å?に、delTermæ–?­—å?(大æ–?­?小文字ã?区別あり)ã�?
291             * 含まれてã�?‚Œば、DELETE選択タブとして処ç�?�—ますã?
292             * DELETE選択タブã?、タブそのもã?が表示されませんã€?
293             * ただしã?タブã?selectIndex は、DELETEされたタブも含めて、カウントされますã?でã€?
294             * JSPでの設定時のé ?•ªがインãƒ?ƒƒクス番号になりますã?
295             * OPEN選択とDELETE選択が競合したå?合ã?、DELETE選択が優先されますã?
296             * 初期値はã€?null ですã?
297             *
298             * @og.rev 3.8.6.2 (2006/11/01) 新規追åŠ?
299             *
300             * @param       flag DELETE選択タブ条件
301             * @deprecated クラスがå»?­¢されましたã€?
302             */
303            @Deprecated public void setDelTerm( final String flag ) {
304                    delTerm = nval( getRequestParameter( flag ),delTerm );
305            }
306    
307            /**
308             * 【å»?­¢】å?ç�?�—なã�?�¡件を含ã‚?‚ˆã�?�ªæ–?­—å?を指定しますã?
309             *
310             * @og.tag
311             * delTermListで与えられた文字å?に、delTermæ–?­—å?(大æ–?­?小文字ã?区別あり)ã�?
312             * 含まれてã�?‚Œば、DELETE選択タブとして処ç�?�—ますã?
313             * 例えばã€?A","B","C" とã�?�†æ–?­—å?がã?delTerm でæŒ?®šされた
314             * 場合に処ç�?�—なã�?‚ˆã�?�«したã�??合ã?ã€?A|B|C" をセãƒ?ƒˆしますã?
315             * 初期値はã€?null ですã?
316             * 判定ã?、文字å?を含ã‚?�‹どã�?�‹なのでã€?¼‘文字ã?みの場合ã?ã€?|"区åˆ?‚Šにする
317             * å¿?¦�ã?ありませんã€?
318             * OPEN選択とDELETE選択が競合したå?合ã?、DELETE選択が優先されますã?
319             *
320             * @og.rev 3.8.6.2 (2006/11/01) 新規追åŠ?
321             *
322             * @param       list DELETE選択タブ条件æ–?­—å?(indexOf による含ã‚?含まなã�?ˆ¤å®?
323             */
324            @Deprecated public void setDelTermList( final String list ) {
325                    delTermList = nval( getRequestParameter( list ),delTermList );
326            }
327    
328            /**
329             * 【å»?­¢】タブに与えã‚?初期 style 属æ?を指定しますã?
330             *
331             * @og.tag
332             * ts:tab 本体では、å?期選択時のスタイルシートを、defaultStyle と
333             * selectedStyle で与えるå¿?¦�がありますã?これは、id 属æ?を設定してã€?
334             * 外部でスタイルシートを定義する形式でæŒ?®šできませんã€?
335             * ここでæŒ?®šしã�?style 属æ? は、tabTableTag で与えã‚?style 属æ? より優先度は
336             * 高くなりますã?
337             * ここでの style は、タブã? OPEN選択には関係ありませんã€?
338             *
339             * @og.rev 3.8.6.1 (2006/10/24) 新規追åŠ?
340             *
341             * @param       st タブに与えã‚?初期 style 属æ?
342             * @deprecated クラスがå»?­¢されましたã€?
343             */
344            @Deprecated public void setStyle( final String st ) {
345                    style = nval( getRequestParameter( st ),style );
346            }
347    
348            /**
349             * 【å»?­¢】タブが選択状æ…?OPEN選択タブ時)に使用するキーをCSV形式でè¤?•°æŒ?®šしますã?
350             *
351             * @og.tag
352             * タブã?BODYå†?ƒ¨でのみ有効なscope="request"変数を定義できますã?
353             * 条件は、term、termList によるOPEN選択タブ時にのみæŒ?®šã?タブã?
354             * BODY部å†??みに有効になりますã?
355             * タブã?前に設定されてã�?‚‹ scope="request"変数 はé€?�¿され、BODY部ã�?
356             * 終äº?�—た時点で、å?の変数に値が戻されますã?
357             * åˆ?§£方法ã?、CSV変数をå?にåˆ?§£してから、getRequestParameter で値を取得しますã?
358             * こうしなã�?�¨ãƒ??タ自身にカンマを持ってã�?‚‹場合にåˆ?§£をミスる為ですã?
359             *
360             * @og.rev 3.8.6.2 (2006/11/01) 新規追åŠ?
361             *
362             * @param       key キー(CSV形å¼?
363             * @deprecated クラスがå»?­¢されましたã€?
364             */
365            @Deprecated public void setKeys( final String key ) {
366                    keys = getCSVParameter( key );
367            }
368    
369            /**
370             * 【å»?­¢】タブが選択状æ…?OPEN選択タブ時)に使用する値をCSV形式でè¤?•°æŒ?®šしますã?
371             *
372             * @og.tag
373             * タブã?BODYå†?ƒ¨でのみ有効なscope="request"変数を定義できますã?
374             * 条件は、term、termList によるOPEN選択タブ時にのみæŒ?®šã?タブã?
375             * BODY部å†??みに有効になりますã?
376             * タブã?前に設定されてã�?‚‹ scope="request"変数 はé€?�¿され、BODY部ã�?
377             * 終äº?�—た時点で、å?の変数に値が戻されますã?
378             * åˆ?§£方法ã?、CSV変数をå?にåˆ?§£してから、getRequestParameter で値を取得しますã?
379             * こうしなã�?�¨ãƒ??タ自身にカンマを持ってã�?‚‹場合にåˆ?§£をミスる為ですã?
380             *
381             * @param       val 値(CSV形å¼?
382             * @deprecated クラスがå»?­¢されましたã€?
383             */
384            @Deprecated public void setVals( final String val ) {
385                    vals = getCSVParameter( val );
386            }
387    
388            /**
389             * こã?オブジェクトã?æ–?­—å?表現を返しますã?
390             * 基本çš?�«ãƒ?ƒ�ãƒ?‚°目çš?�«使用しますã?
391             *
392             * @return こã?クラスのæ–?­—å?表現
393             */
394            @Override
395            public String toString() {
396                    return org.opengion.fukurou.util.ToString.title( this.getClass().getName() )
397                                    .println( "VERSION"             ,VERSION        )
398                                    .println( "text"                ,text           )
399                                    .println( "name"                ,name           )
400                                    .println( "body"                ,body           )
401                                    .println( "term"                ,term           )
402                                    .println( "termList"    ,termList       )
403                                    .println( "Other..."    ,getAttributes().getAttribute() )
404                                    .fixForm().toString() ;
405            }
406    }