    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.fukurou.util.ToString;                                              // 6.1.1.0 (2015/01/17)
    019
    020import static org.opengion.fukurou.util.StringUtil.nval;
    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形式(CSV形式)で設定します
    040 *       useSplit            【TAG】左右分割する場合は、trueを、分割せずに、BODYのviewタグだけ使用する場合は、false をセットします。
    041 *       caseKey             【TAG】このタグ自体を利用するかどうかの条件キーを指定します(初期値:null)
    042 *       caseVal             【TAG】このタグ自体を利用するかどうかの条件値を指定します(初期値:null)
    043 *       caseNN              【TAG】指定の値が、null/ゼロ文字列 でない場合(Not Null=NN)は、このタグは使用されます(初期値:判定しない)
    044 *       caseNull            【TAG】指定の値が、null/ゼロ文字列 の場合は、このタグは使用されます(初期値:判定しない)
    045 *       caseIf              【TAG】指定の値が、true/TRUE文字列の場合は、このタグは使用されます(初期値:判定しない)
    046 *   &gt;   ... Body ...
    047 *   &lt;/og:splitView&gt;
    048 *
    049 * ●使用例
    050 *    &lt;og:splitView fixDisplay="CLM,NAME_JA"&gt;
    051 *      &lt;og:view
    052 *          viewFormType    = "HTMLTable"
    053 *          command         = "{&#064;command}"
    054 *          checked         = "{&#064;checked}"
    055 *          startNo         = "{&#064;startNo}"
    056 *          pageSize        = "{&#064;pageSize}"
    057 *          noWritable      = "{&#064;noWritable}"
    058 *          columnWritable  = "{&#064;columnWritable}"
    059 *      /&gt;
    060 *    &lt;/og:splitView&gt;
    061 *
    062 * @og.rev 5.3.0.0 (2010/12/01) 新規作成
    063 * @og.group 画面部品
    064 *
    065 * @version  4.0
    066 * @author       Kazuhiko Hasegawa
    067 * @since    JDK5.0,
    068 */
    069public class SplitViewTag extends CommonTagSupport {
    070        /** このプログラムのVERSION文字列を設定します。   {@value} */
    071        private static final String VERSION = "6.9.5.0 (2018/04/23)" ;
    072        private static final long serialVersionUID = 695020180423L ;
    073
    074        private static final String SPLIT_A =
    075                                  "<style type=\"text/css\">#GantBody div tr { height:22px; }</style>"                          + CR
    076                                + "<table id=\"GantBody\" border=\"0px\" cellpadding=\"0px\" cellspacing=\"0px\""       + CR
    077                                + "       frame=\"box\" rules=\"all\" style=\"margin:0px;padding:0px;\">"                       + CR
    078                                + "  <tr style=\"margin:0px;padding:0px;\">"                                                                            + CR
    079                                + "    <td valign=\"top\" style=\"margin:0px; padding:0px;\" >"                                         + CR
    080                                + "      <div id=\"X1\" style=\"overflow-x:hidden; overflow-y:hidden;\" >"                      + CR ;
    081
    082        private static final String SPLIT_B =
    083                                  "      </div>"                                                                                                        + CR
    084                                + "    </td>"                                                                                                           + CR
    085                                + "    <td valign=\"top\" style=\"margin:0px; padding:0px;\">"          + CR
    086                                + "      <div id=\"X2\" style=\"position:absolute; overflow-x:hidden; overflow-y:hidden;\" >" + CR ;
    087
    088        private static final String SPLIT_C =
    089                                  "       </div>"               + CR
    090                                + "    </td>"                   + CR
    091                                + "  </tr>"                             + CR
    092                                + "</table>"                    + CR ;
    093
    094        private String  fixDisplay              ;
    095        private boolean useSplit                = true;         // 左右分割のON/OFFﾌﾗｸﾞ
    096
    097        private boolean firstStepFlag   = true;         // BODY部の view 処理の制御
    098
    099        /**
    100         * デフォルトコンストラクター
    101         *
    102         * @og.rev 6.4.2.0 (2016/01/29) PMD refactoring. Each class should declare at least one constructor.
    103         */
    104        public SplitViewTag() { super(); }              // これも、自動的に呼ばれるが、空のメソッドを作成すると警告されるので、明示的にしておきます。
    105
    106        /**
    107         * Taglibの開始タグが見つかったときに処理する doStartTag() を オーバーライドします。
    108         *
    109         * @og.rev 6.9.5.0 (2018/04/23) 左右分割に、使用をON/OFFするﾌﾗｸﾞを追加
    110         *
    111         * @return      後続処理の指示( EVAL_BODY_INCLUDE )
    112         */
    113        @Override
    114        public int doStartTag() {
    115                // 6.9.5.0 (2018/04/23) 左右分割に、使用をON/OFFするﾌﾗｸﾞを追加
    116                if( useTag() ) {
    117                        if( useSplit ) {
    118                                firstStepFlag = true;
    119                                // EVAL_BODY_BUFFERED ではなく、Viewなので、INCLUDE 処理します。
    120                                jspPrint( SPLIT_A );
    121                        }
    122                        return EVAL_BODY_INCLUDE ;              // Body インクルード( extends TagSupport 時)
    123                }
    124                return SKIP_BODY ;                                      // Body を評価しない
    125
    126//              firstStepFlag = true;
    127//              // EVAL_BODY_BUFFERED ではなく、Viewなので、INCLUDE 処理します。
    128//              jspPrint( SPLIT_A );
    129//              return EVAL_BODY_INCLUDE ;                                      // Body インクルード( extends TagSupport 時)
    130        }
    131
    132        /**
    133         * Taglibのタグ本体を処理する doAfterBody() を オーバーライドします。
    134         *
    135         * @og.rev 6.9.5.0 (2018/04/23) 左右分割に、使用をON/OFFするﾌﾗｸﾞを追加
    136         *
    137         * @return      後続処理の指示(SKIP_BODY)
    138         */
    139        @Override
    140        public int doAfterBody() {
    141                // 6.9.5.0 (2018/04/23) 左右分割に、使用をON/OFFするﾌﾗｸﾞを追加
    142                if( useSplit ) {
    143                        if( firstStepFlag ) {
    144                                firstStepFlag = false;
    145
    146                                jspPrint( SPLIT_B );
    147                                // EVAL_BODY_INCLUDE なので、コンテンツの取得ではなく、処理のみ実行されます。
    148                                return EVAL_BODY_BUFFERED ;     // ボディーを再評価( extends BodyTagSupport 時)
    149                        }
    150                        else {
    151                                jspPrint( SPLIT_C );
    152                                return SKIP_BODY ;                      // Body を評価しない
    153                        }
    154                }
    155                return SKIP_BODY ;                                      // Body を評価しない
    156
    157//              if( firstStepFlag ) {
    158//                      firstStepFlag = false;
    159//
    160//                      jspPrint( SPLIT_B );
    161//                      return EVAL_BODY_BUFFERED ;     // ボディーを再評価( extends BodyTagSupport 時)
    162//              }
    163//              else {
    164//                      jspPrint( SPLIT_C );
    165//                      return SKIP_BODY ;                      // Body を評価しない
    166//              }
    167        }
    168
    169        /**
    170         * タグリブオブジェクトをリリースします。
    171         * キャッシュされて再利用されるので、フィールドの初期設定を行います。
    172         *
    173         */
    174        @Override
    175        protected void release2() {
    176                super.release2();
    177                fixDisplay = null;
    178                useSplit   = true;
    179        }
    180
    181        /**
    182         * 【TAG】固定するカラム名を、CSV形式(CSV形式)で設定します。
    183         *
    184         * @og.tag
    185         * Viewタグの左側(固定部)には、このタグで指定された fixDisplay のカラムを
    186         * columnDisplay に設定します。
    187         * Viewタグの右側には、fixDisplay のカラムを noDisplay のカラムに設定します。
    188         * 既存の設定値(noDisplay)があれば、それに追記されます。
    189         *
    190         * @param   clms 固定するカラム名(CSV形式)
    191         */
    192        public void setFixDisplay( final String clms ) {
    193                fixDisplay = nval( getRequestParameter( clms ),fixDisplay );
    194        }
    195
    196        /**
    197         * 固定するカラム名を、CSV形式(CSV形式)で取得します。
    198         *
    199         * これは、BODY部に記述された、viewタグからアクセスされるメソッドです。
    200         * 設定されていない場合は、null です。
    201         *
    202         * @return      固定するカラム名(CSV形式)
    203         */
    204        protected String getFixDisplay() {
    205                return fixDisplay ;
    206        }
    207
    208        /**
    209         * 【TAG】左右分割機能の ON/OFF を設定します(初期値=true:左右分割を使用する)。
    210         *
    211         * @og.tag
    212         * 左右分割する場合は、trueを、分割せずに、BODYのviewタグだけ使用する場合は、false をセットします。
    213         * BODYも含めての使用を制御する場合は、case属性(caseKey , caseVal , caseNN , caseNull , caseIf)を、
    214         * 使用してください。
    215         * 初期値は、true:左右分割を使用する です。
    216         *
    217         * @og.rev 6.9.5.0 (2018/04/23) 左右分割に、使用をON/OFFするﾌﾗｸﾞを追加
    218         *
    219         * @param   flag 左右分割機能の ON/OFF [true:左右分割/false:BODYのみ表示]
    220         */
    221        public void setUseSplit( final String flag ) {
    222                useSplit = nval( getRequestParameter( flag ),useSplit );
    223        }
    224
    225        /**
    226         * 左右分割機能の ON/OFF を取得します。
    227         *
    228         * 左右分割する場合は、trueを、分割せずに、BODYのviewタグだけ使用する場合は、false がセットされています。
    229         * これは、BODY部に記述された、viewタグからアクセスされるメソッドです。
    230         * falseの場合は、viewタグで、左右分割処理を行わないようにします。
    231         *
    232         * @og.rev 6.9.5.0 (2018/04/23) 左右分割に、使用をON/OFFするﾌﾗｸﾞを追加
    233         *
    234         * @return      左右分割機能の ON/OFF[true:左右分割/false:BODYのみ表示]
    235         */
    236        protected boolean isUseSplit() {
    237                return useSplit ;
    238        }
    239
    240        /**
    241         * BODY部の view 処理の制御を行うためのフラグを返します。
    242         *
    243         * 左右分割を行うには、Viewタグを２回出力する必要があります。
    244         * ここでは isFirstStep="true" が１回目(左側:固定部)で、false が
    245         * 右側(可変部)になるように、View側で制御します。
    246         *
    247         * @return      BODY部の view 処理の制御(true:１回目 / false:２回目)
    248         */
    249        protected boolean isFirstStep() {
    250                return firstStepFlag ;
    251        }
    252
    253        /**
    254         * このオブジェクトの文字列表現を返します。
    255         * 基本的にデバッグ目的に使用します。
    256         *
    257         * @return このクラスの文字列表現
    258         * @og.rtnNotNull
    259         */
    260        @Override
    261        public String toString() {
    262                return ToString.title( this.getClass().getName() )
    263                                .println( "VERSION"                     ,VERSION        )
    264                                .println( "fixDisplay"          ,fixDisplay     )
    265                                .println( "Other..."    ,getAttributes().getAttribute() )
    266                                .fixForm().toString() ;
    267        }
    268}