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