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}