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.hayabusa.common.HybsSystem; 019 020import static org.opengion.fukurou.util.StringUtil.nval; 021 022import java.util.concurrent.atomic.AtomicInteger; // 5.5.2.6 (2012/05/25) findbugs対応 023 024/** 025 * Query画面の拡張検索領域を指定用のタグです。 026 * 027 * 通常は属性を何もセットせずにQuery画面の隠しメニューに利用します。 028 * queryButtonタグが存在しない場合はボタンを出力したい場所にIDをセットしたspanタグを 029 * 配置し、そのIDをこのタグのbuttonId属性で指定して下さい。 030 * タグの動きとしてはにはbody内に書いた内容をbuttonIdで指定した領域に動的に作成した 031 * ボタン(初期値はシステムパラメータの画像)でON/OFF制御可能とします。 032 * なお、body部分にはog:firldsetタグも利用可能です。 033 * 034 * @og.formSample 035 * <pre> 036 * ●形式: 037 * ・<og:hideMenu 038 * [ id = "uniqHideId" ] タグで囲われた部分に付けるID 039 * [ buttonId = "targetId" ] ボタンを出力する場所のIDを指定 040 * [ defaultNone = "[true|false]" ] 初期状態の開閉指定 041 * [ openButton = "open.png" ] 開く(+)ボタンの画像 042 * [ closeButton = "close.png" ] 閉じる(−)ボタンの画像 043 * [ lbl = "MSG0076" ] 画像のalt属性に付けるメッセージ(初期値:MSG0076) 044 * > 045 * ●body:あり(EVAL_BODY_INCLUDE:BODYをインクルードし、{@XXXX} は解析しません) 046 * 047 * ●Tag定義: 048 * <og:hideMenu 049 * id 【TAG】このタグのBODY部分にIDを指定します 050 * buttonId 【TAG】画像ボタン出力先のIDを指定します 051 * defaultNone 【TAG】初期状態の開閉指定[[true:閉じている/false:開いている]を指定します(初期値:true) 052 * openButton 【TAG】開くボタンの画像を指定します 053 * closeButton 【TAG】閉じるボタンの画像を指定します 054 * lbl 【TAG】ラベルリソースのラベルIDを指定します 055 * debug 【TAG】デバッグ情報を出力するかどうか[true/false]を指定します(初期値:false) 056 * > ... Body ... 057 * </og:hideMenu> 058 * 059 * ●使用例 060 * 例1:通常のQUERY画面での利用 061 * <og:hideMenu> 062 * <table><tr> 063 * <og:column name="CLM"/> 064 * </tr></table> 065 * </og:hideMenu> 066 * 067 * 例2:queryButtonタグが存在しない状況での利用(buttonIdの明示的な指定) 068 * <span id="hideButtonSet"> </span> 069 * <og:hideMenu> 070 * ...... 071 * </og:hideMenu> 072 * </pre> 073 * @og.rev 4.3.6.0 (2009/04/01) 新規作成 074 * @og.group 画面部品 075 * 076 * @version 4.0 077 * @author Takahashi Masakazu 078 * @since JDK5.0, 079 */ 080public class HideMenuTag extends CommonTagSupport { 081 //* このプログラムのVERSION文字列を設定します。 {@value} */ 082 private static final String VERSION = "5.7.1.2 (2013/12/20)" ; 083 084 private static final long serialVersionUID = 571220131220L ; 085 086// private static volatile int uniqID = 1 ; // ユニークID作成用 087 private static final AtomicInteger uniqID = new AtomicInteger(1); // 5.5.2.6 (2012/05/25) findbugs対応 088 089 private String id = null; // この領域に付けるid 090 private String buttonId = "query-button-append"; // ボタンを出力する場所のid 091 private boolean defaultNone = true; // 開閉初期状態 092 093 private String openButton = HybsSystem.sys( "JSP" ) + "/image/" + HybsSystem.sys( "HIDE_OPEN_BUTTON" ); // 開くボタン 094 private String closeButton = HybsSystem.sys( "JSP" ) + "/image/" + HybsSystem.sys( "HIDE_CLOSE_BUTTON" ); // 閉じるボタン 095 private String hideClass = null; // 5.5.4.4 (2012/07/20) 096 097 /** 098 * Taglibの開始タグが見つかったときに処理する doStartTag() を オーバーライドします。 099 * 100 * @og.rev 5.5.2.6 (2012/05/25) findbugs対応。staticフィールドへの書き込みに、AtomicInteger を利用します。 101 * @og.rev 5.5.3.2 (2012/06/08) 画像にalt属性を追加します。 102 * @og.rev 5.5.4.4 (2012/07/20) hideClassを外部から指定可能にします 103 * @og.rev 5.7.1.2 (2013/12/20) msg ⇒ msglbl 変更 104 * 105 * @return 後続処理の指示( EVAL_BODY_INCLUDE ) 106 */ 107 @Override 108 public int doStartTag() { 109 String IMG = null; // imgタグ 110// String hideClass = "hideMenu" + String.valueOf( uniqID++ ); // ユニークだが、JS側がクラスで制御するため。 111// String hideClass = "hideMenu" + ( uniqID++ ); // ユニークだが、JS側がクラスで制御するため。 112// String hideClass = "hideMenu" + ( uniqID.getAndIncrement() ); // 5.5.2.6 (2012/05/25) findbugs対応 113 if( hideClass == null || hideClass.length() == 0 ){ // 5.5.4.4 (2012/07/20) 外部指定対応 114 hideClass = "hideMenu" + ( uniqID.getAndIncrement() ); 115 } 116 117 118 // 5.5.3.2 (2012/06/08) 画像にalt属性を追加します。 119 String msg = getMsglbl(); 120 String msglbl = getMsglbl(); // 5.7.1.2 (2013/12/20) msg ⇒ msglbl 変更 121// if( msg == null ) { setLbl( "MSG0076" ); msg = getMsglbl(); } // 初期値は、MSG0076:拡張検索条件 122 if( msglbl == null ) { setLbl( "MSG0076" ); msglbl = getMsglbl(); } // 初期値は、MSG0076:拡張検索条件 123 124 StringBuilder buf = new StringBuilder( HybsSystem.BUFFER_MIDDLE ); 125 buf.append( "<div class=\"" ).append( hideClass ).append( "\" " ); 126 if( id != null){ buf.append( "id\"=" + id + "\" " ); } 127 if( defaultNone ){ 128 buf.append( "style=\"display: none;\"" ); 129// IMG = " <img id=\"queryHide\" src=\"" + openButton + "\" alt=\"Expand\" border=\"0px\" "+ 130// IMG = " <img id=\"queryHide\" src=\"" + openButton + "\" alt=\"" + msg + "\" border=\"0px\" "+ 131 IMG = " <img id=\"queryHide\" src=\"" + openButton + "\" alt=\"" + msglbl + "\" border=\"0px\" "+ 132 " onClick=\"hideClass( event, this, '" + hideClass + "', '" + openButton + "', '" + closeButton + "' )\"/> "; 133 } 134 else{ 135// IMG = " <img id=\"queryHide\" src=\"" + closeButton + "\" alt=\"Expand\" border=\"0px\" "+ 136// IMG = " <img id=\"queryHide\" src=\"" + closeButton + "\" alt=\"" + msg + "\" border=\"0px\" "+ 137 IMG = " <img id=\"queryHide\" src=\"" + closeButton + "\" alt=\"" + msglbl + "\" border=\"0px\" "+ 138 " onClick=\"hideClass( event, this, '" + hideClass + "', '" + openButton + "', '" + closeButton + "' )\"/> "; 139 } 140 buf.append( ">" ); 141 142 // 指定したIDにボタン画像を放り込むスクリプトを出力 143 if( buttonId != null && buttonId.length() > 0){ 144 buf.append( "<script language=\"javascript\">" ).append( HybsSystem.CR ); 145 buf.append( "$(function(){$('#" + buttonId + "').append(\"" ); 146 buf.append( IMG.replace( "\"", "\\\"" ) ); 147 buf.append( "\");})" ).append( HybsSystem.CR ); 148 buf.append( "</script>").append( HybsSystem.CR ); 149 } 150 151 jspPrint( buf.toString() ); 152 return( EVAL_BODY_INCLUDE ); // Body インクルード( extends TagSupport 時) 153 } 154 155 /** 156 * Taglibの終了タグが見つかったときに処理する doEndTag() を オーバーライドします。 157 * 158 * @return 後続処理の指示 159 */ 160 @Override 161 public int doEndTag() { 162 debugPrint(); 163 164 jspPrint( HybsSystem.CR + "</div>" ); 165 166 return(EVAL_PAGE); // ページの残りを評価する。 167 } 168 169 /** 170 * タグリブオブジェクトをリリースします。 171 * キャッシュされて再利用されるので、フィールドの初期設定を行います。 172 * 173 * @og.rev 5.5.4.4 (2012/07/20) hideClass対応 174 */ 175 @Override 176 protected void release2() { 177 super.release2(); 178 id = null; 179 buttonId = "query-button-append"; 180 defaultNone = true; 181 openButton = HybsSystem.sys( "JSP" ) + "/image/" + HybsSystem.sys( "HIDE_OPEN_BUTTON" ); // 開くボタン 182 closeButton = HybsSystem.sys( "JSP" ) + "/image/" + HybsSystem.sys( "HIDE_CLOSE_BUTTON" ); // 閉じるボタン 183 hideClass = null; 184 } 185 186 /** 187 * 【TAG】このタグのBODY部分にIDを指定します。 188 * 189 * @og.tag 190 * 開閉される部分を囲っているDIVにIDを指定します。 191 * 特定のhideMenuにスタイルを指定したい場合等に利用して下さい。 192 * 193 * @param input BODY部分のID 194 */ 195 @Override 196 public void setId( final String input) { 197 id = nval( getRequestParameter( input ), id ); 198 } 199 200 /** 201 * 【TAG】画像ボタン出力先のIDを指定します。 202 * 203 * @og.tag 204 * 初期値は"query-button-append"です。 205 * queryButtonタグが存在する画面では通常指定する必要はありません。 206 * queryButtonタグが存在しない場合は、別途用意したspanタグの 207 * IDを指定する事でボタンが表示されます。 208 * 209 * @param input 出力先のID 210 * 211 */ 212 public void setButtonId( final String input) { 213 buttonId = nval( getRequestParameter( input ), buttonId ); 214 } 215 216 /** 217 * 【TAG】初期状態の開閉指定[[true:閉じている/false:開いている]を指定します(初期値:true)。 218 * 219 * @og.tag 220 * 初期状態が開いているか、閉じているかを指定します。 221 * 初期値は閉じる(true)です。 222 * 223 * @param flag 開閉指定 [true:閉じている/false:開いている] 224 * 225 */ 226 public void setDefaultNone( final String flag) { 227 defaultNone = nval( getRequestParameter( flag ), defaultNone ); 228 } 229 230 /** 231 * 【TAG】開くボタンの画像を指定します。 232 * 233 * @og.tag 234 * ボタンの画像を指定します。 235 * 絶対パスの場合は、システムの先頭から、相対パスの場合、基底は各画面のフォルダとなります。 236 * 初期値はjsp/imageフォルダ内のシステムパラメータHIDE_OPEN_BUTTONのファイルです。 237 * (/システムID/jsp/image/expand_u.png) 238 * 239 * @param name 画像ファイル名 240 * 241 */ 242 public void setOpenButton( final String name) { 243 openButton = nval( getRequestParameter( name ), openButton ); 244 } 245 246 /** 247 * 【TAG】閉じるボタンの画像を指定します。 248 * 249 * @og.tag 250 * ボタンの画像を指定します。 251 * 絶対パスの場合は、システムの先頭から、相対パスの場合、基底は各画面のフォルダとなります。 252 * 初期値はjsp/imageフォルダ内のシステムパラメータHIDE_CLOSE_BUTTONのファイルです。 253 * (/システムID/jsp/image/shrink_u.png) 254 * 255 * @param name 画像ファイル名 256 * 257 */ 258 public void setCloseButton( final String name) { 259 closeButton = nval( getRequestParameter( name ), closeButton ); 260 } 261 262 /** 263 * 【TAG】開閉するclassを指定します。 264 * 265 * @og.tag 266 * 開閉を制御するためのclass属性を外部から指定します。 267 * 指定しない場合は自動でユニークなClassがセットされます。 268 * 269 * @param name クラス 270 * 271 * @og.rev 5.5.4.4 (2012/07/20) 新規追加 272 */ 273 public void setHideClass( final String name) { 274 hideClass = nval( getRequestParameter( name ), hideClass ); 275 } 276 277 /** 278 * このオブジェクトの文字列表現を返します。 279 * 基本的にデバッグ目的に使用します。 280 * 281 * @return このクラスの文字列表現 282 */ 283 @Override 284 public String toString() { 285 return org.opengion.fukurou.util.ToString.title( this.getClass().getName() ) 286 .println( "VERSION" ,VERSION ) 287 .println( "id" ,id ) 288 .println( "buttonId" ,buttonId ) 289 .println( "defaultNone" ,defaultNone ) 290 .println( "openButton" ,openButton ) 291 .println( "closeButton" ,closeButton ) 292 .println( "Other..." ,getAttributes().getAttribute() ) 293 .fixForm().toString() ; 294 } 295}