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