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}