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