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     * 設定することも?来ませんので、ご注意く???<br/>
036     * こ?固定化に伴??WRITABLE ?も使用できません?
037     * なお?日付?キー、備?に関しては、columnDisplay 属?で、表示の ON/OFF 制御は可能です?
038     * また?日付ブレイク、キーブレイクの設定で、カラ??体を??ブルの外に出すことが可能です?
039     * (キーと備?はセ?になって?す?)<br/>
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     * 例として?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             * <del>"0800" は?0に?2000" は?00 に変換します?
614             * 30?5 なので?0830" は?85 になります?</del>
615             * "0800" は?80に?2100" は?260 に変換します?
616             *
617             * @og.rev 5.4.3.7 (2012/01/20) 計算方法?変更
618             *
619             * @param       val     時間??の値(0800 など)
620             * @param       defTm   引数の時間???null の場合?初期値
621             *
622             * @return      時間??を数字に変換した結果( 80 など)
623             */
624            private int getStr2Time( final String val , final int defTm ) {
625                    if( val == null || val.isEmpty() ) { return defTm; }
626                    else if( val.length() != 4 ) {
627                            String errMsg = "時間引数は?桁?です?" +
628                                                            "  val=[" + val + "]";
629                            throw new HybsSystemException( errMsg );
630                    }
631    
632    //              return Integer.parseInt( val.substring( 0,2 ) )*10 +
633    //                                      Integer.parseInt( val.substring( 2 ) )/6 ;      // 30?5 になるよ?
634                    return Integer.parseInt( val.substring( 0,2 ) )*60 +
635                                            Integer.parseInt( val.substring( 2 ) ) ;        // 5.4.3.7 (2012/01/20)
636    
637            }
638    
639            /**
640             * 数字を時間??に変換します?
641             *
642             * <del>80は?0800" に?00 は?2000" に変換します?
643             * 30?5 なので?5 は?0830"  になります?</del>
644             * 480は?0800" に?1260"は?100 に変換します?
645             *
646             * @og.rev 5.4.3.7 (2012/01/20) 計算方法?変更
647             *
648             * @param       timeVal 引数の時間???null の場合?初期値
649             *
650             * @return      数字を時間??に変換した結果( "0800" など)
651             */
652            private String getInt2StrTime( final int timeVal ) {
653                    int tmpVal = timeVal;
654                    if(      tmpVal < minStTime ) { tmpVal = minStTime; }        // ??以下?場合?、最小?に合せ?
655                    else if( tmpVal > maxEdTime ) { tmpVal = maxEdTime; }        // ?値以上?場合?、最大値に合せる?
656    
657                    //        桁合?   85??00 の変換         85??0 の変換      足して?0830 になる?
658    //              int rtn = 10000 + ( tmpVal / 10 ) * 100 + ( ( tmpVal % 10 ) * 6 ) ;
659    
660    //              return String.valueOf( rtn ).substring(1);                      // "0830" 部?返す?
661                    return String.valueOf(100+ tmpVal/60).substring(1) + String.valueOf(100+tmpVal%60).substring(1);
662            }
663    
664            // 引数に?を追?る?
665    
666            /**
667             * リンク??をパースします?
668             *
669             * ??タの空?リンクを作?するときに、?となるリンク??の引数を設定します?
670             * 引数は?TMSTART=(stTime)&TMEND=(edTime) を追?るイメージです?
671             * stTime、edTime は、それぞれ?($1)?$2) の変数が割り当てられます?
672             * stTime、edTime は?getInt2StrTime( int ) メソ?で変換した??を利用します?
673             *
674             * @param       lnkVal  リンクのベ?スとなる?
675             * @param       stTime  開始時刻の数字表?
676             * @param       edTime  終?刻の数字表?
677             *
678             * @return      リンク??をパースした結果
679             */
680            private String makeLinkValue( final String lnkVal,final int stTime,final int edTime ) {
681    //      private String makeLinkValue( final String lnkVal,final String dyClm,final String keyClm,final int stTime,final int edTime ) {
682                    String rtn = "";
683                    if( lnkVal != null ) {
684            //              rtn = lnkVal.replace( "($1)",getInt2StrTime( stTime ) )
685            //                                              .replace( "($2)",getInt2StrTime( edTime ) ) ;
686    //                                                      .replace( "($3)",dyClm )
687    //                                                      .replace( "($4)",keyClm ) ;
688    
689                            // URLエンコードがかかって?場合?なお??して処?な??は、他にURLエンコードされて??を?慮して?
690                            rtn = lnkVal.replace( "%28%241%29",getInt2StrTime( stTime ) )
691                                                            .replace( "%28%242%29",getInt2StrTime( edTime ) ) ;
692    //                                                      .replace(  "%28%243%29",dyClm )
693    //                                                      .replace( "%28%244%29",keyClm ) ;
694                    }
695    
696                    return rtn;
697            }
698    
699            /**
700             * 表示?の編?並び替?が可能かど?を返しま?
701             *
702             * @return      表示?の編?並び替?が可能かど?(false:不可能)
703             */
704            @Override
705            public boolean isEditable() {
706                    return false;
707            }
708    }