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 static org.opengion.fukurou.util.StringUtil.nval; 019import org.opengion.hayabusa.common.HybsSystemException; 020 021/** 022 * タブ形式のリンクを表示する場合に、タブそのものを表示するタグです。 023 * 024 * tabLinkタグを親タグとし、listType="TAG"を指定した場合に、このタグを使用して 025 * タブを個別に定義します。 026 * 027 * タグの使用方法については、tabLinkタグのドキュメントを参照して下さい。 028 * 029 * 各属性は、{@XXXX} 変数が使用できます。 030 * これは、ServletRequest から、XXXXをキーに値を取り出し,この変数に割り当てます。 031 * つまり、このXXXXをキーにリクエストすれば、この変数に値をセットすることができます。 032 * 033 * @og.formSample 034 * ●形式:<og:tabLink href="…" > <og:tabList name="TAB1" … /> … </og:tabLink > 035 * ●body:なし 036 * 037 * ●Tag定義: 038 * <og:tabList 039 * name ○【TAG】要素に対して固有の名前をつけます(必須)。 040 * lbl 【TAG】ラベルリソースのラベルIDを指定します 041 * href 【TAG】リンク先のJSPを指定します(初期値:result.jsp) 042 * term 【TAG】処理する条件を指定します(初期値:null) 043 * termList 【TAG】処理する条件を含むような文字列を指定します 044 * delTerm 【TAG】処理しないタブを選択する条件を指定します(初期値:null) 045 * delTermList 【TAG】処理しない条件を含むような文字列を指定します 046 * unselClass 【TAG】非選択タブのクラスを指定します(初期値:unselTab) 047 * keys 【TAG】リンク先のJSPに引数として渡すキーをCSV形式で指定します 048 * vals 【TAG】リンク先のJSPに引数として渡す値をCSV形式で指定します 049 * roles 【TAG】ロールをセットします 050 * debug 【TAG】デバッグ情報を出力するかどうか[true/false]を指定します(初期値:false) 051 * /> 052 * 053 * ●使用例 054 * tabListタグからタブリストを生成する場合 055 * <og:tabLink 056 * listType = "DB" タブの一覧をどこから取得するか 057 * href = "result.jsp" リンク先のJSP 058 * target = "RESULT" リンクターゲット 059 * openTab = "[true/false]" タブ表示後にタブを自動で開く 060 * openTabName = "{@PN} 自動で開くタブの名前 061 * constKeys = "KEY1" 次画面に固定で渡すキー一覧 062 * constVals = "{@VAL1}" 次画面に固定で渡す値一覧 063 * listCount = "10" 1行辺りに表示するタブの数 064 * selClass = "selTab" 選択タブのクラス 065 * unselClass = "unselTab" 非選択タブのクラス 066 * width = "100px" タブリンクの幅 067 * height = "50px" タブリンクの高さ 068 * > 069 * <og:tabList name="TAB1" href="result1.jsp" keys="PN,CDK" vals="ABC,V" /> 070 * <og:tabList name="TAB2" href="result2.jsp" keys="PN,CDK" vals="BCD,W" /> 071 * <og:tabList name="TAB3" href="result3.jsp" keys="PN,CDK" vals="CDE,X" /> 072 * </og:tabLink> 073 * 074 * @og.group 画面表示 075 * 076 * @version 4.3.5.0 (2008/02/01) 077 * @author Nakamura 078 * @since JDK1.4, 079 */ 080public class TabListTag extends CommonTagSupport { 081 //* このプログラムのVERSION文字列を設定します。 {@value} */ 082 private static final String VERSION = "4.3.5.0 (2009/02/01)" ; 083 084 private static final long serialVersionUID = 435020090201L ; 085 086 private String name = null; 087 private String href = null; 088 private String unselClass = null; 089 090 private String[] keys = null; 091 private String[] vals = null; 092 093 private String term = null; 094 private String termList = null; 095 private String delTerm = null; 096 private String delTermList = null; 097 private boolean visible = false; 098 private TabLinkTag tabLink = null; 099 100 /** 101 * Taglibの開始タグが見つかったときに処理する doStartTag() を オーバーライドします。 102 * 103 * @return 後続処理の指示( SKIP_BODY ) 104 */ 105 @Override 106 public int doStartTag() { 107 tabLink = (TabLinkTag)findAncestorWithClass( this,TabLinkTag.class ); 108 if( tabLink == null ) { 109 String errMsg = "tabLink タグの BODY部で使用してください。"; 110 throw new HybsSystemException( errMsg ); 111 } 112 return( SKIP_BODY ); // Body を評価する。( extends BodyTagSupport 時) 113 } 114 115 /** 116 * Taglibの終了タグが見つかったときに処理する doEndTag() を オーバーライドします。 117 * 118 * @return 後続処理の指示 119 */ 120 @Override 121 public int doEndTag() { 122 debugPrint(); 123 124 visible = getUser().isAccess( get( "roles" ) ); 125 126 // delTermが優先 127 if( visible ) { 128 visible = ( delTermList == null || delTerm == null || delTermList.indexOf( delTerm ) < 0 ); 129 } 130 131 // delTermで表示対象となった場合に、termを処理 132 if( visible ) { 133 visible = ( termList == null || term == null || termList.indexOf( term ) >= 0 ); 134 } 135 136 tabLink.addTag( href, name, getMsglbl(), unselClass, visible, keys, vals ); 137 138 return( EVAL_PAGE ); 139 } 140 141 /** 142 * タグリブオブジェクトをリリースします。 143 * キャッシュされて再利用されるので、フィールドの初期設定を行います。 144 */ 145 @Override 146 protected void release2() { 147 super.release2(); 148 name = null; 149 href = null; 150 term = null; 151 termList = null; 152 delTerm = null; 153 delTermList = null; 154 unselClass = null; 155 keys = null; 156 vals = null; 157 visible = false; 158 tabLink = null; 159 } 160 161 /** 162 * 【TAG】要素に対して固有の名前をつけます。 163 * 164 * @og.tag 165 * 要素に対して固有の名前をつけます。 166 * ここで設定された名称は、自動でタブを表示するためのopenTabName属性判定にも使用されます。 167 * 168 * @param nm タブ名 169 */ 170 public void setName( final String nm ) { 171 name = nval( getRequestParameter( nm ), name ); 172 } 173 174 /** 175 * 【TAG】リンク先のJSPを指定します(初期値:result.jsp)。 176 * 177 * @og.tag 178 * リンク先のJSPを指定します。 179 * ここで指定しない場合は、tagLinkタグの値が適用されます。 180 * 181 * @param hr リンク先のJSP 182 */ 183 public void setHref( final String hr ) { 184 href = nval( getRequestParameter( hr ), href ); 185 } 186 187 /** 188 * 【TAG】処理する条件を指定します(初期値:null)。 189 * 190 * @og.tag 191 * termListで与えられた文字列に、term文字列(大文字/小文字の区別あり)が 192 * 含まれていれば、OPEN選択タブとして処理します。 193 * OPEN選択タブでないタブは、初期値OPENにならないだけで、タブそのものは表示されます。 194 * OPEN選択とDELETE選択が競合した場合は、DELETE選択が優先されます。 195 * 初期値は、 null です。 196 * 197 * @param flag 処理する条件文字列 198 */ 199 public void setTerm( final String flag ) { 200 term = nval( getRequestParameter( flag ),term ); 201 } 202 203 /** 204 * 【TAG】処理する条件を含むような文字列を指定します。 205 * 206 * @og.tag 207 * termListで与えられた文字列に、term文字列(大文字/小文字の区別あり)が 208 * 含まれていれば、OPEN選択タブとして処理します。 209 * 例えば、"A","B","C" という文字列が、term で指定された 210 * 場合に処理するようにしたい場合は、"A|B|C" をセットします。 211 * 初期値は、 null です。 212 * 判定は、文字列を含むかどうかなので、1文字のみの場合は、"|"区切りにする 213 * 必要はありません。 214 * OPEN選択とDELETE選択が競合した場合は、DELETE選択が優先されます。 215 * 216 * @param list 処理する条件(indexOf による含む/含まない判定) 217 */ 218 public void setTermList( final String list ) { 219 termList = nval( getRequestParameter( list ),termList ); 220 } 221 222 /** 223 * 【TAG】処理しないタブを選択する条件を指定します(初期値:null)。 224 * 225 * @og.tag 226 * delTermListで与えられた文字列に、delTerm文字列(大文字/小文字の区別あり)が 227 * 含まれていれば、DELETE選択タブとして処理します。 228 * DELETE選択タブは、タブそのものが表示されません。 229 * ただし、タブのselectIndex は、DELETEされたタブも含めて、カウントされますので、 230 * JSPでの設定時の順番がインデックス番号になります。 231 * OPEN選択とDELETE選択が競合した場合は、DELETE選択が優先されます。 232 * 初期値は、 null です。 233 * 234 * @param flag DELETE選択タブ文字列 235 */ 236 public void setDelTerm( final String flag ) { 237 delTerm = nval( getRequestParameter( flag ),delTerm ); 238 } 239 240 /** 241 * 【TAG】処理しない条件を含むような文字列を指定します。 242 * 243 * @og.tag 244 * delTermListで与えられた文字列に、delTerm文字列(大文字/小文字の区別あり)が 245 * 含まれていれば、DELETE選択タブとして処理します。 246 * 例えば、"A","B","C" という文字列が、delTerm で指定された 247 * 場合に処理しないようにしたい場合は、"A|B|C" をセットします。 248 * 初期値は、 null です。 249 * 判定は、文字列を含むかどうかなので、1文字のみの場合は、"|"区切りにする 250 * 必要はありません。 251 * OPEN選択とDELETE選択が競合した場合は、DELETE選択が優先されます。 252 * 253 * @param list DELETE選択タブ条件文字列(indexOf による含む/含まない判定) 254 */ 255 public void setDelTermList( final String list ) { 256 delTermList = nval( getRequestParameter( list ),delTermList ); 257 } 258 259 /** 260 * 【TAG】非選択タブのクラスを指定します(初期値:unselTab)。 261 * 262 * @og.tag 263 * タブが選択されていない状態にある場合の、タブ部分のクラス名を指定します。 264 * このクラス名を変更する場合は、そのクラスをcustom/custom.css等で再定義して下さい。 265 * tabListタグで指定された値は、tabLinkタグで指定されたものより優先されます。 266 * 初期値は、unselTabです。 267 * 268 * @param cls 選択タブのクラス名 269 */ 270 public void setUnselClass( final String cls ) { 271 unselClass = nval( getRequestParameter( cls ), unselClass ); 272 } 273 274 /** 275 * 【TAG】リンク先のJSPに引数として渡すキーをCSV形式で指定します。 276 * 277 * @og.tag 278 * リンク先のJSPに引数として渡すキーをCSV形式で指定します。 279 * 280 * @param key キー(CSV形式) 281 */ 282 public void setKeys( final String key ) { 283 keys = getCSVParameter( key ); 284 } 285 286 /** 287 * 【TAG】リンク先のJSPに引数として渡す値をCSV形式で指定します。 288 * 289 * @og.tag 290 * リンク先のJSPに引数として渡す値をCSV形式で指定します。 291 * 292 * @param val 値(CSV形式) 293 */ 294 public void setVals( final String val ) { 295 vals = getCSVParameter( val ); 296 } 297 298 /** 299 * 【TAG】ロールをセットします。 300 * 301 * @og.tag 302 * ここで指定したカラムロールを元に、ユーザー毎のアクセス許可がチェックされます。 303 * アクセス許可されないと、表示されません。 304 * このロールを指定しない場合は、カラムリソースのロールが使用されます。 305 * 306 * @param roles パラメータ 307 */ 308 public void setRoles( final String roles ) { 309 set( "roles",getRequestParameter( roles ) ); 310 } 311 312 /** 313 * このオブジェクトの文字列表現を返します。 314 * 基本的にデバッグ目的に使用します。 315 * 316 * @return このクラスの文字列表現 317 */ 318 @Override 319 public String toString() { 320 return org.opengion.fukurou.util.ToString.title( this.getClass().getName() ) 321 .println( "VERSION" ,VERSION ) 322 .println( "name" ,name ) 323 .println( "href" ,href ) 324 .println( "term" ,term ) 325 .println( "termList" ,termList ) 326 .println( "delTerm" ,delTerm ) 327 .println( "delTermList" ,delTermList) 328 .println( "Other..." ,getAttributes().getAttribute() ) 329 .fixForm().toString() ; 330 } 331}