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 * @og.rev 5.10.15.2 (2019/09/20) GROUPのマルチバイト文字対応 564 * 565 * @return メニュー 566 */ 567 private String makeGroupMenu() { 568 569 // 画面のグループメニューのキャッシュを取得します。 570 String groupMenu ; 571 String cacheKey = HybsSystem.GUI_GR_MENU_CACHE_KEY + href + target ; 572 if( cache ) { 573 groupMenu = (String)getSessionAttribute( cacheKey ); 574 if( groupMenu != null ) { return groupMenu; } // キャッシュを返します。 575 } 576 else { 577 removeSessionAttribute( cacheKey ); 578 } 579 580 UserInfo userInfo = getUser(); 581 582 Set<String> groupSet = new LinkedHashSet<String>(); 583 584 // そのユーザーで使用できる画面をすべてピックアップします。 585 // その上で、読取可能なメニューを含むグループを順番に Set にセットしていきます。 586 GUIInfo[] guiInfos = userInfo.getGUIInfos(); 587 String gamenId ; // 画面ID 588 for( int i=0; i<guiInfos.length; i++ ) { 589 if( guiInfos[i].isRead() ) { 590 gamenId = guiInfos[i].getKey() ; 591 if( match != null && !gamenId.matches( match ) ) { continue; } 592 if( unmatch != null && gamenId.matches( unmatch ) ) { continue; } 593 // 5.9.7.1 (2016/04/06) 594// String[] groups = StringUtil.csv2Array( guiInfos[i].getGroups() ); 595 String[] guiGroups = StringUtil.csv2Array( guiInfos[i].getGroups() ); 596 for( int j=0; j<guiGroups.length; j++ ) { 597 if(groups != null && !Arrays.asList(groups).contains( guiGroups[j] )){ 598 continue; 599 } 600// groupSet.add( groups[j] ); 601 groupSet.add( guiGroups[j] ); 602 } 603 } 604 } 605 606 // 5.0.0.3 (2009/09/22) 607 if( groupSet.size() > 0 ) { 608 int sideTmpCnt = 1; 609 StringBuilder rtn = new StringBuilder( HybsSystem.BUFFER_LARGE ); 610 rtn.append( "<tr>" ); 611 612 String allMenu = getLabel( "ALL_MENU" ); // 4.2.2.0 (2008/05/15) ALLはラベルリソース使うように変更 613 rtn.append( makeTagMenuString( href,target,allMenu,"GUI_ALL",-1 ) ); 614 if( sideCount > 0 && sideTmpCnt % sideCount == 0 ) { rtn.append("</tr><tr>"); } 615 sideTmpCnt++ ; 616 617 Iterator<String> ite = groupSet.iterator() ; 618 CodeData groupCode = getResource().getCodeData( "GROUPS" ) ; 619 if( groupCode != null ) { 620 while( ite.hasNext() ) { 621 String group = ite.next(); 622 int cdAdrs = groupCode.getAddress( group ) ; 623 // 4.0.0.0 (2007/10/05) グループのコードリソースが存在しない場合 624 String groupLabel = ""; 625 if( cdAdrs >= 0 ) { groupLabel = groupCode.getLongLabel( cdAdrs ); } 626 627 // 5.1.8.0 (2010/07/01) コードリソースのキーが存在しない場合にエラーとなるバグを修正 628 if( groupLabel.length() == 0 && group != null && group.length() > 0 ) { 629 groupLabel = group; 630 } 631 632// String src = XHTMLTag.addUrlEncode( href,"group=" + group ); 633 String src = XHTMLTag.addUrlEncode( href,"group=" + StringUtil.urlEncode( group ) ); // 5.10.15.2 (2019/09/20) 634 rtn.append( makeTagMenuString( src,target,groupLabel,group,-1 ) ); 635 if( sideCount > 0 && sideTmpCnt % sideCount == 0 ) { rtn.append("</tr><tr>"); } 636 sideTmpCnt++ ; 637 } 638 } 639 640 if( ! imageOnly && ! buttonRequest ) { // 4.2.2.0 (2008/05/14) ボタンメニュー時はトップメニュー 641 rtn.append( makeTagMenuString( JSP + "/index.jsp",target,"Top","GUI_TOP",-1 ) ); 642 } 643 rtn.append( "</tr>" ); 644 645 // 画面のグループメニューのキャッシュをセットします。 646 groupMenu = rtn.toString() ; 647 } 648 else { 649 groupMenu = ""; 650 } 651 652 if( cache ) { 653 setSessionAttribute( cacheKey,groupMenu ); 654 } 655 656 return groupMenu; 657 } 658 659 /** 660 * メニューを表示する為のHTMLを作成します(折り返しJavaScript対応版)。 661 * 662 * @og.rev 4.0.0.0 (2005/01/31) GUIInfoの実アドレスのパラメータを考慮する。 663 * @og.rev 4.0.0.0 (2007/10/31) 一旦廃止 664 * @og.rev 5.5.2.3 (2012/05/15) useDivOneLevel 対応 665 * @og.rev 5.5.2.5 (2012/05/21) イメージアイコン対応(makeTagMenuのパラメータ変更) 666 * @og.rev 5.5.6.0 (2013/01/07) useDivOneLevelの折り返し方法変更 667 * @og.rev 5.9.1.2 (2015/10/23) span自己終了修正 668 * @og.rev 5.9.6.1 (2016/03/04) フレーム対応 669 * 670 * @return メニュー 671 */ 672 private String makeOneLevelMenu() { 673 StringBuilder rtn = new StringBuilder( HybsSystem.BUFFER_LARGE ); 674 675 // 5.5.2.3 (2012/05/15) useDivOneLevel 対応 676 if( useDivOneLevel ) { rtn.append("<div id=\"design-onelevel\">"); } 677 678 UserInfo userInfo = getUser(); 679 680 // 4.0.0 (2005/01/31) 681 GUIInfo[] guiInfos = userInfo.getGUIInfos(); 682 String gamenId ; // 画面ID 683 int sideTmpCnt = 1; 684 685 boolean isInClassify = false; 686 687 for( int i=0; i<guiInfos.length; i++ ) { 688 int level = guiInfos[i].getLevel(); 689 690 if( level == 2 ) { 691 if( selClassify.equals( guiInfos[i].getKey() ) ) { 692 isInClassify = true; 693 } 694 else { 695 isInClassify = false; 696 } 697 } 698 699 if( guiInfos[i].isRead() && level == 3 && isInClassify ) { // 4.0.0 (2005/01/31) 700 gamenId = guiInfos[i].getKey() ; 701 if( match != null && !gamenId.matches( match ) ) { continue; } 702 if( unmatch != null && gamenId.matches( unmatch ) ) { continue; } 703 704 String guiLabel = guiInfos[i].getName(); // 画面ラベル 705 706 String thisGamenId = getGUIInfoAttri( "KEY" ); 707 if( gamenId.equals( thisGamenId ) ) { 708 // 5.5.2.3 (2012/05/15) useDivOneLevel 対応 709 if( useDivOneLevel ) { 710 rtn.append("<span class=\"design-onelevel\">").append( guiLabel ).append( "</span>" ); 711 } 712 else { 713 rtn.append( "[" ).append( guiLabel ).append( "] " ); 714 } 715 } 716 else { 717 // 5.5.2.3 (2012/05/15) useDivOneLevel 対応 718 if( useDivOneLevel ) { 719 // 5.5.2.5 (2012/05/21) イメージアイコン対応 720// rtn.append("<span class=\"design-onelevel\">").append( makeTagMenu( guiInfos[i],guiLabel,-3 ) ).append( "</span>" ); 721 rtn.append("<span class=\"design-onelevel\">").append( makeTagMenu( guiInfos[i],guiLabel,-5 ) ).append( "</span>" ); // 5.9.6.1 722 } 723 else { 724 rtn.append( makeTagMenu( guiInfos[i],guiLabel,-2 ) ); // 5.5.2.5 (2012/05/21) イメージアイコン対応 725 } 726 } 727 728 if( sideCount > 0 ) { 729 // 全件数をサイドカウント数で割った値が最大行数の場合は、終了する。 730 if( sideTmpCnt / sideCount >= maxCellCount ) { 731 // rtn.append("・・・"); 732 break; 733 } 734 // 全件数をサイドカウント数で割った余りがゼロの場合は、行ブレイクする。 735 // 5.5.2.3 (2012/05/15) useDivOneLevel 対応 736 if( sideTmpCnt % sideCount == 0 ) { 737 // 5.5.2.3 (2012/05/15) useDivOneLevel 対応 738 if( useDivOneLevel ) { 739 rtn.append( HybsSystem.BR ); // 5.6.0.0 (2013/01/07) BRにする(条件分岐は残しておく) 740 // rtn.append("<span style=\"clear: both;\" />"); 741 } 742 else { 743 rtn.append( HybsSystem.BR ); 744 } 745 } 746 sideTmpCnt++ ; 747 } 748 } 749 } 750 751 // 5.5.2.3 (2012/05/15) useDivOneLevel 対応 752 if( useDivOneLevel ) { 753 //rtn.append("<span style=\"clear: both;\" />"); 754 rtn.append("<span style=\"clear: both;\" ><!-- --></span>"); // 5.9.1.2 (2015/10/23) 755 rtn.append("</div>"); 756 } 757 758 return rtn.toString(); 759 } 760 761 /** 762 * 既存のページの次にアクセスされる画面郡のリンクを作成します。 763 * 764 * これは、現時点の画面に対して、次にアクセスされる画面の候補を 765 * ピックアップしておく機能です。 766 * 実際には、過去にアクセスされた結果より取得しています。 767 * これは、ONELEVEL と置き換えることになる機能です。 768 * 769 * @og.rev 5.2.3.0 (2010/12/01) NEXTGUI 追加 770 * @og.rev 5.5.2.3 (2012/05/15) useDivOneLevel 対応 771 * @og.rev 5.5.2.5 (2012/05/21) イメージアイコン対応(makeTagMenuのパラメータ変更) 772 * @og.rev 5.9.6.1 (2016/03/04) フレーム対応 773 * 774 * @return メニュー 775 */ 776 private String makeNextguiMenu() { 777 StringBuilder rtn = new StringBuilder( HybsSystem.BUFFER_LARGE ); 778 779 // 今、アクセスしている画面 780 GUIInfo thisGamen = (GUIInfo)getSessionAttribute( HybsSystem.GUIINFO_KEY ); 781 String[] nextGuis = thisGamen.getNextGuiArray(); 782 783 UserInfo userInfo = getUser(); 784 int sideTmpCnt = 1; 785 786 // 5.5.2.3 (2012/05/15) useDivOneLevel 対応 787 if( useDivOneLevel ) { rtn.append("<div id=\"design-onelevel\">"); } 788 789 GUIInfo guiInfo = null; 790 for( int i=0; i<nextGuis.length; i++ ) { 791 guiInfo = userInfo.getGUIInfo( nextGuis[i] ); 792 if( guiInfo == null ) { continue; } // 存在しない、またはアクセス拒否の場合は、無視する。 793 794 if( guiInfo.isRead() ) { 795 String guiLabel = guiInfo.getName(); // 画面ラベル 796 797 // 5.5.2.3 (2012/05/15) useDivOneLevel 対応 798 if( useDivOneLevel ) { 799 // 5.5.2.5 (2012/05/21) イメージアイコン対応 800// rtn.append("<span class=\"design-onelevel\">").append( makeTagMenu( guiInfo,guiLabel,-3 ) ).append( "</span>" ); 801 rtn.append("<span class=\"design-onelevel\">").append( makeTagMenu( guiInfo,guiLabel,-5 ) ).append( "</span>" ); 802 } 803 else { 804 rtn.append( makeTagMenu( guiInfo,guiLabel,-2 ) ); // 5.5.2.5 (2012/05/21) イメージアイコン対応 805 } 806 807 if( sideCount > 0 ) { 808 // 全件数をサイドカウント数で割った値が最大行数の場合は、終了する。 809 if( sideTmpCnt / sideCount >= maxCellCount ) { 810 break; 811 } 812 // 全件数をサイドカウント数で割った余りがゼロの場合は、行ブレイクする。 813 // 5.5.2.3 (2012/05/15) useDivOneLevel 対応 814 if( sideTmpCnt % sideCount == 0 ) { 815 if( useDivOneLevel ) { 816 rtn.append("<span style=\"clear: both;\" />"); 817 } 818 else { 819 rtn.append( HybsSystem.BR ); 820 } 821 } 822 sideTmpCnt++ ; 823 } 824 } 825 } 826 827 // 5.5.2.3 (2012/05/15) useDivOneLevel 対応 828 if( useDivOneLevel ) { rtn.append("</div>"); } 829 830 return rtn.toString(); 831 } 832 833 /** 834 * メニューを表示する為のHTMLを作成します(マトリクスメニュー)。 835 * 836 * 分類まとめ、クラス色指定、最小行数設定、最大行数設定の機能があります。 837 * 《分類まとめ》 最大行数設定(maxCellCount)に達したセルは、一つ右に新たにセルを作成 838 * します。このとき、ヘッダーの CLASSIFY を同じにして、colspan でまとめます。 839 * 《クラス色指定》ヘッダー毎に 順次 CLR0,CLR1,・・・・ というクラス属性を付与します。 840 * ヘッダーには、MENU_H も出力されています。CLR0 は、大分類ごとに加算されていきますので、 841 * 繰り返して同じ色を指定する場合は、CSSファイルでまとめて指定してください。 842 * 《最小行数設定》minCellCount 属性を指定することで、1セルに含まれる最小行数を指定できます。 843 * これは、セルに入れる <br /> の個数を指定することと同じです。 844 * 《最大行数設定》maxCellCount 属性を指定することで、1セルに含まれる最大行数を指定できます。 845 * 分類まとめでも説明しましたように、最大値をオーバーすると次のセルから書き始めます。 846 * 847 * @og.rev 4.0.0.0 (2005/11/30) 新規追加 848 * @og.rev 4.0.0.0 (2007/10/05) 分類のコードリソースが存在しない場合 849 * @og.rev 5.2.3.0 (2010/12/01) sideCount対応 850 * @og.rev 5.5.2.5 (2012/05/21) イメージアイコン対応(makeTagMenuのパラメータ変更) 851 * @og.rev 5.5.5.3 (2012/08/17) th,tdにヘッダの画面IDをクラスとして出力 852 * 853 * @return マトリクスメニュー 854 */ 855 private String makeMatrixMenu() { 856 StringBuilder rtn = new StringBuilder( HybsSystem.BUFFER_LARGE ); 857 858 UserInfo userInfo = getUser(); 859 860 // 4.0.0 (2005/01/31) 861 GUIInfo[] guiInfos = userInfo.getGUIInfos(); 862 String gamenId ; // 画面ID 863 String bkClassifyKey = null; // 分類コード(旧) 864 String bkClassifyName = null; // 分類名称(旧) 865 int cellColorCnt = 0; // MENU_H に 追加する CLR クラス属性の連番 866 867 String headGuikey = ""; // 5.5.5.3 (2012/08/17) ヘッダのgamenId 868 869 StringBuilder rtnH = null; // 分類部分の出力用 870 StringBuilder rtnB = null; // 実画面のリンク部分の出力用 871 872 int level ; 873 int preLevel = 0; 874 875 int lineTmpCnt = 0; // セル中の行カウント 876 int cellTmpCnt = 0; // 1つの分類中のセルカウント 877 int cellTmpAllCnt = 0; // 5.2.3.0 (2010/12/01) 該当行のセルカウント 878 879 boolean isInClassify = false; // 分類の中か? 880 boolean isChangeLevel = false; // 直リンク用(無理やり通常画面の階層として扱うので) 881 boolean isDummyMENU_S = false; // 5.2.3.0 (2010/12/01) sideCountブレーク時の大分類領域の出力可否 882 883 for( int i=0; i<guiInfos.length; i++ ) { 884 if( guiInfos[i].isRead() ) { // 4.0.0 (2005/01/31) 885 gamenId = guiInfos[i].getKey() ; 886 if( match != null && !gamenId.matches( match ) ) { continue; } 887 if( unmatch != null && gamenId.matches( unmatch ) ) { continue; } 888 889 // 処理すべき画面かのチェック 890 int guiFlg = guiCheck( guiInfos, i ); 891 if( guiFlg == 0 ) { continue; } 892 893 level = guiInfos[i].getLevel(); // 4.0.0 (2005/01/31) 894 895 // 大分類が来るまでは処理しない 896 if( level > 1 && rtnH == null ) { continue; } 897 898 // 直リンクの場合、無理やり通常画面に変換 899 if( level == 2 && guiInfos[i].getAddress() != null && guiInfos[i].getAddress().length() != 0 ) { 900 level = 3; 901 if( !isChangeLevel ) { 902 isChangeLevel = true; 903 isInClassify = false; 904 } 905 } 906 else { 907 isChangeLevel = false; 908 } 909 910 // 分類のブレイク処理 911 if( ( preLevel >= 3 && level < 3 ) || !isInClassify ) { 912 if( lineTmpCnt != 0 ) { 913 for( int j=lineTmpCnt; j<minCellCount-1; j++ ) { rtnB.append( HybsSystem.BR ); } 914 rtnB.append( "</td>" ).append( HybsSystem.CR ); 915 } 916 917 918 if( bkClassifyKey != null ) { 919 rtnH.append( "<th colspan=\"" + cellTmpCnt + "\" class=\"MENU_H CLR" + cellColorCnt + " " + headGuikey + "\">" ); // 5.5.5.3 (2012/08/17) 920 if( "_SPACE".equals( bkClassifyKey ) ) { 921 rtnH.append( " " ); 922 } 923 else { 924 rtnH.append( makeTagMenuString( null,null,bkClassifyName,bkClassifyKey,-3 ) ); 925 } 926 rtnH.append( "</th>" ); 927 928 // 5.2.3.0 (2010/12/01) sideCount によるセルの改行 929 cellTmpAllCnt += cellTmpCnt; 930 if( sideCount > 0 && cellTmpAllCnt >= sideCount ) { 931 rtn.append( rtnH ).append( "</tr><tr>" ).append( rtnB ).append( "</tr>" ); 932 933 rtnH = new StringBuilder( HybsSystem.BUFFER_LARGE ); 934 rtnB = new StringBuilder( HybsSystem.BUFFER_LARGE ); 935 cellTmpAllCnt = 0; 936 isDummyMENU_S = true; // 出力予約 937 } 938 } 939 940 bkClassifyKey = null; 941 isInClassify = false; 942 lineTmpCnt = 0; 943 cellTmpCnt = 0; 944 } 945 946 // 大分類(フィールドメニュー) 947 if( level == 1 ) { 948 headGuikey = gamenId; // 5.5.5.3 (2012/08/17) 949 if( preLevel > 0 ) { 950 cellColorCnt++ ; 951 rtn.append( rtnH ).append( "</tr><tr>" ).append( rtnB ).append( "</tr>" ); 952 } 953 954 rtn.append( "<tr><td rowspan=\"2\" class=\"MENU_S "+ headGuikey +"\">" ); // 5.5.5.3 (2012/08/17) 955 rtn.append( makeTagMenuString( null,null,guiInfos[i].getName(),gamenId,-3 ) ); 956 rtn.append( "</td>" ).append( HybsSystem.CR ); 957 958 rtnH = new StringBuilder( HybsSystem.BUFFER_LARGE ); 959 rtnB = new StringBuilder( HybsSystem.BUFFER_LARGE ); 960 cellTmpAllCnt = 0; // 5.2.3.0 (2010/12/01) 961 isDummyMENU_S = false; // 5.2.3.0 (2010/12/01) 出力予約解除 962 } 963 // 分類(直リンクの場合は、level=3で処理) 964 else if( level == 2 ) { 965 isInClassify = true; 966 bkClassifyKey = guiInfos[i].getKey(); 967 bkClassifyName = guiInfos[i].getName(); 968 } 969 // 通常メニュー・隠しメニュー 970 else if( level >= 3 ) { 971 972 // 元のMENU_Sに戻り、rowspan を書き換える・・・のが邪魔くさいので、td のみ出力しておく。 973 // 5.2.3.0 (2010/12/01) sideCount によるセルの改行 974 if( isDummyMENU_S ) { 975 rtn.append( "<tr><td rowspan=\"2\" class=\"MENU_S " + headGuikey + "\">" ); // 5.5.5.3 (2012/08/17) 976 rtn.append( "</td>" ).append( HybsSystem.CR ); 977 isDummyMENU_S = false; // 出力予約解除 978 } 979 980 // 画面ID="HYBS_BR"の場合は、セルを変える。 981 if( "HYBS_BR".equals( guiInfos[i].getKey() ) ) { 982 if( lineTmpCnt != 0 ) { 983 for( int j=lineTmpCnt; j<minCellCount-1; j++ ) { rtnB.append( HybsSystem.BR ); } 984 lineTmpCnt = 0; 985 } 986 } 987 // 通常画面 988 else { 989 if( lineTmpCnt == 0 ) { 990 rtnB.append( "<td class=\"MENU_B " + headGuikey + "\">" ); // 5.5.5.3 (2012/08/17) 991 cellTmpCnt++; 992 } 993 994 rtnB.append( makeTagMenu( guiInfos[i],guiInfos[i].getName(),-3 ) ); // 5.5.2.5 (2012/05/21) イメージアイコン対応 995 lineTmpCnt++; 996 997 if( lineTmpCnt >= maxCellCount ) { 998 rtnB.append( "</td>" ); 999 lineTmpCnt = 0; 1000 } 1001 else { 1002 rtnB.append( HybsSystem.BR ); 1003 } 1004 1005 // 分類の中に入っていない通常画面 1006 if( !isInClassify ) { 1007 bkClassifyKey = "_SPACE"; 1008 isInClassify = true; 1009 } 1010 } 1011 } 1012 1013 preLevel = level; 1014 } 1015 1016 } 1017 1018 // 終了処理 1019 for( int j=lineTmpCnt; j<minCellCount-1; j++ ) { rtnB.append( HybsSystem.BR ); } 1020 rtnB.append( "</td>" ).append( HybsSystem.CR ); 1021 1022 if( bkClassifyKey != null ) { 1023 rtnH.append( "<th colspan=\"" + cellTmpCnt + "\" class=\"MENU_H CLR" + cellColorCnt + " " + headGuikey + "\">" ); // 5.5.5.3 (2012/08/17) 1024 rtnH.append( makeTagMenuString( null,null,bkClassifyName,bkClassifyKey,-3 ) ); 1025 rtnH.append( "</th>" ); 1026 } 1027 1028 rtn.append( rtnH ).append( "</tr><tr>" ).append( rtnB ).append( "</tr>" ); 1029 1030 return rtn.toString(); 1031 } 1032 1033 /** 1034 * メニューを表示する為のHTMLを作成します(マトリクスメニュー2)。 1035 * 1036 * マトリクスメニューをベースとした特別バージョンです。 1037 * 通常のマトリクスメニューからの変更点は以下の通りです。 1038 * @大分類が表示されない 1039 * ⇒ 変わりに、1行に表示されているセル数がsideCountで指定した数を超えた場合に 1040 * 自動的に改行されます。 1041 * A画面リンクのターゲット 1042 * ⇒ 自分自身のフレームに対してリンク先を表示します。 1043 * リンク先は、通常メニュー構成ですが左メニューには該当する小分類の画面しか表示されません。 1044 * B小分類でのリンク 1045 * ⇒ 小分類をクリックした際に、通常のメニュー構成画面にリンクします。 1046 * 但し、Aと同様に左メニューには該当する小分類の画面しか表示されません。 1047 * 1048 * @og.rev 4.2.1.0 (2008/04/01) 新規追加 1049 * @og.rev 4.2.1.1 (2008/05/02) カテゴリーリンクで一番上の画面のモードが-wとなっている場合に、 1050 * その画面が立ち上がってしまうバグを修正 1051 * @og.rev 4.2.2.0 (2008/05/14) buttonRequestの付加をmakeTagMenuString()に変更 1052 * @og.rev 5.5.2.5 (2012/05/21) イメージアイコン対応(makeTagMenuのパラメータ変更) 1053 * @og.rev 5.5.5.3 (2012/08/17) ヘッダ部のgamenIdをth,tdのクラスに追加 1054 * 1055 * @return マトリクスメニュー 1056 */ 1057 private String makeMatrixMenu2() { 1058 StringBuilder rtn = new StringBuilder( HybsSystem.BUFFER_LARGE ); 1059 1060 UserInfo userInfo = getUser(); 1061 1062 GUIInfo[] guiInfos = userInfo.getGUIInfos(); 1063 String gamenId ; // 画面ID 1064 String bkClassifyKey = null; // 分類コード(旧) 1065 String nextKey = null; // 分類ボタンを押した時に最初の画面が開くようにする 1066 String bkClassifyName = null; // 分類名称(旧) 1067 int cellColorCnt = 0; // MENU_H に 追加する CLR クラス属性の連番 1068 1069 StringBuilder rtnH = new StringBuilder( HybsSystem.BUFFER_LARGE ); // 分類部分の出力用 1070 StringBuilder rtnB = new StringBuilder( HybsSystem.BUFFER_LARGE ); // 実画面のリンク部分の出力用 1071 1072 int level ; 1073 int preLevel = 0; 1074 1075 int lineTmpCnt = 0; // セル中の行カウント 1076 int cellTmpCnt = 0; // 1つの分類中のセルカウント 1077 int cellTmpAllCnt = 0; // 該当行のセルカウント 1078 1079 boolean isInClassify = false; // 分類の中か? 1080 boolean isChangeLevel = false; // 直リンク用(無理やり通常画面の階層として扱うので) 1081 1082 String classifyHref = null; // 小分類のリンク 1083 1084 String headGuikey = "" ; // 5.5.5.3 (2012/08/17) 1085 1086 rtn.append( "<tr>" ).append( HybsSystem.CR ); 1087 1088 for( int i=0; i<guiInfos.length; i++ ) { 1089 if( guiInfos[i].isRead() ) { // 4.0.0 (2005/01/31) 1090 gamenId = guiInfos[i].getKey() ; 1091 if( match != null && !gamenId.matches( match ) ) { continue; } 1092 if( unmatch != null && gamenId.matches( unmatch ) ) { continue; } 1093 1094 // 処理すべき画面かのチェック 1095 int guiFlg = guiCheck( guiInfos, i ); 1096 if( guiFlg == 0 ) { continue; } 1097 1098 level = guiInfos[i].getLevel(); // 4.0.0 (2005/01/31) 1099 1100 // 直リンクの場合、無理やり通常画面に変換 1101 if( level == 2 && guiInfos[i].getAddress() != null && guiInfos[i].getAddress().length() != 0 ) { 1102 level = 3; 1103 if( !isChangeLevel ) { 1104 isChangeLevel = true; 1105 isInClassify = false; 1106 } 1107 } 1108 else { 1109 isChangeLevel = false; 1110 } 1111 1112 // 分類のブレイク処理 1113 if( ( preLevel >= 3 && level < 3 ) || !isInClassify ) { 1114 if( lineTmpCnt != 0 ) { 1115 for( int j=lineTmpCnt; j<minCellCount-1; j++ ) { rtnB.append( HybsSystem.BR ); } 1116 //rtnB.append( "</td>" ).append( HybsSystem.CR ); // 4.2.1.0 (2008/04/03) リスト 1117 rtnB.append( "</ul></div></td>" ).append( HybsSystem.CR ); 1118 } 1119 1120 if( bkClassifyKey != null ) { 1121 rtnH.append( "<th colspan=\"" + cellTmpCnt + "\" class=\"MENU_H CLR" + cellColorCnt + " " + headGuikey + "\">" ); // 5.5.5.3 (2012/08/17) 1122 if( "_SPACE".equals( bkClassifyKey ) ) { 1123 rtnH.append( " " ); 1124 } 1125 else { 1126 classifyHref = JSP + "/index.jsp?classify=" + bkClassifyKey; 1127 // 4.1.2.0(2008/05/14) リクエスト変数を付ける位置変更 1128 classifyHref += "&GAMENID="+nextKey; // ボタンを押した場合に最初の画面が現れる 1129 rtnH.append( makeTagMenuString( classifyHref,"_self",bkClassifyName,bkClassifyKey,-3 ) ); 1130 } 1131 rtnH.append( "</th>" ); 1132 1133 cellTmpAllCnt += cellTmpCnt; 1134 1135 if( sideCount > 0 && cellTmpAllCnt >= sideCount ) { 1136 rtn.append( rtnH ).append( "</tr><tr>" ).append( rtnB ).append( "</tr>" ); 1137 1138 rtnH = new StringBuilder( HybsSystem.BUFFER_LARGE ); 1139 rtnB = new StringBuilder( HybsSystem.BUFFER_LARGE ); 1140 cellTmpAllCnt = 0; 1141 } 1142 } 1143 1144 bkClassifyKey = null; 1145 nextKey = null; 1146 isInClassify = false; 1147 lineTmpCnt = 0; 1148 cellTmpCnt = 0; 1149 } 1150 1151 // 5.5.5.3 (2012/08/17) 大分類(フィールドメニュー) 1152 if( level == 1 ) { 1153 headGuikey = gamenId; 1154 } 1155 // 分類(直リンクの場合は、level=3で処理) 1156 else if( level == 2 ) { 1157 isInClassify = true; 1158 if( guiInfos[i].isPulldown() ){ // 4.3.3.0 (2008/10/01) プルダウン化チェック 1159 excludeButton = true; 1160 } 1161 else{ 1162 excludeButton = false; 1163 } 1164 bkClassifyKey = guiInfos[i].getKey(); 1165 bkClassifyName = guiInfos[i].getName(); 1166 for( int j=i+1; j<guiInfos.length; j++ ) { 1167 if( guiInfos[j] != null && guiInfos[j].isRead() ) { 1168 nextKey = guiInfos[j].getKey(); 1169 break; 1170 } 1171 } 1172 } 1173 // 通常メニュー・隠しメニュー 1174 else if( level >= 3 ) { 1175 1176 // 画面ID="HYBS_BR"の場合は、セルを変える。 1177 if( "HYBS_BR".equals( guiInfos[i].getKey() ) ) { 1178 if( lineTmpCnt != 0 ) { 1179 for( int j=lineTmpCnt; j<minCellCount-1; j++ ) { rtnB.append( HybsSystem.BR ); } 1180 lineTmpCnt = 0; 1181 } 1182 } 1183 // 通常画面 1184 else { 1185 if( lineTmpCnt == 0 ) { 1186 // rtnB.append( "<td class=\"MENU_B\">" ); 1187 // 4.2.1.0 (2008/04/03) リンクをリスト形式で出す案 1188 rtnB.append( "<td class=\"MENU_B "+ headGuikey +"\"> <div class=\"gamen-menu-wrap\"><ul class=\"gamen-menu\">" ); // 5.5.5.3 (2012/08/17) 1189 cellTmpCnt++; 1190 } 1191 1192 // 5.5.2.5 (2012/05/21) リストは、イメージを設定するので、メソッド側で付与します。 1193 rtnB.append( makeTagMenu( guiInfos[i],guiInfos[i].getName(),-4 ) ); // 5.5.2.5 (2012/05/21) イメージアイコン対応 1194 lineTmpCnt++; 1195 1196 if( lineTmpCnt >= maxCellCount ) { 1197 // rtnB.append( "</td>" ); 1198 rtnB.append( " </ul> </div></td>" ); // 4.2.1.0 (008/04/03) リスト 1199 lineTmpCnt = 0; 1200 } 1201 // else { 1202 // rtnB.append( HybsSystem.BR ); // 4.2.1.0 (2008/04/03) リスト。改行不要。 1203 // } 1204 1205 // 分類の中に入っていない通常画面 1206 if( !isInClassify ) { 1207 bkClassifyKey = "_SPACE"; 1208 isInClassify = true; 1209 } 1210 } 1211 } 1212 1213 preLevel = level; 1214 } 1215 1216 } 1217 1218 // 終了処理 1219 // 4.3.3.0 (2008/10/01) 終了処理は0の時行はない 1220 if( lineTmpCnt != 0){ 1221 for( int j=lineTmpCnt; j<minCellCount-1; j++ ) { rtnB.append( HybsSystem.BR ); } 1222 rtnB.append( "</td>" ).append( HybsSystem.CR ); 1223 } 1224 1225 if( bkClassifyKey != null ) { 1226 rtnH.append( "<th colspan=\"" + cellTmpCnt + "\" class=\"MENU_H CLR" + cellColorCnt + " " + headGuikey + "\">" ); // 5.5.5.3 (2012/08/17) 1227 1228 classifyHref = JSP + "/index.jsp?classify=" + bkClassifyKey; 1229 // 4.1.2.0(2008/05/14) リクエスト変数を付ける位置変更 1230 classifyHref += "&GAMENID="+nextKey; 1231 rtnH.append( makeTagMenuString( classifyHref,"_self",bkClassifyName,bkClassifyKey,-3 ) ); 1232 rtnH.append( "</th>" ); 1233 } 1234 1235 rtn.append( rtnH ).append( "</tr><tr>" ).append( rtnB ).append( "</tr>" ); 1236 1237 return rtn.toString(); 1238 } 1239 1240 /** 1241 * タイプに応じたメニューを表示する為の文字列を作成します。 1242 * 引数の GUIInfo より、アクセスすべきメニューのhrefと、targetを求めます。 1243 * type = -3 (マトリクスメニュー) の場合だけ、タグ属性の target を使用します。 1244 * 1245 * 0:フィールドセットメニュー 1246 * 1:トップ階層(【分類名称】) 1247 * 2:選択階層(通常の折りたたみメニュー) 1248 * 3:選択非表示(通常は、隠してあります) 1249 * -1:グループ分類メニュー(class="GUI_GRP"のtdタグで囲われます) 1250 * -2:ラインメニュー([画面名称] ) 1251 * -3:マトリクスメニュー(一覧) 1252 * -4:マトリクスメニュー2(一覧) 1253 * -5:1レベル表示(後続処理は-3と同じ) 1254 * 1255 * @og.rev 4.0.0.0 (2005/01/31) 新規登録(makeTopMenu、makeSecondMenuの置き換え) 1256 * @og.rev 4.1.0.1 (2008/01/22) アドレスが[..]から始まる画面はマルチセッションチェックを行わない。 1257 * @og.rev 4.2.1.0 (2008/04/01) マトリクスメニュー2用のタグ作成処理追加 1258 * @og.rev 4.2.1.0 (2008/04/17) マトリクス2からの遷移先でボタンメニューにする処理 1259 * @og.rev 4.2.2.0 (2008/05/14) buttonRequestの付加をmakeTagMenuString()に変更 1260 * @og.rev 4.3.3.7 (2008/11/22) https対応 1261 * @og.rev 5.5.2.5 (2012/05/21) イメージアイコン対応(画面ID単位ではなく、IMAGE_KEYパラメータで指定可能にする。) 1262 * @og.rev 5.7.8.1 (2014/07/18) realAddress の "/" 対応 1263 * @og.rev 5.9.6.1 (2016/03/04) -5を追加。-3との違いはresult.jspに飛ばない事 1264 * 1265 * @param guiInfo GUIInfoリンク 1266 * @param bodyIn BODY部(表示) 1267 * @param type タイプ 1268 * 1269 * @return 階層別メニュー文字列 1270 */ 1271 private String makeTagMenu( final GUIInfo guiInfo, final String bodyIn, final int type ) { 1272 1273 String href = null; 1274 String tmpTarget = null; 1275 String gamenId = guiInfo.getKey(); // 5.5.2.5 (2012/05/21) イメージアイコン対応 1276 int tmpType = type; // 5.9.6.1 1277 1278 if( guiInfo.getAddress() != null && guiInfo.getAddress().length() > 0 ) { 1279 String readAdrs = guiInfo.getRealAddress( "index.jsp" ); 1280 String reqParam = getRequestParameter( guiInfo.getParam() ); 1281 href = XHTMLTag.addUrlEncode( readAdrs,reqParam ); 1282 tmpTarget = guiInfo.getTarget(); 1283 1284 // 4.3.3.7 (2008/11/22) https対応 1285 // 5.7.8.1 (2014/07/18) realAddress の "/" 対応 1286 String kblink = guiInfo.getKblink(); 1287// if( ! readAdrs.startsWith( "http://" ) && ! readAdrs.startsWith( "https://" )) { 1288 if( ! readAdrs.startsWith( "http://" ) && ! readAdrs.startsWith( "https://" ) && !"/".equals( kblink ) ) { 1289 if( type == -3 ) { 1290 tmpTarget = target; 1291 String param = getRequestParameter( guiInfo.getParam() ); 1292 href = XHTMLTag.addUrlEncode( JSP + "/result.jsp",param ); 1293 } 1294 else if( type == -4 ) { // 4.2.1.0 (2008/04/01) 1295 tmpTarget = "_self"; 1296 String param = getRequestParameter( guiInfo.getParam() ); 1297 href = XHTMLTag.addUrlEncode( JSP + "/index.jsp",param ); 1298 href = XHTMLTag.addUrlEncode( href,"classify=" + guiInfo.getClassify() ); 1299 } 1300 else if( type == -5 ){ // 5.9.6.1 (2016/03/04) 1301 tmpTarget = target; 1302 String param = getRequestParameter( guiInfo.getParam() ); 1303 tmpType = -3; 1304 } 1305 href = XHTMLTag.addUrlEncode( href,"GAMENID=" + gamenId ); // 5.5.2.5 (2012/05/21) せっかくなので、利用する。 1306 1307 // 3.8.0.0 (2005/06/07) 同一セッションでのマルチ起動対策を行います。 1308 // 4.1.0.1 (2008/01/22) アドレスが[..]から始まる画面はマルチセッションチェックを行いません。 1309 // 4.1.0.1 (2008/04/01) マトリクスメニュー2はマルチセッションチェックを行いません。 1310 if( multiSessionCheck && !guiInfo.getAddress().startsWith( ".." ) && type != -4 ) { 1311 href = XHTMLTag.addUrlEncode( href,mscKey ); 1312 } 1313 } 1314 } 1315 // 5.5.2.5 (2012/05/21) イメージアイコン対応(画面ID単位ではなく、IMAGE_KEYパラメータで指定可能にする。) 1316 String imgKey = guiInfo.getImageKey() ; 1317// return makeTagMenuString( href,tmpTarget,bodyIn,gamenId,imgKey,type ) ; 1318 return makeTagMenuString( href,tmpTarget,bodyIn,gamenId,imgKey,tmpType ) ; // 5.9.6.1 1319 } 1320 1321 /** 1322 * タイプに応じたメニューを表示する為の文字列を作成します。 1323 * 従来からのメソッドの引数のままで、新しい gamenId は、imgKey をそのままセットします。 1324 * 1325 * 0:フィールドセットメニュー 1326 * 1:トップ階層(【分類名称】) 1327 * 2:選択階層(通常の折りたたみメニュー) 1328 * 3:選択非表示(通常は、隠してあります) 1329 * -1:グループ分類メニュー(class="GUI_GRP"のtdタグで囲われます) 1330 * -2:ラインメニュー([画面名称] ) 1331 * -3:マトリクスメニュー(一覧) 1332 * -4:マトリクスメニュー2(一覧) 1333 * 1334 * @og.rev 5.5.2.5 (2012/05/21) イメージアイコン対応(画面ID単位ではなく、IMAGE_KEYパラメータで指定可能にする。) 1335 * 1336 * @param href リンク 1337 * @param target ターゲット 1338 * @param bodyIn BODY部(表示) 1339 * @param imgKey imageファイルの検索キー 1340 * @param type タイプ 1341 * 1342 * @return 階層別メニュー文字列 1343 */ 1344 private String makeTagMenuString( final String href,final String target, final String bodyIn, 1345 final String imgKey,final int type ) { 1346 return makeTagMenuString( href,target,bodyIn,imgKey,imgKey,type ); // gamenId の代わりに、imgKey をセットする。 1347 } 1348 1349 /** 1350 * タイプに応じたメニューを表示する為の文字列を作成します。 1351 * 1352 * 0:フィールドセットメニュー 1353 * 1:トップ階層(【分類名称】) 1354 * 2:選択階層(通常の折りたたみメニュー) 1355 * 3:選択非表示(通常は、隠してあります) 1356 * -1:グループ分類メニュー(class="GUI_GRP"のtdタグで囲われます) 1357 * -2:ラインメニュー([画面名称] ) 1358 * -3:マトリクスメニュー(一覧) 1359 * -4:マトリクスメニュー2(一覧) 1360 * 1361 * @og.rev 4.0.0.0 (2005/01/31) 新規登録(makeTopMenu、makeSecondMenuの置き換え) 1362 * @og.rev 4.0.0.0 (2007/11/28) switch文の中の二重コードを統一します。 1363 * @og.rev 4.2.1.0 (2008/04/01) ボタン形式のリンク対応、マトリクスメニュー2対応 1364 * @og.rev 4.2.2.0 (2008/05/14) buttonRequestの付加をここで行うようにする 1365 * @og.rev 4.3.5.0 (2009/02/01) switch の case で重複項目をまとめます。 1366 * @og.rev 5.1.4.0 (2010/03/01) onClick,onMouseOver,onMouseOutの処理は、外部のJavaScriptファイルで記述します。 1367 * @og.rev 5.1.8.0 (2010/07/01) コードリソースのキーが存在しない場合にエラーとなるバグを修正 1368 * @og.rev 5.3.9.0 (2011/09/01) メニューでのヘルプアイコン対応 1369 * @og.rev 5.4.4.4 (2012/02/15) ヘルプアイコンはimgKeyがnullでない場合のみとする 1370 * @og.rev 5.5.0.4 (2012/03/14) FAQ対応 1371 * @og.rev 5.5.2.5 (2012/05/21) イメージアイコン対応(画面ID単位ではなく、IMAGE_KEYパラメータで指定可能にする。) 1372 * @og.rev 5.5.4.2 (2012/07/13) JSP(/gf/jsp/) ではなく、CNTX(gf)+MENU_IMG(/jsp/menuImage/) で処理するように変更 1373 * 1374 * @param href リンク 1375 * @param target ターゲット 1376 * @param bodyIn BODY部(表示) 1377 * @param gamenId 画面ID/グループIDなど 1378 * @param imgKey imageファイルの検索キー 1379 * @param type タイプ 1380 * 1381 * @return 階層別メニュー文字列 1382 */ 1383 private String makeTagMenuString( final String href,final String target, final String bodyIn, 1384 final String gamenId,final String imgKey,final int type ) { 1385 1386 final String body ; 1387 String listStyle = "<li>"; 1388 String imgFile = imgFileMap.getFilename( imgKey ); // 5.5.2.5 (2012/05/21) 属性名変更 1389 if( imgFile != null ) { 1390 if( imageOnly ) { 1391 body = "<img src=\"/" + CNTX + MENU_IMG + imgFile + "\" title=\"" + bodyIn + "\" />" ; 1392 } 1393 // 5.5.2.5 (2012/05/21) -4(MATRIX Menu2)の場合は、<li style="list-style:url(画像URL);"> で処理する。 1394 else if( type == -4 ) { 1395 listStyle = "<li style=\"list-style:url(/" + CNTX + MENU_IMG + imgFile + ");\">" ; 1396 body = bodyIn ; 1397 } 1398 else { 1399 body = "<img src=\"/" + CNTX + MENU_IMG + imgFile + "\"/>" + bodyIn ; 1400 } 1401 } 1402 else { 1403 if( imageOnly && bodyIn != null && bodyIn.length() > 0 ) { 1404 body = "<span title=\"" + bodyIn + "\" >" + bodyIn.charAt(0) + "</span>" ; 1405 } 1406 else { 1407 body = bodyIn ; 1408 } 1409 } 1410 1411 final String in ; 1412 if( href != null ) { 1413 TagBuffer tag = null; 1414 if( useButton ) { // 4.2.1.0 (2008/04/01) 1415 tag = new TagBuffer( "button" ); 1416 String onClick = "top."+target+".location.href=\'"+ href + "\';"; 1417 // 5.1.4.0 (2010/03/01) 1418 tag.add( "onclick" , onClick ); 1419 tag.add( "class" , "buttonMenu" ); // 4.2.1.0 (2008/04/03) classを追加 1420 tag.add( "id" , gamenId ); // 5.5.2.5 (2012/05/21) idを本当の画面IDで設定 1421 tag.setBody( body ); 1422 } 1423 else { 1424 tag = new TagBuffer( "a" ); 1425 1426 String href2 = href; 1427 if( buttonRequest ){ // 4.2.2.0 (2008/05/14) ボタン式にする場合はリクエスト変数付加 1428 if ( excludeButton ){ //4.3.3.0 (2008/10/01) 強制プルダウン化の場合はfalseで渡す 1429 href2 = XHTMLTag.addUrlEncode( href2,"buttonRequest=false"); 1430 } 1431 else{ 1432 href2 = XHTMLTag.addUrlEncode( href2,"buttonRequest=true"); 1433 } 1434 tag.add( "class" , "buttonClassify" ); 1435 } 1436 1437 tag.add( "href" , href2 ); 1438 tag.add( "target" , target ); 1439 tag.setBody( body ); 1440 } 1441 in = tag.makeTag(); 1442 } 1443 else { 1444 in = body; 1445 } 1446 1447 String rtn = null; 1448 switch( type ) { 1449 case 1: rtn = FIELD_IN + "<legend>" + in + "</legend>" ; break; // 大分類 1450 case 2: rtn = "【" + in + "】" ; break; // 小分類・直リンク 1451 case 3: // 通常メニュー 1452 case 4: rtn = " " + in ; break; // 隠れメニュー 1453 case -1: rtn = "<td class=\"MENU_G " + gamenId + "\">" + in + "</td>" ; break; // 5.5.2.5 (2012/05/21) グループメニュー 1454 case -2: rtn = "[" + in + "] "; break; // ラインメニュー 1455 // 4.3.5.0 (2009/02/01) switch の case で重複項目をまとめます。 1456 //case -4: rtn = "■ " + in ; break; 1457 // 5.5.2.5 (2012/05/21) listStyle の適用。type == -4 のみで適用するので、-3 は、そのままセットする。 1458 case -3: rtn = in ; break; // マトリクスメニュー 1459 case -4: rtn = listStyle + in + "</li>" ; break; // 4.2.1.0 (2008/04/03) リスト。リストのため■はいらない 1460 default : 1461 rtn = "X_" + in ; 1462 } 1463 1464 // 5.5.2.5 (2012/05/21) imgKeyではなく、gamenIdがnullの場合は処理しないに変更、faqLinkFormat 廃止。 1465 if( gamenId != null && helpMap != null && helpMap.exists( gamenId ) ) { 1466 if( type == 2 ) { 1467 rtn = rtn + makeHelpLink( gamenId ); 1468 } 1469 else if( type == -3 ) { 1470 rtn = "<table><tr><td rowspan=\"2\">" + rtn + "</td><td>" 1471 + makeHelpLink( gamenId ) + "</td></tr><tr><td></td></tr></table>"; 1472 } 1473 } 1474 1475 return rtn ; 1476 } 1477 1478 /** 1479 * 【TAG】作成するメニューの種類(NORMAL,GROUP,ONELEVEL,NEXTGUI,MATRIX,MATRIX2)を指定します(初期値:NORMAL)。 1480 * 1481 * @og.tag 1482 * 作成するメニューには、複数の種類があります。 1483 * <table border="1" frame="box" rules="all" > 1484 * <caption>メニューの種類</caption> 1485 * <tr><th>種類 </th><th>説明 </th></tr> 1486 * <tr><td>NORMAL </td><td>通常の階層メニュー</td></tr> 1487 * <tr><td>GROUP </td><td>GROUPのみを取り出してリンクを作成します。(topMenuに利用)</td></tr> 1488 * <tr><td>ONELEVEL</td><td>指定のclassify のメニューのみを取り出してリンクを作成します。(lineMenuに利用)</td></tr> 1489 * <tr><td>NEXTGUI </td><td>既存のページの次にアクセスされる画面郡のリンクを作成します。</td></tr> 1490 * <tr><td>MATRIX </td><td>一覧表形式のメニューを作成します。(大分類付きマルチメニュー)</td></tr> 1491 * <tr><td>MATRIX2 </td><td>一覧表形式のメニューを作成します。(大分類なしボタンメニュー)</td></tr> 1492 * </table> 1493 * 1494 * @og.rev 4.0.0.0 (2005/01/31) 新規登録 1495 * @og.rev 5.2.3.0 (2010/12/01) NEXTGUI 追加 1496 * 1497 * @param type メニューの種類(NORMAL,GROUP,ONELEVEL,NEXTGUI,MATRIX,MATRIX2) 1498 */ 1499 public void setMenuType( final String type ) { 1500 menuType = nval( getRequestParameter( type ),MENU_TYPE[0] ); 1501 if( ! check( menuType, MENU_TYPE ) ) { 1502 String errMsg = "menuType に、指定できない種類の文字が指定されました。menuType=[" 1503 + menuType + "]" + HybsSystem.CR 1504 + "以下の中から、選択してください。[" 1505 + StringUtil.array2csv( MENU_TYPE ) + "]" + HybsSystem.CR; 1506 throw new HybsSystemException( errMsg ); 1507 } 1508 } 1509 1510 /** 1511 * 【TAG】折り返しメニューを構築するかどうかを指定します(初期値:true)。 1512 * 1513 * @og.tag 1514 * trueを設定すると、JavaScriptによる折り返しメニューを構築します。 1515 * false の場合は、通常のHTMLのみで、階層メニューを構築します。 1516 * 初期値は、true(折り返しメニュー)です。 1517 * 1518 * @og.rev 4.0.0.0 (2005/01/31) 新規登録 1519 * 1520 * @param flag 折り返しメニューかどうか 1521 */ 1522 public void setExpand( final String flag ) { 1523 expand = nval( getRequestParameter( flag ),expand ); 1524 } 1525 1526 /** 1527 * 【TAG】表示対象となるグループをカンマ区切り文字列で指定します。 1528 * 1529 * @og.tag 1530 * メニューの表示対象グループをカンマ区切り文字列で複数指定できます。 1531 * 指定のグループのメニューだけが、表示対象になります。 1532 * メニューにも、複数のグループを指定できるため、1グループの指定で、 1533 * 複数のくくりを表示することも可能です。 1534 * グループを指定しない場合は、全グループが対象になります。 1535 * また、メニュー側にグループ指定がない場合は、グループ指定に 1536 * 関係なく、対象になります。 1537 * 初期値は、未指定(全メニューが対象)です。 1538 * 分解方法は、通常のパラメータ取得後に、CSV分解します。 1539 * 1540 * @og.rev 4.0.0.0 (2005/01/31) 新規登録 1541 * 1542 * @param menuGroups 表示対象となるグループ(カンマ区切り文字列) 1543 */ 1544 public void setGroups( final String menuGroups ) { 1545 groups = StringUtil.csv2Array( getRequestParameter( menuGroups ) ); 1546 if( groups.length == 0 ) { groups = null; } 1547 } 1548 1549 /** 1550 * 【TAG】表示対象となる分類(classify)を指定します。 1551 * 1552 * @og.tag 1553 * メニューの表示対象となる分類(classify)を指定することで、一まとまりの 1554 * メニューを作成します。これは、3段階メニューの最終メニューを求める場合に 1555 * 指定します。 1556 * 最終メニューは、画面上部に設ける予定のメニューで、上下フレーム分割での 1557 * 運用時に使用します。 1558 * 分類の指定がない場合は、すべてが表示対象になります。 1559 * 初期値は、未指定(全メニューが対象)です。 1560 * 1561 * @og.rev 4.0.0.0 (2005/01/31) 新規登録 1562 * 1563 * @param classify 表示対象となる分類(classify) 1564 */ 1565 public void setClassify( final String classify ) { 1566 selClassify = nval( getRequestParameter( classify ),selClassify ); 1567 } 1568 1569 /** 1570 * 【TAG】グループメニューの表示対象となるソース名(href)を指定します(初期値:menu.jsp)。 1571 * 1572 * @og.tag 1573 * GROUPメニューの表示対象となるソース名(href)を指定することで、 1574 * サブメニューを自分自身のフレームに対して割り当てるのか、フレームを分けて 1575 * 管理するのかを自由に設定できます。 1576 * 初期値は、menu.jspです。 1577 * 1578 * @og.rev 4.0.0.0 (2005/01/31) 新規登録 1579 * 1580 * @param inHref 表示対象となるソース名(href) 1581 */ 1582 public void setHref( final String inHref ) { 1583 href = nval( getRequestParameter( inHref ),href ); 1584 } 1585 1586 /** 1587 * 【TAG】グループメニューの表示対象となるフレーム名(target)を指定します(初期値:MENU)。 1588 * 1589 * @og.tag 1590 * GROUPメニューの表示対象となるフレーム名(target)を指定することで、 1591 * サブメニューを自分自身のフレームに対して割り当てるのか、フレームを分けて 1592 * 管理するのかを自由に設定できます。 1593 * フレーム分割を行うと、変更箇所は、サブメニューのみになる為、動きに無駄が 1594 * なくなりますが、グループメニューの大きさが固定されてしまいます。 1595 * 自分自身にすると、グループメニューとサブメニューを一つのフレームに 1596 * 入れることで、更新時の画面のちらつきは発生しますが、無駄なスペースは 1597 * 省くことが可能になります。 1598 * 初期値は、MENU(通常のメニューフレーム)です。 1599 * 1600 * @og.rev 4.0.0.0 (2005/01/31) 新規登録 1601 * 1602 * @param inTarget 表示対象となるフレーム名(target) 1603 */ 1604 public void setTarget( final String inTarget ) { 1605 target = nval( getRequestParameter( inTarget ),target ); 1606 } 1607 1608 /** 1609 * 【TAG】グループメニューの表示に、画像のみかどうか[true:画像のみ/false:画像+ラベル]を指定します(初期値:false)。 1610 * 1611 * @og.tag 1612 * GROUPメニューの表示対象として、jsp/menuImage 以下に グループ名と同一の 1613 * 画像ファイルが存在する場合は、画像を使用します。 1614 * このフラグを、true に設定すると、画像のみを使用します。 1615 * false の場合は、画像+グループ名のラベルを使用します。 1616 * 画像のみの場合でも、title 属性にグループ名のラベルをセットしますので、 1617 * マウスカーソルをオーバーすれば、名称がTips表示されます。 1618 * 画像が存在しない場合に、true(画像のみ)に設定した場合は、ラベルの最初の1文字 1619 * のみを出力します。 1620 * 初期値は、false(画像+ラベル)です。 1621 * 1622 * @og.rev 4.0.0.0 (2005/01/31) 新規登録 1623 * 1624 * @param flag [true:画像のみ/false:画像+ラベル] 1625 */ 1626 public void setImageOnly( final String flag ) { 1627 imageOnly = nval( getRequestParameter( flag ),imageOnly ); 1628 } 1629 1630 /** 1631 * 【TAG】グループメニューの表示対象となるメニューを横並びさせる数を指定します。 1632 * 1633 * @og.tag 1634 * GROUPメニューなどの表示を行う場合に、横方向に何個のメニューを表示させるかを 1635 * 指定します。例えば、画像のみのリンクと組み合わせれば、より、多くのグループを 1636 * 横方向に並べることで、小領域に多くの情報を詰めることが可能になります。 1637 * 0 を設定すると、横方向にのみ並べる(折り返さない)メニューを作ることが 1638 * 可能になります。 1639 * 初期値は、無制限です。 1640 * 1641 * @og.rev 4.0.0.0 (2005/01/31) 新規登録 1642 * 1643 * @param count メニューを横並びさせる数 1644 */ 1645 public void setSideCount( final String count ) { 1646 sideCount = nval( getRequestParameter( count ),sideCount ); 1647 } 1648 1649 /** 1650 * 【TAG】表形式メニュー(MATRIX)の一つのセルに含まれる最小行数を指定します(初期値:8)。 1651 * 1652 * @og.tag 1653 * 表形式メニュー(MATRIX)では、一つのセルの高さを同一にする為、<br />タグを挿入します。 1654 * このタグの挿入する個数を指定します。 1655 * この個数だけ、メニューの数があろうとなかろうと行を確保します。 1656 * 指定の値が、実際の行数より少ない場合は、実際の行数分だけ拡張されます。 1657 * 初期値は、8 です。 1658 * 1659 * @og.rev 4.0.0.0 (2005/01/31) 新規登録 1660 * 1661 * @param count セルに含まれる最小行数 1662 * @see #setMaxCellCount( String ) 1663 */ 1664 public void setMinCellCount( final String count ) { 1665 minCellCount = nval( getRequestParameter( count ),minCellCount ); 1666 } 1667 1668 /** 1669 * 【TAG】表形式メニュー(MATRIX)の一つのセルに含まれる最大行数を指定します(初期値:8)。 1670 * 1671 * @og.tag 1672 * 表形式メニュー(MATRIX)では、一つのセルの高さを同一にする為、指定の行数で 1673 * 新たな セルを作成して、セルを横方向に連結します。 1674 * 初期値は、8 です。 1675 * 1676 * @og.rev 4.0.0.0 (2005/01/31) 新規登録 1677 * 1678 * @param count セルに含まれる最大行数 1679 * @see #setMinCellCount( String ) 1680 */ 1681 public void setMaxCellCount( final String count ) { 1682 maxCellCount = nval( getRequestParameter( count ),maxCellCount ); 1683 } 1684 1685 /** 1686 * 【TAG】グループメニューのキャッシュを使用するかどうか[true/false]を指定します(初期値:true)。 1687 * 1688 * @og.tag 1689 * GROUPメニューの表示は、一旦作成すると、ほとんど書き換えることがありません。 1690 * 作成は、使用できる全メニューをスキャンして、その中からグループ属性をピックアップ 1691 * するという処理を行っている為、明らかに無駄な処理です。 1692 * そこで、jsp/index.jsp が実行された場合のみキャッシュをクリアして、内部では 1693 * キャッシュがなければ作成し、あればキャッシュを使うロジックになっています。 1694 * ここでは、キャッシュを使用するのか、毎回作成しなおすのかを指定します。 1695 * 対象として、jsp/menuImage 以下に グループ名と同一の 1696 * 画像ファイルが存在する場合は、画像を使用します。 1697 * このフラグを、true に設定すると、画像のみを使用します。 1698 * false の場合は、画像+グループ名のラベルを使用します。 1699 * 画像のみの場合でも、title 属性にグループ名のラベルをセットしますので、 1700 * マウスカーソルをオーバーすれば、名称がTips表示されます。 1701 * 画像が存在しない場合は、たとえ、true(画像のみ)に設定しても、ラベルを出力します。 1702 * 初期値は、true(キャッシュする)です。 1703 * 1704 * @og.rev 4.0.0.0 (2005/01/31) 新規登録 1705 * 1706 * @param flag [true:キャッシュする/false:キャッシュしない] 1707 */ 1708 public void setCache( final String flag ) { 1709 cache = nval( getRequestParameter( flag ),cache ); 1710 } 1711 1712 /** 1713 * 【TAG】正判定(マッチする場合に、メニューに出す)条件を設定します。 1714 * 1715 * @og.tag 1716 * メニューを表示する/しないの判定を、画面IDのマッチングで判断します。 1717 * これは、正規表現で表される引数と、画面IDがマッチする場合に、 1718 * メニューを表示させます。 1719 * マッチしない場合は、表示されません。 1720 * 何も指定しない場合は、ロールの判定みの行われます。 1721 * 1722 * @param mt 正判定(マッチする場合に、メニューに出す)条件 1723 */ 1724 public void setMatch( final String mt ) { 1725 match = nval( getRequestParameter( mt ),match ); 1726 } 1727 1728 /** 1729 * 【TAG】逆判定(マッチする場合に、メニューに出さない)条件を設定します。 1730 * 1731 * @og.tag 1732 * メニューを表示する/しないの判定を、画面IDのマッチングで判断します。 1733 * これは、正規表現で表される引数と、画面IDがマッチする場合に、 1734 * メニューを表示させません。 1735 * マッチしない場合は、表示されます。 1736 * 何も指定しない場合は、ロールの判定みの行われます。 1737 * 1738 * @param umt 逆判定(マッチする場合に、メニューに出さない)条件 1739 */ 1740 public void setUnmatch( final String umt ) { 1741 unmatch = nval( getRequestParameter( umt ),unmatch ); 1742 } 1743 1744 /** 1745 * 【TAG】画面リンクにボタンを使用するかどうか[true/false]を指定します(初期値:false)。 1746 * 1747 * @og.tag 1748 * 画面リンクをボタンリンク形式で表示するかを指定します。 1749 * falseの場合は、通常のリンクになります。 1750 * 初期値は、false(通常リンク)です。 1751 * 1752 * @og.rev 4.2.1.0 (2008/04/01) 新規登録 1753 * 1754 * @param flag [true:ボタン形式リンク/false:通常リンク] 1755 */ 1756 public void setUseButton( final String flag ) { 1757 useButton = nval( getRequestParameter( flag ),useButton ); 1758 } 1759 1760 /** 1761 * 【廃止】ボタンリンクを使用した場合に、JavaScriptのイベントを発生させるかどうか[true/false]を指定します(初期値:false)。 1762 * 1763 * @og.tag 1764 * (この属性は、廃止されています) 1765 * ボタンリンクを使用した場合に、JavaScriptのイベントを発生させるかを指定します。 1766 * 発生するイベント及び呼ばれる関数は以下の3つです。 1767 * @クリック時 ⇒ buttonClick(this) 1768 * Aマウスオーバー時 ⇒ buttonOver(this) 1769 * Bカーソルアウト時 ⇒ buttonOut(this) 1770 * 初期値は、false(JavaScriptイベントを発生しない)です。 1771 * 1772 * @og.rev 4.2.1.0 (2008/04/01) 新規登録 1773 * @og.rev 5.1.4.0 (2010/03/01) 廃止 1774 * @og.rev 5.9.12.2 (2016/09/16) バージョンアップ時互換性のためメソッドのみ残す 1775 * 1776 * @param flag [true:ボタン形式リンク/false:通常リンク] 1777 */ 1778 @Deprecated public void setUseButtonScript( final String flag ) { 1779// useButtonScript = nval( getRequestParameter( flag ),useButtonScript ); 1780 } 1781 1782 /** 1783 * 【TAG】マトリクスからの遷移先でボタンメニュー表示するかどうか[true/false]を指定します(初期値:false)。 1784 * 1785 * @og.tag 1786 * マトリクスメニューからの遷移先でボタンメニューを表示させるために 1787 * アドレスに付加するリクエスト変数を指定します。 1788 * trueにするとbuttonRequest=trueのリクエスト変数を付けます。 1789 * falseの場合はリクエスト変数を付けません。 1790 * 初期値は、false(プルダウン形式で表示)です。 1791 * 1792 * @og.rev 4.2.1.0 (2008/04/17) 新規登録 1793 * 1794 * @param flag [true:ボタン形式/false:通常形式] 1795 */ 1796 public void setButtonRequest( final String flag ) { 1797 buttonRequest = nval( getRequestParameter( flag ),buttonRequest ); 1798 } 1799 1800 /** 1801 * 【TAG】標準画面を初期状態で表示するかどうか[true/false]を指定します(初期値:false)。 1802 * 1803 * @og.tag 1804 * 通常expand=trueの状態では、メニューが折りたたまれています。 1805 * このinlineStyle属性をtrueにすると標準画面のスタイルにdisplay:inlineを 1806 * 付加する事で、初期状態でメニューが開いた状態になります。 1807 * expand=falseとの違いは、隠しメニュー及び分類の折りたたみ機能が利用できる事です。 1808 * 初期値は、false(折りたたまれた状態)です。 1809 * 1810 * @og.rev 4.3.3.0 (2008/10/01) 新規 1811 * 1812 * @param flag [true:ボタン形式/false:通常形式] 1813 */ 1814 public void setInlineStyle( final String flag ) { 1815 inlineStyle = nval( getRequestParameter( flag ),inlineStyle ); 1816 } 1817 1818 /** 1819 * 【TAG】ONELEVEL,NEXTGUI で、DIVタグ+design-onelevel 処理をするかどうか[true/false]を指定します(初期値:false)。 1820 * 1821 * @og.tag 1822 * ONELEVEL,NEXTGUI は、QUERY 画面の上部に表示される簡易メニューです。 1823 * この表記は、[画面リンク] 形式のテキスト表示されていますが、画面名称を固定長にするなどの処理を入れるため、 1824 * DIVでフォーマットします。 1825 * 作りは、出力される HTML を確認いただきたいと思います。 1826 * 全体を、<div id="design-onelevel" > で、囲い、画面名称は、<span clas="design-onelevel" > で、囲います。 1827 * これを、標準CSSで、固定幅と背景色、リンクの文字色など書き換えて、体裁を整えます。 1828 * 初期値は、false(従来と同じ)です。 1829 * 1830 * @og.rev 5.5.2.3 (2012/05/15) 新規追加 1831 * 1832 * @param flag [true:DIVタグ処理をする/false:しない] 1833 */ 1834 public void setUseDivOneLevel( final String flag ) { 1835 useDivOneLevel = nval( getRequestParameter( flag ),useDivOneLevel ); 1836 } 1837 1838 /** 1839 * シリアライズ用のカスタムシリアライズ書き込みメソッド 1840 * 1841 * @og.rev 4.0.0.0 (2006/09/31) 新規追加 1842 * @serialData 一部のオブジェクトは、シリアライズされません。 1843 * 1844 * @param strm ObjectOutputStreamオブジェクト 1845 * @throws IOException 入出力エラーが発生した場合 1846 */ 1847 private void writeObject( final ObjectOutputStream strm ) throws IOException { 1848 strm.defaultWriteObject(); 1849 } 1850 1851 /** 1852 * シリアライズ用のカスタムシリアライズ読み込みメソッド 1853 * 1854 * ここでは、transient 宣言された内部変数の内、初期化が必要なフィールドのみ設定します。 1855 * 1856 * @og.rev 4.0.0.0 (2006/09/31) 新規追加 1857 * @serialData 一部のオブジェクトは、シリアライズされません。 1858 * 1859 * @param strm ObjectInputStreamオブジェクト 1860 * @see #release2() 1861 * @throws IOException シリアライズに関する入出力エラーが発生した場合 1862 * @throws ClassNotFoundException クラスを見つけることができなかった場合 1863 */ 1864 private void readObject( final ObjectInputStream strm ) throws IOException , ClassNotFoundException { 1865 strm.defaultReadObject(); 1866 } 1867 1868 /** 1869 * 画面オブジェクト一覧より、指定されたインデックスより後に実体となる画面ID 1870 * (直リンク、通常メニュー、隠しメニュー※改行メニューは除く)が存在するかを判定します。 1871 * グループスが指定されている場合は、グループで絞り込まれた結果に対して判定を行います。 1872 * 1873 * @og.rev 4.0.0.0 (2007/10/30) 新規追加 1874 * 1875 * @param guiInfos 画面オブジェクト一覧 1876 * @param idx 検索を開始するインデックス番号 1877 * 1878 * @return 0:実体画面が存在せず 1:全て隠しの分類 2:実体画面 or 通常画面を含む分類 1879 */ 1880 private int guiCheck( final GUIInfo[] guiInfos, final int idx ) { 1881 int flg = 0; 1882 1883 // 実態探し 1884 if( levelCheck( guiInfos[idx] ) > 0 ) { 1885 // グループメニューリンク時の処理 1886 if( groups == null ) { flg = 2; } 1887 else { flg = groupCheck( guiInfos[idx] ) ? 2 : 0; } 1888 } 1889 else { 1890 for( int j=idx+1; j<guiInfos.length; j++ ) { 1891 if( !guiInfos[j].isRead() ) { continue; } 1892 if( flg > 1 || guiInfos[j].getLevel() <= guiInfos[idx].getLevel() ) { break; } 1893 1894 if( groups == null || groupCheck( guiInfos[j] ) ) { 1895 if( levelCheck( guiInfos[j] ) > 0 ) { 1896 flg = levelCheck( guiInfos[j] ); 1897 } 1898 } 1899 } 1900 } 1901 1902 return flg; 1903 } 1904 1905 /** 1906 * 指定された画面IDが実体であるか(直リンク、通常メニュー、隠しメニュー※改行メニューは除く)を判定します。 1907 * 1908 * @og.rev 4.0.0.0 (2007/10/30) 新規追加 1909 * @og.rev 4.0.0.0 (2007/11/30) switch に default 追加 1910 * 1911 * @param guiInfo 画面オブジェクト 1912 * 1913 * @return 0:分類 1:実体画面(隠し) 2:実体画面(通常) or 直リンク 1914 */ 1915 private int levelCheck( final GUIInfo guiInfo ) { 1916 int flg = 0; 1917 1918 switch ( guiInfo.getLevel() ) { 1919 case 2: 1920 String adrs = guiInfo.getAddress(); 1921 if( adrs != null && adrs.length() > 0 ) { 1922 flg = 2; 1923 } 1924 break; 1925 case 3: 1926 flg = "HYBS_BR".equals( guiInfo.getKey() ) ? flg : 2; break; 1927 case 4: 1928 flg = "HYBS_BR".equals( guiInfo.getKey() ) ? flg : 1; break; 1929 default : 1930 flg = 0; break; 1931 } 1932 1933 return flg; 1934 } 1935 1936 /** 1937 * 指定された画面IDが設定されたグループスに含まれるかを判定します。 1938 * 1939 * @og.rev 4.0.0.0 (2007/10/30) 新規追加 1940 * 1941 * @param guiInfo 画面オブジェクト 1942 * 1943 * @return グループスに含まれるかどうか 1944 */ 1945 private boolean groupCheck( final GUIInfo guiInfo ) { 1946 boolean flg = false; 1947 1948 for( int k=0; k<groups.length; k++ ) { 1949 if( guiInfo.isGroupIn( groups[k] ) ) { 1950 flg = true; 1951 break; 1952 } 1953 } 1954 1955 return flg; 1956 } 1957 1958 /** 1959 * ヘルプリンク文字列を生成します。 1960 * 1961 * @og.rev 5.3.9.0 (2011/09/01) 新規作成 1962 * @og.rev 5.0.0.4 (2012/03/16) FAQ対応 1963 * @og.rev 5.5.2.5 (2012/05/21) FAQ対応 廃止 1964 * 1965 * @param key 画面ID 1966 * 1967 * @return ヘルプリンク文字列 1968 */ 1969 private String makeHelpLink( final String key ) { 1970 String rtn = ""; 1971 String filename = helpMap.getFilename( key ); 1972 if( filename != null ) { 1973 rtn = helpLinkFormat.replace( "{FILENAME}", filename ); 1974 } 1975 1976 return rtn; 1977 } 1978 1979 /** 1980 * このオブジェクトの文字列表現を返します。 1981 * 基本的にデバッグ目的に使用します。 1982 * 1983 * @return このクラスの文字列表現 1984 */ 1985 @Override 1986 public String toString() { 1987 return org.opengion.fukurou.util.ToString.title( this.getClass().getName() ) 1988 .println( "VERSION" ,VERSION ) 1989 .println( "menuType" ,menuType ) 1990 .println( "expand" ,expand ) 1991 .println( "groups" ,groups ) 1992 .println( "selClassify" ,selClassify ) 1993 .println( "href" ,href ) 1994 .println( "target" ,target ) 1995 .println( "imageOnly" ,imageOnly ) 1996 .println( "sideCount" ,sideCount ) 1997 .println( "minCellCount" ,minCellCount ) 1998 .println( "maxCellCount" ,maxCellCount ) 1999 .println( "cache" ,cache ) 2000 .println( "mscKey" ,mscKey ) 2001 .println( "multiSessionCheck" ,multiSessionCheck ) 2002 .println( "useButton" ,useButton ) 2003// .println( "useButtonScript" ,useButtonScript ) 2004 .println( "buttonRequest" ,buttonRequest ) 2005 .println( "MENU_TYPE" ,MENU_TYPE ) 2006 .println( "Other..." ,getAttributes().getAttribute() ) 2007 .fixForm().toString() ; 2008 } 2009}