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