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 * ●形式:<og:splitView  fixDisplay="CLM,NAME_JA"><og:view ・・・  /></og:splitView>
035 * ●body:あり(EVAL_BODY_INCLUDE:BODYをインクルードし、{@XXXX} は解析しません)
036 *
037 * ●Tag定義:
038 *   <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 *   >   ... Body ...
047 *   </og:splitView>
048 *
049 * ●使用例
050 *    <og:splitView fixDisplay="CLM,NAME_JA">
051 *      <og:view
052 *          viewFormType    = "HTMLTable"
053 *          command         = "{@command}"
054 *          checked         = "{@checked}"
055 *          startNo         = "{@startNo}"
056 *          pageSize        = "{@pageSize}"
057 *          noWritable      = "{@noWritable}"
058 *          columnWritable  = "{@columnWritable}"
059 *      />
060 *    </og:splitView>
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タグを2回出力する必要があります。
244         * ここでは isFirstStep="true" が1回目(左側:固定部)で、false が
245         * 右側(可変部)になるように、View側で制御します。
246         *
247         * @return      BODY部の view 処理の制御(true:1回目 / false:2回目)
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}