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 * ●形式:<og:splitView fixDisplay="CLM,NAME_JA"><og:view ・・・ /></og:splitView>
036 * ●body:あり(EVAL_BODY_INCLUDE:BODYをインクルードし、{@XXXX} は解析しません)
037 *
038 * ●Tag定義:
039 *   <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 *   >   ... Body ...
048 *   </og:splitView>
049 *
050 * ●使用例
051 *    <og:splitView fixDisplay="CLM,NAME_JA">
052 *      <og:view
053 *          viewFormType    = "HTMLTable"
054 *          command         = "{@command}"
055 *          checked         = "{@checked}"
056 *          startNo         = "{@startNo}"
057 *          pageSize        = "{@pageSize}"
058 *          noWritable      = "{@noWritable}"
059 *          columnWritable  = "{@columnWritable}"
060 *      />
061 *    </og:splitView>
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}