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