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