    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 static org.opengion.fukurou.util.StringUtil.nval;
    019
    020import java.io.IOException;
    021import java.io.ObjectInputStream;
    022import java.io.ObjectOutputStream;
    023import java.util.ArrayList;
    024import java.util.List;
    025import java.util.Locale;
    026
    027import org.opengion.fukurou.util.StringUtil;
    028import org.opengion.fukurou.util.TagBuffer;
    029import org.opengion.fukurou.util.XHTMLTag;
    030import org.opengion.hayabusa.common.HybsSystem;
    031import org.opengion.hayabusa.common.HybsSystemException;
    032import org.opengion.hayabusa.db.DBTableModel;
    033import org.opengion.hayabusa.db.DBTableModelUtil;
    034
    035/** タブ形式のリンクを表示するタグです。
    036 *
    037 * このタグ形式の実態は、リンクのリストであるため、実の画面の表示はターゲットを指定して
    038 * 別フレームで行う必要があります。
    039 *
    040 * タブの指定方法については、listType属性の指定により、クエリ発行(DB)により動的に生成する
    041 * パターンと、タグ指定(TAG)により、静的に生成するパターンがあります。
    042 * listType属性に何も指定されていない場合は、Body部分に記述された内容により、自動判定されます。
    043 * ("SELECT"で始まっている場合はDB、それ以外はTAGとして処理)
    044 *
    045 * ①listType属性が"DB"の場合
    046 *  検索された各カラムは、その順番により次の意味を持ちます。
    047 *  [第1カラム] タブの名前        : リンク時のキー情報、後述のopenTabName属性のキーとしても使用 ※必須
    048 *  [第2カラム] タブの表示名称    : タブの表示名称 指定がない場合は、第1カラムが表示名称となります。
    049 *  [第3カラム] タブのリンク先URL : タブのリンク先URL 指定がない場合は、href属性の値が適用されます。
    050 *  [第4カラム] タブのクラス属性  : 個別のタブに付加されるクラス属性 指定がない場合は、unselClass属性の値が適用されます。
    051 *  [第5カラム] タブのロールズ    : タブのロールズを指定します。ユーザーロールズと一致しない指定した場合は、タブが表示されなくなります。
    052 *  [第6カラム] タブの選択可否    : タブの選択可否を'true'or'false'で指定します。falseを指定した場合は、タブが表示されなくなります。
    053 *                                  (ロールズで選択不可になっている場合は、この値は無視されます)
    054 *  各カラムの値は[カラム名]=[値]の形で、リンク先のJSPに引数として渡されます。
    055 *  また、リンク先のJSPについては、href属性で指定します。
    056 *
    057 * ②listType属性が"TAG"の場合
    058 *  tabListタグを記述し、個別にタブを定義します。
    059 *  制御可能な項目は、①DBの場合と同等です。
    060 *  タブの名前を定義するname属性は、tabListタグで必ず定義する必要があります。
    061 *  lbl属性が指定されていない場合は、name属性のラベル名称を取得します。
    062 *  タブのリンク先JSP及び、クラス属性については、tabListタグで指定がない場合、tabListタグの値が適用されます。
    063 *
    064 * [共通設定]
    065 * 初期設定では、第1番目の"有効な"タブが自動的に開かれます。(="true")
    066 * 各タブの表示方法で、選択不可能なタブが存在している場合は、それらを読み飛ばした上で、"有効な"タブを
    067 * 検索します。
    068 * また、自動で開くタブは、openTabName属性で指定可能であり、これに変数を定義することで、
    069 * 画面リロード時も、開いていたタブを再度選択された状態で表示することが可能です。
    070 *
    071 * 選択したタブ及び非選択のタブの枠線や、背景色等を変更する場合は、custom.cssでクラスを定義し、
    072 * 変更して下さい。
    073 *
    074 * タブの表示方向(水平方向 or 垂直方向)については、orientation属性で変更することが可能です。
    075 * (初期値は、水平方向)
    076 * 水平方向にした場合は、listCount属性により強制的に一定数のタブを表示する毎に、改行を挿入することができます。
    077 *
    078 * このタグを使用する場合は、headタグで必ずuseTabLink="true"を指定してJavaScriptをロードして下さい。
    079 *
    080 * 各属性は、{&#064;XXXX} 変数が使用できます。
    081 * これは、ServletRequest から、XXXX をキーに値を取り出し,この変数に割り当てます。
    082 * つまり、このXXXXをキーにリクエストすれば、この変数に値をセットすることができます。
    083 *
    084 * @og.formSample
    085 * ●形式：&lt;og:tabLink href="…" … /&gt;
    086 * ●body：あり(EVAL_BODY_BUFFERED:BODYを評価し、{&#064;XXXX} を解析します)
    087 *
    088 * ●Tag定義：
    089 *   &lt;og:tabLink
    090 *       listType           【TAG】タブの一覧をどこから取得するかを指定します(初期値:AUTO)
    091 *       href               【TAG】リンク先のJSPを指定します(初期値:result.jsp)
    092 *       target             【TAG】リンクのターゲットを指定します(初期値:RESULT)
    093 *       openTab            【TAG】リンク表示にタブリンクを自動で開くかどうか[true/false]を指定します(初期値:true[=開く])
    094 *       openTabName        【TAG】最初に開くタブリンクの名前を指定します
    095 *       constKeys          【TAG】次画面に渡す定数パラメーターのキーを指定します
    096 *       constVals          【TAG】次画面に渡す定数パラメーターの値を指定します
    097 *       listCount          【TAG】1行辺りに表示するタブの数を指定します(初期値:10)
    098 *       selClass           【TAG】選択タブのクラスを指定します(初期値:selTab)
    099 *       unselClass         【TAG】非選択タブのクラスを指定します(初期値:unselTab)
    100 *       orientation        【TAG】タブの方向、横型(Horizontal)か縦型(Vertical)を指定します(初期値:横型)
    101 *       width              【TAG】タブリンクの幅を % 、px 、または "auto" で指定します
    102 *       height             【TAG】タブの高さを、% 、px 、または "auto" で指定します
    103 *       debug              【TAG】デバッグ情報を出力するかどうか[true/false]を指定します(初期値:false)
    104 *   &gt;   ... Body ...
    105 *   &lt;/og:tabLink&gt;
    106 *
    107 * ●使用例
    108 *   ①DBからタブリストを取得する場合
    109 *
    110 *    Body部分に記述されたクエリよりタブ一覧を生成します。
    111 *
    112 *      &lt;og:tabLink
    113 *          listType        = "DB"                      タブの一覧をどこから取得するか
    114 *          href            = "result.jsp"              リンク先のJSP
    115 *          target          = "RESULT"                  リンクターゲット
    116 *          openTab         = "[true/false]"            タブ表示後にタブを自動で開く
    117 *          openTabName     = "{&#064;PN}               自動で開くタブの名前
    118 *          constKeys       = "KEY1"                    次画面に固定で渡すキー一覧
    119 *          constVals       = "{&#064;VAL1}"            次画面に固定で渡す値一覧
    120 *          listCount       = "10"                      1行辺りに表示するタブの数
    121 *          selClass        = "selTab"                  選択タブのクラス
    122 *          unselClass      = "unselTab"                非選択タブのクラス
    123 *          width           = "100px"                   タブリンクの幅
    124 *          height          = "50px"                    タブリンクの高さ
    125 *       &gt;
    126 *               select PN,HINM,'tabClass','query.jsp','ADMIN','false' from XX01 where PN = '{&#064;PN}' order by PN
    127 *      &lt;/og:tabLink&gt;
    128 *
    129 *   ②tabListタグからタブリストを生成する場合
    130 *
    131 *    tabListタグよりタブ一覧を生成します。
    132 *
    133 *      &lt;og:tabLink
    134 *          listType        = "DB"                      タブの一覧をどこから取得するか
    135 *          href            = "result.jsp"              リンク先のJSP
    136 *          target          = "RESULT"                  リンクターゲット
    137 *          openTab         = "[true/false]"            タブ表示後にタブを自動で開く
    138 *          openTabName     = "{&#064;PN}               自動で開くタブの名前
    139 *          constKeys       = "KEY1"                    次画面に固定で渡すキー一覧
    140 *          constVals       = "{&#064;VAL1}"            次画面に固定で渡す値一覧
    141 *          listCount       = "10"                      1行辺りに表示するタブの数
    142 *          selClass        = "selTab"                  選択タブのクラス
    143 *          unselClass      = "unselTab"                非選択タブのクラス
    144 *          width           = "100px"                   タブリンクの幅
    145 *          height          = "50px"                    タブリンクの高さ
    146 *       &gt;
    147 *          &lt;og:tabList name="TAB1" href="result1.jsp" keys="PN,CDK" vals="ABC,V" /&gt;
    148 *          &lt;og:tabList name="TAB2" href="result2.jsp" keys="PN,CDK" vals="BCD,W" /&gt;
    149 *          &lt;og:tabList name="TAB3" href="result3.jsp" keys="PN,CDK" vals="CDE,X" /&gt;
    150 *      &lt;/og:tabLink&gt;
    151 *
    152 * @og.group 画面表示
    153 *
    154 * @version  0.9.0      2008/09/26
    155 * @author       Nakamura
    156 * @since        JDK1.4,
    157 */
    158public class TabLinkTag extends CommonTagSupport {
    159        private static final String             VERSION                         = "5.1.8.0 (2010/07/01)";
    160        private static final long               serialVersionUID        = 518020100701L;
    161
    162        /** リストのulタグのclass属性 */
    163        private static final String             UL_TAG_START            = "<ul class=\"tabList\">";
    164        private static final String             UL_TAG_END                      = "</ul>";
    165
    166        /** タブ表示を入れ替えるためのJavaScript関数 */
    167        private static final String             CHANGE_TAB_SCRIPT       = "changeTab";
    168        private static final String             INITIAL_TAB_SCRIPT      = "initialTabSelect";
    169//              "<script type=\"text/javascript\">addEvent(window,\"load\", initialTabSelect);</script>";
    170
    171        /** 自動で開くタブに付加されるID */
    172        private static final String             FIRST_TAB_ID            = "firstTab";
    173
    174        /** リスト取得タイプのEnum */
    175        private static enum LIST_TYPE { AUTO, DB, TAG };
    176
    177        /** 内部変数 */
    178        private String          query                   = null;
    179        private transient List<TabData>           tabData         = new ArrayList<TabData>();
    180
    181        /** タグで設定する属性 */
    182        private LIST_TYPE       type                    = LIST_TYPE.AUTO;
    183        private String          href                    = "result.jsp";
    184        private String          target                  = "RESULT";
    185        private boolean         openTab                 = true;
    186        private String          openTabName             = null;
    187        private String[]        constKeys               = null;
    188        private String[]        constVals               = null;
    189        private int                     listCount               = 10;
    190        private String          selClass                = "selTab";
    191        private String          unselClass              = "unselTab";
    192        private boolean         isHorizontal    = true;
    193        private String          width                   = "auto";
    194        private String          height                  = "auto";
    195
    196        /**
    197         * Taglibの開始タグが見つかったときに処理する doStartTag() を オーバーライドします。
    198         *
    199         * @return      後続処理の指示( EVAL_BODY_BUFFERED )
    200         */
    201        @Override
    202        public int doStartTag() {
    203                return( EVAL_BODY_BUFFERED );   // Body を評価する
    204        }
    205
    206        /**
    207         * Taglibのタグ本体を処理する doAfterBody() を オーバーライドします。
    208         *
    209         * @return      後続処理の指示(SKIP_BODY)
    210         */
    211        @Override
    212        public int doAfterBody() {
    213                query = getBodyString().trim();
    214                return ( SKIP_BODY );
    215        }
    216
    217        /**
    218         * Taglibの終了タグが見つかったときに処理する doEndTag() を オーバーライドします。
    219         *
    220         * @og.rev 4.3.5.0 (2008/02/01) 処理及び内部構造を大幅に見直し
    221         *
    222         * @return      後続処理の指示
    223         */
    224        @Override
    225        public int doEndTag() {
    226                debugPrint();
    227                int rtnCode = EVAL_PAGE;
    228
    229                // 種別の自動判定処理
    230                if( type == LIST_TYPE.AUTO ) {
    231                        if( query == null || query.length() == 0 ) {
    232                                type = LIST_TYPE.TAG;
    233                        }
    234                        else {
    235                                if( query.toUpperCase( Locale.JAPAN ).indexOf( "SELECT" ) >= 0 ) {
    236                                        type = LIST_TYPE.DB;
    237                                }
    238                                else {
    239                                        type = LIST_TYPE.TAG;
    240                                }
    241                        }
    242                }
    243
    244                if( type == LIST_TYPE.DB ) {
    245                        makeTabsFromQuery();
    246                }
    247                else if( type == LIST_TYPE.TAG ) {
    248                        makeTabsFromTag();
    249                }
    250
    251                // リンク一覧が何も設定されていない場合は、処理しない
    252//              if( tabData.size() > 0 ) {
    253                if( ! tabData.isEmpty() ) {
    254                        makeTag();
    255                }
    256
    257                return( rtnCode );
    258        }
    259
    260        /**
    261         * タグリブオブジェクトをリリースします。
    262         * キャッシュされて再利用されるので、フィールドの初期設定を行います。
    263         */
    264        @Override
    265        protected void release2() {
    266                super.release2();
    267                query                   = null;
    268                tabData                 = new ArrayList<TabData>();
    269                type                    = LIST_TYPE.AUTO;
    270                href                    = "result.jsp";
    271                target                  = "RESULT";
    272                openTab                 = true;
    273                openTabName             = null;
    274                constKeys               = null;
    275                constVals               = null;
    276                listCount               = 10;
    277                selClass                = "selTab";
    278                unselClass              = "unselTab";
    279                isHorizontal    = true;
    280                width                   = "auto";
    281                height                  = "auto";
    282        }
    283
    284        /**
    285         * DBからタブリンクの一覧を作成します。
    286         * DBTableModelが作成されない(行数が0の場合)は、リンク一覧は生成されません。
    287         */
    288        private void makeTabsFromQuery() {
    289                DBTableModel table = DBTableModelUtil.makeDBTable( query, new String[0], getResource(), getApplicationInfo() );
    290                if( table == null || table.getRowCount() == 0 ) {
    291                        return;
    292                }
    293
    294                boolean isSetLabel = false;
    295                boolean isSetHref = false;
    296                boolean isSetClazz = false;
    297                boolean isSetRoles = false;
    298                boolean isSetVisible = false;
    299                if( table.getColumnCount() > 1 ) { isSetLabel = true; }
    300                if( table.getColumnCount() > 2 ) { isSetHref = true; }
    301                if( table.getColumnCount() > 3 ) { isSetClazz = true; }
    302                if( table.getColumnCount() > 4 ) { isSetRoles = true; }
    303                if( table.getColumnCount() > 5 ) { isSetVisible = true; }
    304
    305                int rowCount = table.getRowCount();
    306                String key = table.getColumnName( 0 );
    307                for( int row=0; row<rowCount; row++ ) {
    308                        String value    = table.getValue( row, 0 );
    309                        String label    = ( isSetLabel ? StringUtil.nval( table.getValue( row, 1 ), value ) : value );
    310                        String newHref  = ( isSetHref ? StringUtil.nval( table.getValue( row, 2 ), href ) : href );
    311                        String clazz    = ( isSetClazz ? StringUtil.nval( table.getValue( row, 3 ), unselClass ) : unselClass );
    312                        boolean visible = ( isSetRoles ? getUser().isAccess( table.getValue( row, 4 ) ) : true );
    313                        if( visible ) {
    314                                visible         = ( isSetVisible ? Boolean.valueOf( table.getValue( row, 5 ) ) : true );
    315                        }
    316
    317                        // 第1カラムのカラム名とその値はリンクの引数に含める
    318                        newHref = XHTMLTag.addUrlEncode( newHref, XHTMLTag.urlEncode( key, value ) );
    319
    320                        if( visible ) { // visible=falseの場合は表示しない
    321                                tabData.add( new TabData( newHref, value, label, clazz, visible ) );
    322                        }
    323                }
    324        }
    325
    326        /**
    327         * タブリストからタブリンクの一覧を作成します。
    328         * (予めaddTagメソッドにより、リンク一覧が登録されているため、ここでは何も処理しません)
    329         *
    330         * @see #addTag( String, String, String, String, boolean, String[], String[] )
    331         */
    332        private void makeTabsFromTag() {
    333                // 何もありません。(PMD エラー回避)
    334        }
    335
    336        /**
    337         * 子タグであるタブリストタグからタブ情報をセットします。
    338         *
    339         * @param hr 画面URL
    340         * @param name タブの名前
    341         * @param label タブの表示名称
    342         * @param clz 非選択状態のタブに付加するclass名
    343         * @param visible タブが選択可能(中身を表示できるかどうか)
    344         * @param keys リンク先のJSPに渡すキー一覧
    345         * @param vals リンク先のJSPに渡す値一覧
    346         */
    347        protected void addTag( final String hr, final String name, final String label, final String clz
    348                                                        ,final boolean visible, final String[] keys, final String[] vals ) {
    349                String newHref = StringUtil.nval( hr, href );
    350                if( keys != null && keys.length > 0 ) {
    351                        newHref = XHTMLTag.addUrlEncode( newHref, XHTMLTag.urlEncode( keys, vals ) );
    352                }
    353
    354                if( visible ) { // visible=falseの場合は表示しない
    355                        tabData.add( new TabData( newHref, name, StringUtil.nval( label, getLabel( name ) ), StringUtil.nval( clz, unselClass ), visible ) );
    356                }
    357        }
    358
    359        /**
    360         * リンク一覧からHTMLタグを作成します。
    361         *
    362         * @og.rev 5.0.2.0 (2009/11/01) openTab属性がfalseの場合でも、openTabNameに指定されたタブに色付けする。
    363         * @og.rev 5.1.4.0 (2010/03/01) FF対応&FirstTabのID付加に関するバグを修正
    364         */
    365        private void makeTag() {
    366                StringBuilder buf = new StringBuilder();
    367                buf.append( HybsSystem.CR );
    368
    369                boolean isExistFirst = false;
    370                for( int idx=0; idx<tabData.size(); idx++ ) {
    371                        TabData tab = tabData.get( idx );
    372
    373                        if( idx % listCount == 0 ) {
    374                                if( idx > 0 ) {
    375                                        buf.append( UL_TAG_END ).append( HybsSystem.CR );
    376                                }
    377                                buf.append( UL_TAG_START ).append( HybsSystem.CR );
    378                        }
    379
    380                        // openTabNameが定義されていない場合は、1番目の有効なタブを開く
    381                        // 5.1.4.0 (2010/03/01) バグ修正
    382                        if( !isExistFirst && tab.visible
    383                                && ( openTabName == null || openTabName.length() == 0 || openTabName.equals( tab.name ) ) ) {
    384                                buf.append( tab.makeLiTag( idx, true ) );
    385                                isExistFirst = true;
    386                        }
    387                        else {
    388                                buf.append( tab.makeLiTag( idx, false ) );
    389                        }
    390                }
    391                buf.append( UL_TAG_END ).append( HybsSystem.CR );
    392
    393                // タブを自動で開くためのJavaScriptタグを発行
    394                // 5.1.4.0 (2010/03/01) FF対応
    395                if( openTab || ( openTabName != null && openTabName.length() > 0 ) ) {
    396                        buf.append( "<script type=\"text/javascript\">addEvent(window,\"load\", function() { " + INITIAL_TAB_SCRIPT + "(" );
    397                        buf.append( openTab );
    398                        buf.append( "); } );</script>" );
    399                }
    400
    401                jspPrint( buf.toString() );
    402        }
    403
    404        /**
    405         * Tabデータ を管理している 内部クラス
    406         *
    407         * タブの情報を管理するための簡易的な、内部クラスです。
    408         */
    409        private final class TabData {
    410                // 引数として初期設定される変数
    411                private final String href;
    412                private final String name;
    413                private final String label;
    414                private final String clazz;
    415                // 現状の実装では、visible=falseは渡ってきませんが、将来的にdisableの状態で
    416                // 表示したい場合等に対応するため残しておきます。
    417                private final boolean visible;
    418
    419                /**
    420                 * コンストラクタ
    421                 *
    422                 * @param hr 画面URL
    423                 * @param nm タブの名前
    424                 * @param lbl タブの表示名称
    425                 * @param clz 非選択状態のタブに付加するclass名
    426                 * @param vsb タブが選択可能(中身を表示できるかどうか)
    427                 */
    428                public TabData( final String hr, final String nm, final String lbl, final String clz, final boolean vsb ) {
    429                        href    = hr;
    430                        name    = nm;
    431                        label   = lbl;
    432                        clazz   = clz;
    433                        visible = vsb;
    434                }
    435
    436                /**
    437                 * liタグの部分の文字列を生成します。
    438                 *
    439                 * @param idx 生成したタブのインデックス番号
    440                 * @param isFirst 始めの有効なタブかどうか
    441                 * @return liタグ文字列
    442                 */
    443                private String makeLiTag( final int idx, final boolean isFirst ) {
    444                        StringBuilder buf = new StringBuilder();
    445                        buf.append( "<li class=\"" ).append( clazz ).append( "\"" );
    446                        buf.append( " style=\"" );
    447                        buf.append( " width: " ).append( width ).append( ";" );
    448                        buf.append( " height: " ).append( height ).append( ";" );
    449                        // 水平方向の場合のみfloat:leftを付加し、回り込み(+解除)を行う。
    450                        if( isHorizontal ) {
    451                                buf.append( " float: left;" );
    452                                if( idx % listCount == 0 ) {
    453                                        // 行が変わったタイミングで、テキストの折り返しをクリア＆左マージン(+10px)を空ける
    454                                        buf.append( " clear: left; margin-left: " );
    455//                                      buf.append( Math.round( idx/listCount ) * 10 ).append( "px;" );
    456                                        // 4.3.4.4 (2009/01/01) Math.roundを呼び出す意味がないため削除
    457                                        buf.append( (idx/listCount) * 10 ).append( "px;" );
    458                                }
    459                        }
    460                        buf.append( " \"" );
    461                        buf.append( ">" );
    462                        buf.append( makeLinkTag( isFirst ) );
    463                        buf.append( "</li>" ).append( HybsSystem.CR );
    464
    465                        return buf.toString();
    466                }
    467
    468                /**
    469                 * aタグの部分の文字列を生成します。
    470                 * タブが選択不可能な状態の場合は、タブの表示文字列をそのまま返します。
    471                 *
    472                 * @og.rev 4.3.6.4 戻るボタンがでない問題への対応
    473                 *
    474                 * @param isFirst 始めの有効なタブかどうか
    475                 * @return liタグ文字列
    476                 */
    477                private String makeLinkTag( final boolean isFirst ) {
    478//                      if( !visible ) { return label; }
    479
    480                        String newHref = XHTMLTag.addUrlEncode( href, XHTMLTag.urlEncode( constKeys, constVals ) );
    481                        // 4.3.6.4 (2009/05/01)
    482                        // タブ画面から遷移した時に、タブの読込により、画面IDが消えてしまい
    483                        // 戻るボタンがでない不具合への対応
    484                        newHref = XHTMLTag.addUrlEncode( newHref, "GAMENID=" + getGUIInfoAttri( "KEY" ) );
    485                        TagBuffer tag = new TagBuffer( "a" );
    486                        tag.add( "href", newHref );
    487                        tag.add( "name", name );
    488                        tag.add( "target", target );
    489                        tag.add( "onClick", CHANGE_TAB_SCRIPT + "( this, \"" + selClass + "\" );" );
    490                        if ( isFirst ) {
    491                                tag.add( "id", FIRST_TAB_ID );
    492                        }
    493                        tag.setBody( label );
    494
    495                        return tag.makeTag();
    496                }
    497        }
    498
    499        /**
    500         * 【TAG】タブの一覧をどこから取得するかを指定します(初期値:AUTO)。
    501         *
    502         * @og.tag
    503         * タブの一覧をどこから取得するかを指定します。
    504         * 現状の実装では、クエリを発行して一覧を生成する「DB」と、子タグである
    505         * tabListタグを列挙してタブを定義する「TAG」が実装されています。
    506         *
    507         * また、「AUTO」と指定した場合は、Body部分の内容に応じて自動的に判定されます。
    508         * 初期値は、｢AUTO」です。
    509         *
    510         * @param       tp タブ一覧取得方法(「AUTO」)
    511         */
    512        public void setListType( final String tp ) {
    513                String typeStr = nval( getRequestParameter( tp ), null );
    514                try {
    515                        type = LIST_TYPE.valueOf( typeStr );
    516                }
    517                catch ( IllegalArgumentException ex ) {
    518                        StringBuilder errBuf = new StringBuilder( 100 );
    519                        errBuf.append( "listType は" );
    520                        for ( LIST_TYPE obj : LIST_TYPE.values() ) {
    521                                errBuf.append( ',' );
    522                                errBuf.append( obj.name() );
    523                        }
    524                        errBuf.append( "から選んでください。" );
    525                        throw new HybsSystemException( errBuf.toString(), ex );
    526                }
    527        }
    528
    529        /**
    530         * 【TAG】リンク先のJSPを指定します(初期値:result.jsp)。
    531         *
    532         * @og.tag
    533         * リンク先のJSPを指定します。
    534         * このタブリンクは、あくまで「タブの形をしたリンク」なので、
    535         * target属性と合わせてセットする必要があります。
    536         * 初期値は、｢result.jsp」です。
    537         *
    538         * @param       hr リンク先のJSP
    539         */
    540        public void setHref( final String hr ) {
    541                href = nval( getRequestParameter( hr ), href );
    542        }
    543
    544        /**
    545         * 【TAG】リンクのターゲットを指定します(初期値:RESULT)。
    546         *
    547         * @og.tag
    548         * リンクのターゲットを指定します。
    549         * このタブリンクは、あくまで「タブの形をしたリンク」なので、
    550         * target属性を設定し、別のフレームに実画面を表示するようにします。
    551         * 初期値は、｢RESULT」です。
    552         *
    553         * @param       tgt リンクターゲット
    554         */
    555        public void setTarget( final String tgt ) {
    556                target = nval( getRequestParameter( tgt ), target );
    557        }
    558
    559        /**
    560         * 【TAG】リンク表示にタブリンクを自動で開くかどうか[true/false]を指定します(初期値:true[=開く])。
    561         *
    562         * @og.tag
    563         * リンク表示にタブリンクを自動で開くかを指定します。
    564         * openTabName属性が指定されていない場合、自動で開くタブは
    565         * 「1番目に表示されたタブリンク」です。
    566         * 指定されている場合は、その名前を持つ「1番目」のタブが自動で開かれます。
    567         * タブが選択不可能な状態の場合は、「1番目」の条件から除外されます。
    568         * 初期値は、「true(開く)」です。
    569         *
    570         * @param       flag タブ表示後に自動でタブを開くか[true:自動で開く/false:開かない]
    571         */
    572        public void setOpenTab( final String flag ) {
    573                openTab = nval( getRequestParameter( flag ), openTab );
    574        }
    575
    576        /**
    577         * 【TAG】最初に開くタブリンクの名前を指定します。
    578         *
    579         * @og.tag
    580         * 最初に開くタブリンクのキーを指定します。
    581         *
    582         * @param       name 最初に開くタブリンクの名前
    583         */
    584        public void setOpenTabName( final String name ) {
    585                openTabName = nval( getRequestParameter( name ), openTabName );
    586        }
    587
    588        /**
    589         * 【TAG】次画面に渡す定数パラメーターのキーを指定します。
    590         *
    591         * @og.tag
    592         * 次画面に渡す定数パラメーターのキーを指定します。
    593         * キーはカンマ区切りで複数指定が可能です。
    594         * パラメーターの値は、constVals属性の数と一致している必要があります。
    595         *
    596         * @param       keys 定数パラメーターのキー
    597         * @see         #setConstVals( String )
    598         */
    599        public void setConstKeys( final String keys ) {
    600                constKeys = getCSVParameter( keys );
    601        }
    602
    603        /**
    604         * 【TAG】次画面に渡す定数パラメーターの値を指定します。
    605         *
    606         * @og.tag
    607         * 次画面に渡す定数パラメーターの値を指定します。
    608         * 値はカンマ区切りで複数指定が可能です。
    609         * パラメーターの値は、constKeys属性の数と一致している必要があります。
    610         *
    611         * @param       vals 定数パラメーターのキー
    612         * @see         #setConstKeys( String )
    613         */
    614        public void setConstVals( final String vals ) {
    615                constVals = getCSVParameter( vals );
    616        }
    617
    618        /**
    619         * 【TAG】1行辺りに表示するタブの数を指定します(初期値:10)。
    620         *
    621         * @og.tag
    622         * 1行辺りに表示するタブの数を指定します。
    623         * 1行辺りのタブの数がこの設定を超えると、自動的に折り返します。
    624         * また、折り返し毎に、左に10pxのマージンを設けます。
    625         * 初期値は、10です。
    626         * この属性は、orientationがHorizontal(水平方向)の場合のみ有効です。
    627         *
    628         * @param       cnt 1行辺りに表示するタブの数
    629         */
    630        public void setListCount( final String cnt ) {
    631                listCount = nval( getRequestParameter( cnt ), listCount );
    632        }
    633
    634        /**
    635         * 【TAG】選択タブのクラスを指定します(初期値:selTab)。
    636         *
    637         * @og.tag
    638         * タブが選択されている状態にある場合の、タブ部分のクラス名を指定します。
    639         * このクラス名を変更する場合は、そのクラスをcustom/custom.css等で再定義して下さい。
    640         * 初期値は、selTabです。
    641         *
    642         * @param       cls 選択タブのクラス名
    643         */
    644        public void setSelClass( final String cls ) {
    645                selClass = nval( getRequestParameter( cls ), selClass );
    646        }
    647
    648        /**
    649         * 【TAG】非選択タブのクラスを指定します(初期値:unselTab)。
    650         *
    651         * @og.tag
    652         * タブが選択されていない状態にある場合の、タブ部分のクラス名を指定します。
    653         * このクラス名を変更する場合は、そのクラスをcustom/custom.css等で再定義して下さい。
    654         * 初期値は、unselTabです。
    655         *
    656         * @param       cls 選択タブのクラス名
    657         */
    658        public void setUnselClass( final String cls ) {
    659                unselClass = nval( getRequestParameter( cls ), unselClass );
    660        }
    661
    662        /**
    663         * 【TAG】タブの方向、横型(Horizontal)か縦型(Vertical)を指定します(初期値:横型)。
    664         *
    665         * @og.tag
    666         * タブは、上にタブが並ぶ横型と左にタブが並ぶ縦型があります。
    667         * この属性では、横型は、Horizontal 、縦型は、Vertical を指定します。
    668         * 指定は、文字列の最初の一文字を見ているだけですので、HかVでも構いません。
    669         *
    670         * 縦型(Vertical)にした場合、各タブ要素は、フレームサイズの幅に合わせて
    671         * 最大で表示されます。幅を固定する場合は、width属性を指定して下さい。
    672         *
    673         * 初期値は、横型(Horizontal) です。
    674         *
    675         * @param       ori タブの方向、横型(Horizontal)か縦型(Vertical)を指定
    676         */
    677        public void setOrientation( final String ori ) {
    678                String ori2 = nval( getRequestParameter( ori ),null );
    679                if( ori2 != null && ori2.length() > 0 ) {
    680                        char ch = ori2.toUpperCase(Locale.JAPAN).charAt( 0 );
    681                        if( ch == 'H' ) { isHorizontal = true; }
    682                        else if( ch == 'V' ) { isHorizontal = false; }
    683                        else {
    684                                String errMsg = "orientation の指定は、H(orizontal) または、V(ertical) です。"
    685                                                        + " orientation=" + ori2 ;                      // 5.1.8.0 (2010/07/01) errMsg 修正
    686                                throw new HybsSystemException( errMsg );
    687                        }
    688                }
    689        }
    690
    691        /**
    692         * 【TAG】タブリンクの幅を % 、px 、または "auto" で指定します。
    693         *
    694         * @og.tag
    695         * 初期値は、"auto"(自動設定) です。
    696         * autoの場合、横型表示では、文字の幅に合わせて自動的に調整され、
    697         * 縦型表示の場合は、フレームサイズに合わせて拡大して表示されます。
    698         *
    699         * @param       wh      幅 (% 、px 、または "auto" )
    700         */
    701        public void setWidth( final String wh ) {
    702                width = nval( getRequestParameter( wh ),width );
    703        }
    704
    705        /**
    706         * 【TAG】タブの高さを、% 、px 、または "auto" で指定します。
    707         *
    708         * @og.tag
    709         * タブの高さを、% 、px 、または "auto" で指定します
    710         * 初期値は、"auto"(自動設定) です。
    711         *
    712         * @param       ht      高さ (% 、px 、または "auto" )
    713         */
    714        public void setHeight( final String ht ) {
    715                height = nval( getRequestParameter( ht ),height );
    716        }
    717
    718        /**
    719         * シリアライズ用のカスタムシリアライズ書き込みメソッド
    720         *
    721         * @serialData 一部のオブジェクトは、シリアライズされません。
    722         *
    723         * @param       strm    ObjectOutputStreamオブジェクト
    724         * @throws IOException  入出力エラーが発生した場合
    725         */
    726        private void writeObject( final ObjectOutputStream strm ) throws IOException {
    727                strm.defaultWriteObject();
    728        }
    729
    730        /**
    731         * シリアライズ用のカスタムシリアライズ読み込みメソッド
    732         *
    733         * ここでは、transient 宣言された内部変数の内、初期化が必要なフィールドのみ設定します。
    734         *
    735         * @og.rev 5.1.8.0 (2010/07/01) tabData の初期化処理 追加
    736         * @serialData 一部のオブジェクトは、シリアライズされません。
    737         *
    738         * @param       strm    ObjectInputStreamオブジェクト
    739         * @see #release2()
    740         * @throws IOException  シリアライズに関する入出力エラーが発生した場合
    741         * @throws ClassNotFoundException       クラスを見つけることができなかった場合
    742         */
    743        private void readObject( final ObjectInputStream strm ) throws IOException, ClassNotFoundException {
    744                strm.defaultReadObject();
    745                tabData         = new ArrayList<TabData>();
    746        }
    747
    748        /**
    749         * このオブジェクトの文字列表現を返します。
    750         * 基本的にデバッグ目的に使用します。
    751         *
    752         * @return このクラスの文字列表現
    753         */
    754        @Override
    755        public String toString() {
    756                return org.opengion.fukurou.util.ToString.title(this.getClass().getName() )
    757                .println( "VERSION"       , VERSION )
    758                .println( "listType"      , type.toString() )
    759                .println( "href"          , href )
    760                .println( "target"        , target )
    761                .println( "openTab"       , openTab )
    762                .println( "openTabName"   , openTabName )
    763                .println( "constKeys"     , constKeys )
    764                .println( "constVals"     , constVals )
    765                .println( "listCount"     , listCount )
    766                .println( "selClass"      , selClass )
    767                .println( "unselClass"    , unselClass )
    768                .println( "isHorizontal"  , isHorizontal )
    769                .println( "width"         , width )
    770                .println( "height"        , height )
    771                .println( "Other...", getAttributes().getAttribute() ).fixForm().toString();
    772        }
    773}