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.hayabusa.common.HybsSystemException; 020import org.opengion.hayabusa.resource.GUIInfo; 021import org.opengion.hayabusa.resource.UserInfo; 022import org.opengion.hayabusa.resource.CodeData; 023import org.opengion.hayabusa.resource.FavoriteGUIData; 024import org.opengion.hayabusa.resource.ResourceManager; 025import org.opengion.fukurou.util.XHTMLTag; 026import org.opengion.fukurou.util.FileMap; 027import org.opengion.fukurou.util.TagBuffer; 028 029import org.opengion.fukurou.util.StringUtil ; 030import static org.opengion.fukurou.util.StringUtil.nval ; 031 032import java.util.Set ; 033import java.util.LinkedHashSet; 034import java.util.Iterator; 035import java.util.Map; 036 037import java.io.ObjectOutputStream; 038import java.io.ObjectInputStream; 039import java.io.IOException; 040 041/** 042 * 画面アクセスメニューを作成します。 043 * 044 * 画面リソースの階層番号(レベル)は、 045 * 0:グループ分類メニュー(class="GUI_GRP"のtdタグで囲われます) 046 * 1:トップ階層(【分類名称】) 047 * 2:選択階層(通常の折りたたみメニュー) 048 * 3:選択非表示(通常は、隠してあります) 049 * です。 050 * お気に入りメニューを登録するキーワードに、HybsSystem.GUI_FAV_MENU_KEY を使用しています。 051 * これは、エンジン内部で使用しているキーワードです。 052 * 053 * @og.formSample 054 * ●形式:<og:topMenu /> 055 * ●body:なし 056 * 057 * ●Tag定義: 058 * <og:topMenu 059 * menuType 【TAG】作成するメニューの種類(NORMAL,GROUP,ONELEVEL,NEXTGUI,MATRIX,MATRIX2)を指定します(初期値:NORMAL) 060 * expand 【TAG】折り返しメニューを構築するかどうかを指定します(初期値:true) 061 * groups 【TAG】表示対象となるグループをカンマ区切り文字列で指定します 062 * classify 【TAG】表示対象となる分類(classify)を指定します 063 * href 【TAG】グループメニューの表示対象となるソース名(href)を指定します(初期値:menu.jsp) 064 * target 【TAG】グループメニューの表示対象となるフレーム名(target)を指定します(初期値:MENU) 065 * imageOnly 【TAG】グループメニューの表示に、画像のみかどうか[true:画像のみ/false:画像+ラベル]を指定します(初期値:false) 066 * sideCount 【TAG】グループメニューの表示対象となるメニューを横並びさせる数を指定します 067 * minCellCount 【TAG】表形式メニュー(MATRIX)の一つのセルに含まれる最小行数を指定します(初期値:8) 068 * maxCellCount 【TAG】表形式メニュー(MATRIX)の一つのセルに含まれる最大行数を指定します(初期値:8) 069 * cache 【TAG】グループメニューのキャッシュを使用するかどうか[true/false]を指定します(初期値:true) 070 * match 【TAG】正判定(マッチする場合に、メニューに出す)条件を設定します 071 * unmatch 【TAG】逆判定(マッチする場合に、メニューに出さない)条件を設定します 072 * useButton 【TAG】画面リンクにボタンを使用するかどうか[true/false]を指定します(初期値:false) 073 * buttonRequest 【TAG】マトリクスからの遷移先でボタンメニュー表示するかどうか[true/false]を指定します(初期値:false) 074 * inlineStyle 【TAG】標準画面を初期状態で表示するかどうか[true/false]を指定します(初期値:false) 075 * useDivOneLevel 【TAG】ONELEVEL,NEXTGUI で、DIVタグ+design-onelevel 処理をするかどうか[true/false]を指定します(初期値:false) 076 * debug 【TAG】デバッグ情報を出力するかどうか[true/false]を指定します(初期値:false) 077 * useButtonScript 【廃止】ボタンリンクを使用した場合に、JavaScriptのイベントを発生させるかどうか[true/false]を指定します(初期値:false) 078 * > ... Body ... 079 * </og:topMenu> 080 * 081 * ●使用例 082 * <og:topMenu /> 083 * 084 * <og:topMenu 085 * menuType = "NORMAL" NORMAL:通常 / GROUP:グループメニュー / ONELEVEL:1レベル / NEXTGUI:次アクセス先 086 * / MATRIX:一覧表メニュー / MATRIX2:一覧表メニュー(大分類なし版) 087 * expand = "true" true:折り返しメニュー / false:階層メニュー 088 * groups = "AA,BB,CC" 表示対象となるグループをカンマ区切り文字列で指定します。 089 * classify = "ABC" 表示対象となる分類を指定します。 090 * href = "menu.jsp" グループメニューの対象ソース名(href)を指定します。 091 * target = "MENU" グループメニューの対象フレーム名(target)を指定します。 092 * imageOnly = "false" グループメニューに、 true:画像のみ / false:画像+ラベル を指定します。 093 * sideCount = "6" グループメニューの表示対象となるメニューを横並びさせる数を指定します。 094 * minCellCount = "8" 表形式メニューの1セルの最小行数を指定します。 095 * maxCellCount = "8" 表形式メニューの1セルの最大行数を指定します。 096 * cache = "true" グループメニューのキャッシュを使用するかどうか指定します。 097 * match = "正規表現" 正判定(マッチする場合に、メニューに出す)条件を設定します。 098 * unmatch = "正規表現" 逆判定(マッチする場合に、メニューに出さない)条件を設定します。 099 * useButton = "false" ボタン形式のリンクを使用するかを指定します。 100 * useDivOneLevel = "false" ONELEVEL,NEXTGUI で、DIVタグ+design-onelevel 処理をするかどうかを指定します。 101 * /> 102 * 103 * @og.rev 3.5.5.3 (2004/04/09) 新規作成 104 * @og.group メニュー制御 105 * 106 * @version 4.0 107 * @author Kohei Naruse 108 * @since JDK5.0, 109 */ 110public class TopMenuTag extends CommonTagSupport { 111 //* このプログラムのVERSION文字列を設定します。 {@value} */ 112 private static final String VERSION = "5.7.8.1 (2014/07/18)" ; 113 114 private static final long serialVersionUID = 578120140718L ; 115 116 private static final String FIELD_IN = "<fieldset style=\"display:inline;\">"; 117 private static final String FIELD_OUT = "</fieldset>" + HybsSystem.BR; 118 private static final String JSP = HybsSystem.sys( "JSP" ); 119 120 private static final String CNTX = HybsSystem.sys( "CONTEXT_NAME" ); // 5.5.4.2 (2012/07/13) META-INF/resources 対応 121 private static final String MENU_IMG = "/jsp/menuImage/" ; // 5.5.4.2 (2012/07/13) META-INF/resources 対応 122 123 private boolean multiSessionCheck = HybsSystem.sysBool( "USE_MULTI_SESSION_CHECK" ); 124 125 private static final String[] MENU_TYPE = new String[] { "NORMAL","GROUP","ONELEVEL","NEXTGUI","MATRIX","MATRIX2" } ; // 5.2.3.0 (2010/12/01) 126 private String menuType = MENU_TYPE[0] ; // NORMAL:通常 / GROUP:グループメニュー / ONELEVEL:1レベル / MATRIX:一覧表メニュー / MATRIX2:一覧表メニュー(大分類なし版) 127 private boolean expand = true; // true:折り返しメニュー / false:階層メニュー 128 private String[] groups = null; // 表示対象となるグループをカンマ区切り文字列で指定します。 129 private String selClassify= null; // 表示対象となる分類を指定します。 130 private String href = "menu.jsp"; // グループメニューの対象ソース名(href)を指定します。 131 private String target = "MENU"; // グループメニューの対象フレーム名(target)を指定します。 132 private boolean imageOnly = false; // グループメニューに、 true:画像のみ / false:画像+ラベル を指定します 133 private int sideCount = -1; // 5.2.3.0 (2010/12/01) 表示対象となるメニューを横並びさせる数を指定します。 134 private int minCellCount = 8; // 表形式メニューの1セルの最小行数を指定します。 135 private int maxCellCount = 8; // 表形式メニューの1セルの最大行数を指定します。 136 private boolean cache = true; // グループメニューのキャッシュを使用するかどうか指定します。 137 // 3.8.8.7 (2007/05/01) メニューの表示条件指定追加 138 private String match = null; // 正判定(マッチする場合に、メニューに出す)条件を設定 139 private String unmatch = null; // 逆判定(マッチする場合に、メニューに出さない)条件を設定 140 141 private transient FileMap imgFileMap = null; // 5.5.2.5 (2012/05/21) 属性名変更 142 143 // MULTI_SESSION_CHECK 時のリンクに付加する情報 144 private String mscKey = null; 145 146 private boolean useButton = false; // ボタン形式のリンクを使用するか 4.2.1.0 (2008/04/01) 147 private boolean buttonRequest = false; // マトリクス2からの遷移でボタン形式にするかのリクエスト変数 4.2.1.0 (2008/04/17) 148 private boolean excludeButton = false; // 4.3.3.0 (2008/10/01) ボタンメニューの場合でも強制的に従来のプルダウンにします。 149 private boolean inlineStyle = false; // 4.3.3.0 (2008/10/01) trueでLv3の画面にstyle属性でinlineを付加 150 151 private String helpLinkFormat = null; // 5.3.9.0 (2011/09/01) ヘルプリンクフォーマット 152 private transient FileMap helpMap = null; // 5.3.9.0 (2011/09/01) ヘルプファイルが存在するかどうかのキャッシュ 153 154 private boolean useDivOneLevel = false; // 5.5.2.3 (2012/05/15) ONELEVEL,NEXTGUI で、DIVタグ+design-onelevel 処理をするかどうかを指定します。 155 156 /** 157 * Taglibの終了タグが見つかったときに処理する doEndTag() を オーバーライドします。 158 * 159 * @og.rev 4.0.0.0 (2007/10/31) 1レベルメニューの見直し 160 * @og.rev 4.2.1.0 (2008/04/01) マトリクスメニュー2追加 161 * @og.rev 5.2.3.0 (2010/12/01) NEXTGUI 追加 162 * @og.rev 5.3.0.0 (2010/11/22) NEXTGUI もマルチセッションチェックをしない。 163 * @og.rev 5.3.9.0 (2011/09/01) メニューでのヘルプアイコン対応 164 * @og.rev 5.5.0.4 (2012/03/12) FAQ表示対応 165 * @og.rev 5.5.2.5 (2012/05/21) FAQ対応 廃止 166 * @og.rev 5.5.4.2 (2012/07/13) META-INF/resources からの読み取り対応 167 * 168 * @return 後続処理の指示 169 */ 170 @Override 171 public int doEndTag() { 172 debugPrint(); // 4.0.0 (2005/02/28) 173 174 // Ver 4.0.0 2007/09/04 175 // ONELEVEL, NEXTGUI の場合は、multiSessionCheck を行いません。 176 if( multiSessionCheck && !"ONELEVEL".equals( menuType ) && !"NEXTGUI".equals( menuType ) ) { 177 String cnt = (String)getSessionAttribute( HybsSystem.MULTI_SESSION_CHECK ); 178 if( cnt == null ) { 179 String errMsg = "マルチセッションチェックのキーが存在しません。" 180 + "topMenu タグを実行する前に、必ず jspInit タグを" 181 + "実行しておいてください。" ; 182 jspPrint( errMsg ); 183 return SKIP_PAGE ; // ページの残りの処理を行わない。 184 } 185 mscKey = HybsSystem.MULTI_SESSION_CHECK + "=" + cnt ; 186 } 187 188 Set<?> set = pageContext.getServletContext().getResourcePaths( MENU_IMG ); 189 imgFileMap = new FileMap( MENU_IMG,set ); 190 191 // メニューでのヘルプアイコン対応 192 helpLinkFormat = get( "helpLinkFormat" ); 193 if( helpLinkFormat != null && helpLinkFormat.length() > 0 ) { 194 helpMap = new FileMap( get( "helpBaseDir" ) ); 195 } 196 197 if( "NORMAL".equals( menuType ) ) { 198 jspPrint( "<div class=\"forpos\" id=\"dummy\"></div>" + HybsSystem.CR ); 199 if( ! useButton ){ // 4.2.1.0 (2008/04/26) ボタン時にはお気に入りを出さない 200 jspPrint( makeFavoriteMenu() ); 201 } 202 jspPrint( makeMenu() ); 203 } 204 else if( "GROUP".equals( menuType ) ) { 205 jspPrint( makeGroupMenu() ); 206 } 207 // else if( "CLASSIFY".equals( menuType ) ) { 208 // jspPrint( makeClassifyMenu() ); 209 // } 210 else if( "ONELEVEL".equals( menuType ) && selClassify != null ) { 211 jspPrint( makeOneLevelMenu() ); 212 } 213 // 5.2.3.0 (2010/12/01) NEXTGUI 追加 214 else if( "NEXTGUI".equals( menuType ) ) { 215 jspPrint( makeNextguiMenu() ); 216 } 217 else if( "MATRIX".equals( menuType ) ) { 218 jspPrint( makeMatrixMenu() ); 219 } 220 else if( "MATRIX2".equals( menuType ) ) { // 4.2.1.0 (2008/04/01) 大分類なし版追加 221 jspPrint( makeMatrixMenu2() ); 222 } 223 // else { 224 // jspPrint( "menuType が想定外です。menuType=[" + menuType + "]" ); 225 // } 226 227 return EVAL_PAGE ; // ページの残りを評価する。 228 } 229 230 /** 231 * タグリブオブジェクトをリリースします。 232 * キャッシュされて再利用されるので、フィールドの初期設定を行います。 233 * 234 * @og.rev 5.2.3.0 (2010/12/01) sideCountの初期値を -1(無制限)に変更 235 * @og.rev 5.3.9.0 (2011/09/01) メニューでのヘルプアイコン対応 236 * @og.rev 5.5.2.3 (2012/05/15) ONELEVEL,NEXTGUI で、DIVタグ+design-onelevel 処理をするかどうかを指定します。 237 */ 238 @Override 239 protected void release2() { 240 super.release2(); 241 expand = true; 242 menuType = MENU_TYPE[0]; 243 groups = null; 244 selClassify = null; 245 multiSessionCheck = HybsSystem.sysBool( "USE_MULTI_SESSION_CHECK" ); 246 href = "menu.jsp"; // グループメニューの対象ソース名(href)を指定します。 247 imageOnly = false; // グループメニューに、 true:画像のみ / false:画像+ラベル を指定します 248 target = "MENU"; // グループメニューの対象フレーム名(target)を指定します。 249 sideCount = -1; // 5.2.3.0 (2010/12/01) 表示対象となるメニューを横並びさせる数を指定します。 250 minCellCount = 8; // 表形式メニューの1セルの最小行数を指定します。 251 maxCellCount = 8; // 表形式メニューの1セルの最大行数を指定します。 252 mscKey = null; // MULTI_SESSION_CHECK 時のリンクに付加する情報 253 imgFileMap = null; // 5.5.2.5 (2012/05/21) 属性名変更 254 cache = true; // グループメニューのキャッシュを使用するかどうか指定します。 255 match = null; // 正判定(マッチする場合に、メニューに出す)条件を設定 256 unmatch = null; // 逆判定(マッチする場合に、メニューに出さない)条件を設定 257 useButton = false; // ボタン形式のリンクを使用するか 258 buttonRequest = false; // trueでボタンメニューの表示を行う 259 excludeButton = false; // trueでボタンメニュー時でも強制的に従来のプルダウンにする。 260 inlineStyle = false; // trueの場合は標準画面(Lv3)にdisplay:inlineを付加 261 helpLinkFormat = null; // ヘルプリンクフォーマット 262 helpMap = null; // ヘルプファイルが存在するかどうかのキャッシュ 263 useDivOneLevel = false; // 5.5.2.3 (2012/05/15) ONELEVEL,NEXTGUI で、DIVタグ+design-onelevel 処理をするかどうかを指定します。 264 } 265 266 /** 267 * メニューを表示する為のHTMLを作成します(折り返しJavaScript対応版)。 268 * 269 * @og.rev 3.5.6.5 (2004/08/09) GUIInfo の comments 属性を title にセットする。 270 * @og.rev 3.6.0.9 (2004/12/03) リアルアドレス設定時に、{@XXXX}処理を追加 271 * @og.rev 3.8.0.0 (2005/06/07) 同一セッションでのマルチ起動対策を行います。 272 * @og.rev 4.0.0.0 (2005/01/31) GUIInfoの実アドレスのパラメータを考慮する。 273 * @og.rev 4.0.0.0 (2007/10/31) 分類の廃止に伴い、全面見直し 274 * @og.rev 4.2.1.0 (2008/04/01) 小分類指定での表示対応(↑の対応での再実装漏れ) 275 * @og.rev 4.2.1.0 (2008/04/11) 小分類をexpandしない場合にはspanタグで囲う。 276 * @og.rev 5.5.2.5 (2012/05/21) イメージアイコン対応(makeTagMenuのパラメータ変更) 277 * 278 * @return メニュー 279 */ 280 private String makeMenu() { 281 StringBuilder rtn = new StringBuilder( HybsSystem.BUFFER_LARGE ); 282 283 UserInfo userInfo = getUser(); 284 285 // 4.0.0 (2005/01/31) 286 287 GUIInfo[] guiInfos = userInfo.getGUIInfos(); 288 String gamenId ; // 画面ID 289 int menuNo = 11; 290 int kmokuNo = 0; 291 292 boolean isInFieldset = false; // 大分類の中か? 293 boolean isInClassify = false; // 小分類の中か? 294 boolean isExistHiddenMenu = false; // 隠しメニューが存在するか? 295 boolean isExistClassifyHidden = false; // 分類隠しが存在するか? 296 int level ; 297 int preLevel = 0; 298 299 for( int i=0; i<guiInfos.length; i++ ) { 300 if( guiInfos[i].isRead() ) { // 4.0.0 (2005/01/31) 301 gamenId = guiInfos[i].getKey() ; 302 if( match != null && !gamenId.matches( match ) ) { continue; } 303 if( unmatch != null && gamenId.matches( unmatch ) ) { continue; } 304 305 // 4.2.1.0 (2008/04/01) 306 if( selClassify != null ) { 307 if( !selClassify.equals( guiInfos[i].getKey() ) && !selClassify.equals( guiInfos[i].getClassify() ) ) { 308 continue; // 分類(classify) に含まれない 309 } 310 } 311 312 // 処理すべき画面かのチェック 313 int guiFlg = guiCheck( guiInfos, i ); 314 if( guiFlg == 0 ) { continue; } 315 316 level = guiInfos[i].getLevel(); // 4.0.0 (2005/01/31) 317 318 // 隠しメニュー展開用 319 if( preLevel >= 3 && level < 3 ) { 320 if( isExistHiddenMenu ) { 321 rtn.append( makeEllipses( menuNo,kmokuNo,3 ) ); 322 kmokuNo++; 323 } 324 isExistHiddenMenu = false; 325 } 326 327 // 大分類(フィールドメニュー) 328 if( level == 1 ) { 329 if( isInFieldset ) { 330 rtn.append( FIELD_OUT ); 331 rtn.append( "</div>" ); 332 } 333 isInFieldset = true; 334 335 // 隠しメニュー用 336 if( expand ) { 337 rtn.append( "<div class=\"expand1 " ); 338 339 if( guiFlg == 1 ) { 340 rtn.append( "unpopular "); 341 } 342 343 rtn.append( "\">" ); 344 } 345 346 rtn.append( makeTagMenu( guiInfos[i],guiInfos[i].getName(),level ) ); // 5.5.2.5 (2012/05/21) イメージアイコン対応 347 348 isInClassify = false; 349 } 350 // 小分類・直リンク 351 else if( level == 2 ) { 352 menuNo++; 353 kmokuNo = 0; 354 if( expand ) { 355 rtn.append( "<div class=\"expand1 " ); 356 357 // 隠しメニュー用 358 if( guiFlg == 1 ) { 359 rtn.append( "unpopular " ); 360 isExistClassifyHidden = true; 361 } 362 363 // rtn.append( "\" id=\"menu" + menuNo + "\">" ); 364 // 4.3.3.0 (2008/10/01) useButton=true時は表示しない 365 rtn.append( "\" id=\"menu" + menuNo + "\" "); 366 if( useButton ){ 367 rtn.append( "style=\"display:none\""); 368 } 369 rtn.append( ">"); 370 371 } 372 else{ // 4.2.1.0 (2008/04/11)expandしない場合にはspan要素で囲ってnon-expandクラスを指定。 373 rtn.append( "<span class=\"non-expand\">" ); 374 } 375 376 rtn.append( makeTagMenu( guiInfos[i],guiInfos[i].getName(),level ) ); // 5.5.2.5 (2012/05/21) イメージアイコン対応 377 rtn.append( HybsSystem.BR ); 378 if( expand ) { 379 rtn.append( "</div>" ); 380 } 381 else{ // 4.2.1.0 (2008/04/11) 382 rtn.append( "</span>"); 383 } 384 385 isInClassify = true; 386 } 387 // 通常メニュー・隠しメニュー 388 else if( level >= 3 ) { 389 if( isInClassify ) { 390 if( expand ) { 391 rtn.append( "<div class=\"expand2 " ); 392 393 // 隠しメニュー用 394 if( level == 4 ) { 395 rtn.append( "unpopular " ); 396 isExistHiddenMenu = true; 397 } 398 399 // rtn.append( "\" id=\"menu" + menuNo + "_" + kmokuNo + "\">" ); 400 // 4.3.3.0 (2008/10/01) メニューを初期状態で開けるようにする 401 rtn.append( "\" id=\"menu" + menuNo + "_" + kmokuNo + "\" " ); 402 if( inlineStyle && level == 3 ) { 403 rtn.append( " style=\"display:inline\"" ); 404 } 405 rtn.append( ">" ); 406 } 407 408 // 画面IDが"HYBS_BR"の時は処理しない 409 if( !"HYBS_BR".equals( guiInfos[i].getKey() ) ) { 410 rtn.append( makeTagMenu( guiInfos[i],guiInfos[i].getName(),level ) ); // 5.5.2.5 (2012/05/21) イメージアイコン対応 411 } 412 rtn.append( HybsSystem.BR ); 413 if( expand ) { 414 rtn.append( "</div>" ); 415 } 416 kmokuNo++; 417 } 418 } 419 420 rtn.append( HybsSystem.CR ); 421 422 preLevel = level; 423 } 424 } 425 426 // 終了処理 427 if( isExistHiddenMenu ) { 428 rtn.append( makeEllipses( menuNo,kmokuNo,3 ) ); 429 } 430 431 if( isInFieldset ) { 432 rtn.append( FIELD_OUT ); 433 rtn.append( "</div>" ); 434 } 435 436 if( isExistClassifyHidden ) { 437 rtn.append( makeEllipses( menuNo,0,2 ) ); 438 } 439 440 return rtn.toString(); 441 } 442 443 /** 444 * メニューを表示する為のHTMLを作成します(折り返しJavaScript対応版)。 445 * 446 * @og.rev 4.0.0.0 (2005/01/31) 個人別のお気に入りメニューを作成します。 447 * @og.rev 4.0.0.0 (2007/10/31) 分類項目の廃止 448 * @og.rev 4.1.1.0 (2008/02/05) お気に入り情報はGEA09から取得するように変更 449 * @og.rev 5.5.2.5 (2012/05/21) イメージアイコン対応(makeTagMenuのパラメータ変更) 450 * 451 * @return 個人別のお気に入りメニュー 452 */ 453 private String makeFavoriteMenu() { 454 StringBuilder rtn = new StringBuilder( HybsSystem.BUFFER_LARGE ); 455 456 UserInfo userInfo = getUser(); 457 Map<String,FavoriteGUIData> favoriteMap = userInfo.getFavoriteMap(); 458 459 if( favoriteMap.isEmpty() ) { return ""; } 460 461 ResourceManager resource = getResource(); // リソース参照 462 String largeClassify = resource.getLabelData( "FAVORITE_MENU" ).getShortLabel(); // お気に入り 463 String lastClassify = ""; // 前方画面の分類 464 int menuNo = 99999; 465 int kmokuNo = 0; 466 467 // fieldSetタグ、お気に入り編集画面リンクの出力 468 GUIInfo editFavorite = userInfo.getGUIInfo( "GE0014" ); 469 rtn.append( "<div class=\"expand1\"> " ); 470 rtn.append( makeTagMenuString( null,null,largeClassify,null,1 ) ); 471 rtn.append( makeTagMenu( editFavorite,resource.getLabelData( "EDIT" ).getShortLabel(),2 ) ); // 5.5.2.5 (2012/05/21) イメージアイコン対応 472 rtn.append( HybsSystem.BR ); 473 474 String thisClassify = null; 475 String gamenId = null; 476 FavoriteGUIData favoriteGui = null; 477 // 4.3.4.4 (2009/01/01) findBugs警告対応 478 for( Map.Entry<String, FavoriteGUIData> entry : favoriteMap.entrySet() ) { 479 gamenId = entry.getKey(); 480 favoriteGui = entry.getValue(); 481 GUIInfo guiInfo = userInfo.getGUIInfo( gamenId ); 482 483 if( match != null && !gamenId.matches( match ) ) { continue; } 484 if( unmatch != null && gamenId.matches( unmatch ) ) { continue; } 485 486 thisClassify = favoriteGui.getClassify(); 487 if( !lastClassify.equals( thisClassify ) ) { 488 menuNo++; 489 kmokuNo = 0; 490 if( expand ) { 491 rtn.append( "<div class=\"expand1\" id=\"menu" ); 492 rtn.append( menuNo ).append( "\">" ); 493 } 494 rtn.append( makeTagMenuString( null,null,thisClassify,thisClassify,2 ) ); 495 rtn.append( HybsSystem.BR ); 496 if( expand ) { 497 rtn.append( "</div>" ).append( HybsSystem.CR ); 498 } 499 lastClassify = thisClassify; 500 } 501 502 if( expand ) { 503 rtn.append( "<div class=\"expand2\" id=\"menu" ); 504 rtn.append( menuNo ).append( "_" ).append( kmokuNo ).append( "\">" ) ; 505 } 506 507 String linkLabel = favoriteGui.getName(); 508 rtn.append( makeTagMenu( guiInfo,linkLabel,3 ) ); // 5.5.2.5 (2012/05/21) イメージアイコン対応 509 rtn.append( HybsSystem.BR ); 510 if( expand ) { 511 rtn.append( "</div>" ).append( HybsSystem.CR ); 512 } 513 kmokuNo++; 514 } 515 rtn.append( FIELD_OUT ); 516 rtn.append( "</div>" ); 517 518 return rtn.toString(); 519 } 520 521 /** 522 * 折りたたみメニューで、非標準メニューの 表示に使う、"←・・・→" を作成します。 523 * 524 * @param menuNo 階層番号 525 * @param kmokuNo 階層項目番号 526 * @param type タイプ(1,2限定) 527 * 528 * @og.rev 4.0.0.0 (2005/01/31) 新規作成 529 * 530 * @return メニュー 531 */ 532 private String makeEllipses( final int menuNo,final int kmokuNo,final int type ) { 533 int tmpType = type-1; // 超暫定対応 4.0.0.0 (2007/10/31) 534 String kmkNo = ( tmpType == 1 ) ? "" : "_" + kmokuNo ; 535 536 // 4.3.3.0 (2008/10/01) inlineStyleがtrueの場合は←・・・→をinlineで表示する 537 // String rtn = "<div class=\"expand" + tmpType + " ellipses\" id=\"menu" + menuNo 538 // + kmkNo + "\">" 539 // + makeTagMenuString( null,null,"←・・・→",null,type ) 540 // + HybsSystem.BR + "</div>" + HybsSystem.CR ; 541 String rtn = "<div class=\"expand" + tmpType + " ellipses\" id=\"menu" + menuNo 542 + kmkNo + "\" "; 543 if( inlineStyle ){ 544 rtn += "style=\"display:inline\" "; 545 } 546 rtn += ">" + makeTagMenuString( null,null,"←・・・→",null,type ) 547 + HybsSystem.BR + "</div>" + HybsSystem.CR ; 548 549 return rtn ; 550 } 551 552 /** 553 * menuType="GROUP" 時に作成するグループメニュー 554 * 555 * @og.rev 4.0.0.0 (2005/01/31) 新規作成 556 * @og.rev 4.0.0.0 (2007/10/05) グループのコードリソースが存在しない場合 557 * @og.rev 4.2.2.0 (2008/05/14) buttonRequestがtrueの場合はTOPへのリンクを表示しない 558 * @og.rev 4.2.2.0 (2008/05/15) グループ絞込解除(GUI_ALL)の表示文字にラベルリソースを使う。 559 * @og.rev 5.0.0.3 (2009/09/22) グループが1件の場合に表示されないバグを修正 560 * @og.rev 5.1.8.0 (2010/07/01) コードリソースのキーが存在しない場合にエラーとなるバグを修正 561 * 562 * @return メニュー 563 */ 564 private String makeGroupMenu() { 565 566 // 画面のグループメニューのキャッシュを取得します。 567 String groupMenu ; 568 String cacheKey = HybsSystem.GUI_GR_MENU_CACHE_KEY + href + target ; 569 if( cache ) { 570 groupMenu = (String)getSessionAttribute( cacheKey ); 571 if( groupMenu != null ) { return groupMenu; } // キャッシュを返します。 572 } 573 else { 574 removeSessionAttribute( cacheKey ); 575 } 576 577 UserInfo userInfo = getUser(); 578 579 Set<String> groupSet = new LinkedHashSet<String>(); 580 581 // そのユーザーで使用できる画面をすべてピックアップします。 582 // その上で、読取可能なメニューを含むグループを順番に Set にセットしていきます。 583 GUIInfo[] guiInfos = userInfo.getGUIInfos(); 584 String gamenId ; // 画面ID 585 for( int i=0; i<guiInfos.length; i++ ) { 586 if( guiInfos[i].isRead() ) { 587 gamenId = guiInfos[i].getKey() ; 588 if( match != null && !gamenId.matches( match ) ) { continue; } 589 if( unmatch != null && gamenId.matches( unmatch ) ) { continue; } 590 String[] groups = StringUtil.csv2Array( guiInfos[i].getGroups() ); 591 for( int j=0; j<groups.length; j++ ) { 592 groupSet.add( groups[j] ); 593 } 594 } 595 } 596 597 // 5.0.0.3 (2009/09/22) 598 if( groupSet.size() > 0 ) { 599 int sideTmpCnt = 1; 600 StringBuilder rtn = new StringBuilder( HybsSystem.BUFFER_LARGE ); 601 rtn.append( "<tr>" ); 602 603 String allMenu = getLabel( "ALL_MENU" ); // 4.2.2.0 (2008/05/15) ALLはラベルリソース使うように変更 604 rtn.append( makeTagMenuString( href,target,allMenu,"GUI_ALL",-1 ) ); 605 if( sideCount > 0 && sideTmpCnt % sideCount == 0 ) { rtn.append("</tr><tr>"); } 606 sideTmpCnt++ ; 607 608 Iterator<String> ite = groupSet.iterator() ; 609 CodeData groupCode = getResource().getCodeData( "GROUPS" ) ; 610 if( groupCode != null ) { 611 while( ite.hasNext() ) { 612 String group = ite.next(); 613 int cdAdrs = groupCode.getAddress( group ) ; 614 // 4.0.0.0 (2007/10/05) グループのコードリソースが存在しない場合 615 String groupLabel = ""; 616 if( cdAdrs >= 0 ) { groupLabel = groupCode.getLongLabel( cdAdrs ); } 617 618 // 5.1.8.0 (2010/07/01) コードリソースのキーが存在しない場合にエラーとなるバグを修正 619 if( groupLabel.length() == 0 && group != null && group.length() > 0 ) { 620 groupLabel = group; 621 } 622 623 String src = XHTMLTag.addUrlEncode( href,"group=" + group ); 624 rtn.append( makeTagMenuString( src,target,groupLabel,group,-1 ) ); 625 if( sideCount > 0 && sideTmpCnt % sideCount == 0 ) { rtn.append("</tr><tr>"); } 626 sideTmpCnt++ ; 627 } 628 } 629 630 if( ! imageOnly && ! buttonRequest ) { // 4.2.2.0 (2008/05/14) ボタンメニュー時はトップメニュー 631 rtn.append( makeTagMenuString( JSP + "/index.jsp",target,"Top","GUI_TOP",-1 ) ); 632 } 633 rtn.append( "</tr>" ); 634 635 // 画面のグループメニューのキャッシュをセットします。 636 groupMenu = rtn.toString() ; 637 } 638 else { 639 groupMenu = ""; 640 } 641 642 if( cache ) { 643 setSessionAttribute( cacheKey,groupMenu ); 644 } 645 646 return groupMenu; 647 } 648 649 /** 650 * メニューを表示する為のHTMLを作成します(折り返しJavaScript対応版)。 651 * 652 * @og.rev 4.0.0.0 (2005/01/31) GUIInfoの実アドレスのパラメータを考慮する。 653 * @og.rev 4.0.0.0 (2007/10/31) 一旦廃止 654 * @og.rev 5.5.2.3 (2012/05/15) useDivOneLevel 対応 655 * @og.rev 5.5.2.5 (2012/05/21) イメージアイコン対応(makeTagMenuのパラメータ変更) 656 * @og.rev 5.5.6.0 (2013/01/07) useDivOneLevelの折り返し方法変更 657 * @og.rev 5.9.1.2 (2015/10/23) span自己終了修正 658 * @og.rev 5.9.6.1 (2016/03/04) フレーム対応 659 * 660 * @return メニュー 661 */ 662 private String makeOneLevelMenu() { 663 StringBuilder rtn = new StringBuilder( HybsSystem.BUFFER_LARGE ); 664 665 // 5.5.2.3 (2012/05/15) useDivOneLevel 対応 666 if( useDivOneLevel ) { rtn.append("<div id=\"design-onelevel\">"); } 667 668 UserInfo userInfo = getUser(); 669 670 // 4.0.0 (2005/01/31) 671 GUIInfo[] guiInfos = userInfo.getGUIInfos(); 672 String gamenId ; // 画面ID 673 int sideTmpCnt = 1; 674 675 boolean isInClassify = false; 676 677 for( int i=0; i<guiInfos.length; i++ ) { 678 int level = guiInfos[i].getLevel(); 679 680 if( level == 2 ) { 681 if( selClassify.equals( guiInfos[i].getKey() ) ) { 682 isInClassify = true; 683 } 684 else { 685 isInClassify = false; 686 } 687 } 688 689 if( guiInfos[i].isRead() && level == 3 && isInClassify ) { // 4.0.0 (2005/01/31) 690 gamenId = guiInfos[i].getKey() ; 691 if( match != null && !gamenId.matches( match ) ) { continue; } 692 if( unmatch != null && gamenId.matches( unmatch ) ) { continue; } 693 694 String guiLabel = guiInfos[i].getName(); // 画面ラベル 695 696 String thisGamenId = getGUIInfoAttri( "KEY" ); 697 if( gamenId.equals( thisGamenId ) ) { 698 // 5.5.2.3 (2012/05/15) useDivOneLevel 対応 699 if( useDivOneLevel ) { 700 rtn.append("<span class=\"design-onelevel\">").append( guiLabel ).append( "</span>" ); 701 } 702 else { 703 rtn.append( "[" ).append( guiLabel ).append( "] " ); 704 } 705 } 706 else { 707 // 5.5.2.3 (2012/05/15) useDivOneLevel 対応 708 if( useDivOneLevel ) { 709 // 5.5.2.5 (2012/05/21) イメージアイコン対応 710// rtn.append("<span class=\"design-onelevel\">").append( makeTagMenu( guiInfos[i],guiLabel,-3 ) ).append( "</span>" ); 711 rtn.append("<span class=\"design-onelevel\">").append( makeTagMenu( guiInfos[i],guiLabel,-5 ) ).append( "</span>" ); // 5.9.6.1 712 } 713 else { 714 rtn.append( makeTagMenu( guiInfos[i],guiLabel,-2 ) ); // 5.5.2.5 (2012/05/21) イメージアイコン対応 715 } 716 } 717 718 if( sideCount > 0 ) { 719 // 全件数をサイドカウント数で割った値が最大行数の場合は、終了する。 720 if( sideTmpCnt / sideCount >= maxCellCount ) { 721 // rtn.append("・・・"); 722 break; 723 } 724 // 全件数をサイドカウント数で割った余りがゼロの場合は、行ブレイクする。 725 // 5.5.2.3 (2012/05/15) useDivOneLevel 対応 726 if( sideTmpCnt % sideCount == 0 ) { 727 // 5.5.2.3 (2012/05/15) useDivOneLevel 対応 728 if( useDivOneLevel ) { 729 rtn.append( HybsSystem.BR ); // 5.6.0.0 (2013/01/07) BRにする(条件分岐は残しておく) 730 // rtn.append("<span style=\"clear: both;\" />"); 731 } 732 else { 733 rtn.append( HybsSystem.BR ); 734 } 735 } 736 sideTmpCnt++ ; 737 } 738 } 739 } 740 741 // 5.5.2.3 (2012/05/15) useDivOneLevel 対応 742 if( useDivOneLevel ) { 743 //rtn.append("<span style=\"clear: both;\" />"); 744 rtn.append("<span style=\"clear: both;\" ><!-- --></span>"); // 5.9.1.2 (2015/10/23) 745 rtn.append("</div>"); 746 } 747 748 return rtn.toString(); 749 } 750 751 /** 752 * 既存のページの次にアクセスされる画面郡のリンクを作成します。 753 * 754 * これは、現時点の画面に対して、次にアクセスされる画面の候補を 755 * ピックアップしておく機能です。 756 * 実際には、過去にアクセスされた結果より取得しています。 757 * これは、ONELEVEL と置き換えることになる機能です。 758 * 759 * @og.rev 5.2.3.0 (2010/12/01) NEXTGUI 追加 760 * @og.rev 5.5.2.3 (2012/05/15) useDivOneLevel 対応 761 * @og.rev 5.5.2.5 (2012/05/21) イメージアイコン対応(makeTagMenuのパラメータ変更) 762 * @og.rev 5.9.6.1 (2016/03/04) フレーム対応 763 * 764 * @return メニュー 765 */ 766 private String makeNextguiMenu() { 767 StringBuilder rtn = new StringBuilder( HybsSystem.BUFFER_LARGE ); 768 769 // 今、アクセスしている画面 770 GUIInfo thisGamen = (GUIInfo)getSessionAttribute( HybsSystem.GUIINFO_KEY ); 771 String[] nextGuis = thisGamen.getNextGuiArray(); 772 773 UserInfo userInfo = getUser(); 774 int sideTmpCnt = 1; 775 776 // 5.5.2.3 (2012/05/15) useDivOneLevel 対応 777 if( useDivOneLevel ) { rtn.append("<div id=\"design-onelevel\">"); } 778 779 GUIInfo guiInfo = null; 780 for( int i=0; i<nextGuis.length; i++ ) { 781 guiInfo = userInfo.getGUIInfo( nextGuis[i] ); 782 if( guiInfo == null ) { continue; } // 存在しない、またはアクセス拒否の場合は、無視する。 783 784 if( guiInfo.isRead() ) { 785 String guiLabel = guiInfo.getName(); // 画面ラベル 786 787 // 5.5.2.3 (2012/05/15) useDivOneLevel 対応 788 if( useDivOneLevel ) { 789 // 5.5.2.5 (2012/05/21) イメージアイコン対応 790// rtn.append("<span class=\"design-onelevel\">").append( makeTagMenu( guiInfo,guiLabel,-3 ) ).append( "</span>" ); 791 rtn.append("<span class=\"design-onelevel\">").append( makeTagMenu( guiInfo,guiLabel,-5 ) ).append( "</span>" ); 792 } 793 else { 794 rtn.append( makeTagMenu( guiInfo,guiLabel,-2 ) ); // 5.5.2.5 (2012/05/21) イメージアイコン対応 795 } 796 797 if( sideCount > 0 ) { 798 // 全件数をサイドカウント数で割った値が最大行数の場合は、終了する。 799 if( sideTmpCnt / sideCount >= maxCellCount ) { 800 break; 801 } 802 // 全件数をサイドカウント数で割った余りがゼロの場合は、行ブレイクする。 803 // 5.5.2.3 (2012/05/15) useDivOneLevel 対応 804 if( sideTmpCnt % sideCount == 0 ) { 805 if( useDivOneLevel ) { 806 rtn.append("<span style=\"clear: both;\" />"); 807 } 808 else { 809 rtn.append( HybsSystem.BR ); 810 } 811 } 812 sideTmpCnt++ ; 813 } 814 } 815 } 816 817 // 5.5.2.3 (2012/05/15) useDivOneLevel 対応 818 if( useDivOneLevel ) { rtn.append("</div>"); } 819 820 return rtn.toString(); 821 } 822 823 /** 824 * メニューを表示する為のHTMLを作成します(マトリクスメニュー)。 825 * 826 * 分類まとめ、クラス色指定、最小行数設定、最大行数設定の機能があります。 827 * 《分類まとめ》 最大行数設定(maxCellCount)に達したセルは、一つ右に新たにセルを作成 828 * します。このとき、ヘッダーの CLASSIFY を同じにして、colspan でまとめます。 829 * 《クラス色指定》ヘッダー毎に 順次 CLR0,CLR1,・・・・ というクラス属性を付与します。 830 * ヘッダーには、MENU_H も出力されています。CLR0 は、大分類ごとに加算されていきますので、 831 * 繰り返して同じ色を指定する場合は、CSSファイルでまとめて指定してください。 832 * 《最小行数設定》minCellCount 属性を指定することで、1セルに含まれる最小行数を指定できます。 833 * これは、セルに入れる <br /> の個数を指定することと同じです。 834 * 《最大行数設定》maxCellCount 属性を指定することで、1セルに含まれる最大行数を指定できます。 835 * 分類まとめでも説明しましたように、最大値をオーバーすると次のセルから書き始めます。 836 * 837 * @og.rev 4.0.0.0 (2005/11/30) 新規追加 838 * @og.rev 4.0.0.0 (2007/10/05) 分類のコードリソースが存在しない場合 839 * @og.rev 5.2.3.0 (2010/12/01) sideCount対応 840 * @og.rev 5.5.2.5 (2012/05/21) イメージアイコン対応(makeTagMenuのパラメータ変更) 841 * @og.rev 5.5.5.3 (2012/08/17) th,tdにヘッダの画面IDをクラスとして出力 842 * 843 * @return マトリクスメニュー 844 */ 845 private String makeMatrixMenu() { 846 StringBuilder rtn = new StringBuilder( HybsSystem.BUFFER_LARGE ); 847 848 UserInfo userInfo = getUser(); 849 850 // 4.0.0 (2005/01/31) 851 GUIInfo[] guiInfos = userInfo.getGUIInfos(); 852 String gamenId ; // 画面ID 853 String bkClassifyKey = null; // 分類コード(旧) 854 String bkClassifyName = null; // 分類名称(旧) 855 int cellColorCnt = 0; // MENU_H に 追加する CLR クラス属性の連番 856 857 String headGuikey = ""; // 5.5.5.3 (2012/08/17) ヘッダのgamenId 858 859 StringBuilder rtnH = null; // 分類部分の出力用 860 StringBuilder rtnB = null; // 実画面のリンク部分の出力用 861 862 int level ; 863 int preLevel = 0; 864 865 int lineTmpCnt = 0; // セル中の行カウント 866 int cellTmpCnt = 0; // 1つの分類中のセルカウント 867 int cellTmpAllCnt = 0; // 5.2.3.0 (2010/12/01) 該当行のセルカウント 868 869 boolean isInClassify = false; // 分類の中か? 870 boolean isChangeLevel = false; // 直リンク用(無理やり通常画面の階層として扱うので) 871 boolean isDummyMENU_S = false; // 5.2.3.0 (2010/12/01) sideCountブレーク時の大分類領域の出力可否 872 873 for( int i=0; i<guiInfos.length; i++ ) { 874 if( guiInfos[i].isRead() ) { // 4.0.0 (2005/01/31) 875 gamenId = guiInfos[i].getKey() ; 876 if( match != null && !gamenId.matches( match ) ) { continue; } 877 if( unmatch != null && gamenId.matches( unmatch ) ) { continue; } 878 879 // 処理すべき画面かのチェック 880 int guiFlg = guiCheck( guiInfos, i ); 881 if( guiFlg == 0 ) { continue; } 882 883 level = guiInfos[i].getLevel(); // 4.0.0 (2005/01/31) 884 885 // 大分類が来るまでは処理しない 886 if( level > 1 && rtnH == null ) { continue; } 887 888 // 直リンクの場合、無理やり通常画面に変換 889 if( level == 2 && guiInfos[i].getAddress() != null && guiInfos[i].getAddress().length() != 0 ) { 890 level = 3; 891 if( !isChangeLevel ) { 892 isChangeLevel = true; 893 isInClassify = false; 894 } 895 } 896 else { 897 isChangeLevel = false; 898 } 899 900 // 分類のブレイク処理 901 if( ( preLevel >= 3 && level < 3 ) || !isInClassify ) { 902 if( lineTmpCnt != 0 ) { 903 for( int j=lineTmpCnt; j<minCellCount-1; j++ ) { rtnB.append( HybsSystem.BR ); } 904 rtnB.append( "</td>" ).append( HybsSystem.CR ); 905 } 906 907 908 if( bkClassifyKey != null ) { 909 rtnH.append( "<th colspan=\"" + cellTmpCnt + "\" class=\"MENU_H CLR" + cellColorCnt + " " + headGuikey + "\">" ); // 5.5.5.3 (2012/08/17) 910 if( "_SPACE".equals( bkClassifyKey ) ) { 911 rtnH.append( " " ); 912 } 913 else { 914 rtnH.append( makeTagMenuString( null,null,bkClassifyName,bkClassifyKey,-3 ) ); 915 } 916 rtnH.append( "</th>" ); 917 918 // 5.2.3.0 (2010/12/01) sideCount によるセルの改行 919 cellTmpAllCnt += cellTmpCnt; 920 if( sideCount > 0 && cellTmpAllCnt >= sideCount ) { 921 rtn.append( rtnH ).append( "</tr><tr>" ).append( rtnB ).append( "</tr>" ); 922 923 rtnH = new StringBuilder( HybsSystem.BUFFER_LARGE ); 924 rtnB = new StringBuilder( HybsSystem.BUFFER_LARGE ); 925 cellTmpAllCnt = 0; 926 isDummyMENU_S = true; // 出力予約 927 } 928 } 929 930 bkClassifyKey = null; 931 isInClassify = false; 932 lineTmpCnt = 0; 933 cellTmpCnt = 0; 934 } 935 936 // 大分類(フィールドメニュー) 937 if( level == 1 ) { 938 headGuikey = gamenId; // 5.5.5.3 (2012/08/17) 939 if( preLevel > 0 ) { 940 cellColorCnt++ ; 941 rtn.append( rtnH ).append( "</tr><tr>" ).append( rtnB ).append( "</tr>" ); 942 } 943 944 rtn.append( "<tr><td rowspan=\"2\" class=\"MENU_S "+ headGuikey +"\">" ); // 5.5.5.3 (2012/08/17) 945 rtn.append( makeTagMenuString( null,null,guiInfos[i].getName(),gamenId,-3 ) ); 946 rtn.append( "</td>" ).append( HybsSystem.CR ); 947 948 rtnH = new StringBuilder( HybsSystem.BUFFER_LARGE ); 949 rtnB = new StringBuilder( HybsSystem.BUFFER_LARGE ); 950 cellTmpAllCnt = 0; // 5.2.3.0 (2010/12/01) 951 isDummyMENU_S = false; // 5.2.3.0 (2010/12/01) 出力予約解除 952 } 953 // 分類(直リンクの場合は、level=3で処理) 954 else if( level == 2 ) { 955 isInClassify = true; 956 bkClassifyKey = guiInfos[i].getKey(); 957 bkClassifyName = guiInfos[i].getName(); 958 } 959 // 通常メニュー・隠しメニュー 960 else if( level >= 3 ) { 961 962 // 元のMENU_Sに戻り、rowspan を書き換える・・・のが邪魔くさいので、td のみ出力しておく。 963 // 5.2.3.0 (2010/12/01) sideCount によるセルの改行 964 if( isDummyMENU_S ) { 965 rtn.append( "<tr><td rowspan=\"2\" class=\"MENU_S " + headGuikey + "\">" ); // 5.5.5.3 (2012/08/17) 966 rtn.append( "</td>" ).append( HybsSystem.CR ); 967 isDummyMENU_S = false; // 出力予約解除 968 } 969 970 // 画面ID="HYBS_BR"の場合は、セルを変える。 971 if( "HYBS_BR".equals( guiInfos[i].getKey() ) ) { 972 if( lineTmpCnt != 0 ) { 973 for( int j=lineTmpCnt; j<minCellCount-1; j++ ) { rtnB.append( HybsSystem.BR ); } 974 lineTmpCnt = 0; 975 } 976 } 977 // 通常画面 978 else { 979 if( lineTmpCnt == 0 ) { 980 rtnB.append( "<td class=\"MENU_B " + headGuikey + "\">" ); // 5.5.5.3 (2012/08/17) 981 cellTmpCnt++; 982 } 983 984 rtnB.append( makeTagMenu( guiInfos[i],guiInfos[i].getName(),-3 ) ); // 5.5.2.5 (2012/05/21) イメージアイコン対応 985 lineTmpCnt++; 986 987 if( lineTmpCnt >= maxCellCount ) { 988 rtnB.append( "</td>" ); 989 lineTmpCnt = 0; 990 } 991 else { 992 rtnB.append( HybsSystem.BR ); 993 } 994 995 // 分類の中に入っていない通常画面 996 if( !isInClassify ) { 997 bkClassifyKey = "_SPACE"; 998 isInClassify = true; 999 } 1000 } 1001 } 1002 1003 preLevel = level; 1004 } 1005 1006 } 1007 1008 // 終了処理 1009 for( int j=lineTmpCnt; j<minCellCount-1; j++ ) { rtnB.append( HybsSystem.BR ); } 1010 rtnB.append( "</td>" ).append( HybsSystem.CR ); 1011 1012 if( bkClassifyKey != null ) { 1013 rtnH.append( "<th colspan=\"" + cellTmpCnt + "\" class=\"MENU_H CLR" + cellColorCnt + " " + headGuikey + "\">" ); // 5.5.5.3 (2012/08/17) 1014 rtnH.append( makeTagMenuString( null,null,bkClassifyName,bkClassifyKey,-3 ) ); 1015 rtnH.append( "</th>" ); 1016 } 1017 1018 rtn.append( rtnH ).append( "</tr><tr>" ).append( rtnB ).append( "</tr>" ); 1019 1020 return rtn.toString(); 1021 } 1022 1023 /** 1024 * メニューを表示する為のHTMLを作成します(マトリクスメニュー2)。 1025 * 1026 * マトリクスメニューをベースとした特別バージョンです。 1027 * 通常のマトリクスメニューからの変更点は以下の通りです。 1028 * @大分類が表示されない 1029 * ⇒ 変わりに、1行に表示されているセル数がsideCountで指定した数を超えた場合に 1030 * 自動的に改行されます。 1031 * A画面リンクのターゲット 1032 * ⇒ 自分自身のフレームに対してリンク先を表示します。 1033 * リンク先は、通常メニュー構成ですが左メニューには該当する小分類の画面しか表示されません。 1034 * B小分類でのリンク 1035 * ⇒ 小分類をクリックした際に、通常のメニュー構成画面にリンクします。 1036 * 但し、Aと同様に左メニューには該当する小分類の画面しか表示されません。 1037 * 1038 * @og.rev 4.2.1.0 (2008/04/01) 新規追加 1039 * @og.rev 4.2.1.1 (2008/05/02) カテゴリーリンクで一番上の画面のモードが-wとなっている場合に、 1040 * その画面が立ち上がってしまうバグを修正 1041 * @og.rev 4.2.2.0 (2008/05/14) buttonRequestの付加をmakeTagMenuString()に変更 1042 * @og.rev 5.5.2.5 (2012/05/21) イメージアイコン対応(makeTagMenuのパラメータ変更) 1043 * @og.rev 5.5.5.3 (2012/08/17) ヘッダ部のgamenIdをth,tdのクラスに追加 1044 * 1045 * @return マトリクスメニュー 1046 */ 1047 private String makeMatrixMenu2() { 1048 StringBuilder rtn = new StringBuilder( HybsSystem.BUFFER_LARGE ); 1049 1050 UserInfo userInfo = getUser(); 1051 1052 GUIInfo[] guiInfos = userInfo.getGUIInfos(); 1053 String gamenId ; // 画面ID 1054 String bkClassifyKey = null; // 分類コード(旧) 1055 String nextKey = null; // 分類ボタンを押した時に最初の画面が開くようにする 1056 String bkClassifyName = null; // 分類名称(旧) 1057 int cellColorCnt = 0; // MENU_H に 追加する CLR クラス属性の連番 1058 1059 StringBuilder rtnH = new StringBuilder( HybsSystem.BUFFER_LARGE ); // 分類部分の出力用 1060 StringBuilder rtnB = new StringBuilder( HybsSystem.BUFFER_LARGE ); // 実画面のリンク部分の出力用 1061 1062 int level ; 1063 int preLevel = 0; 1064 1065 int lineTmpCnt = 0; // セル中の行カウント 1066 int cellTmpCnt = 0; // 1つの分類中のセルカウント 1067 int cellTmpAllCnt = 0; // 該当行のセルカウント 1068 1069 boolean isInClassify = false; // 分類の中か? 1070 boolean isChangeLevel = false; // 直リンク用(無理やり通常画面の階層として扱うので) 1071 1072 String classifyHref = null; // 小分類のリンク 1073 1074 String headGuikey = "" ; // 5.5.5.3 (2012/08/17) 1075 1076 rtn.append( "<tr>" ).append( HybsSystem.CR ); 1077 1078 for( int i=0; i<guiInfos.length; i++ ) { 1079 if( guiInfos[i].isRead() ) { // 4.0.0 (2005/01/31) 1080 gamenId = guiInfos[i].getKey() ; 1081 if( match != null && !gamenId.matches( match ) ) { continue; } 1082 if( unmatch != null && gamenId.matches( unmatch ) ) { continue; } 1083 1084 // 処理すべき画面かのチェック 1085 int guiFlg = guiCheck( guiInfos, i ); 1086 if( guiFlg == 0 ) { continue; } 1087 1088 level = guiInfos[i].getLevel(); // 4.0.0 (2005/01/31) 1089 1090 // 直リンクの場合、無理やり通常画面に変換 1091 if( level == 2 && guiInfos[i].getAddress() != null && guiInfos[i].getAddress().length() != 0 ) { 1092 level = 3; 1093 if( !isChangeLevel ) { 1094 isChangeLevel = true; 1095 isInClassify = false; 1096 } 1097 } 1098 else { 1099 isChangeLevel = false; 1100 } 1101 1102 // 分類のブレイク処理 1103 if( ( preLevel >= 3 && level < 3 ) || !isInClassify ) { 1104 if( lineTmpCnt != 0 ) { 1105 for( int j=lineTmpCnt; j<minCellCount-1; j++ ) { rtnB.append( HybsSystem.BR ); } 1106 //rtnB.append( "</td>" ).append( HybsSystem.CR ); // 4.2.1.0 (2008/04/03) リスト 1107 rtnB.append( "</ul></div></td>" ).append( HybsSystem.CR ); 1108 } 1109 1110 if( bkClassifyKey != null ) { 1111 rtnH.append( "<th colspan=\"" + cellTmpCnt + "\" class=\"MENU_H CLR" + cellColorCnt + " " + headGuikey + "\">" ); // 5.5.5.3 (2012/08/17) 1112 if( "_SPACE".equals( bkClassifyKey ) ) { 1113 rtnH.append( " " ); 1114 } 1115 else { 1116 classifyHref = JSP + "/index.jsp?classify=" + bkClassifyKey; 1117 // 4.1.2.0(2008/05/14) リクエスト変数を付ける位置変更 1118 classifyHref += "&GAMENID="+nextKey; // ボタンを押した場合に最初の画面が現れる 1119 rtnH.append( makeTagMenuString( classifyHref,"_self",bkClassifyName,bkClassifyKey,-3 ) ); 1120 } 1121 rtnH.append( "</th>" ); 1122 1123 cellTmpAllCnt += cellTmpCnt; 1124 1125 if( sideCount > 0 && cellTmpAllCnt >= sideCount ) { 1126 rtn.append( rtnH ).append( "</tr><tr>" ).append( rtnB ).append( "</tr>" ); 1127 1128 rtnH = new StringBuilder( HybsSystem.BUFFER_LARGE ); 1129 rtnB = new StringBuilder( HybsSystem.BUFFER_LARGE ); 1130 cellTmpAllCnt = 0; 1131 } 1132 } 1133 1134 bkClassifyKey = null; 1135 nextKey = null; 1136 isInClassify = false; 1137 lineTmpCnt = 0; 1138 cellTmpCnt = 0; 1139 } 1140 1141 // 5.5.5.3 (2012/08/17) 大分類(フィールドメニュー) 1142 if( level == 1 ) { 1143 headGuikey = gamenId; 1144 } 1145 // 分類(直リンクの場合は、level=3で処理) 1146 else if( level == 2 ) { 1147 isInClassify = true; 1148 if( guiInfos[i].isPulldown() ){ // 4.3.3.0 (2008/10/01) プルダウン化チェック 1149 excludeButton = true; 1150 } 1151 else{ 1152 excludeButton = false; 1153 } 1154 bkClassifyKey = guiInfos[i].getKey(); 1155 bkClassifyName = guiInfos[i].getName(); 1156 for( int j=i+1; j<guiInfos.length; j++ ) { 1157 if( guiInfos[j] != null && guiInfos[j].isRead() ) { 1158 nextKey = guiInfos[j].getKey(); 1159 break; 1160 } 1161 } 1162 } 1163 // 通常メニュー・隠しメニュー 1164 else if( level >= 3 ) { 1165 1166 // 画面ID="HYBS_BR"の場合は、セルを変える。 1167 if( "HYBS_BR".equals( guiInfos[i].getKey() ) ) { 1168 if( lineTmpCnt != 0 ) { 1169 for( int j=lineTmpCnt; j<minCellCount-1; j++ ) { rtnB.append( HybsSystem.BR ); } 1170 lineTmpCnt = 0; 1171 } 1172 } 1173 // 通常画面 1174 else { 1175 if( lineTmpCnt == 0 ) { 1176 // rtnB.append( "<td class=\"MENU_B\">" ); 1177 // 4.2.1.0 (2008/04/03) リンクをリスト形式で出す案 1178 rtnB.append( "<td class=\"MENU_B "+ headGuikey +"\"> <div class=\"gamen-menu-wrap\"><ul class=\"gamen-menu\">" ); // 5.5.5.3 (2012/08/17) 1179 cellTmpCnt++; 1180 } 1181 1182 // 5.5.2.5 (2012/05/21) リストは、イメージを設定するので、メソッド側で付与します。 1183 rtnB.append( makeTagMenu( guiInfos[i],guiInfos[i].getName(),-4 ) ); // 5.5.2.5 (2012/05/21) イメージアイコン対応 1184 lineTmpCnt++; 1185 1186 if( lineTmpCnt >= maxCellCount ) { 1187 // rtnB.append( "</td>" ); 1188 rtnB.append( " </ul> </div></td>" ); // 4.2.1.0 (008/04/03) リスト 1189 lineTmpCnt = 0; 1190 } 1191 // else { 1192 // rtnB.append( HybsSystem.BR ); // 4.2.1.0 (2008/04/03) リスト。改行不要。 1193 // } 1194 1195 // 分類の中に入っていない通常画面 1196 if( !isInClassify ) { 1197 bkClassifyKey = "_SPACE"; 1198 isInClassify = true; 1199 } 1200 } 1201 } 1202 1203 preLevel = level; 1204 } 1205 1206 } 1207 1208 // 終了処理 1209 // 4.3.3.0 (2008/10/01) 終了処理は0の時行はない 1210 if( lineTmpCnt != 0){ 1211 for( int j=lineTmpCnt; j<minCellCount-1; j++ ) { rtnB.append( HybsSystem.BR ); } 1212 rtnB.append( "</td>" ).append( HybsSystem.CR ); 1213 } 1214 1215 if( bkClassifyKey != null ) { 1216 rtnH.append( "<th colspan=\"" + cellTmpCnt + "\" class=\"MENU_H CLR" + cellColorCnt + " " + headGuikey + "\">" ); // 5.5.5.3 (2012/08/17) 1217 1218 classifyHref = JSP + "/index.jsp?classify=" + bkClassifyKey; 1219 // 4.1.2.0(2008/05/14) リクエスト変数を付ける位置変更 1220 classifyHref += "&GAMENID="+nextKey; 1221 rtnH.append( makeTagMenuString( classifyHref,"_self",bkClassifyName,bkClassifyKey,-3 ) ); 1222 rtnH.append( "</th>" ); 1223 } 1224 1225 rtn.append( rtnH ).append( "</tr><tr>" ).append( rtnB ).append( "</tr>" ); 1226 1227 return rtn.toString(); 1228 } 1229 1230 /** 1231 * タイプに応じたメニューを表示する為の文字列を作成します。 1232 * 引数の GUIInfo より、アクセスすべきメニューのhrefと、targetを求めます。 1233 * type = -3 (マトリクスメニュー) の場合だけ、タグ属性の target を使用します。 1234 * 1235 * 0:フィールドセットメニュー 1236 * 1:トップ階層(【分類名称】) 1237 * 2:選択階層(通常の折りたたみメニュー) 1238 * 3:選択非表示(通常は、隠してあります) 1239 * -1:グループ分類メニュー(class="GUI_GRP"のtdタグで囲われます) 1240 * -2:ラインメニュー([画面名称] ) 1241 * -3:マトリクスメニュー(一覧) 1242 * -4:マトリクスメニュー2(一覧) 1243 * -5:1レベル表示(後続処理は-3と同じ) 1244 * 1245 * @og.rev 4.0.0.0 (2005/01/31) 新規登録(makeTopMenu、makeSecondMenuの置き換え) 1246 * @og.rev 4.1.0.1 (2008/01/22) アドレスが[..]から始まる画面はマルチセッションチェックを行わない。 1247 * @og.rev 4.2.1.0 (2008/04/01) マトリクスメニュー2用のタグ作成処理追加 1248 * @og.rev 4.2.1.0 (2008/04/17) マトリクス2からの遷移先でボタンメニューにする処理 1249 * @og.rev 4.2.2.0 (2008/05/14) buttonRequestの付加をmakeTagMenuString()に変更 1250 * @og.rev 4.3.3.7 (2008/11/22) https対応 1251 * @og.rev 5.5.2.5 (2012/05/21) イメージアイコン対応(画面ID単位ではなく、IMAGE_KEYパラメータで指定可能にする。) 1252 * @og.rev 5.7.8.1 (2014/07/18) realAddress の "/" 対応 1253 * @og.rev 5.9.6.1 (2016/03/04) -5を追加。-3との違いはresult.jspに飛ばない事 1254 * 1255 * @param guiInfo GUIInfoリンク 1256 * @param bodyIn BODY部(表示) 1257 * @param type タイプ 1258 * 1259 * @return 階層別メニュー文字列 1260 */ 1261 private String makeTagMenu( final GUIInfo guiInfo, final String bodyIn, final int type ) { 1262 1263 String href = null; 1264 String tmpTarget = null; 1265 String gamenId = guiInfo.getKey(); // 5.5.2.5 (2012/05/21) イメージアイコン対応 1266 int tmpType = type; // 5.9.6.1 1267 1268 if( guiInfo.getAddress() != null && guiInfo.getAddress().length() > 0 ) { 1269 String readAdrs = guiInfo.getRealAddress( "index.jsp" ); 1270 String reqParam = getRequestParameter( guiInfo.getParam() ); 1271 href = XHTMLTag.addUrlEncode( readAdrs,reqParam ); 1272 tmpTarget = guiInfo.getTarget(); 1273 1274 // 4.3.3.7 (2008/11/22) https対応 1275 // 5.7.8.1 (2014/07/18) realAddress の "/" 対応 1276 String kblink = guiInfo.getKblink(); 1277// if( ! readAdrs.startsWith( "http://" ) && ! readAdrs.startsWith( "https://" )) { 1278 if( ! readAdrs.startsWith( "http://" ) && ! readAdrs.startsWith( "https://" ) && !"/".equals( kblink ) ) { 1279 if( type == -3 ) { 1280 tmpTarget = target; 1281 String param = getRequestParameter( guiInfo.getParam() ); 1282 href = XHTMLTag.addUrlEncode( JSP + "/result.jsp",param ); 1283 } 1284 else if( type == -4 ) { // 4.2.1.0 (2008/04/01) 1285 tmpTarget = "_self"; 1286 String param = getRequestParameter( guiInfo.getParam() ); 1287 href = XHTMLTag.addUrlEncode( JSP + "/index.jsp",param ); 1288 href = XHTMLTag.addUrlEncode( href,"classify=" + guiInfo.getClassify() ); 1289 } 1290 else if( type == -5 ){ // 5.9.6.1 (2016/03/04) 1291 tmpTarget = target; 1292 String param = getRequestParameter( guiInfo.getParam() ); 1293 tmpType = -3; 1294 } 1295 href = XHTMLTag.addUrlEncode( href,"GAMENID=" + gamenId ); // 5.5.2.5 (2012/05/21) せっかくなので、利用する。 1296 1297 // 3.8.0.0 (2005/06/07) 同一セッションでのマルチ起動対策を行います。 1298 // 4.1.0.1 (2008/01/22) アドレスが[..]から始まる画面はマルチセッションチェックを行いません。 1299 // 4.1.0.1 (2008/04/01) マトリクスメニュー2はマルチセッションチェックを行いません。 1300 if( multiSessionCheck && !guiInfo.getAddress().startsWith( ".." ) && type != -4 ) { 1301 href = XHTMLTag.addUrlEncode( href,mscKey ); 1302 } 1303 } 1304 } 1305 // 5.5.2.5 (2012/05/21) イメージアイコン対応(画面ID単位ではなく、IMAGE_KEYパラメータで指定可能にする。) 1306 String imgKey = guiInfo.getImageKey() ; 1307// return makeTagMenuString( href,tmpTarget,bodyIn,gamenId,imgKey,type ) ; 1308 return makeTagMenuString( href,tmpTarget,bodyIn,gamenId,imgKey,tmpType ) ; // 5.9.6.1 1309 } 1310 1311 /** 1312 * タイプに応じたメニューを表示する為の文字列を作成します。 1313 * 従来からのメソッドの引数のままで、新しい gamenId は、imgKey をそのままセットします。 1314 * 1315 * 0:フィールドセットメニュー 1316 * 1:トップ階層(【分類名称】) 1317 * 2:選択階層(通常の折りたたみメニュー) 1318 * 3:選択非表示(通常は、隠してあります) 1319 * -1:グループ分類メニュー(class="GUI_GRP"のtdタグで囲われます) 1320 * -2:ラインメニュー([画面名称] ) 1321 * -3:マトリクスメニュー(一覧) 1322 * -4:マトリクスメニュー2(一覧) 1323 * 1324 * @og.rev 5.5.2.5 (2012/05/21) イメージアイコン対応(画面ID単位ではなく、IMAGE_KEYパラメータで指定可能にする。) 1325 * 1326 * @param href リンク 1327 * @param target ターゲット 1328 * @param bodyIn BODY部(表示) 1329 * @param imgKey imageファイルの検索キー 1330 * @param type タイプ 1331 * 1332 * @return 階層別メニュー文字列 1333 */ 1334 private String makeTagMenuString( final String href,final String target, final String bodyIn, 1335 final String imgKey,final int type ) { 1336 return makeTagMenuString( href,target,bodyIn,imgKey,imgKey,type ); // gamenId の代わりに、imgKey をセットする。 1337 } 1338 1339 /** 1340 * タイプに応じたメニューを表示する為の文字列を作成します。 1341 * 1342 * 0:フィールドセットメニュー 1343 * 1:トップ階層(【分類名称】) 1344 * 2:選択階層(通常の折りたたみメニュー) 1345 * 3:選択非表示(通常は、隠してあります) 1346 * -1:グループ分類メニュー(class="GUI_GRP"のtdタグで囲われます) 1347 * -2:ラインメニュー([画面名称] ) 1348 * -3:マトリクスメニュー(一覧) 1349 * -4:マトリクスメニュー2(一覧) 1350 * 1351 * @og.rev 4.0.0.0 (2005/01/31) 新規登録(makeTopMenu、makeSecondMenuの置き換え) 1352 * @og.rev 4.0.0.0 (2007/11/28) switch文の中の二重コードを統一します。 1353 * @og.rev 4.2.1.0 (2008/04/01) ボタン形式のリンク対応、マトリクスメニュー2対応 1354 * @og.rev 4.2.2.0 (2008/05/14) buttonRequestの付加をここで行うようにする 1355 * @og.rev 4.3.5.0 (2009/02/01) switch の case で重複項目をまとめます。 1356 * @og.rev 5.1.4.0 (2010/03/01) onClick,onMouseOver,onMouseOutの処理は、外部のJavaScriptファイルで記述します。 1357 * @og.rev 5.1.8.0 (2010/07/01) コードリソースのキーが存在しない場合にエラーとなるバグを修正 1358 * @og.rev 5.3.9.0 (2011/09/01) メニューでのヘルプアイコン対応 1359 * @og.rev 5.4.4.4 (2012/02/15) ヘルプアイコンはimgKeyがnullでない場合のみとする 1360 * @og.rev 5.5.0.4 (2012/03/14) FAQ対応 1361 * @og.rev 5.5.2.5 (2012/05/21) イメージアイコン対応(画面ID単位ではなく、IMAGE_KEYパラメータで指定可能にする。) 1362 * @og.rev 5.5.4.2 (2012/07/13) JSP(/gf/jsp/) ではなく、CNTX(gf)+MENU_IMG(/jsp/menuImage/) で処理するように変更 1363 * 1364 * @param href リンク 1365 * @param target ターゲット 1366 * @param bodyIn BODY部(表示) 1367 * @param gamenId 画面ID/グループIDなど 1368 * @param imgKey imageファイルの検索キー 1369 * @param type タイプ 1370 * 1371 * @return 階層別メニュー文字列 1372 */ 1373 private String makeTagMenuString( final String href,final String target, final String bodyIn, 1374 final String gamenId,final String imgKey,final int type ) { 1375 1376 final String body ; 1377 String listStyle = "<li>"; 1378 String imgFile = imgFileMap.getFilename( imgKey ); // 5.5.2.5 (2012/05/21) 属性名変更 1379 if( imgFile != null ) { 1380 if( imageOnly ) { 1381 body = "<img src=\"/" + CNTX + MENU_IMG + imgFile + "\" title=\"" + bodyIn + "\" />" ; 1382 } 1383 // 5.5.2.5 (2012/05/21) -4(MATRIX Menu2)の場合は、<li style="list-style:url(画像URL);"> で処理する。 1384 else if( type == -4 ) { 1385 listStyle = "<li style=\"list-style:url(/" + CNTX + MENU_IMG + imgFile + ");\">" ; 1386 body = bodyIn ; 1387 } 1388 else { 1389 body = "<img src=\"/" + CNTX + MENU_IMG + imgFile + "\"/>" + bodyIn ; 1390 } 1391 } 1392 else { 1393 if( imageOnly && bodyIn != null && bodyIn.length() > 0 ) { 1394 body = "<span title=\"" + bodyIn + "\" >" + bodyIn.charAt(0) + "</span>" ; 1395 } 1396 else { 1397 body = bodyIn ; 1398 } 1399 } 1400 1401 final String in ; 1402 if( href != null ) { 1403 TagBuffer tag = null; 1404 if( useButton ) { // 4.2.1.0 (2008/04/01) 1405 tag = new TagBuffer( "button" ); 1406 String onClick = "top."+target+".location.href=\'"+ href + "\';"; 1407 // 5.1.4.0 (2010/03/01) 1408 tag.add( "onclick" , onClick ); 1409 tag.add( "class" , "buttonMenu" ); // 4.2.1.0 (2008/04/03) classを追加 1410 tag.add( "id" , gamenId ); // 5.5.2.5 (2012/05/21) idを本当の画面IDで設定 1411 tag.setBody( body ); 1412 } 1413 else { 1414 tag = new TagBuffer( "a" ); 1415 1416 String href2 = href; 1417 if( buttonRequest ){ // 4.2.2.0 (2008/05/14) ボタン式にする場合はリクエスト変数付加 1418 if ( excludeButton ){ //4.3.3.0 (2008/10/01) 強制プルダウン化の場合はfalseで渡す 1419 href2 = XHTMLTag.addUrlEncode( href2,"buttonRequest=false"); 1420 } 1421 else{ 1422 href2 = XHTMLTag.addUrlEncode( href2,"buttonRequest=true"); 1423 } 1424 tag.add( "class" , "buttonClassify" ); 1425 } 1426 1427 tag.add( "href" , href2 ); 1428 tag.add( "target" , target ); 1429 tag.setBody( body ); 1430 } 1431 in = tag.makeTag(); 1432 } 1433 else { 1434 in = body; 1435 } 1436 1437 String rtn = null; 1438 switch( type ) { 1439 case 1: rtn = FIELD_IN + "<legend>" + in + "</legend>" ; break; // 大分類 1440 case 2: rtn = "【" + in + "】" ; break; // 小分類・直リンク 1441 case 3: // 通常メニュー 1442 case 4: rtn = " " + in ; break; // 隠れメニュー 1443 case -1: rtn = "<td class=\"MENU_G " + gamenId + "\">" + in + "</td>" ; break; // 5.5.2.5 (2012/05/21) グループメニュー 1444 case -2: rtn = "[" + in + "] "; break; // ラインメニュー 1445 // 4.3.5.0 (2009/02/01) switch の case で重複項目をまとめます。 1446 //case -4: rtn = "■ " + in ; break; 1447 // 5.5.2.5 (2012/05/21) listStyle の適用。type == -4 のみで適用するので、-3 は、そのままセットする。 1448 case -3: rtn = in ; break; // マトリクスメニュー 1449 case -4: rtn = listStyle + in + "</li>" ; break; // 4.2.1.0 (2008/04/03) リスト。リストのため■はいらない 1450 default : 1451 rtn = "X_" + in ; 1452 } 1453 1454 // 5.5.2.5 (2012/05/21) imgKeyではなく、gamenIdがnullの場合は処理しないに変更、faqLinkFormat 廃止。 1455 if( gamenId != null && helpMap != null && helpMap.exists( gamenId ) ) { 1456 if( type == 2 ) { 1457 rtn = rtn + makeHelpLink( gamenId ); 1458 } 1459 else if( type == -3 ) { 1460 rtn = "<table><tr><td rowspan=\"2\">" + rtn + "</td><td>" 1461 + makeHelpLink( gamenId ) + "</td></tr><tr><td></td></tr></table>"; 1462 } 1463 } 1464 1465 return rtn ; 1466 } 1467 1468 /** 1469 * 【TAG】作成するメニューの種類(NORMAL,GROUP,ONELEVEL,NEXTGUI,MATRIX,MATRIX2)を指定します(初期値:NORMAL)。 1470 * 1471 * @og.tag 1472 * 作成するメニューには、複数の種類があります。 1473 * <table border="1" frame="box" rules="all" > 1474 * <caption>メニューの種類</caption> 1475 * <tr><th>種類 </th><th>説明 </th></tr> 1476 * <tr><td>NORMAL </td><td>通常の階層メニュー</td></tr> 1477 * <tr><td>GROUP </td><td>GROUPのみを取り出してリンクを作成します。(topMenuに利用)</td></tr> 1478 * <tr><td>ONELEVEL</td><td>指定のclassify のメニューのみを取り出してリンクを作成します。(lineMenuに利用)</td></tr> 1479 * <tr><td>NEXTGUI </td><td>既存のページの次にアクセスされる画面郡のリンクを作成します。</td></tr> 1480 * <tr><td>MATRIX </td><td>一覧表形式のメニューを作成します。(大分類付きマルチメニュー)</td></tr> 1481 * <tr><td>MATRIX2 </td><td>一覧表形式のメニューを作成します。(大分類なしボタンメニュー)</td></tr> 1482 * </table> 1483 * 1484 * @og.rev 4.0.0.0 (2005/01/31) 新規登録 1485 * @og.rev 5.2.3.0 (2010/12/01) NEXTGUI 追加 1486 * 1487 * @param type メニューの種類(NORMAL,GROUP,ONELEVEL,NEXTGUI,MATRIX,MATRIX2) 1488 */ 1489 public void setMenuType( final String type ) { 1490 menuType = nval( getRequestParameter( type ),MENU_TYPE[0] ); 1491 if( ! check( menuType, MENU_TYPE ) ) { 1492 String errMsg = "menuType に、指定できない種類の文字が指定されました。menuType=[" 1493 + menuType + "]" + HybsSystem.CR 1494 + "以下の中から、選択してください。[" 1495 + StringUtil.array2csv( MENU_TYPE ) + "]" + HybsSystem.CR; 1496 throw new HybsSystemException( errMsg ); 1497 } 1498 } 1499 1500 /** 1501 * 【TAG】折り返しメニューを構築するかどうかを指定します(初期値:true)。 1502 * 1503 * @og.tag 1504 * trueを設定すると、JavaScriptによる折り返しメニューを構築します。 1505 * false の場合は、通常のHTMLのみで、階層メニューを構築します。 1506 * 初期値は、true(折り返しメニュー)です。 1507 * 1508 * @og.rev 4.0.0.0 (2005/01/31) 新規登録 1509 * 1510 * @param flag 折り返しメニューかどうか 1511 */ 1512 public void setExpand( final String flag ) { 1513 expand = nval( getRequestParameter( flag ),expand ); 1514 } 1515 1516 /** 1517 * 【TAG】表示対象となるグループをカンマ区切り文字列で指定します。 1518 * 1519 * @og.tag 1520 * メニューの表示対象グループをカンマ区切り文字列で複数指定できます。 1521 * 指定のグループのメニューだけが、表示対象になります。 1522 * メニューにも、複数のグループを指定できるため、1グループの指定で、 1523 * 複数のくくりを表示することも可能です。 1524 * グループを指定しない場合は、全グループが対象になります。 1525 * また、メニュー側にグループ指定がない場合は、グループ指定に 1526 * 関係なく、対象になります。 1527 * 初期値は、未指定(全メニューが対象)です。 1528 * 分解方法は、通常のパラメータ取得後に、CSV分解します。 1529 * 1530 * @og.rev 4.0.0.0 (2005/01/31) 新規登録 1531 * 1532 * @param menuGroups 表示対象となるグループ(カンマ区切り文字列) 1533 */ 1534 public void setGroups( final String menuGroups ) { 1535 groups = StringUtil.csv2Array( getRequestParameter( menuGroups ) ); 1536 if( groups.length == 0 ) { groups = null; } 1537 } 1538 1539 /** 1540 * 【TAG】表示対象となる分類(classify)を指定します。 1541 * 1542 * @og.tag 1543 * メニューの表示対象となる分類(classify)を指定することで、一まとまりの 1544 * メニューを作成します。これは、3段階メニューの最終メニューを求める場合に 1545 * 指定します。 1546 * 最終メニューは、画面上部に設ける予定のメニューで、上下フレーム分割での 1547 * 運用時に使用します。 1548 * 分類の指定がない場合は、すべてが表示対象になります。 1549 * 初期値は、未指定(全メニューが対象)です。 1550 * 1551 * @og.rev 4.0.0.0 (2005/01/31) 新規登録 1552 * 1553 * @param classify 表示対象となる分類(classify) 1554 */ 1555 public void setClassify( final String classify ) { 1556 selClassify = nval( getRequestParameter( classify ),selClassify ); 1557 } 1558 1559 /** 1560 * 【TAG】グループメニューの表示対象となるソース名(href)を指定します(初期値:menu.jsp)。 1561 * 1562 * @og.tag 1563 * GROUPメニューの表示対象となるソース名(href)を指定することで、 1564 * サブメニューを自分自身のフレームに対して割り当てるのか、フレームを分けて 1565 * 管理するのかを自由に設定できます。 1566 * 初期値は、menu.jspです。 1567 * 1568 * @og.rev 4.0.0.0 (2005/01/31) 新規登録 1569 * 1570 * @param inHref 表示対象となるソース名(href) 1571 */ 1572 public void setHref( final String inHref ) { 1573 href = nval( getRequestParameter( inHref ),href ); 1574 } 1575 1576 /** 1577 * 【TAG】グループメニューの表示対象となるフレーム名(target)を指定します(初期値:MENU)。 1578 * 1579 * @og.tag 1580 * GROUPメニューの表示対象となるフレーム名(target)を指定することで、 1581 * サブメニューを自分自身のフレームに対して割り当てるのか、フレームを分けて 1582 * 管理するのかを自由に設定できます。 1583 * フレーム分割を行うと、変更箇所は、サブメニューのみになる為、動きに無駄が 1584 * なくなりますが、グループメニューの大きさが固定されてしまいます。 1585 * 自分自身にすると、グループメニューとサブメニューを一つのフレームに 1586 * 入れることで、更新時の画面のちらつきは発生しますが、無駄なスペースは 1587 * 省くことが可能になります。 1588 * 初期値は、MENU(通常のメニューフレーム)です。 1589 * 1590 * @og.rev 4.0.0.0 (2005/01/31) 新規登録 1591 * 1592 * @param inTarget 表示対象となるフレーム名(target) 1593 */ 1594 public void setTarget( final String inTarget ) { 1595 target = nval( getRequestParameter( inTarget ),target ); 1596 } 1597 1598 /** 1599 * 【TAG】グループメニューの表示に、画像のみかどうか[true:画像のみ/false:画像+ラベル]を指定します(初期値:false)。 1600 * 1601 * @og.tag 1602 * GROUPメニューの表示対象として、jsp/menuImage 以下に グループ名と同一の 1603 * 画像ファイルが存在する場合は、画像を使用します。 1604 * このフラグを、true に設定すると、画像のみを使用します。 1605 * false の場合は、画像+グループ名のラベルを使用します。 1606 * 画像のみの場合でも、title 属性にグループ名のラベルをセットしますので、 1607 * マウスカーソルをオーバーすれば、名称がTips表示されます。 1608 * 画像が存在しない場合に、true(画像のみ)に設定した場合は、ラベルの最初の1文字 1609 * のみを出力します。 1610 * 初期値は、false(画像+ラベル)です。 1611 * 1612 * @og.rev 4.0.0.0 (2005/01/31) 新規登録 1613 * 1614 * @param flag [true:画像のみ/false:画像+ラベル] 1615 */ 1616 public void setImageOnly( final String flag ) { 1617 imageOnly = nval( getRequestParameter( flag ),imageOnly ); 1618 } 1619 1620 /** 1621 * 【TAG】グループメニューの表示対象となるメニューを横並びさせる数を指定します。 1622 * 1623 * @og.tag 1624 * GROUPメニューなどの表示を行う場合に、横方向に何個のメニューを表示させるかを 1625 * 指定します。例えば、画像のみのリンクと組み合わせれば、より、多くのグループを 1626 * 横方向に並べることで、小領域に多くの情報を詰めることが可能になります。 1627 * 0 を設定すると、横方向にのみ並べる(折り返さない)メニューを作ることが 1628 * 可能になります。 1629 * 初期値は、無制限です。 1630 * 1631 * @og.rev 4.0.0.0 (2005/01/31) 新規登録 1632 * 1633 * @param count メニューを横並びさせる数 1634 */ 1635 public void setSideCount( final String count ) { 1636 sideCount = nval( getRequestParameter( count ),sideCount ); 1637 } 1638 1639 /** 1640 * 【TAG】表形式メニュー(MATRIX)の一つのセルに含まれる最小行数を指定します(初期値:8)。 1641 * 1642 * @og.tag 1643 * 表形式メニュー(MATRIX)では、一つのセルの高さを同一にする為、<br />タグを挿入します。 1644 * このタグの挿入する個数を指定します。 1645 * この個数だけ、メニューの数があろうとなかろうと行を確保します。 1646 * 指定の値が、実際の行数より少ない場合は、実際の行数分だけ拡張されます。 1647 * 初期値は、8 です。 1648 * 1649 * @og.rev 4.0.0.0 (2005/01/31) 新規登録 1650 * 1651 * @param count セルに含まれる最小行数 1652 * @see #setMaxCellCount( String ) 1653 */ 1654 public void setMinCellCount( final String count ) { 1655 minCellCount = nval( getRequestParameter( count ),minCellCount ); 1656 } 1657 1658 /** 1659 * 【TAG】表形式メニュー(MATRIX)の一つのセルに含まれる最大行数を指定します(初期値:8)。 1660 * 1661 * @og.tag 1662 * 表形式メニュー(MATRIX)では、一つのセルの高さを同一にする為、指定の行数で 1663 * 新たな セルを作成して、セルを横方向に連結します。 1664 * 初期値は、8 です。 1665 * 1666 * @og.rev 4.0.0.0 (2005/01/31) 新規登録 1667 * 1668 * @param count セルに含まれる最大行数 1669 * @see #setMinCellCount( String ) 1670 */ 1671 public void setMaxCellCount( final String count ) { 1672 maxCellCount = nval( getRequestParameter( count ),maxCellCount ); 1673 } 1674 1675 /** 1676 * 【TAG】グループメニューのキャッシュを使用するかどうか[true/false]を指定します(初期値:true)。 1677 * 1678 * @og.tag 1679 * GROUPメニューの表示は、一旦作成すると、ほとんど書き換えることがありません。 1680 * 作成は、使用できる全メニューをスキャンして、その中からグループ属性をピックアップ 1681 * するという処理を行っている為、明らかに無駄な処理です。 1682 * そこで、jsp/index.jsp が実行された場合のみキャッシュをクリアして、内部では 1683 * キャッシュがなければ作成し、あればキャッシュを使うロジックになっています。 1684 * ここでは、キャッシュを使用するのか、毎回作成しなおすのかを指定します。 1685 * 対象として、jsp/menuImage 以下に グループ名と同一の 1686 * 画像ファイルが存在する場合は、画像を使用します。 1687 * このフラグを、true に設定すると、画像のみを使用します。 1688 * false の場合は、画像+グループ名のラベルを使用します。 1689 * 画像のみの場合でも、title 属性にグループ名のラベルをセットしますので、 1690 * マウスカーソルをオーバーすれば、名称がTips表示されます。 1691 * 画像が存在しない場合は、たとえ、true(画像のみ)に設定しても、ラベルを出力します。 1692 * 初期値は、true(キャッシュする)です。 1693 * 1694 * @og.rev 4.0.0.0 (2005/01/31) 新規登録 1695 * 1696 * @param flag [true:キャッシュする/false:キャッシュしない] 1697 */ 1698 public void setCache( final String flag ) { 1699 cache = nval( getRequestParameter( flag ),cache ); 1700 } 1701 1702 /** 1703 * 【TAG】正判定(マッチする場合に、メニューに出す)条件を設定します。 1704 * 1705 * @og.tag 1706 * メニューを表示する/しないの判定を、画面IDのマッチングで判断します。 1707 * これは、正規表現で表される引数と、画面IDがマッチする場合に、 1708 * メニューを表示させます。 1709 * マッチしない場合は、表示されません。 1710 * 何も指定しない場合は、ロールの判定みの行われます。 1711 * 1712 * @param mt 正判定(マッチする場合に、メニューに出す)条件 1713 */ 1714 public void setMatch( final String mt ) { 1715 match = nval( getRequestParameter( mt ),match ); 1716 } 1717 1718 /** 1719 * 【TAG】逆判定(マッチする場合に、メニューに出さない)条件を設定します。 1720 * 1721 * @og.tag 1722 * メニューを表示する/しないの判定を、画面IDのマッチングで判断します。 1723 * これは、正規表現で表される引数と、画面IDがマッチする場合に、 1724 * メニューを表示させません。 1725 * マッチしない場合は、表示されます。 1726 * 何も指定しない場合は、ロールの判定みの行われます。 1727 * 1728 * @param umt 逆判定(マッチする場合に、メニューに出さない)条件 1729 */ 1730 public void setUnmatch( final String umt ) { 1731 unmatch = nval( getRequestParameter( umt ),unmatch ); 1732 } 1733 1734 /** 1735 * 【TAG】画面リンクにボタンを使用するかどうか[true/false]を指定します(初期値:false)。 1736 * 1737 * @og.tag 1738 * 画面リンクをボタンリンク形式で表示するかを指定します。 1739 * falseの場合は、通常のリンクになります。 1740 * 初期値は、false(通常リンク)です。 1741 * 1742 * @og.rev 4.2.1.0 (2008/04/01) 新規登録 1743 * 1744 * @param flag [true:ボタン形式リンク/false:通常リンク] 1745 */ 1746 public void setUseButton( final String flag ) { 1747 useButton = nval( getRequestParameter( flag ),useButton ); 1748 } 1749 1750 /** 1751 * 【廃止】ボタンリンクを使用した場合に、JavaScriptのイベントを発生させるかどうか[true/false]を指定します(初期値:false)。 1752 * 1753 * @og.tag 1754 * (この属性は、廃止されています) 1755 * ボタンリンクを使用した場合に、JavaScriptのイベントを発生させるかを指定します。 1756 * 発生するイベント及び呼ばれる関数は以下の3つです。 1757 * @クリック時 ⇒ buttonClick(this) 1758 * Aマウスオーバー時 ⇒ buttonOver(this) 1759 * Bカーソルアウト時 ⇒ buttonOut(this) 1760 * 初期値は、false(JavaScriptイベントを発生しない)です。 1761 * 1762 * @og.rev 4.2.1.0 (2008/04/01) 新規登録 1763 * @og.rev 5.1.4.0 (2010/03/01) 廃止 1764 * 1765 * @param flag [true:ボタン形式リンク/false:通常リンク] 1766 */ 1767// @Deprecated public void setUseButtonScript( final String flag ) { 1768// useButtonScript = nval( getRequestParameter( flag ),useButtonScript ); 1769// } 1770 1771 /** 1772 * 【TAG】マトリクスからの遷移先でボタンメニュー表示するかどうか[true/false]を指定します(初期値:false)。 1773 * 1774 * @og.tag 1775 * マトリクスメニューからの遷移先でボタンメニューを表示させるために 1776 * アドレスに付加するリクエスト変数を指定します。 1777 * trueにするとbuttonRequest=trueのリクエスト変数を付けます。 1778 * falseの場合はリクエスト変数を付けません。 1779 * 初期値は、false(プルダウン形式で表示)です。 1780 * 1781 * @og.rev 4.2.1.0 (2008/04/17) 新規登録 1782 * 1783 * @param flag [true:ボタン形式/false:通常形式] 1784 */ 1785 public void setButtonRequest( final String flag ) { 1786 buttonRequest = nval( getRequestParameter( flag ),buttonRequest ); 1787 } 1788 1789 /** 1790 * 【TAG】標準画面を初期状態で表示するかどうか[true/false]を指定します(初期値:false)。 1791 * 1792 * @og.tag 1793 * 通常expand=trueの状態では、メニューが折りたたまれています。 1794 * このinlineStyle属性をtrueにすると標準画面のスタイルにdisplay:inlineを 1795 * 付加する事で、初期状態でメニューが開いた状態になります。 1796 * expand=falseとの違いは、隠しメニュー及び分類の折りたたみ機能が利用できる事です。 1797 * 初期値は、false(折りたたまれた状態)です。 1798 * 1799 * @og.rev 4.3.3.0 (2008/10/01) 新規 1800 * 1801 * @param flag [true:ボタン形式/false:通常形式] 1802 */ 1803 public void setInlineStyle( final String flag ) { 1804 inlineStyle = nval( getRequestParameter( flag ),inlineStyle ); 1805 } 1806 1807 /** 1808 * 【TAG】ONELEVEL,NEXTGUI で、DIVタグ+design-onelevel 処理をするかどうか[true/false]を指定します(初期値:false)。 1809 * 1810 * @og.tag 1811 * ONELEVEL,NEXTGUI は、QUERY 画面の上部に表示される簡易メニューです。 1812 * この表記は、[画面リンク] 形式のテキスト表示されていますが、画面名称を固定長にするなどの処理を入れるため、 1813 * DIVでフォーマットします。 1814 * 作りは、出力される HTML を確認いただきたいと思います。 1815 * 全体を、<div id="design-onelevel" > で、囲い、画面名称は、<span clas="design-onelevel" > で、囲います。 1816 * これを、標準CSSで、固定幅と背景色、リンクの文字色など書き換えて、体裁を整えます。 1817 * 初期値は、false(従来と同じ)です。 1818 * 1819 * @og.rev 5.5.2.3 (2012/05/15) 新規追加 1820 * 1821 * @param flag [true:DIVタグ処理をする/false:しない] 1822 */ 1823 public void setUseDivOneLevel( final String flag ) { 1824 useDivOneLevel = nval( getRequestParameter( flag ),useDivOneLevel ); 1825 } 1826 1827 /** 1828 * シリアライズ用のカスタムシリアライズ書き込みメソッド 1829 * 1830 * @og.rev 4.0.0.0 (2006/09/31) 新規追加 1831 * @serialData 一部のオブジェクトは、シリアライズされません。 1832 * 1833 * @param strm ObjectOutputStreamオブジェクト 1834 * @throws IOException 入出力エラーが発生した場合 1835 */ 1836 private void writeObject( final ObjectOutputStream strm ) throws IOException { 1837 strm.defaultWriteObject(); 1838 } 1839 1840 /** 1841 * シリアライズ用のカスタムシリアライズ読み込みメソッド 1842 * 1843 * ここでは、transient 宣言された内部変数の内、初期化が必要なフィールドのみ設定します。 1844 * 1845 * @og.rev 4.0.0.0 (2006/09/31) 新規追加 1846 * @serialData 一部のオブジェクトは、シリアライズされません。 1847 * 1848 * @param strm ObjectInputStreamオブジェクト 1849 * @see #release2() 1850 * @throws IOException シリアライズに関する入出力エラーが発生した場合 1851 * @throws ClassNotFoundException クラスを見つけることができなかった場合 1852 */ 1853 private void readObject( final ObjectInputStream strm ) throws IOException , ClassNotFoundException { 1854 strm.defaultReadObject(); 1855 } 1856 1857 /** 1858 * 画面オブジェクト一覧より、指定されたインデックスより後に実体となる画面ID 1859 * (直リンク、通常メニュー、隠しメニュー※改行メニューは除く)が存在するかを判定します。 1860 * グループスが指定されている場合は、グループで絞り込まれた結果に対して判定を行います。 1861 * 1862 * @og.rev 4.0.0.0 (2007/10/30) 新規追加 1863 * 1864 * @param guiInfos 画面オブジェクト一覧 1865 * @param idx 検索を開始するインデックス番号 1866 * 1867 * @return 0:実体画面が存在せず 1:全て隠しの分類 2:実体画面 or 通常画面を含む分類 1868 */ 1869 private int guiCheck( final GUIInfo[] guiInfos, final int idx ) { 1870 int flg = 0; 1871 1872 // 実態探し 1873 if( levelCheck( guiInfos[idx] ) > 0 ) { 1874 // グループメニューリンク時の処理 1875 if( groups == null ) { flg = 2; } 1876 else { flg = groupCheck( guiInfos[idx] ) ? 2 : 0; } 1877 } 1878 else { 1879 for( int j=idx+1; j<guiInfos.length; j++ ) { 1880 if( !guiInfos[j].isRead() ) { continue; } 1881 if( flg > 1 || guiInfos[j].getLevel() <= guiInfos[idx].getLevel() ) { break; } 1882 1883 if( groups == null || groupCheck( guiInfos[j] ) ) { 1884 if( levelCheck( guiInfos[j] ) > 0 ) { 1885 flg = levelCheck( guiInfos[j] ); 1886 } 1887 } 1888 } 1889 } 1890 1891 return flg; 1892 } 1893 1894 /** 1895 * 指定された画面IDが実体であるか(直リンク、通常メニュー、隠しメニュー※改行メニューは除く)を判定します。 1896 * 1897 * @og.rev 4.0.0.0 (2007/10/30) 新規追加 1898 * @og.rev 4.0.0.0 (2007/11/30) switch に default 追加 1899 * 1900 * @param guiInfo 画面オブジェクト 1901 * 1902 * @return 0:分類 1:実体画面(隠し) 2:実体画面(通常) or 直リンク 1903 */ 1904 private int levelCheck( final GUIInfo guiInfo ) { 1905 int flg = 0; 1906 1907 switch ( guiInfo.getLevel() ) { 1908 case 2: 1909 String adrs = guiInfo.getAddress(); 1910 if( adrs != null && adrs.length() > 0 ) { 1911 flg = 2; 1912 } 1913 break; 1914 case 3: 1915 flg = "HYBS_BR".equals( guiInfo.getKey() ) ? flg : 2; break; 1916 case 4: 1917 flg = "HYBS_BR".equals( guiInfo.getKey() ) ? flg : 1; break; 1918 default : 1919 flg = 0; break; 1920 } 1921 1922 return flg; 1923 } 1924 1925 /** 1926 * 指定された画面IDが設定されたグループスに含まれるかを判定します。 1927 * 1928 * @og.rev 4.0.0.0 (2007/10/30) 新規追加 1929 * 1930 * @param guiInfo 画面オブジェクト 1931 * 1932 * @return グループスに含まれるかどうか 1933 */ 1934 private boolean groupCheck( final GUIInfo guiInfo ) { 1935 boolean flg = false; 1936 1937 for( int k=0; k<groups.length; k++ ) { 1938 if( guiInfo.isGroupIn( groups[k] ) ) { 1939 flg = true; 1940 break; 1941 } 1942 } 1943 1944 return flg; 1945 } 1946 1947 /** 1948 * ヘルプリンク文字列を生成します。 1949 * 1950 * @og.rev 5.3.9.0 (2011/09/01) 新規作成 1951 * @og.rev 5.0.0.4 (2012/03/16) FAQ対応 1952 * @og.rev 5.5.2.5 (2012/05/21) FAQ対応 廃止 1953 * 1954 * @param key 画面ID 1955 * 1956 * @return ヘルプリンク文字列 1957 */ 1958 private String makeHelpLink( final String key ) { 1959 String rtn = ""; 1960 String filename = helpMap.getFilename( key ); 1961 if( filename != null ) { 1962 rtn = helpLinkFormat.replace( "{FILENAME}", filename ); 1963 } 1964 1965 return rtn; 1966 } 1967 1968 /** 1969 * このオブジェクトの文字列表現を返します。 1970 * 基本的にデバッグ目的に使用します。 1971 * 1972 * @return このクラスの文字列表現 1973 */ 1974 @Override 1975 public String toString() { 1976 return org.opengion.fukurou.util.ToString.title( this.getClass().getName() ) 1977 .println( "VERSION" ,VERSION ) 1978 .println( "menuType" ,menuType ) 1979 .println( "expand" ,expand ) 1980 .println( "groups" ,groups ) 1981 .println( "selClassify" ,selClassify ) 1982 .println( "href" ,href ) 1983 .println( "target" ,target ) 1984 .println( "imageOnly" ,imageOnly ) 1985 .println( "sideCount" ,sideCount ) 1986 .println( "minCellCount" ,minCellCount ) 1987 .println( "maxCellCount" ,maxCellCount ) 1988 .println( "cache" ,cache ) 1989 .println( "mscKey" ,mscKey ) 1990 .println( "multiSessionCheck" ,multiSessionCheck ) 1991 .println( "useButton" ,useButton ) 1992// .println( "useButtonScript" ,useButtonScript ) 1993 .println( "buttonRequest" ,buttonRequest ) 1994 .println( "MENU_TYPE" ,MENU_TYPE ) 1995 .println( "Other..." ,getAttributes().getAttribute() ) 1996 .fixForm().toString() ; 1997 } 1998}