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