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 * 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 属性を指定することで、1セルに含まれる最小行数を指定できます。 827 * これは、セルに入れる <br /> の個数を指定することと同じです。 828 * 《最大行数設定》maxCellCount 属性を指定することで、1セルに含まれる最大行数を指定できます。 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 * ⇒ 変わりに、1行に表示されているセル数が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 * 0:フィールドセットメニュー 1230 * 1:トップ階層(【分類名称】) 1231 * 2:選択階層(通常の折りたたみメニュー) 1232 * 3:選択非表示(通常は、隠してあります) 1233 * -1:グループ分類メニュー(class="GUI_GRP"のtdタグで囲われます) 1234 * -2:ラインメニュー([画面名称] ) 1235 * -3:マトリクスメニュー(一覧) 1236 * -4:マトリクスメニュー2(一覧) 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) マトリクス2からの遷移先でボタンメニューにする処理 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 * 0:フィールドセットメニュー 1301 * 1:トップ階層(【分類名称】) 1302 * 2:選択階層(通常の折りたたみメニュー) 1303 * 3:選択非表示(通常は、隠してあります) 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 * 0:フィールドセットメニュー 1328 * 1:トップ階層(【分類名称】) 1329 * 2:選択階層(通常の折りたたみメニュー) 1330 * 3:選択非表示(通常は、隠してあります) 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 * メニューにも、複数のグループを指定できるため、1グループの指定で、 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 * メニューを作成します。これは、3段階メニューの最終メニューを求める場合に 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(画像のみ)に設定した場合は、ラベルの最初の1文字 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)では、一つのセルの高さを同一にする為、<br />タグを挿入します。 1629 * このタグの挿入する個数を指定します。 1630 * この個数だけ、メニューの数があろうとなかろうと行を確保します。 1631 * 指定の値が、実際の行数より少ない場合は、実際の行数分だけ拡張されます。 1632 * 初期値は、8 です。 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 * 初期値は、8 です。 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 * 全体を、<div id="design-onelevel" > で、囲い、画面名称は、<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}