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