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.plugin.view;
017    
018    import java.util.List;
019    import java.util.ArrayList;
020    
021    import org.opengion.hayabusa.common.HybsSystem;
022    import org.opengion.hayabusa.common.HybsSystemException;
023    import org.opengion.hayabusa.html.ViewTimeTableParam;
024    
025    /**
026     * 時間軸を持つタイãƒ?ƒ†ーブルの表示を行うクラスですã?
027     *
028     * パラメータがå¿?¦�な場合ã?、ViewTimeTableParamTag を使用してくださいã€?
029     *
030     * パラメータが設定されてã�?�ªã�??合ã?、ViewForm_HTMLTimeTable の初期値が使用されますã?
031     * (パラメータを使用するには、viewタグのuseParam 属æ?をtrueに設定するå¿?¦�がありますã?)
032     *
033     * SELECTæ–??、日付ã?キー、備è€??開始時刻、終äº?™‚刻、リンクがã?å¿??é ?›®で、この並びé ??ã€?
034     * 完å?に固定ですã?よって、カラãƒ?½�置を指定するå¿?¦�ã?ありませんがã?SELECTæ–?‚’自由に
035     * 設定することもå?来ませんので、ご注意くã�?�•ã�??
036     * こã?固定化に伴ã�??WRITABLE æŒ?®šも使用できませんã€?
037     * なおã?日付ã?キー、備è€?に関しては、columnDisplay 属æ?で、表示の ON/OFF 制御は可能ですã?
038     * またã?日付ブレイク、キーブレイクの設定で、カラãƒ??体をãƒ??ブルの外に出すことが可能ですã?
039     * (キーと備è?はセãƒ?ƒˆになってã�?�¾すã?)
040     *
041     * タイãƒ?ƒ†ーブルが空きã?場合ã?リンクを指定できますã?(ViewTimeTableParam.NULL_LINK_CLM_ID)
042     * (ViewTimeTableParam の nullLinkColumn 属æ?)
043     * æŒ?®šしなã�??合ã?、空きã?リンクは作æ?されませんã€?
044     * こã?リンクは、特殊で、引数に、パラメータを追åŠ?�§きますがã€?($1)"ã€?($2)" でæŒ?®šしますã?
045     * こã?($1)ã€?$2)はã€?–‹始時刻、終äº?™‚刻がセãƒ?ƒˆされますが、SELECTæ–??固定カラãƒ?�¨同じ
046     * 並びé ?�§すが、DBTableModelの値を設定してã�?‚‹わけではありませんã€?
047     * 空きã?場合ã?、データ自体が存在しなã�??合と、日付ã?キー のみã�?外部結合で生æ?されã�?
048     * レコードが実際に存在する場合がありますが、外部結合で生æ?されたレコードにはã€?
049     * 開始時刻、終äº?™‚刻はありませんã€?$1) と($2)には、それぞれã?æœ?°�開始時刻とæœ?¤§終äº?™‚刻ã‚?
050     * セãƒ?ƒˆしますã?
051     *
052     * 例としてã€?amp;TMSTART=($1)&TMEND=($2) とã�?�†æ–?­—å?の ($*) 部åˆ?‚’解析して割当ますã?
053     *
054     * ブレーク処ç�?‚’行うカラãƒ?¼©?¤をCSV形式でセãƒ?ƒˆできますã?(ViewTimeTableParam.BREAK_CLMS)
055     * (ViewTimeTableParam の breakClms 属æ?)
056     * これは、ブレイク毎にãƒ??ブルがå?かれて、テーブルの先é?に、ブレイクした
057     * 値が表示されますã?
058     * 例えば、日付カラãƒ?‚’ブレイクカラãƒ?�¨して設定すると、日付がブレイクするたã?ã€?
059     * 日付をヘッãƒ??に出して、テーブルを作æ?しますã?
060     * ブレークカラãƒ??、CSV形式でè¤?•°æŒ?®šできますã?そã?場合ã?、è¤?•°æŒ?®šã?カラãƒ??
061     * 合æ?されたå?で、キーブレイクの判定を行いますã?(簡単にè¨?�†と?¯?²判定になりますã?)
062     * なおã?ブレイクカラãƒ?‚’æŒ?®šしたå?合ã?、è?動的に、noDisplay 属æ?にそã?値をセãƒ?ƒˆ
063     * しますã?
064     *
065     * @og.rev 5.4.0.0 (2011/10/01) 新規追åŠ?
066     * @og.group 画面表示
067     *
068     * @version  4.0
069     * @author       Kazuhiko Hasegawa
070     * @since    JDK5.0,
071     */
072    public class ViewForm_HTMLTimeTable extends ViewForm_HTMLTable {
073            //* こã?プログラãƒ??VERSIONæ–?­—å?を設定しますã?       {@value} */
074            private static final String VERSION = "5.4.4.2 (2012/02/03)" ;
075    
076    //      private int             intval          = 5;                    // 30åˆ?5 単位に colspan を設定するã?
077    //      private int             minStTime       = 80;                   // 08:00 のことã€?0åˆ?5 換ç®?
078    //      private int             maxEdTime       = 210;                  // 21:00 のことã€?
079            private int             intval          = 30;                   // 30åˆ?単位に colspan を設定するã?
080            private int             minStTime       = 480;                  // 08:00 のことã€?H=480M
081            private int             maxEdTime       = 1260;                 // 21:00 のことã€?1H=1260M
082    
083            private static final int        dyClmNo         = 0;    // ヘッãƒ??1?šたã�?�—、グループ化する場合ã?、外å?ã�?
084            private static final int        keyClmNo        = 1;    // ヘッãƒ??2?šたã�?�—、グループ化する場合ã?、外å?ã�?
085            private static final int        bikoClmNo       = 2;    // ヘッãƒ??3??å†?ƒ¨では使用してã�?�¾せんã€?
086    
087            private static final int        tmstClmNo       = 3;    // 時間æž??開始時刻(含ã‚?
088            private static final int        tmedClmNo       = 4;    // 時間æž??終äº?™‚刻(含まなã�?
089            private static final int        linkClmNo       = 5;    // 時間æž?�«表示する予ç´?ƒ…報(変更画面へのリンク)
090    
091            private static final int        clmCnt          = 3;    // 決め打ち。今ã?、dyClm,keyClm の?’つã�?�‘表示
092    
093            // 引数に、DYUSE=(dyClm)&UNITID=(keyClm)&TMSTART=(stTime)&TMEND=(edTime) を追åŠ?�™るã?
094    //      private String  linkValue       = "<a href=\"../GK0101/index.jsp?command=NEW&NORESERVE="
095    //                                                                      + "&DYUSE=($1)&UNITID=($2)&TMSTART=($3)&TMEND=($4)"
096    //                                                                      + "&BACK_GAMENID=GK0000&GAMENID=GK0101&BACK_ADDRESS=/gk/jsp/GK0000/index.jsp\" target=\"CONTENTS\">"
097    //                                                                      + "<img src=\"../customImage/gk/space.gif\" width=\"100%\" height=\"20px\" />"
098    //                                                                      + "</a>" ;
099            // 引数パã?ス機è?付き ãƒ??タが存在しなã�??合ã?リンクのベã?スを設定ã?
100    //      private String  linkValue               = "" ;          // null にするとエラーになるã?で、空æ–?­—å?
101            private int             nullLinkClmNo   = -1 ;          // 固定ではなく可変ã?場合に利用するリンクカラãƒ?o
102    
103            private int             tdClassColumnNo = -1 ;          // 5.4.3.7 (2012/01/20) ãƒ??タをå?れるTDタグにclass属æ?を付与するå?合ã?カラãƒ?o
104    
105    //      private int[]   breakClmNos             = null;         // ブレーク処ç�?‚’行うカラãƒ?o
106            private boolean isDyBreak               = true;         // 日付でブレイクするかどã�?�‹を指å®?
107            private boolean isBookingMerge  = false;        // 5.4.4.2 (2012/02/03) ブッキングãƒ??タをã?ージするかどã�?�‹を指å®?
108    
109            /**
110             * å†?®¹をクリア(初期åŒ?しますã?
111             *
112             * @og.rev 5.4.3.7 (2012/01/20) tdClassColumnNo 追åŠ?
113             * @og.rev 5.4.4.2 (2012/02/03) isBookingMerge 追åŠ?
114             *
115             */
116            @Override
117            public void clear() {
118                    super.clear();
119    
120    //              intval          = 5;                    // 30åˆ?5 単位に colspan を設定するã?
121    //              minStTime       = 80;                   // 08:00 のことã€?0åˆ?5 換ç®?
122    //              maxEdTime       = 210;                  // 21:00 のことã€?
123                    intval          = 30;                   // 30åˆ?単位に colspan を設定するã?
124                    minStTime       = 480;                  // 08:00 のことã€?H=480M
125                    maxEdTime       = 1260;                 // 21:00 のことã€?1H=1260M
126    
127    //              linkValue               = "" ;                  // null にするとエラーになるã?で、空æ–?­—å?
128                    nullLinkClmNo   = -1;                   // 固定ではなく可変ã?場合に利用するリンクカラãƒ?
129    //              breakClmNos             = null;                 // ブレーク処ç�?‚’行うカラãƒ?o
130                    tdClassColumnNo = -1 ;                  // 5.4.3.7 (2012/01/20) ãƒ??タをå?れるTDタグにclass属æ?を付与するå?合ã?カラãƒ?o
131                    isDyBreak               = true;                 // 日付でブレイクするかどã�?�‹を指å®?
132                    isBookingMerge  = false;                // 5.4.4.2 (2012/02/03) ブッキングãƒ??タをã?ージするかどã�?�‹を指å®?
133            }
134    
135            /**
136             * DBTableModel から HTMLæ–?­—å?を作æ?して返しますã?
137             * startNo(表示開始位置)から、pageSize(表示件数)までのViewæ–?­—å?を作æ?しますã?
138             * 表示残りãƒ??タã�?pageSize 以下ã?場合ã?,残りのãƒ??タをすべて出力しますã?
139             *
140             * @og.rev 5.4.3.7 (2012/01/20) tdClassColumnNo 追åŠ?
141             * @og.rev 5.4.4.2 (2012/02/03) isBookingMerge 追åŠ?
142             *
143             * @param  startNo        表示開始位置
144             * @param  pageSize   表示件数
145             *
146             * @return      DBTableModelから作æ?されã�?HTMLæ–?­—å?
147             */
148            @Override
149            public String create( final int startNo, final int pageSize )  {
150                    if( getRowCount() == 0 ) { return ""; } // 暫定å?置
151    
152                    paramInit();
153                    headerLine       = null;
154                    int lastNo = getLastNo( startNo, pageSize );
155                    int hsc = getHeaderSkipCount();
156                    int hscCnt = 1;
157    
158                    StringBuilder out = new StringBuilder( HybsSystem.BUFFER_LARGE );
159    
160                    if( isDyBreak ) {
161                            out.append( getRendererValue( 0,dyClmNo ) ).append( HybsSystem.CR );
162                            setColumnDisplay( dyClmNo,false );      // 日付ブレイクならã?setColumnDisplay をfalse にセãƒ?ƒˆ
163                    }
164    
165                    out.append( getHeader() );
166    
167                    out.append("<tbody>").append( HybsSystem.CR );
168                    int bgClrCnt = 0;
169    
170                    int maxColspan = (maxEdTime-minStTime)/intval ;         // こã?数がã?TDの数になるã?
171                    int rowColspan = 0;                                                                     // 5.5.0.3(2012/03/12) ?‘行ã?累積TD数。最大は、maxColspan でã€?
172                    int stTime     = minStTime;
173    
174                    String backData    = "";        // 初期値。1回目にキーブレイクさせるã?
175    
176                    List<String> dblBooking = new ArrayList<String>();          // 重è¤?ƒ‡ータがあったときã?ãƒ??タ格ç´?
177                    String nlVal     = null;                // 空リンクのベã?ス値
178                    String tdCls     = null;                // 5.4.3.7 (2012/01/20) tdClassColumnNo 追åŠ?
179                    String dyVal     = null;                // 日付é?目の値
180                    String keyVal    = null;                // キーé ?›®の値
181    //              String breakVal  = null;                // キーブレイクの値
182                    String bk_nlVal  = null;                // キーブレイク時ã?å…??空リンクのベã?ス値
183                    String bk_dyVal  = "";                  // キーブレイク時ã?å…??日ä»?
184    //              String bk_breakVal = "";                // キーブレイクのå…??値
185                    for( int row=startNo; row<lastNo; row++ ) {
186                            // キーブレイクの判å®?
187                            bk_nlVal   = nlVal;
188    //                      bk_dyVal   = dyVal;
189    //                      bk_keyVal  = keyVal;
190    
191    //                      nlVal = (nullLinkClmNo < 0 ) ? linkValue : getRendererValue( row,nullLinkClmNo );
192                            nlVal = (nullLinkClmNo < 0 ) ? null : getRendererValue( row,nullLinkClmNo );
193                            tdCls = (tdClassColumnNo < 0 ) ? null : getValue( row,tdClassColumnNo );     // 5.4.3.7 (2012/01/20)
194                            dyVal   = getValue( row,dyClmNo );
195                            keyVal  = getValue( row,keyClmNo );
196                            if( row==startNo ) { bk_dyVal   = dyVal; }              // 初期ãƒ??タをセãƒ?ƒˆã€?
197                            //
198    //                      if( breakClmNos != null ) {
199    //                              StringBuilder blkVal = new StringBuilder( HybsSystem.BUFFER_MIDDLE );
200    //                              for( int i=0; i<breakClmNos.length; i++ ) {
201    //                                      blkVal.append( getValue( row,breakClmNos[i] ) );
202    //                              }
203    //                              breakVal = blkVal.toString();
204    //                      }
205    
206                            String linkVal = getRendererValue( row,linkClmNo );
207    
208                            // キーブレイク判定ã?キーブレイクは、ä¸?•ª初めから来るã?
209                            if( !backData.equals( dyVal + keyVal ) ) {
210                                    backData   = dyVal + keyVal;                    // null は来なã�??ã�?
211    
212                                    // minStTime < stTime の時だけã?処ç�?‚’行うã€?æœ??のキーブレイクは処ç�?�—なã�?�Ÿã‚?
213                                    if( minStTime < stTime ) {
214                                            // まずã?、前の td の残りをå?力するã?ここでは、キーブレイク前ã?値を使用するã€?
215                                            if( stTime < maxEdTime ) {
216                                                    out.append("  ");               // td タグの出力前の段落
217                                                    // 残データの書きå?しã?、最大TD数-それまでにセãƒ?ƒˆした数ã€?
218                                                    int td = maxColspan - rowColspan;               // 5.5.0.3(2012/03/12)
219    //                                              appendTag( out , "td" , (maxEdTime-stTime)/intval ,
220    //                                              appendTDTag( out , null , (maxEdTime-stTime)/intval ,   // 5.4.3.7 (2012/01/20)
221                                                    appendTDTag( out , null , td ,  // 5.5.0.3(2012/03/12)
222                                                                                    makeLinkValue( bk_nlVal , stTime , maxEdTime ) );
223    //                                                                              makeLinkValue( bk_nlVal , bk_dyVal , bk_keyVal , stTime , maxEdTime ) );
224                                            }
225                                            out.append("</tr>").append( HybsSystem.CR );
226                                    }
227                                    stTime = minStTime;             // 初期åŒ?
228    
229                                    // ãƒ??タかã?りが発生したときã?処ç�?
230                                    if( !dblBooking.isEmpty() ) {
231                                            for( String bkdt : dblBooking ) {
232                                                    out.append("<tr").append( getBgColorCycleClass( bgClrCnt-1 ) ).append(">").append( HybsSystem.CR );
233                                                    out.append( bkdt );
234                                                    out.append("</tr>").append( HybsSystem.CR );
235                                            }
236                                            dblBooking.clear();
237                                    }
238    
239                                    // 日付ブレイク処ç�?
240                                    if( isDyBreak && row > startNo && !bk_dyVal.equals( dyVal ) ) {
241                                            bk_dyVal = dyVal;
242                                            out.append("<tr class=\"dummy\">");
243                                            for(int column = 0; column < clmCnt; column++) {
244                                                    if( isColumnDisplay( column ) ) {
245                                                            out.append("<td/>");
246                                                    }
247                                            }
248    //                                      for( int i=0; i<(maxEdTime-minStTime)/intval ; i++ ) {
249                                            for( int i=0; i<maxColspan ; i++ ) {         // 5.5.0.3(2012/03/12) 空td の出力ã?TD の colspan の基準になるã?
250                                                    out.append("<td/>");
251                                            }
252                                            out.append("</tr>").append( HybsSystem.CR );
253                                            out.append("</tbody>").append( HybsSystem.CR );
254                                            out.append("</table>").append( HybsSystem.CR );
255    
256                                            out.append( getRendererValue( row,dyClmNo ) ).append( HybsSystem.CR );
257    
258                                            out.append( getHeader() );
259                                            out.append("<tbody>").append( HybsSystem.CR );
260                                            hscCnt = 1;
261                                    }
262    
263                                    // ヘッãƒ??繰り返し属æ?( headerSkipCount )を採用
264                                    if( hsc > 0 && hscCnt % hsc == 0 ) {
265                                            out.append( getHeadLine() );
266                                            hscCnt = 1;
267                                    }
268                                    else {
269                                            // 特殊å?ç�?¼šここã?処ç�?�§は、ä¸?•ªæœ??もã?実行されるのでã€?¼‹+しなã�?‚ˆã�?�«åŠ?·¥しておくã€?
270                                            if( row > startNo ) { hscCnt ++ ; }
271                                    }
272    
273                                    // ここから、新しい行が始まるã?
274                                    out.append("<tr").append( getBgColorCycleClass( bgClrCnt++ ) ).append(">").append( HybsSystem.CR );
275                                    rowColspan = 0 ;                // 5.5.0.3(2012/03/12) 初期åŒ?
276    
277                                    for(int column = 0; column < clmCnt; column++) {
278                                            if( isColumnDisplay( column ) ) {
279                                                    // ヘッãƒ??部åˆ?�«åŠ?·¥しやすいように、class 属æ?を与えておくã€?
280                                                    out.append("  <td class=\"" ).append( getColumnName( column ) ).append( "\">" );
281                                                    out.append( getValueLabel(row,column) );
282                                                    out.append("</td>").append( HybsSystem.CR );
283                                            }
284                                    }
285                            }
286    
287                            // æ–?­—å?型ã?時å?æƒ??を数字に変換するã€?
288    //                      int clStTime = getStr2Time( getValue( row,tmstClmNo ) , minStTime );
289                            int clStTime = getStr2Time( getValue( row,tmstClmNo ) , -1 );
290                            boolean nullData = (clStTime < 0) ;  // 開始時刻ã�?null の場合ã?-1 が返されるのでフラグをセãƒ?ƒˆするã€?
291                            if( clStTime < minStTime ) { clStTime = minStTime; } // æœ?°�å?以下ã?場合ã?、最小å?に合せるã?
292    
293                            int clEdTime = getStr2Time( getValue( row,tmedClmNo ) , maxEdTime );
294                            if( clEdTime > maxEdTime ) { clEdTime = maxEdTime; } // æœ?¤§値以上ã?場合ã?、最大値に合せるã?
295    
296                            if( clStTime == clEdTime ) { clEdTime = clEdTime + intval ; }   // æœ??とæœ?¾Œが同じ場合ã?、intvalåˆ?進めておくã€?
297    
298                            // æœ??とæœ?¾Œが異なるå?合ã?ã€?–“に空æ¬?�Œ入るã?同じ場合ã?ã€??続なので、空æ¬??入らなã�??
299                            if( stTime < clStTime ) {
300                                    out.append("  ");               // td タグの出力前の段落
301    
302                                    // 5.5.0.3(2012/03/12) 間に空æ¬?�Œ入るå?合ã?そã?大きさが最小TD単位より大きけれã?、å?割するã€?
303                                    // ただしã?直前ã? TD 個数がã?æœ?°�でなã�??合ã?みã€?
304                                    int td = (clStTime-stTime)/intval;              // 5.5.0.3(2012/03/12)
305                                    rowColspan += td;
306    //                              appendTag( out , "td" , (clStTime-stTime)/intval ,
307    //                              appendTDTag( out , null , (clStTime-stTime)/intval ,            // 5.4.3.7 (2012/01/20)
308                                    appendTDTag( out , null , td ,          // 5.5.0.3(2012/03/12)
309                                                                                    makeLinkValue( nlVal , stTime , clStTime ) ).append( HybsSystem.CR );
310    //                                                                              makeLinkValue( nlVal , dyVal , keyVal , stTime , clStTime ) ).append( HybsSystem.CR );
311                            }
312                            // 前ã?ãƒ??タとかã?ってã�?‚‹。つまりã?ブッキングãƒ??タがあるã?
313                            else if( stTime > clStTime ) {
314                                    // 5.4.4.2 (2012/02/03) ブッキングãƒ??タをã?ージする機è?を追åŠ?
315                                    if( isBookingMerge ) {
316                                            if( stTime < clEdTime ) {
317                                                    int td = (clEdTime-stTime)/intval;              // 5.5.0.3(2012/03/12)
318                                                    rowColspan += td ;
319    //                                              appendTDTag( out , tdCls , (clEdTime-stTime)/intval , linkVal ).append( HybsSystem.CR );
320                                                    appendTDTag( out , tdCls , td , linkVal ).append( HybsSystem.CR );
321                                                    stTime = clEdTime;
322                                            }
323                                            continue;
324                                    }
325    
326                                    StringBuilder buf2 = new StringBuilder( HybsSystem.BUFFER_MIDDLE );
327    
328                                    buf2.append("  ");              // td タグの出力前の段落
329    //                              appendTag( buf2 , "td" , clmCnt );                                                                      // ヘッãƒ??部åˆ?
330                                    for(int column = 0; column < clmCnt; column++) {
331                                            if( isColumnDisplay( column ) ) {
332                                                    // ヘッãƒ??部åˆ?�«åŠ?·¥しやすいように、class 属æ?を与えておくã€?
333                                                    buf2.append("<td class=\"" ).append( getColumnName( column ) ).append( "\"/>" );
334                                            }
335                                    }
336    
337    //                              appendTag( buf2 , "td" , (clStTime-minStTime)/intval );                         // æœ??からãƒ??タまで
338    //                              appendTag( buf2 , "td" , (clEdTime-clStTime)/intval , linkVal );        // ãƒ??タ部
339    //                              appendTag( buf2 , "td" , (maxEdTime-clEdTime)/intval );                         // ãƒ??タからæœ?¾Œまで
340    
341                                    // 5.4.3.7 (2012/01/20)
342                                    appendTDTag( buf2 , null  , (clStTime-minStTime)/intval );                              // æœ??からãƒ??タまで
343                                    appendTDTag( buf2 , tdCls , (clEdTime-clStTime)/intval , linkVal );             // ãƒ??タ部: 5.4.3.7 (2012/01/20) td に class属æ?追åŠ?
344                                    appendTDTag( buf2 , null  , (maxEdTime-clEdTime)/intval );                              // ãƒ??タからæœ?¾Œまで
345    
346                                    dblBooking.add( buf2.toString() );
347                                    continue;
348                            }
349                            // 前も後ろも最小とæœ?¤§になってã�?‚‹のは、予ç´?ƒ¬コードが無ã�?�Ÿめã?
350    //                      else if( clStTime == minStTime && clEdTime == maxEdTime ) {
351                            // stTime == clStTime のケース。nullData = true で、予ç´?ƒ¬コードが無ã�?�Ÿめã?
352                            else if( nullData ) {
353    //                              linkVal = makeLinkValue( nlVal , dyVal , keyVal , minStTime , maxEdTime );
354                                    linkVal = makeLinkValue( nlVal , minStTime , maxEdTime );
355                            }
356                            // 5.4.3.7 (2012/01/20) linkVal をå?通に使用してã�?‚‹ç®?‰€を修正
357    
358                            out.append("  ");               // td タグの出力前の段落
359    //                      appendTag( out , "td" , (clEdTime-clStTime)/intval , linkVal ).append( HybsSystem.CR );
360                            int td = (clEdTime-clStTime)/intval;            // 5.5.0.3(2012/03/12)
361                            rowColspan += td ;
362    //                      appendTDTag( out , tdCls , (clEdTime-clStTime)/intval , linkVal ).append( HybsSystem.CR );      // 5.4.3.7 (2012/01/20) td に class属æ?追åŠ?
363                            appendTDTag( out , tdCls , td , linkVal ).append( HybsSystem.CR );      // 5.5.0.3(2012/03/12)
364    
365                            stTime = clEdTime ;
366                    }
367    
368                    // 残å?ç�?¼šデータが残ってã�?‚‹場合ã?、書きå?すå¿?¦�があるã€?
369                    if( ( minStTime < stTime && stTime < maxEdTime ) ) {
370                            out.append("  ");               // td タグの出力前の段落
371    //                      appendTag( out , "td" , (maxEdTime-stTime)/intval ,
372                            // 残データの書きå?しã?、最大TD数-それまでにセãƒ?ƒˆした数ã€?
373                            int td = maxColspan - rowColspan;               // 5.5.0.3(2012/03/12)
374    //                      appendTDTag( out , null , (maxEdTime-stTime)/intval ,           // 5.4.3.7 (2012/01/20)
375                            appendTDTag( out , null , td ,          // 5.5.0.3(2012/03/12)
376                                                                                    makeLinkValue( nlVal , stTime , maxEdTime ) );
377    //                                                                              makeLinkValue( nlVal , dyVal , keyVal , stTime , maxEdTime ) );
378    //                      out.append("</tr>").append( HybsSystem.CR );
379    
380                            // ãƒ??タかã?りが発生したときã?処ç�?
381    //                      if( !dblBooking.isEmpty() ) {
382    //                              for( String bkdt : dblBooking ) {
383    //                                      out.append("<tr").append( getBgColorCycleClass( bgClrCnt-1 ) ).append(">").append( HybsSystem.CR );
384    //                                      out.append( bkdt );
385    //                                      out.append("</tr>").append( HybsSystem.CR );
386    //                              }
387    //                      }
388    //              }
389    //              else {
390    //                      out.append("</tr>").append( HybsSystem.CR );
391                    }
392                    out.append("</tr>").append( HybsSystem.CR );
393    
394                    // ãƒ??タかã?りが発生したときã?処ç�?
395                    if( !dblBooking.isEmpty() ) {
396                            for( String bkdt : dblBooking ) {
397                                    out.append("<tr").append( getBgColorCycleClass( bgClrCnt-1 ) ).append(">").append( HybsSystem.CR );
398                                    out.append( bkdt );
399                                    out.append("</tr>").append( HybsSystem.CR );
400                            }
401                    }
402    
403                    // カラãƒ??結合があるためã?td タグをå?別に出力しておかなã�?�¨、レイアウトがずれるã?
404                    out.append("<tr class=\"dummy\">");
405                    for(int column = 0; column < clmCnt; column++) {
406                            if( isColumnDisplay( column ) ) {
407                                    out.append("<td/>");
408                            }
409                    }
410    //              for( int i=0; i<(maxEdTime-minStTime)/intval ; i++ ) {
411                    for( int i=0; i<maxColspan ; i++ ) {         // 5.5.0.3(2012/03/12) 空td の出力ã?TD の colspan の基準になるã?
412                            out.append("<td/>");
413                    }
414                    out.append("</tr>").append( HybsSystem.CR );
415    
416                    out.append("</tbody>").append( HybsSystem.CR );
417                    out.append("</table>").append( HybsSystem.CR );
418    
419                    out.append( getScrollBarEndDiv() );     // 3.8.0.3 (2005/07/15)
420                    return out.toString();
421            }
422    
423            /**
424             * パラメータå†?®¹をå?期化しますã?
425             *
426             * @og.rev 5.4.3.7 (2012/01/20) tdClassColumnNo 追åŠ??intval の実å?åŒ?
427             * @og.rev 5.4.4.2 (2012/02/03) isBookingMerge 追åŠ?
428             *
429             */
430            private void paramInit() {
431                    String s_intval         = getParam( ViewTimeTableParam.TIME_INTERVAL    , null );
432                    String s_minStTime      = getParam( ViewTimeTableParam.MIN_START_TIME   , null );
433                    String s_maxEdTime      = getParam( ViewTimeTableParam.MAX_END_TIME             , null );
434    
435    //              String[] s_brkClms      = StringUtil.csv2Array( getParam( ViewTimeTableParam.BREAK_CLMS , null ) );
436    
437                    isDyBreak               = Boolean.valueOf( getParam( ViewTimeTableParam.USE_DY_BREAK, "true" ) );
438    
439                    // 5.4.4.2 (2012/02/03) ブッキングãƒ??タをã?ージするかどã�?�‹を指å®?
440                    isBookingMerge  = Boolean.valueOf( getParam( ViewTimeTableParam.USE_BOOKING_MERGE, "false" ) );
441    
442                    // nullリンクのカラãƒ?��æŒ?®šã?nullClm が優先é?位が高いã€?
443                    String s_nullClm        = getParam( ViewTimeTableParam.NULL_LINK_CLM_ID , null );
444                    if( s_nullClm != null ) {
445                            nullLinkClmNo = getColumnNo( s_nullClm );
446                    }
447    //              else {
448    //                      linkValue       = getParam( ViewTimeTableParam.BODY_LINK_VALUE  , linkValue );
449    //              }
450    
451                    // 5.4.3.7 (2012/01/20) ãƒ??タをå?れるTDタグにclass属æ?を付与するå?合ã?カラãƒ?o
452                    String s_tdClsClm       = getParam( ViewTimeTableParam.TD_CLASS_COLUMN_ID       , null );
453                    if( s_tdClsClm != null ) {
454                            tdClassColumnNo = getColumnNo( s_tdClsClm );
455                    }
456    
457                    // BREAK_CLMS は、csv2Array してã�?‚‹ので、null は来なã�??
458    //              if( s_brkClms.length > 0 ) {
459    //                      breakClmNos     = new int[s_brkClms.length];
460    //                      for( int i=0; i<s_brkClms.length; i++ ) {
461    //                              breakClmNos[i] = getColumnNo( s_brkClms[i] );
462    //                      }
463    //              }
464    
465                    if( s_intval != null ) {
466                            intval = Integer.parseInt( s_intval ) ; // 5.4.3.7 (2012/01/20)
467                    }
468    //              intval          = getStr2Time( s_intval         , intval );                             // インターバルã€?030 ならã?5ã€? 30åˆ?5 換ç®?
469                    minStTime       = getStr2Time( s_minStTime      , minStTime );                  // æœ?°�開始時刻ã€?800 ならã?80ã€?30åˆ?5 換ç®?
470                    maxEdTime       = getStr2Time( s_maxEdTime      , maxEdTime );                  // æœ?¤§終äº?™‚刻ã€?100 ならã?210ã€?0åˆ?5 換ç®?
471            }
472    
473            /**
474             * DBTableModel から ãƒ??ブルのタグæ–?­—å?を作æ?して返しますã?
475             *
476             * @og.rev 5.4.3.7 (2012/01/20) colgroup は不è¦?
477             *
478             * @return      ãƒ??ブルのタグæ–?­—å?
479             */
480            @Override
481            protected String getTableHead() {
482                    StringBuilder buf = new StringBuilder( HybsSystem.BUFFER_MIDDLE );
483    
484            //  5.4.3.7 (2012/01/20) colgroup は不è¦?
485            //      for(int column = 0; column < clmCnt; column++) {
486            //              if( isColumnDisplay( column ) ) {
487            //                      buf.append("<colgroup class=\"" );
488            //                      buf.append( getColumnDbType(column) );          // 4.0.0 (2005/01/31)
489            //                      buf.append("\"/>");
490            //                      buf.append( HybsSystem.CR );
491            //              }
492            //      }
493    
494                    // 3.5.2.0 (2003/10/20) ヘッãƒ??繰り返し部をgetHeadLine()へ移å‹?
495                    buf.append("<thead id=\"header\">").append( HybsSystem.CR );      // 3.5.6.5 (2004/08/09)
496                    buf.append( getHeadLine() );
497                    buf.append("</thead>").append( HybsSystem.CR );
498    
499                    return buf.toString();
500            }
501    
502            /**
503             * ヘッãƒ??繰り返し部をã?getTableHead()メソãƒ?ƒ‰からåˆ?›¢ã€?
504             *
505             * @param       thTag タグのæ–?­—å?
506             *
507             * @return      ãƒ??ブルのタグæ–?­—å?
508             */
509            @Override
510            protected String getHeadLine( final String thTag ) {
511                    if( headerLine != null ) { return headerLine; }         // キャãƒ?‚·ュを返すã€?
512    
513                    StringBuilder buf = new StringBuilder( HybsSystem.BUFFER_MIDDLE );
514    
515                    buf.append("<tr class=\"row_h\"").append(" >").append( HybsSystem.CR );
516    
517                    buf.append( HybsSystem.CR );
518                    for(int column = 0; column < clmCnt; column++) {
519                            if( isColumnDisplay( column ) ) {
520    //                              buf.append( thTag ).append(">");
521                                    buf.append( thTag ).append(" class=\"" ).append( getColumnName( column ) ).append( "\">" );
522                                    buf.append( getColumnLabel(column) );
523                                    buf.append("</th>").append( HybsSystem.CR );
524                            }
525                    }
526    
527    //              for(int tm = minStTime; tm < maxEdTime; tm+=10 ) {   // intval づつ進めるべきだがã?1時間ごとの箱とするã€?
528                    for(int tm = minStTime; tm < maxEdTime; tm+=60 ) {   // ヘッãƒ??はã€?¼‘時間単位とするã€?
529    //                      buf.append( thTag ).append(" class=\"timeVar\" colspan=\"2\">");
530                            buf.append( thTag ).append(" class=\"timeVar\" colspan=\"" ).append( 60/intval ).append( "\">");
531    //                      buf.append( (tm/10) );
532                            buf.append( (tm/60) );
533                            buf.append("</th>").append( HybsSystem.CR );
534                    }
535    
536                    buf.append("</tr>").append( HybsSystem.CR );
537    
538                    headerLine = buf.toString();
539                    return headerLine;
540            }
541    
542            /**
543             * TDタグæ–?­—å?を簡易的に合æ?しますã?
544             *
545             * ここでは、主に、class 属æ?、colspan 属æ?を設定することを目çš?�«してã�?�¾すã?
546             * colspan の値によって、動作を変化させてã�?�¾すã?
547             *   0: タグそã?もã?を生成しません。これã?、第ä¸?¼•数をそのまま返しますã?
548             *   1: colspan 属æ?をå?力しませんã€?Default値なので)
549             *   それ以外ã?、colspan に引数を設定しますã?
550             * BODY 部もã?無æŒ?®šã?場合ã?ã€?&gt; 止めã?タグをå?力しますã?
551             *
552             * 返り値の StringBuilder は、第ä¸?¼•数そã?もã?を返しますã?よって、このメソãƒ?ƒ‰にã€?
553             * append をé?結してã�?��ことも可能ですã?
554             * (return値を使わなくてもã?第ä¸?¼•数の StringBuilder は変化してã�?�¾すã?副作用とã�?�†ã‚?�¤ã€?
555             *
556             * @og.rev 5.4.3.7 (2012/01/20) tdタグ専用に変更ã€?
557             *
558             * @param       buf             こã?StringBuilderに append しますã?
559             * @param       cls             追åŠ?�™ã‚?class 属æ?
560             * @param       colspan td , th タグ属æ?に追åŠ?�™ã‚?colspan値ã€?
561             *                     0 の場合ã?、タグ自体を出力しませんã€?
562             *                     1 の場合ã?、colspan をå?力しませんã€?
563             * @param       body    タグの BODY 部に出力するå?容(String可変長引数)?�件の場合ã?、BODYなã�?
564             *
565             * @return      appendされたStringBuilder(第ä¸?¼•数と同じオブジェクãƒ?
566             */
567    //      private StringBuilder appendTag( final StringBuilder buf , final String tag , final int colspan , final String... body ) {
568            private StringBuilder appendTDTag( final StringBuilder buf , final String cls , final int colspan , final String... body ) {
569                    if( colspan == 0 ) { return buf; }
570    
571    //              buf.append( "<" ).append( tag );
572    //              if( colspan > 1 ) {
573    //                      buf.append( " colspan=\"" ).append( colspan ).append( "\"" );
574    //              }
575    //
576    //              int cnt = body.length;
577    //              if( cnt == 0 ) { buf.append( " />" ); }
578    //              else {
579    //                       buf.append( ">" );
580    //                      for( int i=0; i<cnt; i++ ) {
581    //                              buf.append( body[i] );
582    //                      }
583    //                       buf.append( "</" ).append( tag ).append( ">" );
584    //              }
585    
586                    buf.append( "<td" );
587                    // class 属æ?の追åŠ?
588                    if( cls != null && !cls.isEmpty() ) {
589                            buf.append( " class=\"" ).append( cls ).append( "\"" );
590                    }
591    
592                    // colspan 属æ?の追åŠ?
593                    if( colspan > 1 ) {
594                            buf.append( " colspan=\"" ).append( colspan ).append( "\"" );
595                    }
596    
597                    int cnt = body.length;
598                    if( cnt == 0 ) { buf.append( " />" ); }
599                    else {
600                             buf.append( ">" );
601                            for( int i=0; i<cnt; i++ ) {
602                                    buf.append( body[i] );
603                            }
604                             buf.append( "</td>" );
605                    }
606    
607                    return buf;
608            }
609    
610            /**
611             * 時間æ–?­—å?を数字に変換しますã?
612             *
613             * "0800" はã€?80にã€?2100" はã€?260 に変換しますã?
614             *
615             * @og.rev 5.4.3.7 (2012/01/20) 計算方法ã?変更
616             *
617             * @param       val     時間æ–?­—å?の値(0800 など)
618             * @param       defTm   引数の時間æ–?­—å?ã�?null の場合ã?初期値
619             *
620             * @return      時間æ–?­—å?を数字に変換した結果( 80 など)
621             */
622            private int getStr2Time( final String val , final int defTm ) {
623                    if( val == null || val.isEmpty() ) { return defTm; }
624                    else if( val.length() != 4 ) {
625                            String errMsg = "時間引数はã€?¼”桁å¿?¦�ですã?" +
626                                                            "  val=[" + val + "]";
627                            throw new HybsSystemException( errMsg );
628                    }
629    
630    //              return Integer.parseInt( val.substring( 0,2 ) )*10 +
631    //                                      Integer.parseInt( val.substring( 2 ) )/6 ;      // 30åˆ?5 になるよã�?�«
632                    return Integer.parseInt( val.substring( 0,2 ) )*60 +
633                                            Integer.parseInt( val.substring( 2 ) ) ;        // 5.4.3.7 (2012/01/20)
634    
635            }
636    
637            /**
638             * 数字を時間æ–?­—å?に変換しますã?
639             *
640             * 480はã€?0800" にã€?1260"はã€?100 に変換しますã?
641             *
642             * @og.rev 5.4.3.7 (2012/01/20) 計算方法ã?変更
643             *
644             * @param       timeVal 引数の時間æ–?­—å?ã�?null の場合ã?初期値
645             *
646             * @return      数字を時間æ–?­—å?に変換した結果( "0800" など)
647             */
648            private String getInt2StrTime( final int timeVal ) {
649                    int tmpVal = timeVal;
650                    if(      tmpVal < minStTime ) { tmpVal = minStTime; }        // æœ?°�å?以下ã?場合ã?、最小å?に合せã‚?
651                    else if( tmpVal > maxEdTime ) { tmpVal = maxEdTime; }        // æœ?¤§値以上ã?場合ã?、最大値に合せるã?
652    
653                    //        桁合ã�?   85â†?â†?00 の変換         85â†?â†?0 の変換      足してã€?0830 になるã?
654    //              int rtn = 10000 + ( tmpVal / 10 ) * 100 + ( ( tmpVal % 10 ) * 6 ) ;
655    
656    //              return String.valueOf( rtn ).substring(1);                      // "0830" 部åˆ?‚’返すã€?
657                    return String.valueOf(100+ tmpVal/60).substring(1) + String.valueOf(100+tmpVal%60).substring(1);
658            }
659    
660            // 引数にã€?を追åŠ?�™るã?
661    
662            /**
663             * リンクæ–?­—å?をパースしますã?
664             *
665             * ãƒ??タの空æ¬?�«リンクを作æ?するときに、å?となるリンクæ–?­—å?の引数を設定しますã?
666             * 引数はã€?TMSTART=(stTime)&TMEND=(edTime) を追åŠ?�™るイメージですã?
667             * stTime、edTime は、それぞれã?($1)ã€?$2) の変数が割り当てられますã?
668             * stTime、edTime はã€?getInt2StrTime( int ) メソãƒ?ƒ‰で変換したæ–?­—å?を利用しますã?
669             *
670             * @param       lnkVal  リンクのベã?スとなるå?
671             * @param       stTime  開始時刻の数字表è¨?
672             * @param       edTime  終äº?™‚刻の数字表è¨?
673             *
674             * @return      リンクæ–?­—å?をパースした結果
675             */
676            private String makeLinkValue( final String lnkVal,final int stTime,final int edTime ) {
677    //      private String makeLinkValue( final String lnkVal,final String dyClm,final String keyClm,final int stTime,final int edTime ) {
678                    String rtn = "";
679                    if( lnkVal != null ) {
680            //              rtn = lnkVal.replace( "($1)",getInt2StrTime( stTime ) )
681            //                                              .replace( "($2)",getInt2StrTime( edTime ) ) ;
682    //                                                      .replace( "($3)",dyClm )
683    //                                                      .replace( "($4)",keyClm ) ;
684    
685                            // URLエンコードがかかってã�?‚‹場合ã?なおã?åˆ?§£して処ç�?�—なã�??は、他にURLエンコードされてã�?‚‹ç®?‰€をè?慮してã€?
686                            rtn = lnkVal.replace( "%28%241%29",getInt2StrTime( stTime ) )
687                                                            .replace( "%28%242%29",getInt2StrTime( edTime ) ) ;
688    //                                                      .replace(  "%28%243%29",dyClm )
689    //                                                      .replace( "%28%244%29",keyClm ) ;
690                    }
691    
692                    return rtn;
693            }
694    
695            /**
696             * 表示é ?›®の編é›?並び替ã�?が可能かどã�?�‹を返しまã�?
697             *
698             * @return      表示é ?›®の編é›?並び替ã�?が可能かどã�?�‹(false:不可能)
699             */
700            @Override
701            public boolean isEditable() {
702                    return false;
703            }
704    }