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