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