    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 */
    016package org.opengion.hayabusa.taglib;
    017
    018import org.opengion.hayabusa.common.HybsSystemException;
    019import org.opengion.hayabusa.html.TabData;
    020import 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  ...  &gt;
    038 *             &lt;og:tab name="paGE1" lbl="page 1" &gt;
    039 *                    &lt;jsp:directive.include file="paGE1.jsp" /&gt;
    040 *             &lt;/og:tab&gt;
    041 *             &lt;og:tab name="page2" lbl="page 2" &gt;
    042 *                    &lt;jsp:directive.include file="page2.jsp" /&gt;
    043 *             &lt;/og:tab&gt;
    044 *         &lt;/og:tabTable &gt;
    045 * ●body：あり(EVAL_BODY_BUFFERED:BODYを評価し、{&#064;XXXX} を解析します)
    046 *
    047 * ●Tag定義：
    048 *   &lt;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 *   &gt;   ... Body ...
    060 *   &lt;/og:tab&gt;
    061 *
    062 * ●使用例
    063 *  &lt;og:tabTable&gt;
    064 *    &lt;og:tab lbl="page 1"&gt;
    065 *      &lt;table summary="layout" &gt;
    066 *        &lt;tr&gt;
    067 *          &lt;og:column name="SYSTEM_ID" must="true" /&gt;
    068 *          &lt;og:column name="COLUMN_NAME" /&gt;
    069 *          &lt;og:column name="RENDERER"    /&gt;
    070 *        &lt;/tr&gt;
    071 *      &lt;/table&gt;
    072 *    &lt;/og:tab&gt;
    073 *    &lt;og:tab lbl="page 2"&gt;
    074 *      &lt;table summary="layout" &gt;
    075 *        &lt;tr&gt;
    076 *          &lt;og:column name="DBTYPE"      /&gt;
    077 *          &lt;og:column name="NAME_JA"     /&gt;
    078 *          &lt;og:column name="EDITOR"      /&gt;
    079 *        &lt;/tr&gt;
    080 *      &lt;/table&gt;
    081 *    &lt;/og:tab&gt;
    082 *  &lt;/og:tabTable&gt;
    083 *
    084 * @og.rev 3.5.6.5 (2004/08/09) 新規作成
    085 * @og.rev 5.9.1.3 (2015/10/30) jQuery方式に変更して復活(このタグはコメントの修正のみ)
    086 * @og.group 画面部品
    087 *
    088 * @version  4.0
    089 * @author       Kazuhiko Hasegawa
    090 * @since    JDK5.0,
    091 */
    092public 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         * @og.rev 5.9.1.3 (2015/10/30) 復活
    239         *
    240         * @param   name 名前
    241         */
    242        public void setName( final String name ) {
    243                this.name = getRequestParameter( name );
    244        }
    245
    246        /**
    247         * 【廃止】処理する条件を指定します(初期値:null)。
    248         *
    249         * @og.tag
    250         * termListで与えられた文字列に、term文字列(大文字/小文字の区別あり)が
    251         * 含まれていれば、OPEN選択タブとして処理します。
    252         * OPEN選択タブでないタブは、初期値OPENにならないだけで、タブそのものは表示されます。
    253         * OPEN選択とDELETE選択が競合した場合は、DELETE選択が優先されます。
    254         * 初期値は、 null です。
    255         *
    256         * @og.rev 3.8.6.1 (2006/10/20) 新規追加
    257         *
    258         * @param       flag 処理する条件
    259         * @deprecated クラスが廃止されました。
    260         */
    261        @Deprecated public void setTerm( final String flag ) {
    262                term = nval( getRequestParameter( flag ),term );
    263        }
    264
    265        /**
    266         * 【廃止】処理する条件を含むような文字列を指定します。
    267         *
    268         * @og.tag
    269         * termListで与えられた文字列に、term文字列(大文字/小文字の区別あり)が
    270         * 含まれていれば、OPEN選択タブとして処理します。
    271         * 例えば、"A","B","C" という文字列が、term で指定された
    272         * 場合に処理するようにしたい場合は、"A|B|C" をセットします。
    273         * 初期値は、 null です。
    274         * 判定は、文字列を含むかどうかなので、１文字のみの場合は、"|"区切りにする
    275         * 必要はありません。
    276         * OPEN選択とDELETE選択が競合した場合は、DELETE選択が優先されます。
    277         *
    278         * @og.rev 3.8.6.1 (2006/10/20) 新規追加
    279         *
    280         * @param       list 処理する条件(indexOf による含む/含まない判定)
    281         * @deprecated クラスが廃止されました。
    282         */
    283        @Deprecated public void setTermList( final String list ) {
    284                termList = nval( getRequestParameter( list ),termList );
    285        }
    286
    287        /**
    288         * 【廃止】処理しないタブを選択する条件を指定します(初期値:null)。
    289         *
    290         * @og.tag
    291         * delTermListで与えられた文字列に、delTerm文字列(大文字/小文字の区別あり)が
    292         * 含まれていれば、DELETE選択タブとして処理します。
    293         * DELETE選択タブは、タブそのものが表示されません。
    294         * ただし、タブのselectIndex は、DELETEされたタブも含めて、カウントされますので、
    295         * JSPでの設定時の順番がインデックス番号になります。
    296         * OPEN選択とDELETE選択が競合した場合は、DELETE選択が優先されます。
    297         * 初期値は、 null です。
    298         *
    299         * @og.rev 3.8.6.2 (2006/11/01) 新規追加
    300         *
    301         * @param       flag DELETE選択タブ条件
    302         * @deprecated クラスが廃止されました。
    303         */
    304        @Deprecated public void setDelTerm( final String flag ) {
    305                delTerm = nval( getRequestParameter( flag ),delTerm );
    306        }
    307
    308        /**
    309         * 【廃止】処理しない条件を含むような文字列を指定します。
    310         *
    311         * @og.tag
    312         * delTermListで与えられた文字列に、delTerm文字列(大文字/小文字の区別あり)が
    313         * 含まれていれば、DELETE選択タブとして処理します。
    314         * 例えば、"A","B","C" という文字列が、delTerm で指定された
    315         * 場合に処理しないようにしたい場合は、"A|B|C" をセットします。
    316         * 初期値は、 null です。
    317         * 判定は、文字列を含むかどうかなので、１文字のみの場合は、"|"区切りにする
    318         * 必要はありません。
    319         * OPEN選択とDELETE選択が競合した場合は、DELETE選択が優先されます。
    320         *
    321         * @og.rev 3.8.6.2 (2006/11/01) 新規追加
    322         *
    323         * @param       list DELETE選択タブ条件文字列(indexOf による含む/含まない判定)
    324         */
    325        @Deprecated public void setDelTermList( final String list ) {
    326                delTermList = nval( getRequestParameter( list ),delTermList );
    327        }
    328
    329        /**
    330         * 【廃止】タブに与える 初期 style 属性を指定します。
    331         *
    332         * @og.tag
    333         * ts:tab 本体では、初期選択時のスタイルシートを、defaultStyle と
    334         * selectedStyle で与える必要があります。これは、id 属性を設定して、
    335         * 外部でスタイルシートを定義する形式で指定できません。
    336         * ここで指定した style 属性 は、tabTableTag で与える style 属性 より優先度は
    337         * 高くなります。
    338         * ここでの style は、タブの OPEN選択には関係ありません。
    339         *
    340         * @og.rev 3.8.6.1 (2006/10/24) 新規追加
    341         *
    342         * @param       st タブに与える 初期 style 属性
    343         * @deprecated クラスが廃止されました。
    344         */
    345        @Deprecated public void setStyle( final String st ) {
    346                style = nval( getRequestParameter( st ),style );
    347        }
    348
    349        /**
    350         * 【廃止】タブが選択状態(OPEN選択タブ時)に使用するキーをCSV形式で複数指定します。
    351         *
    352         * @og.tag
    353         * タブのBODY内部でのみ有効なscope="request"変数を定義できます。
    354         * 条件は、term、termList によるOPEN選択タブ時にのみ指定のタブの
    355         * BODY部内のみに有効になります。
    356         * タブの前に設定されている scope="request"変数 は退避され、BODY部が
    357         * 終了した時点で、元の変数に値が戻されます。
    358         * 分解方法は、CSV変数を先に分解してから、getRequestParameter で値を取得します。
    359         * こうしないとデータ自身にカンマを持っている場合に分解をミスる為です。
    360         *
    361         * @og.rev 3.8.6.2 (2006/11/01) 新規追加
    362         *
    363         * @param       key キー(CSV形式)
    364         * @deprecated クラスが廃止されました。
    365         */
    366        @Deprecated public void setKeys( final String key ) {
    367                keys = getCSVParameter( key );
    368        }
    369
    370        /**
    371         * 【廃止】タブが選択状態(OPEN選択タブ時)に使用する値をCSV形式で複数指定します。
    372         *
    373         * @og.tag
    374         * タブのBODY内部でのみ有効なscope="request"変数を定義できます。
    375         * 条件は、term、termList によるOPEN選択タブ時にのみ指定のタブの
    376         * BODY部内のみに有効になります。
    377         * タブの前に設定されている scope="request"変数 は退避され、BODY部が
    378         * 終了した時点で、元の変数に値が戻されます。
    379         * 分解方法は、CSV変数を先に分解してから、getRequestParameter で値を取得します。
    380         * こうしないとデータ自身にカンマを持っている場合に分解をミスる為です。
    381         *
    382         * @param       val 値(CSV形式)
    383         * @deprecated クラスが廃止されました。
    384         */
    385        @Deprecated public void setVals( final String val ) {
    386                vals = getCSVParameter( val );
    387        }
    388
    389        /**
    390         * このオブジェクトの文字列表現を返します。
    391         * 基本的にデバッグ目的に使用します。
    392         *
    393         * @return このクラスの文字列表現
    394         */
    395        @Override
    396        public String toString() {
    397                return org.opengion.fukurou.util.ToString.title( this.getClass().getName() )
    398                                .println( "VERSION"             ,VERSION        )
    399                                .println( "text"                ,text           )
    400                                .println( "name"                ,name           )
    401                                .println( "body"                ,body           )
    402                                .println( "term"                ,term           )
    403                                .println( "termList"    ,termList       )
    404                                .println( "Other..."    ,getAttributes().getAttribute() )
    405                                .fixForm().toString() ;
    406        }
    407}