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