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