    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.HybsSystem;
    019import static org.opengion.fukurou.util.StringUtil.nval;
    020
    021
    022/**
    023 * 左右分割スクロール処理を行う、View を設定します。
    024 *
    025 * BODY部に記述された Viewタグに対して、左右分割情報を追記設定します。
    026 * Viewタグの左側には、このタグで指定された fixDisplay のカラムを columnDisplay に
    027 * 設定するとともに、このタグで指定された numberType をセットします。
    028 * (初期値は、numberType="sequence" です。)
    029 * Viewタグの右側には、fixDisplay のカラムを noDisplay のカラムに設定するとともに、
    030 * command="VIEW" , noMessage="true" , useSelectedRow="false" , numberType="delete"
    031 * をセットします。(既存の設定値があれば、それに追記されます。)
    032 *
    033 * @og.formSample
    034 * ●形式：&lt;og:splitView  fixDisplay="CLM,NAME_JA"&gt;&lt;og:view ・・・  /&gt;&lt;/og:splitView&gt;
    035 * ●body：あり(EVAL_BODY_INCLUDE:BODYをインクルードし、{&#064;XXXX} は解析しません)
    036 *
    037 * ●Tag定義：
    038 *   &lt;og:splitView
    039 *       fixDisplay         【TAG】固定するカラム名を、CSV形式(カンマ区切り文字列)で設定します
    040 *       debug              【TAG】デバッグ情報を出力するかどうか[true/false]を指定します(初期値:false)
    041 *   &gt;   ... Body ...
    042 *   &lt;/og:splitView&gt;
    043 *
    044 * ●使用例
    045 *    &lt;og:splitView fixDisplay="CLM,NAME_JA"&gt;
    046 *      &lt;og:view
    047 *          viewFormType    = "HTMLTable"
    048 *          command         = "{&#064;command}"
    049 *          checked         = "{&#064;checked}"
    050 *          startNo         = "{&#064;startNo}"
    051 *          pageSize        = "{&#064;pageSize}"
    052 *          noWritable      = "{&#064;noWritable}"
    053 *          columnWritable  = "{&#064;columnWritable}"
    054 *      /&gt;
    055 *    &lt;/og:splitView&gt;
    056 *
    057 * @og.rev 5.3.0.0 (2010/12/01) 新規作成
    058 * @og.group 画面部品
    059 *
    060 * @version  4.0
    061 * @author       Kazuhiko Hasegawa
    062 * @since    JDK5.0,
    063 */
    064public class SplitViewTag extends CommonTagSupport {
    065        //* このプログラムのVERSION文字列を設定します。   {@value} */
    066        private static final String VERSION = "5.3.0.0 (2010/12/01)" ;
    067
    068        private static final long serialVersionUID = 530020101201L ;
    069
    070        private static final String SPLIT_A =
    071                                  "<style type=\"text/css\">#GantBody div tr { height:22px; }</style>"                              + HybsSystem.CR
    072                                + "<table id=\"GantBody\" border=\"0px\" cellpadding=\"0px\" cellspacing=\"0px\""    + HybsSystem.CR
    073                                + "       frame=\"box\" rules=\"all\" style=\"margin:0px;padding:0px;\">"                    + HybsSystem.CR
    074                                + "  <tr style=\"margin:0px;padding:0px;\">"                                                                              + HybsSystem.CR
    075                                + "    <td valign=\"top\" style=\"margin:0px; padding:0px;\" >"                                           + HybsSystem.CR
    076                                + "      <div id=\"X1\" style=\"overflow-x:hidden; overflow-y:hidden;\" >"                        + HybsSystem.CR ;
    077
    078        private static final String SPLIT_B =
    079                                  "      </div>"                                                                                                  + HybsSystem.CR
    080                                + "    </td>"                                                                                                             + HybsSystem.CR
    081                                + "    <td  valign=\"top\" style=\"margin:0px; padding:0px;\">"           + HybsSystem.CR
    082                                + "      <div id=\"X2\" style=\"position:absolute; overflow-x:hidden; overflow-y:hidden;\" >" + HybsSystem.CR ;
    083
    084        private static final String SPLIT_C =
    085                                  "       </div>"         + HybsSystem.CR
    086                                + "    </td>"                     + HybsSystem.CR
    087                                + "  </tr>"                               + HybsSystem.CR
    088                                + "</table>"                      + HybsSystem.CR ;
    089
    090        private String  fixDisplay    = null;
    091        private boolean firstStepFlag = true;           // BODY部の view 処理の制御
    092
    093        /**
    094         * Taglibの開始タグが見つかったときに処理する doStartTag() を オーバーライドします。
    095         *
    096         * @return      後続処理の指示( EVAL_BODY_INCLUDE )
    097         */
    098        @Override
    099        public int doStartTag() {
    100                firstStepFlag = true;
    101                // EVAL_BODY_BUFFERED ではなく、Viewなので、INCLUDE 処理します。
    102                jspPrint( SPLIT_A );
    103                return( EVAL_BODY_INCLUDE );    // Body インクルード( extends TagSupport 時)
    104        }
    105
    106        /**
    107         * Taglibのタグ本体を処理する doAfterBody() を オーバーライドします。
    108         *
    109         * @return      後続処理の指示(SKIP_BODY)
    110         */
    111        @Override
    112        public int doAfterBody() {
    113                // EVAL_BODY_INCLUDE なので、コンテンツの取得ではなく、処理のみ実行されます。
    114
    115                if( firstStepFlag ) {
    116                        firstStepFlag = false;
    117
    118                        jspPrint( SPLIT_B );
    119                        return( EVAL_BODY_BUFFERED );   // ボディーを再評価( extends BodyTagSupport 時)
    120                }
    121                else {
    122                        jspPrint( SPLIT_C );
    123                        return(SKIP_BODY);                              // Body を評価しない
    124                }
    125        }
    126
    127        /**
    128         * タグリブオブジェクトをリリースします。
    129         * キャッシュされて再利用されるので、フィールドの初期設定を行います。
    130         *
    131         */
    132        @Override
    133        protected void release2() {
    134                super.release2();
    135                fixDisplay = null;
    136        }
    137
    138        /**
    139         * 【TAG】固定するカラム名を、CSV形式(カンマ区切り文字列)で設定します。
    140         *
    141         * @og.tag
    142         * Viewタグの左側(固定部)には、このタグで指定された fixDisplay のカラムを
    143         * columnDisplay に設定します。
    144         * Viewタグの右側には、fixDisplay のカラムを noDisplay のカラムに設定します。
    145         * 既存の設定値(noDisplay)があれば、それに追記されます。
    146         *
    147         * @param   clms 固定するカラム名(カンマ区切り文字列)
    148         */
    149        public void setFixDisplay( final String clms ) {
    150                fixDisplay = nval( getRequestParameter( clms ),fixDisplay );
    151        }
    152
    153        /**
    154         * 固定するカラム名を、CSV形式(カンマ区切り文字列)で取得します。
    155         *
    156         * これは、BODY部に記述された、viewタグからアクセスされるメソッドです。
    157         * 設定されていない場合は、null です。
    158         *
    159         * @return      固定するカラム名(カンマ区切り文字列)
    160         */
    161        protected String getFixDisplay() {
    162                return fixDisplay ;
    163        }
    164
    165        /**
    166         * BODY部の view 処理の制御を行うためのフラグを返します。
    167         *
    168         * 左右分割を行うには、Viewタグを２回出力する必要があります。
    169         * ここでは isFirstStep="true" が１回目(左側:固定部)で、false が
    170         * 右側(可変部)になるように、View側で制御します。
    171         *
    172         * @return      BODY部の view 処理の制御(true:１回目 / false:２回目)
    173         */
    174        protected boolean isFirstStep() {
    175                return firstStepFlag ;
    176        }
    177
    178        /**
    179         * このオブジェクトの文字列表現を返します。
    180         * 基本的にデバッグ目的に使用します。
    181         *
    182         * @return このクラスの文字列表現
    183         */
    184        @Override
    185        public String toString() {
    186                return org.opengion.fukurou.util.ToString.title( this.getClass().getName() )
    187                                .println( "VERSION"                     ,VERSION        )
    188                                .println( "fixDisplay"          ,fixDisplay     )
    189                                .println( "Other..."    ,getAttributes().getAttribute() )
    190                                .fixForm().toString() ;
    191        }
    192}