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