    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.4.3.0 (2023/03/31)" ;
    074        private static final long serialVersionUID = 843020230331L ;
    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//                              + "<table id=\"GantBody\" border=\"0px\" style=\"clear:both;\">"        + CR    // 8.4.1.2 (2023/03/03)
    088                                + "<table id=\"GantBody\" border=\"0px\" >"                             + CR                            // 8.4.3.0 (2023/03/31) cssで対応
    089                                + "  <tr>"                                                                                              + CR
    090                                + "    <td class=\"GantTd\" >"                                                  + CR
    091                                + "      <div id=\"X1\" >"                                                              + CR ;
    092
    093        private static final String SPLIT_B =
    094                                  "      </div>"                                                                                + CR
    095                                + "    </td>"                                                                                   + CR
    096                                // 8.2.0.2 (2022/06/24) Modify
    097//                              + "    <td valign=\"top\" style=\"margin:0px; padding:0px;\">"          + CR
    098//                              + "      <div id=\"X2\" style=\"position:absolute; overflow-x:hidden; overflow-y:hidden;\" >" + CR ;
    099                                + "    <td class=\"GantTd\" >"                                                  + CR
    100                                + "      <div id=\"X2\" >"                                                              + CR ;
    101
    102        private static final String SPLIT_C =
    103                                  "       </div>"               + CR
    104                                + "    </td>"                   + CR
    105                                + "  </tr>"                             + CR
    106                                + "</table>"                    + CR ;
    107
    108        /** 固定するｶﾗﾑ名 */
    109        private String  fixDisplay              ;
    110        /** 左右分割のON/OFFﾌﾗｸﾞ */
    111        private boolean useSplit                = true;
    112
    113        /** BODY部の view 処理の制御 */
    114        private boolean firstStepFlag   = true;
    115
    116        /**
    117         * ﾃﾞﾌｫﾙﾄｺﾝｽﾄﾗｸﾀｰ
    118         *
    119         * @og.rev 6.4.2.0 (2016/01/29) PMD refactoring. Each class should declare at least one constructor.
    120         */
    121        public SplitViewTag() { super(); }              // これも、自動的に呼ばれるが、空のﾒｿｯﾄﾞを作成すると警告されるので、明示的にしておきます。
    122
    123        /**
    124         * Taglibの開始ﾀｸﾞが見つかったときに処理する doStartTag() を ｵｰﾊﾞｰﾗｲﾄﾞします。
    125         *
    126         * @og.rev 6.9.5.0 (2018/04/23) 左右分割に、使用をON/OFFするﾌﾗｸﾞを追加
    127         *
    128         * @return      後続処理の指示( EVAL_BODY_INCLUDE )
    129         */
    130        @Override
    131        public int doStartTag() {
    132                // 6.9.5.0 (2018/04/23) 左右分割に、使用をON/OFFするﾌﾗｸﾞを追加
    133                if( useTag() ) {
    134                        if( useSplit ) {
    135                                firstStepFlag = true;
    136                                // EVAL_BODY_BUFFERED ではなく、Viewなので、INCLUDE 処理します。
    137                                jspPrint( SPLIT_A );
    138                        }
    139                        return EVAL_BODY_INCLUDE ;                      // Body ｲﾝｸﾙｰﾄﾞ( extends TagSupport 時)
    140                }
    141                return SKIP_BODY ;                                              // Body を評価しない
    142
    143//              firstStepFlag = true;
    144//              // EVAL_BODY_BUFFERED ではなく、Viewなので、INCLUDE 処理します。
    145//              jspPrint( SPLIT_A );
    146//              return EVAL_BODY_INCLUDE ;                              // Body ｲﾝｸﾙｰﾄﾞ( extends TagSupport 時)
    147        }
    148
    149        /**
    150         * Taglibのﾀｸﾞ本体を処理する doAfterBody() を ｵｰﾊﾞｰﾗｲﾄﾞします。
    151         *
    152         * @og.rev 6.9.5.0 (2018/04/23) 左右分割に、使用をON/OFFするﾌﾗｸﾞを追加
    153         *
    154         * @return      後続処理の指示(SKIP_BODY)
    155         */
    156        @Override
    157        public int doAfterBody() {
    158                // 6.9.5.0 (2018/04/23) 左右分割に、使用をON/OFFするﾌﾗｸﾞを追加
    159                if( useSplit ) {
    160                        if( firstStepFlag ) {
    161                                firstStepFlag = false;
    162
    163                                jspPrint( SPLIT_B );
    164                                // EVAL_BODY_INCLUDE なので、ｺﾝﾃﾝﾂの取得ではなく、処理のみ実行されます。
    165                                return EVAL_BODY_BUFFERED ;             // ﾎﾞﾃﾞｨｰを再評価( extends BodyTagSupport 時)
    166                        }
    167                        else {
    168                                jspPrint( SPLIT_C );
    169                                return SKIP_BODY ;                              // Body を評価しない
    170                        }
    171                }
    172                return SKIP_BODY ;                                              // Body を評価しない
    173
    174//              if( firstStepFlag ) {
    175//                      firstStepFlag = false;
    176//
    177//                      jspPrint( SPLIT_B );
    178//                      return EVAL_BODY_BUFFERED ;                     // ﾎﾞﾃﾞｨｰを再評価( extends BodyTagSupport 時)
    179//              }
    180//              else {
    181//                      jspPrint( SPLIT_C );
    182//                      return SKIP_BODY ;                                      // Body を評価しない
    183//              }
    184        }
    185
    186        /**
    187         * ﾀｸﾞﾘﾌﾞｵﾌﾞｼﾞｪｸﾄをﾘﾘｰｽします。
    188         * ｷｬｯｼｭされて再利用されるので、ﾌｨｰﾙﾄﾞの初期設定を行います。
    189         */
    190        @Override
    191        protected void release2() {
    192                super.release2();
    193                fixDisplay = null;
    194                useSplit   = true;
    195        }
    196
    197        /**
    198         * 【TAG】固定するｶﾗﾑ名を、CSV形式(CSV形式)で設定します。
    199         *
    200         * @og.tag
    201         * Viewﾀｸﾞの左側(固定部)には、このﾀｸﾞで指定された fixDisplay のｶﾗﾑを
    202         * columnDisplay に設定します。
    203         * Viewﾀｸﾞの右側には、fixDisplay のｶﾗﾑを noDisplay のｶﾗﾑに設定します。
    204         * 既存の設定値(noDisplay)があれば、それに追記されます。
    205         *
    206         * @og.rev 7.0.5.0 (2019/09/09) StringUtil#nvalCsv(String,String) で、CSV形式の文字列を正規化します。
    207         *
    208         * @param       clms    固定するｶﾗﾑ名(CSV形式)
    209         */
    210        public void setFixDisplay( final String clms ) {
    211//              fixDisplay = nval( getRequestParameter( clms ),fixDisplay );
    212                fixDisplay = StringUtil.nvalCsv( getRequestParameter( clms ),fixDisplay );      // 7.0.5.0 (2019/09/09)
    213        }
    214
    215        /**
    216         * 固定するｶﾗﾑ名を、CSV形式(CSV形式)で取得します。
    217         *
    218         * これは、BODY部に記述された、viewﾀｸﾞからｱｸｾｽされるﾒｿｯﾄﾞです。
    219         * 設定されていない場合は、null です。
    220         *
    221         * @return      固定するｶﾗﾑ名(CSV形式)
    222         */
    223        protected String getFixDisplay() {
    224                return fixDisplay ;
    225        }
    226
    227        /**
    228         * 【TAG】左右分割機能の ON/OFF を設定します(初期値=true:左右分割を使用する)。
    229         *
    230         * @og.tag
    231         * 左右分割する場合は、trueを、分割せずに、BODYのviewﾀｸﾞだけ使用する場合は、false をｾｯﾄします。
    232         * BODYも含めての使用を制御する場合は、case属性(caseKey , caseVal , caseNN , caseNull , caseIf)を、
    233         * 使用してください。
    234         * 初期値は、true:左右分割を使用する です。
    235         *
    236         * @og.rev 6.9.5.0 (2018/04/23) 左右分割に、使用をON/OFFするﾌﾗｸﾞを追加
    237         * @og.rev 7.0.5.0 (2019/09/09) static import をやめます。
    238         *
    239         * @param       flag    左右分割機能の ON/OFF [true:左右分割/false:BODYのみ表示]
    240         */
    241        public void setUseSplit( final String flag ) {
    242//              useSplit = nval( getRequestParameter( flag ),useSplit );
    243                useSplit = StringUtil.nval( getRequestParameter( flag ),useSplit );             // 7.0.5.0 (2019/09/09) static import をやめます。
    244        }
    245
    246        /**
    247         * 左右分割機能の ON/OFF を取得します。
    248         *
    249         * 左右分割する場合は、trueを、分割せずに、BODYのviewﾀｸﾞだけ使用する場合は、false がｾｯﾄされています。
    250         * これは、BODY部に記述された、viewﾀｸﾞからｱｸｾｽされるﾒｿｯﾄﾞです。
    251         * falseの場合は、viewﾀｸﾞで、左右分割処理を行わないようにします。
    252         *
    253         * @og.rev 6.9.5.0 (2018/04/23) 左右分割に、使用をON/OFFするﾌﾗｸﾞを追加
    254         *
    255         * @return      左右分割機能の ON/OFF[true:左右分割/false:BODYのみ表示]
    256         */
    257        protected boolean isUseSplit() {
    258                return useSplit ;
    259        }
    260
    261        /**
    262         * BODY部の view 処理の制御を行うためのﾌﾗｸﾞを返します。
    263         *
    264         * 左右分割を行うには、Viewﾀｸﾞを2回出力する必要があります。
    265         * ここでは isFirstStep="true" が1回目(左側:固定部)で
    266         * false が右側(可変部)になるように、View側で制御します。
    267         *
    268         * @return      BODY部の view 処理の制御(true:1回目 / false:2回目)
    269         */
    270        protected boolean isFirstStep() {
    271                return firstStepFlag ;
    272        }
    273
    274        /**
    275         * このｵﾌﾞｼﾞｪｸﾄの文字列表現を返します。
    276         * 基本的にﾃﾞﾊﾞｯｸﾞ目的に使用します。
    277         *
    278         * @return      このｸﾗｽの文字列表現
    279         * @og.rtnNotNull
    280         */
    281        @Override
    282        public String toString() {
    283                return ToString.title( this.getClass().getName() )
    284                                .println( "VERSION"             ,VERSION        )
    285                                .println( "fixDisplay"  ,fixDisplay     )
    286                                .println( "Other..."    ,getAttributes().getAttribute() )
    287                                .fixForm().toString() ;
    288        }
    289}