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    
020    import java.io.IOException;
021    import java.io.ObjectInputStream;
022    import java.io.ObjectOutputStream;
023    import java.util.ArrayList;
024    import java.util.List;
025    import java.util.Locale;
026    
027    import org.opengion.fukurou.util.StringUtil;
028    import org.opengion.fukurou.util.TagBuffer;
029    import org.opengion.fukurou.util.XHTMLTag;
030    import org.opengion.hayabusa.common.HybsSystem;
031    import org.opengion.hayabusa.common.HybsSystemException;
032    import org.opengion.hayabusa.db.DBTableModel;
033    import 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     * â‘?istType属æ?ã�?DB"の場å�?
046     *  検索された各カラãƒ??、そのé ?•ªにより次の意味を持ちますã?
047     *  [第1カラãƒ? タブã?名前        : リンク時ã?キーæƒ??、後述のopenTabName属æ?のキーとしても使用 ※å¿??
048     *  [第2カラãƒ? タブã?表示名称    : タブã?表示名称 æŒ?®šがなã�??合ã?、第1カラãƒ?�Œ表示名称となりますã?
049     *  [第3カラãƒ? タブã?リンクå…?RL : タブã?リンクå…?RL æŒ?®šがなã�??合ã?、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     *  タブã?リンクå…?SP及ã?、クラス属æ?につã�?�¦は、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     * å�?±žæ?は、{@XXXX} 変数が使用できますã?
081     * これは、ServletRequest から、XXXX をキーに値を取りå?ã�?こã?変数に割り当てますã?
082     * つまりã?こã?XXXXをキーにリクエストすれã?、この変数に値をセãƒ?ƒˆすることができますã?
083     *
084     * @og.formSample
085     * ●形式ï¼?lt;og:tabLink href="…" … />
086     * ●body?šあã‚?EVAL_BODY_BUFFERED:BODYを評価しã?{@XXXX} を解析しまã�?
087     *
088     * ●Tag定義??
089     *   <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ã€?行辺りに表示するタブã?数を指定しまã�?初期値: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     *   >   ... Body ...
105     *   </og:tabLink>
106     *
107     * ●使用ä¾?
108     *   â‘?Bからタブリストを取得するå?å�?
109     *
110     *    Body部åˆ?�«記述されたクエリよりタブä¸?¦§を生成しますã?
111     *
112     *      <og:tabLink
113     *          listType        = "DB"                      タブã?ä¸?¦§をどこから取得するか
114     *          href            = "result.jsp"              リンク先ã?JSP
115     *          target          = "RESULT"                  リンクターゲãƒ?ƒˆ
116     *          openTab         = "[true/false]"            タブ表示後にタブを自動で開く
117     *          openTabName     = "{@PN}               自動で開くタブã?名前
118     *          constKeys       = "KEY1"                    次画面に固定で渡すキーä¸?¦§
119     *          constVals       = "{@VAL1}"            次画面に固定で渡すå?ä¸?¦§
120     *          listCount       = "10"                      1行辺りに表示するタブã?数
121     *          selClass        = "selTab"                  選択タブã?クラス
122     *          unselClass      = "unselTab"                非選択タブã?クラス
123     *          width           = "100px"                   タブリンクのå¹?
124     *          height          = "50px"                    タブリンクの高さ
125     *       >
126     *               select PN,HINM,'tabClass','query.jsp','ADMIN','false' from XX01 where PN = '{@PN}' order by PN
127     *      </og:tabLink>
128     *
129     *   ②tabListタグからタブリストを生æ?する場å�?
130     *
131     *    tabListタグよりタブä¸?¦§を生成しますã?
132     *
133     *      <og:tabLink
134     *          listType        = "DB"                      タブã?ä¸?¦§をどこから取得するか
135     *          href            = "result.jsp"              リンク先ã?JSP
136     *          target          = "RESULT"                  リンクターゲãƒ?ƒˆ
137     *          openTab         = "[true/false]"            タブ表示後にタブを自動で開く
138     *          openTabName     = "{@PN}               自動で開くタブã?名前
139     *          constKeys       = "KEY1"                    次画面に固定で渡すキーä¸?¦§
140     *          constVals       = "{@VAL1}"            次画面に固定で渡すå?ä¸?¦§
141     *          listCount       = "10"                      1行辺りに表示するタブã?数
142     *          selClass        = "selTab"                  選択タブã?クラス
143     *          unselClass      = "unselTab"                非選択タブã?クラス
144     *          width           = "100px"                   タブリンクのå¹?
145     *          height          = "50px"                    タブリンクの高さ
146     *       >
147     *          <og:tabList name="TAB1" href="result1.jsp" keys="PN,CDK" vals="ABC,V" />
148     *          <og:tabList name="TAB2" href="result2.jsp" keys="PN,CDK" vals="BCD,W" />
149     *          <og:tabList name="TAB3" href="result3.jsp" keys="PN,CDK" vals="CDE,X" />
150     *      </og:tabLink>
151     *
152     * @og.group 画面表示
153     *
154     * @version  0.9.0      2008/09/26
155     * @author       Nakamura
156     * @since        JDK1.4,
157     */
158    public 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が作æ?されなã�?行数ã�?の場å�?は、リンクä¸?¦§は生æ?されませんã€?
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が定義されてã�?�ªã�??合ã?ã€?番目の有効なタブを開く
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             * ã€?番目に表示されたタブリンク」ですã?
566             * æŒ?®šされてã�?‚‹場合ã?、その名前を持つã€?番目」ã?タブが自動で開かれますã?
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ã€?行辺りに表示するタブã?数を指定しまã�?初期値:10)ã€?
620             *
621             * @og.tag
622             * 1行辺りに表示するタブã?数を指定しますã?
623             * 1行辺りã?タブã?数がこの設定をè¶?�ˆると、è?動的に折り返しますã?
624             * またã?折り返し毎に、左に10pxのマã?ジンを設けますã?
625             * 初期値はã€?0ですã?
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    }