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 */ 016package org.opengion.hayabusa.taglib; 017 018import org.opengion.hayabusa.common.HybsSystem; 019import org.opengion.hayabusa.common.HybsSystemException; 020import org.opengion.hayabusa.resource.CalendarData; 021import org.opengion.hayabusa.resource.CalendarFactory; 022import org.opengion.hayabusa.html.ViewStackTableParam; 023import org.opengion.fukurou.util.StringUtil; 024 025import static org.opengion.fukurou.util.StringUtil.nval ; 026 027import java.util.Calendar; 028import java.util.Date; 029import java.util.List; 030import java.util.ArrayList; 031import java.util.Locale ; 032import java.text.DateFormat; 033import java.text.SimpleDateFormat; 034 035/** 036 * ガントチャート用のヘッダー情報(日付け等)を出力するタグです。 037 * 038 * スライドバー式ガントチャートの表示時に、スライドバーの長さと日付とを関連付けるための 039 * ヘッダー情報(日付け等)を出力します。スライドバーと日付間隔は、zoom 属性によって、 040 * CSSファイルのフォントサイズと、JavaScript の内部配列に依存しています。 041 * また、このヘッダーでは、日付の休日情報を、カレンダテーブルを参照することで取得しています。 042 * calDB 属性への指定は、CalendarFactory で生成されるテーブル名(CalendarDataの実装クラス) 043 * を指定します。 044 * 045 * @og.formSample 046 * ●形式:<og:ganttHeader startDate="…" endDate="…" zoom="[…]" /> 047 * ●body:なし 048 * 049 * ●Tag定義: 050 * <og:ganttHeader 051 * startDate 【TAG】表示開始日付けを設定します(yyyyMMdd または、yyyyMMddHHmm 形式) 052 * endDate 【TAG】表示最終日を設定します(yyyyMMdd または、yyyyMMddHHmm 形式) 053 * zoom 【TAG】ズーム変数(0~13,20~31,40~49)を設定します(初期値:2) 054 * calDB 【TAG】DB検索するDBを指定します 055 * arg1 【TAG】DB検索する場合の第1のキーを指定します 056 * arg2 【TAG】DB検索する場合の第2のキーを指定します 057 * arg3 【TAG】DB検索する場合の第3のキーを指定します 058 * arg4 【TAG】DB検索する場合の第4のキーを指定します 059 * daySpan 【TAG】1日の開始終了時間を24時間形式(HHmm-HHmm)で設定します(初期値:0700-2000) 060 * breakTimes 【TAG】時間軸での休憩時間の開始-終了時刻をカンマ区切りで複数指定します(HHmm-HHmm形式、または、yyyyMMddHHmm-HHmm形式、または、yyyyMMddHHmm-yyyyMMddHHmm形式) 061 * breakTimeStyle 【TAG】時間軸での休憩時間の表示スタイルを設定します(初期値:top:20px;background-color:yellow;filter:alpha(opacity=60);opacity:0.60;) 062 * baseTimes 【TAG】時間軸でのベース時刻の開始時刻をカンマ区切りで複数指定します(HHmm形式、または、yyyyMMddHHmm形式) 063 * baseTimeStyle 【TAG】時間軸でのベース時刻の表示スタイルを設定します(初期値:top:20px;background-color:transparent;border-left:2px dashed red;) 064 * skipHoliday 【TAG】時間ガントで休日を表示する/しないを設定します (初期値:USE_GANTTHEADER_SKIP_HOLIDAY[=true]) 065 * useMultiClm 【TAG】時間ヘッダーの上段に日付を、下段の時間を表示します (初期値:USE_GANTTHEADER_MULTIPLE_COLUMN[=false]) 066 * debug 【TAG】デバッグ情報を出力するかどうか[true/false]を指定します(初期値:false) 067 * /> 068 * 069 * ●使用例 070 * 参照:jsp/GANTT06 フォルダ 071 * 072 * <og:ganttHeader 073 * startDate = "{@VIEW_DATE}" 074 * endDate = "{@DYMAX}" 075 * zoom = "{@VIEW_ZOOM}" 076 * calDB = "GF13" 077 * arg1 = "{@CDJGS}" 078 * arg2 = "" 079 * /og:ganttHeader> 080 * 081 * <og:ganttHeader 082 * startDate = "{@VIEW_DATE}" 083 * endDate = "{@DYMAX}" 084 * daySpan = "0700-2000" HHmm-HHmm 形式で1日の時間範囲を指定 085 * breakTimes = "1200-1245,1645-1650,200508200700-1200;" 休憩時間は、HHmm-HHmm形式、または、yyyyMMddHHmm-HHmm形式、または、yyyyMMddHHmm-yyyyMMddHHmm形式です。 086 * breakTimeStyle = "top:20px;background-color:yellow;" 休憩時間のスタイルに追加します。 087 * zoom = "20" 088 * /og:ganttHeader> 089 * 090 * ●定義・解説 091 * PL/SQL の VIEW_ZOOM メソッドを用いて、実際の日付けから画面表示ピクセルへ 092 * 変換する割合を求めます。これと、jsp\GANTT\image の ganttBGx.gif(x は ZOOM変数) 093 * を対応付けて、日付けのヘッダーを求めます。 094 * jsp\custom\custom.css の th.zoomx(x は ZOOM変数) により、日付けヘッダー文字の 095 * 表示間隔を制御していますので、これらの関係を正確に把握しておいて下さい。 096 * 日付けヘッダーは、イメージ変数を用いている関係上、固定の日数を加算して、 097 * 求めます。(週:7日, 半月:15日, 月:30日, 4半期:90日, 年:360日) 098 * 099 * ヘッダー部のカレンダに、calDB で指定された カレンダテーブルを使用出来ます。 100 * 使用する場合は、arg1(事業所コード等)~arg4(WCコード等) の属性を指定する事ができます。 101 * zoom="10"(週単位) を使用の週数の計算は、年初の最初の7日間が含まれる週を、第1週と数えます。 102 * 103 * zoom="20"(時)間 では、1日の時間範囲をdaySpanでHHmm-HHmm形式で指定します。 104 * 開始時刻は、内部で1時間単位に変換されます。8時30分~は、8時~になります。 105 * 終了時間は、その時間を「含みません」 106 * 開始終了は、startDate、endDateで指定しますが、yyyyMMdd または、yyyyMMddHHmm 形式とします。 107 * calDB で指定された カレンダテーブルを見て、休日の場合は、表示をスキップします。 108 * 休憩時間は、breakTimes で指定します。(HHmm-HHmm形式、または、yyyyMMddHHmm-HHmm、 109 * または、yyyyMMddHHmm-yyyyMMddHHmm形式) 110 * カンマ区切りで複数指定できます。日付指定がない場合は、毎日、日付指定がある場合は、 111 * その日のみ有効です。休憩時間は、日をまたぐ事は可能です。 112 * breakTimeStyle として、休憩時間の指定に追加するスタイル属性を追加します。 113 * 通常は、バックカラーと上からの位置です。ヘッダー表示は、1時間単位です。 114 * 初期値は、"top:20px;background-color:yellow;filter:alpha(opacity=60);opacity:0.60;" です。 115 * 116 * ベース時刻(baseTimes)は、HHmm形式、または、yyyyMMddHHmm形式で指定した箇所に、線を引きます。 117 * 例えば、検索した時刻を指定すると、現在時刻の箇所を示す線になります。 118 * また、業務自体の開始時刻や終了時刻の箇所を表すことも可能です。 119 * baseTimeStyle は、このベース時刻のスタイルを決めます。breakTimeStyle との違いは、 120 * 帯の幅を、このスタイルシートで指定していることです。 121 * 初期値は、top:20px;background-color:transparent;border-left:2px dashed red; です。 122 * 123 * zoom="21"(時)間 では、一時間のピクセルを"20"(時)の半分に変更します。 124 * 125 * useMultiClm パラメータを設定すると、ガントヘッダーにおいて、2段組を使用するかどうかを、 126 * 指定できます。時間ヘッダーの上段に日付を、下段の時間軸の(h)の削除を行います。 127 * 日付は、表示開始時刻の上と、それの6時間ごとに表示します。 128 * 初期値は、システムリソースの USE_GANTTHEADER_MULTIPLE_COLUMN で指定します。 129 * 130 * システムリソースに USE_GANTTHEADER_MONTH_DATE パラメータを設定すると、 131 * ガントヘッダーにおいて、30日、90日、180日のヘッダー表示で、日付まで 132 * 表示するか、月のみ表示するかを指定します。 133 * ガントヘッダーの繰返し表示でバックグラウンドイメージは固定日なので、一月表示を 134 * 30日単位で表示していますが、先頭日付が 1日でないため、判りにくいと苦情がありました。 135 * そこで、30日、90日、180日のヘッダー表示時に、日付を表示しないようにするフラグです。 136 * 月表示は、その月が 20日以降の場合、翌月を表示します。 137 * 初期値は、互換性の為、false です。 138 * 139 * zoom 40(DAY),41(WEEK),42(MONTH) は、積み上げガント用のヘッダー処理を行います。 140 * 積み上げガントは、固定日処理ではなく、月単位に加算します。 141 * 142 * @og.rev 3.5.4.8 (2004/02/23) 新規作成 143 * @og.group 画面部品 144 * 145 * @version 4.0 146 * @author Kazuhiko Hasegawa 147 * @since JDK5.0, 148 */ 149public class GanttHeaderTag extends CommonTagSupport { 150 //* このプログラムのVERSION文字列を設定します。 {@value} */ 151 private static final String VERSION = "6.0.0.1 (2014/04/25)" ; 152 153 private static final long serialVersionUID = 600120140425L ; 154 155 // 5.6.2.3 (2013/03/22) 日付をセンターに表示させる場合の両端スペースの元ネタ 156 private static final String SPACE = " " ; // 日付(31日分)より多いスペース 157 158 // 5.6.5.0 (2013/06/07) 曜日データを配列で持っておきます。 159 private static final String[] DAY_OF_WEEK_ja = new String[] { " ","日 ","月 ","火 ","水 ","木 ","金 ","土 " }; 160 private static final String[] DAY_OF_WEEK_en = new String[] { " ","Su" ,"Mo" ,"Tu" ,"We" ,"Th" ,"Fr" ,"Sa" }; 161 162 private String startDate = null; 163 private String endDate = null; 164 private String daySpan = "0700-2000"; // 1日の時間範囲(HHmm-HHmm) 3.8.0.5 (2005/08/26) 165 private int zoom = 2; 166 private String breakTimes = null; // 休憩時間は、HHmm-HHmm形式、または、yyyyMMddHHmm-HHmm、または、yyyyMMddHHmm-HHmmyyyyMMdd形式です。 167 private String breakTimeStyle = "top:20px;background-color:yellow;filter:alpha(opacity=60);opacity:0.60;" ; // 5.6.4.3 (2013/05/24) 初期値変更 168 private String calDB = null; // 3.6.0.0 (2004/09/17) DB検索するDBのキー 169 private String arg1 = null; // 3.6.0.0 (2004/09/17) DB検索の第1キー(事業所コードなど) 170 private String arg2 = null; // 3.6.0.0 (2004/09/17) DB検索の第2キー(WCコードなど) 171 private String arg3 = null; // 3.6.0.0 (2004/09/17) DB検索の第3キー(事業所コードなど) 172 private String arg4 = null; // 3.6.0.0 (2004/09/17) DB検索の第4キー(WCコードなど) 173 private boolean skipHoliday = HybsSystem.sysBool( "USE_GANTTHEADER_SKIP_HOLIDAY" ); // 4.0.0.0 (2007/09/07) 休日をスキップするかどうか 174 private String calStr = null; // 5.5.4.0 (2012/07/02) 出勤日・休日のフラグ 175 176 private static final int TIME_PIXEL = 48; // 3.8.1.1 (2005/11/21) 時間ヘッダー時の1時間のピクセル数 177 private boolean useMultiClm = HybsSystem.sysBool( "USE_GANTTHEADER_MULTIPLE_COLUMN" ); // 5.6.1.2 (2013/02/22) 178 179 private static final boolean USE_MONTH_DATE = HybsSystem.sysBool( "USE_GANTTHEADER_MONTH_DATE" ); // 3.8.5.2 (2006/06/09) 180 private static final int MONTH_DATE_LIMITER = 20; // 当月 20 日以降は、翌月扱いとなる。 181 182 private static final String BLUE_COLOR = "<span style=\"color:Blue;\">" ; // 5.6.2.3 (2013/03/22) 廃止 183 private static final String RED_COLOR = "<span style=\"color:Red;\">" ; // 5.6.2.3 (2013/03/22) 廃止 184 private static final String TODAY_CLASS = "gntToday" ; // 5.6.2.3 (2013/03/22) 当日を示すクラス名 185 private static final String HOLIDAY_CLASS = "gntHoliday" ; // 5.6.2.3 (2013/03/22) 休日を示すクラス名 186 private static final String END_SPAN = "</span>" ; 187 private static final String BR = "<br/>" ; 188 189 private static final String ODD_CLASS = "<span class=\"oddColor\">" ; // 5.6.2.3 (2013/03/22) 奇数月の色設定 190 private static final String EVEN_CLASS = "<span class=\"evenColor\">" ; // 5.6.2.3 (2013/03/22) 偶数月の色設定 191 192 private String baseTimes = null; // 5.6.1.2 (2013/02/22) ベース時刻は、HHmm形式、または、yyyyMMddHHmm形式です。 193 private String baseTimeStyle = "top:20px;background-color:transparent;border-left:2px dashed red;" ; // 5.6.1.2 (2013/02/22) ベース時刻を赤線表示します。 194 195 private static final boolean useMdheader = HybsSystem.sysBool( "USE_MDHEADER_ONTIME" ); // 5.7.0.0 (2013/11/07) 196 197 /** 198 * Taglibの終了タグが見つかったときに処理する doEndTag() を オーバーライドします。 199 * 200 * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応。release2() を doEndTag()で呼ぶ。 201 * @og.rev 3.6.0.0 (2004/09/17) zoom 3 の時の計算値を変更 202 * @og.rev 3.7.1.0 (2005/04/15) zoom 10 の追加 203 * @og.rev 3.8.1.6 (2006/04/25) zoom 21 の追加 204 * @og.rev 3.8.5.2 (2006/06/09) makeZoom メソッドの USE_MONTH_DATE パラメータ追加 205 * @og.rev 3.8.9.2 (2007/07/28) makeZoomTime メソッドの 時間間隔パラメータ追加 206 * @og.rev 5.5.4.0 (2012/07/02) ヘッダー属性情報の出力追加 207 * @og.rev 5.6.3.2 (2013/04/12) 曜日を出力する場合の段組みでは、全角スペースを使う(firefox対応) 208 * 209 * @return 後続処理の指示 210 */ 211 @Override 212 public int doEndTag() { 213 debugPrint(); // 4.0.0 (2005/02/28) 214 if( startDate == null || endDate == null || 215 startDate.length() < 8 || endDate.length() < 8 ) { 216 String errMsg = "開始日と終了日は、どちらも yyyyMMdd 形式で、必須です。" 217 + " startDate=[" + startDate + "] endDate=[" + endDate + "]" ; 218 throw new HybsSystemException( errMsg ); 219 } 220 221 // 月単位の処理に30,60,90などの固定日を使用しているのは、ガントバーの長さが 222 // 日単位の固定長なので、長期間のガントを使用すると後ろの方でずれてくるため。 223 String header = ""; 224 String md = USE_MONTH_DATE ? "MM " : "MM/dd"; 225 switch( zoom ) { 226 case 0: header = makeZoom( "MM/ " ,"dd(EE)" , 1 ,false ) ; break; 227 case 1: header = makeZoom( "MM/" ,"dd " , 1 ,false ) ; break; 228 case 2: header = makeZoom2( 1 ) ; break; 229 case 3: header = makeZoom( "yyyy/ " ,"MM/dd " , 7 ,false ) ; break; 230 case 4: header = makeZoom( "yyyy/ " ,"MM/dd " , 14 ,false ) ; break; 231 case 5: header = makeZoom( "yyyy/ " ,md + " " , 30 ,USE_MONTH_DATE ) ; break; 232 case 6: header = makeZoom( "yyyy/ " ,md + " " , 30 ,USE_MONTH_DATE ) ; break; 233 case 7: header = makeZoom( "yyyy/ " ,md + " " , 90 ,USE_MONTH_DATE ) ; break; 234 case 8: header = makeZoom( "yyyy/ " ,md + " " ,180 ,USE_MONTH_DATE ) ; break; 235 case 9: header = makeZoom( "yyyy/ " ,md + " " ,180 ,USE_MONTH_DATE ) ; break; 236 case 10: header = makeZoom( "ww'W'" ,"'<span title=\"'MM/dd'\">'dd '</span>'" ,7 ,false ) ; break; 237 // case 11: break; // 他物件予約済み 238 // case 12: break; // 他物件予約済み 239 case 13: header = makeZoom3( "yyyy/MM" , "dd" ,"EE" , 1 ) ; break; // 5.6.2.3 (2013/03/22) 月、曜日表示 240 case 20: header = makeZoomTime( TIME_PIXEL , 1,true ) ; break; // 3.8.1.1 (2005/11/21) 241 case 21: header = makeZoomTime( TIME_PIXEL/2, 1,false ) ; break; // 3.8.1.6 (2006/04/25) 242 case 22: header = makeZoomTime( TIME_PIXEL , 2,true ) ; break; // 3.8.9.2 (2007/07/28) 243 case 23: header = makeZoomTime( TIME_PIXEL/2, 2,false ) ; break; // 3.8.9.2 (2007/07/28) 244 case 24: header = makeZoomTime( TIME_PIXEL , 4,true ) ; break; // 3.8.9.2 (2007/07/28) 245 case 25: header = makeZoomTime( TIME_PIXEL/2, 4,false ) ; break; // 3.8.9.2 (2007/07/28) 246 case 26: header = makeZoomTime( TIME_PIXEL , 6,true ) ; break; // 3.8.9.2 (2007/07/28) 247 case 27: header = makeZoomTime( TIME_PIXEL/2, 6,false ) ; break; // 3.8.9.2 (2007/07/28) 248 case 28: header = makeZoomTime( TIME_PIXEL , 8,true ) ; break; // 3.8.9.2 (2007/07/28) 249 case 29: header = makeZoomTime( TIME_PIXEL/2, 8,false ) ; break; // 3.8.9.2 (2007/07/28) 250 case 30: header = makeZoomTime( TIME_PIXEL , 12,true ) ; break; // 3.8.9.2 (2007/07/28) 251 case 31: header = makeZoomTime( TIME_PIXEL/2, 12,false ) ; break; // 3.8.9.2 (2007/07/28) 252 // 5.6.1.2 (2013/02/22) 積み上げガント 253 case 40: header = makeZoomStack( "MM/ " ,"dd(EE)" , 1,false ) ; break; // 5.6.1.2 (2013/02/22) 254 case 41: header = makeZoomStack( "ww'W' " ,"MM/dd " , 7,false ) ; break; // 5.6.1.2 (2013/02/22) 255 case 42: header = makeZoomStack( "yyyy/ " ,"MM " , 1,true ) ; break; // 5.6.1.2 (2013/02/22) 256 // case 43: break; // 日単位ヘッダー予約済み 257 // ~ 258 // case 49: break; // 日単位ヘッダー予約済み 259 default: break; 260 } 261 262 jspPrint( header ); 263 jspPrint(makeHeaderData()); // 5.5.4.0 (2012/07/02) 264 return EVAL_PAGE ; 265 } 266 267 /** 268 * タグリブオブジェクトをリリースします。 269 * 270 * キャッシュされて再利用されるので、フィールドの初期設定を行います。 271 * 272 * @og.rev 3.6.0.0 (2004/09/17) 事業所コード cdjgs 属性を追加 273 * @og.rev 3.8.0.2 (2005/07/11) startTime,timePeriod,breakTimes 属性を追加 274 * @og.rev 3.8.0.5 (2005/08/26) daySpan,breakTimes,breakTimeStyle 属性を追加 275 * @og.rev 5.5.4.0 (2012/07/02) calStr追加 276 * @og.rev 5.6.1.2 (2013/02/22) baseTimes、baseTimeStyle追加,useMultiClm追加 277 */ 278 @Override 279 protected void release2() { 280 super.release2(); 281 startDate = null; 282 endDate = null; 283 daySpan = "0700-2000"; // 開始時刻(HHmm-HHmm) 3.8.0.5 (2005/08/26) 284 zoom = 2; 285 calDB = null; // 3.6.0.0 (2004/09/17) DB検索するDBのキー 286 arg1 = null; // 3.6.0.0 (2004/09/17) DB検索の第1キー(事業所コードなど) 287 arg2 = null; // 3.6.0.0 (2004/09/17) DB検索の第2キー(WCコードなど) 288 arg3 = null; // 3.6.0.0 (2004/09/17) DB検索の第3キー 289 arg4 = null; // 3.6.0.0 (2004/09/17) DB検索の第4キー 290 breakTimes = null; // 休憩時間は、HHmm-HHmm形式、または、yyyyMMddHHmm-HHmm、または、yyyyMMddHHmm-HHmmyyyyMMdd形式です。 291 breakTimeStyle = "top:20px;background-color:yellow;filter:alpha(opacity=60);opacity:0.60;" ; 292 skipHoliday = HybsSystem.sysBool( "USE_GANTTHEADER_SKIP_HOLIDAY" ); // 4.0.0.0 (2007/09/10) 293 calStr = null; // 5.5.4.0 (2012/07/02) 294 baseTimes = null; // 5.6.1.2 (2013/02/22) ベース時刻は、HHmm形式、または、yyyyMMddHHmm形式です。 295 baseTimeStyle = "top:20px;background-color:transparent;border-left:2px dashed red;" ; // 5.6.1.2 (2013/02/22) ベース時刻を赤線表示します。 296 useMultiClm = HybsSystem.sysBool( "USE_GANTTHEADER_MULTIPLE_COLUMN" ); // 5.6.1.2 (2013/02/22) 297 } 298 299 /** 300 * 上段・下段のフォーマットと、加算日に応じたヘッダー文字列を作成します。 301 * 302 * @og.rev 3.6.0.0 (2004/09/17) 休日判断を、事業所カレンダを使用 303 * @og.rev 3.7.1.0 (2005/04/15) zoom == 10 週単位の場合の特殊処理を追加 304 * @og.rev 3.7.1.1 (2005/05/23) 本日は、青色で示します。 305 * @og.rev 3.8.5.2 (2006/06/09) makeZoom メソッドの USE_MONTH_DATE パラメータ追加 306 * @og.rev 5.5.4.0 (2012/07/02) カレンダーフラグ対応 307 * @og.rev 5.6.2.3 (2013/03/22) 日付の終了日は、「含む」に変更 308 * @og.rev 5.6.5.0 (2013/06/07) 上段ヘッダーが MM の場合、週単位で月を表示し、色バーを使用します。 309 * @og.rev 5.7.2.0 (2014/01/10) 上段は、休日を出さないので、END_SPAN 不要 310 * 311 * @param upper 上段の表示フォーマット 312 * @param lower 下段の表示フォーマット 313 * @param add 表示日付けの加算 314 * @param useMonth 月日表示でなく、月表示のみにする。(20日以降を翌月表示する。) 315 * 316 * @return ヘッダー文字列 317 */ 318 private String makeZoom( final String upper ,final String lower ,final int add, final boolean useMonth ) { 319 boolean colBar = upper.startsWith( "MM" ); // 5.6.5.0 (2013/06/07) 色バー使用 true 320 321 DateFormat format1 = new SimpleDateFormat( upper,Locale.JAPAN ); 322 DateFormat format2 = new SimpleDateFormat( lower,Locale.JAPAN ); 323 324 Calendar str = HybsSystem.getCalendar( startDate ); 325 Calendar end = HybsSystem.getCalendar( endDate ); 326 327 // zoom == 10 週単位の場合の特殊処理。 328 // 年の第一週を完全な一週間分(7日間)として、設定します。 329 if( zoom == 10 ) { 330 str.setMinimalDaysInFirstWeek( 7 ); 331 format1.setCalendar( str ); 332 format2.setCalendar( str ); 333 } 334 335 StringBuilder buf1 = new StringBuilder( HybsSystem.BUFFER_SMALL ); 336 StringBuilder buf2 = new StringBuilder( HybsSystem.BUFFER_SMALL ); 337 StringBuilder bufcal = new StringBuilder( HybsSystem.BUFFER_SMALL ); // 5.5.4.0 (2012/07/02) 休日判定用 338 339 // 5.6.5.0 (2013/06/07) 文字列の作成方法の統一。pre タグを最初に設定しておく。 340 buf1.append( "<pre>" ); 341 342 // 3.6.0.0 (2004/09/17) カレンダDB検索機能を追加 343 CalendarData calData = CalendarFactory.getCalendarData( calDB,arg1,arg2,arg3,arg4 ); 344 345 boolean modifyFlag = false; 346 // 5.6.2.3 (2013/03/22) 日付の終了日は、「含む」に変更 347 int cnt = 0; // 5.6.5.0 (2013/06/07) 色バー対応 348 if( colBar ) { buf1.append( EVEN_CLASS ); } // 5.6.5.0 (2013/06/07) 色バー対応 349 boolean isFirst = true; // 5.6.5.0 (2013/06/07) 色バー対応で、最初だけ、月を表示する。 350 351 while( str.compareTo( end ) <= 0 ) { 352 boolean monday = Calendar.MONDAY == str.get( Calendar.DAY_OF_WEEK ) ; // 5.6.5.0 (2013/06/07) 色バー対応 353 if( colBar && monday ) { 354 // 5.6.5.0 (2013/06/07) 色バー対応 355 buf1.append( END_SPAN ); 356 cnt++; 357 isFirst = true; 358 359 if( cnt % 2 == 0 ) { buf1.append( EVEN_CLASS ); } // 偶数の色 360 else { buf1.append( ODD_CLASS ); } // 奇数の色 361 } 362 363 Date dt = str.getTime(); 364 // 3.8.5.2 (2006/06/09) useMonth フラグにより 月表示のみに変更します。 365 // MONTH_DATE_LIMITER で指定の日以降は、翌月扱いとなる。 366 if( useMonth && str.get( Calendar.DATE ) >= MONTH_DATE_LIMITER ) { 367 Calendar calPlus = (Calendar)str.clone(); 368 calPlus.set( Calendar.DATE , 1 ); // 1日にセットします。 369 calPlus.add( Calendar.MONTH , 1 ); // 月を1ヶ月プラスします。 370 dt = calPlus.getTime(); 371 } 372 373 // 3.7.1.1 (2005/05/31) 本日は、青色で示します。 374 if( calData.isContainedToday( str,add ) ) { 375 buf2.append( BLUE_COLOR ); 376 bufcal.append( "0" ); // 5.5.4.0 (2012/07/02) 377 modifyFlag = true; 378 } 379 380 // 3.6.0.0 (2004/09/17) 休日判断を、事業所カレンダを使用 381 // modifyFlag が立っていない場合 を条件に追加します。 382 if( !modifyFlag && add == 1 && calData.isHoliday( str ) ) { 383 buf2.append( RED_COLOR ); 384 bufcal.append( "1" ); // 5.5.4.0 (2012/07/02) 休日 385 modifyFlag = true; 386 } 387 388 // 5.6.5.0 (2013/06/07) 色バー対応。色バーで、かつ、先頭でなければ、スペースを出力 389 if( colBar && !isFirst ) { 390 buf1.append( SPACE.substring( 0,upper.length() ) ); 391 } 392 else { 393 buf1.append( format1.format( dt ) ); 394 isFirst = false; 395 } 396 buf2.append( format2.format( dt ) ); 397 398 if( modifyFlag ) { 399 buf2.append( END_SPAN ); 400 modifyFlag = false; 401 } 402 else{ 403 bufcal.append( "0" ); // 5.5.4.0 (2012/07/02) 404 } 405 str.add(Calendar.DATE, add); 406 } 407 calStr = bufcal.toString(); // 5.5.4.0 (2012/07/02) 408 409 if( colBar ) { buf1.append( END_SPAN ); } // 5.6.5.0 (2013/06/07) 色バー対応 410 411 return buf1.append( BR ).append( buf2 ).append( "</pre>" ).toString(); // 5.6.5.0 (2013/06/07) 文字列の作成方法の統一 412 } 413 414 /** 415 * zoom = 2 の場合のヘッダーを出力します。 416 * このヘッダーだけ特別なので、別メソッドを作成します。 417 * 418 * type=1 の場合 419 * [ 0 ・・・]<br/>[ 2 ・・・]<br/>[ / ・・・]<br/>[0000 ・・・]<br/>[1234 ・・・] 420 * 421 * という月情報を毎週月曜日にヘッダーに出力します。(上記は、2月1日~2月4日まで) 422 * 423 * @og.rev 3.6.0.0 (2004/09/17) 休日判断を、事業所カレンダを使用 424 * @og.rev 3.6.0.7 (2004/11/06) 月の情報も出力します。 425 * @og.rev 3.7.1.1 (2005/05/23) 本日は、青色で示します。 426 * @og.rev 5.5.4.0 (2012/07/02) カレンダーフラグ対応 427 * @og.rev 5.6.2.3 (2013/03/22) 日付の終了日は、「含む」に変更 428 * @og.rev 5.6.5.0 (2013/06/07) 日付欄の段組みを廃止し、色バーに変更します。 429 * 430 * @param add 表示日付けの加算 431 * 432 * @return ヘッダー文字列 433 */ 434 private String makeZoom2( final int add ) { 435 Calendar str = HybsSystem.getCalendar( startDate ); 436 Calendar end = HybsSystem.getCalendar( endDate ); 437 438 StringBuilder buf1 = new StringBuilder( HybsSystem.BUFFER_SMALL ); // 月の1桁目 439 StringBuilder buf4 = new StringBuilder( HybsSystem.BUFFER_SMALL ); // 日の1桁目 440 StringBuilder buf5 = new StringBuilder( HybsSystem.BUFFER_SMALL ); // 日の2桁目 441 StringBuilder bufcal = new StringBuilder( HybsSystem.BUFFER_SMALL ); // 5.5.4.0 (2012/07/02) 休日判定用 442 443 // 5.6.5.0 (2013/06/07) 文字列の作成方法の統一。pre タグを最初に設定しておく。 444 buf1.append( "<pre>" ); 445 446 // 3.6.0.0 (2004/09/17) カレンダDB検索機能を追加 447 CalendarData calData = CalendarFactory.getCalendarData( calDB,arg1,arg2,arg3,arg4 ); 448 449 boolean modifyFlag = false; 450 451 // 5.6.2.3 (2013/03/22) 日付の終了日は、「含む」に変更 452 int cnt = 0; // 5.6.5.0 (2013/06/07) 色バー対応 453 int hCnt = 0; // 月欄は、3文字分 454 buf1.append( EVEN_CLASS ); // 5.6.5.0 (2013/06/07) 色バー対応 455 while( str.compareTo( end ) <= 0 ) { 456 int mt = str.get( Calendar.MONTH ) + 1; 457 int dt = str.get( Calendar.DATE ); 458 boolean monday = Calendar.MONDAY == str.get( Calendar.DAY_OF_WEEK ); 459 460 // 3.7.1.1 (2005/05/31) 本日は、青色で示します。 461 if( calData.isContainedToday( str,add ) ) { 462 buf4.append( BLUE_COLOR ); 463 buf5.append( BLUE_COLOR ); 464 bufcal.append("0"); // 5.5.4.0 (2012/07/02) 465 modifyFlag = true; 466 } 467 468 // 3.6.0.0 (2004/09/17) 休日判断を、事業所カレンダを使用 469 // modifyFlag が立っていない場合 を条件に追加します。 470 if( !modifyFlag && add == 1 && calData.isHoliday( str ) ) { 471 buf4.append( RED_COLOR ); 472 buf5.append( RED_COLOR ); 473 bufcal.append("1"); // 5.5.4.0 (2012/07/02) 474 modifyFlag = true; 475 } 476 477 if( monday ) { 478 // 5.6.5.0 (2013/06/07) 色バー対応 479 buf1.append( END_SPAN ); 480 cnt++; 481 hCnt = 0; 482 483 if( cnt % 2 == 0 ) { buf1.append( EVEN_CLASS ); } // 偶数の色 484 else { buf1.append( ODD_CLASS ); } // 奇数の色 485 } 486 487 // 5.6.5.0 (2013/06/07) 色バー対応 488 switch( hCnt++ ) { 489 case 0 : buf1.append( mt/10 ); break; // 月の1文字目 490 case 1 : buf1.append( mt%10 ); break; // 月の2文字目 491 case 2 : buf1.append( "/" ); break; // 月の区切り文字 492 default : buf1.append( " " ); break; // 空欄 493 } 494 495 buf4.append( (dt/10) ); 496 buf5.append( dt%10 ); 497 498 if( modifyFlag ) { 499 buf4.append( END_SPAN ); 500 buf5.append( END_SPAN ); 501 modifyFlag = false; 502 } 503 else{ 504 bufcal.append("0"); // 5.5.4.0 (2012/07/02) 505 } 506 str.add(Calendar.DATE, add); 507 } 508 509 buf1.append( END_SPAN ); // 5.6.5.0 (2013/06/07) 色バー対応 510 calStr = bufcal.toString(); // 5.5.4.0 (2012/07/02) 511 512 return buf1.append( BR ).append( buf4 ).append( BR ).append( buf5 ).append( "</pre>" ).toString(); // 5.6.5.0 (2013/06/07) 文字列の作成方法の統一 513 } 514 515 /** 516 * ヘッダー、上段・下段のフォーマットと、加算日に応じたヘッダー文字列を作成します。 517 * これは特殊で、ヘッダーに、年/月、上段は日、下段は、曜日を想定しています。 518 * ヘッダー部分は、月として横持で表示させます。 519 * 520 * @og.rev 5.6.2.3 (2013/03/22) 新規追加 521 * 522 * @param header 年月のヘッダー部分 523 * @param upper 上段の表示フォーマット(日) 524 * @param lower 下段の表示フォーマット(曜日) 525 * @param add 表示日付けの加算 526 * 527 * @return ヘッダー文字列 528 */ 529 private String makeZoom3( final String header ,final String upper ,final String lower ,final int add ) { 530 DateFormat formatH = new SimpleDateFormat( header,Locale.JAPAN ); 531 DateFormat format1 = new SimpleDateFormat( upper,Locale.JAPAN ); 532 DateFormat format2 = new SimpleDateFormat( lower,Locale.JAPAN ); 533 534 StringBuilder bufH = new StringBuilder( HybsSystem.BUFFER_SMALL ); // 年月のヘッダー部分(11Byte目から) 535 StringBuilder buf1 = new StringBuilder( HybsSystem.BUFFER_SMALL ); // 日(2桁) 536 StringBuilder buf2 = new StringBuilder( HybsSystem.BUFFER_SMALL ); // 曜日 537 StringBuilder bufcal = new StringBuilder( HybsSystem.BUFFER_SMALL ); // 5.5.4.0 (2012/07/02) 休日判定用 538 539 // 5.6.5.0 (2013/06/07) 文字列の作成方法の統一。pre タグを最初に設定しておく。 540 bufH.append( "<pre>" ); 541 542 Calendar str = HybsSystem.getCalendar( startDate ); 543 Calendar end = HybsSystem.getCalendar( endDate ); 544 545 // 3.6.0.0 (2004/09/17) カレンダDB検索機能を追加 546 CalendarData calData = CalendarFactory.getCalendarData( calDB,arg1,arg2,arg3,arg4 ); 547 548 int dtsu = lower.length(); // 日付欄(下段)の文字数 549 int dayCount = 0; // ヘッダー部の文字が入るかどうかの基準 550 int mtCnt = str.get( Calendar.MONTH ) + 1; // 月をチェック(色設定用) 初期値は、開始時の月 551 String tmpH = null; // ヘッダー部のテンポラリ情報 552 // 5.6.2.3 (2013/03/22) 日付の終了日は、「含む」に変更 553 while( str.compareTo( end ) <= 0 ) { 554 Date dt = str.getTime(); 555 556 if( tmpH == null ) { tmpH = formatH.format( dt ); } // 初期値。最初にセット 557 558 // ここから一連の処理は、月表示ヘッダーの作成 559 int day = str.get( Calendar.DATE ); // ヘッダー部の制御用に、日付が必要 560 if( day == 1 && dayCount > 0 ) { 561 makeHeaderYM( bufH , dayCount*dtsu , mtCnt++ , tmpH ); // このヘッダー出力は、ひと月前の情報 562 dayCount = 0 ; 563 tmpH = formatH.format( dt ); 564 } 565 dayCount ++ ; // 566 567 // 5.6.2.3 (2013/03/22) 休日、本日の処理を class属性化で、合成可能とします。 568 String span = null; 569 // 3.6.0.0 (2004/09/17) 休日判断を、事業所カレンダを使用 570 if( calData.isHoliday( str ) ) { 571 span = HOLIDAY_CLASS ; 572 bufcal.append( "1" ); // 5.5.4.0 (2012/07/02) 休日 573 } 574 else { 575 bufcal.append( "0" ); // 5.5.4.0 (2012/07/02) 576 } 577 578 if( calData.isContainedToday( str,add ) ) { // 本日かどうか 579 span = (span == null) ? TODAY_CLASS : span + " " + TODAY_CLASS ; 580 } 581 582 if( span != null ) { 583 buf1.append( "<span class=\"" ).append( span ).append( "\">" ); 584 buf2.append( "<span class=\"" ).append( span ).append( "\">" ); 585 } 586 587 buf1.append( format1.format( dt ) ); 588 buf2.append( format2.format( dt ) ); 589 590 if( span != null ) { 591 buf1.append( END_SPAN ); 592 buf2.append( END_SPAN ); 593 } 594 str.add(Calendar.DATE, add); 595 } 596 597 // 処理の最後に、ヘッダーの出力は必要 598 makeHeaderYM( bufH , dayCount*dtsu , mtCnt , tmpH ); 599 600 calStr = bufcal.toString(); // 5.5.4.0 (2012/07/02) 601 602 return bufH.append( BR ).append( buf1 ).append( BR ).append( buf2 ).append( "</pre>" ).toString(); // 5.6.5.0 (2013/06/07) 文字列の作成方法の統一 603 } 604 605 /** 606 * 時間軸での月ヘッダーデータを作成します。 607 * 608 * 月ヘッダーは、1日~月末までの日付の上段に、年月(yyyy/MM)表示のヘッダーを作成します。 609 * ヘッダーは、できるだけセンター表示になるように、前後にスペースを入れて調整します。 610 * ヘッダー表示領域が少ない場合、スペースのみになります。 611 * ヘッダーは月が偶数月か奇数月かで、背景色を切り替えることで、判りやすくします。 612 * 613 * @og.rev 5.6.2.3 (2013/03/22) 新規追加 614 * 615 * @param bufH ヘッダーを追記していく StringBuilder 616 * @param dayCnt 日付欄の文字数カウント。日数*桁数(DTSU)。通常、横持なら 2桁 となる。 617 * @param mtCnt 月数に基づいた色の設定用の数字。月の連番にします。 618 * @param ymStr ヘッダーに表示する文字列。年月(yyyy/MM) 619 * 620 * @return ヘッダーが追記された StringBuilder 621 */ 622 private StringBuilder makeHeaderYM( final StringBuilder bufH , final int dayCnt , final int mtCnt , final String ymStr ) { 623 // 奇数月と偶数月で色を変える。将来的に % 3 で判定すれば、3色で廻せる。 624 if( mtCnt % 2 == 0 ) { bufH.append( EVEN_CLASS ); } // 偶数月の色 625 else { bufH.append( ODD_CLASS ); } // 奇数月の色 626 627 // 表示すべき文字列が、日付欄の幅よりも小さい場合、スペースのみとする。 628 if( dayCnt < ymStr.length() ) { 629 bufH.append( SPACE.substring( 0,dayCnt ) ); 630 } 631 // 大きい場合は、前後にスペースを入れて、センター配置 632 else { 633 int lcnt = (dayCnt-ymStr.length())/2 ; // 左の個数。端数が切り捨てられる。 634 int rcnt = dayCnt-lcnt-ymStr.length(); // 右の個数。端数を考慮し、引き算のみで求める。 635 636 bufH.append( SPACE.substring( 0,lcnt ) ); 637 bufH.append( ymStr ); 638 bufH.append( SPACE.substring( 0,rcnt ) ); 639 } 640 641 bufH.append( END_SPAN ); 642 643 return bufH; 644 } 645 646 /** 647 * 時間軸でのヘッダー表示を行います。 648 * 649 * 時間軸の為、ヘッダーの上下段組は行いません。 650 * ヘッダーは、1時間単位に表示します。また、休憩時刻も求めています。 651 * 652 * @og.rev 3.8.0.5 (2005/08/26) 新規追加 653 * @og.rev 3.8.1.1 (2005/11/21) 日付title,範囲class, 654 * @og.rev 3.8.1.4 (2006/03/13) 日付表示、時刻単位(h)削除、2段組(USE_MULTI_CLM) 655 * @og.rev 3.8.1.6 (2006/04/25) 日や時間の単位表示を止め、2文字分(24ピクセル)化する。 656 * @og.rev 3.8.9.2 (2007/07/28) 時間間隔パラメータ追加 657 * @og.rev 4.0.0.0 (2007/09/03) 休日の場合でも表示されるように対応(システムリソースで切り替え) 658 * @og.rev 5.5.4.0 (2012/07/02) ガントの一日表示枠の計算を切り上げするようにする。カレンダーフラグ対応。 659 * @og.rev 5.6.1.2 (2013/02/22) ベース時刻を管理。 ym2int 廃止 ⇒ hm2int に変更。 USE_MULTI_CLM ⇒ useMultiClm 変更。 660 * @og.rev 5.6.4.3 (2013/05/24) ヘッダーずれ対応。"日" を2文字の、"日 " に修正。 661 * @og.rev 5.6.5.0 (2013/06/07) 色バーに変更します。 662 * @og.rev 5.6.7.0 (2013/11/03) 時間軸の上段ヘッダーに月日を表示 663 * 664 * @param hourOfPixcel 1時間あたりのピクセル数。 665 * @param step 時間間隔の指定(1:1時間間隔、2:2時間間隔・・・・) 666 * @param useTani 日や時間の単位表示を行う(true)か、行わない(false)か 667 * 668 * @return ヘッダー文字列 669 */ 670 private String makeZoomTime( final int hourOfPixcel,final int step,final boolean useTani ) { 671 DateFormat format1 = new SimpleDateFormat( "yyyy/MM/dd(EE)",Locale.JAPAN ); // 5.6.5.0 (2013/06/07) 曜日を、tipsに出す。 672 DateFormat format2 = new SimpleDateFormat( "MM/dd",Locale.JAPAN ); // 5.7.0.0 (2013/11/03) 上段 673 674 StringBuilder bufBT = new StringBuilder( HybsSystem.BUFFER_SMALL ); // 5.6.5.0 (2013/06/07) 休憩の管理(buf2 ⇒ bufBT 名称変更) 675 StringBuilder buf1 = new StringBuilder( HybsSystem.BUFFER_SMALL ); // 下段の時刻データ 676 StringBuilder bufH = new StringBuilder( HybsSystem.BUFFER_SMALL ); // 3.8.1.4 (2006/03/13) 段組みヘッダー 677 StringBuilder bufcal = new StringBuilder( HybsSystem.BUFFER_SMALL ); // 5.5.4.0 (2012/07/02) 休日判定用 678 StringBuilder bufDY = new StringBuilder( HybsSystem.BUFFER_SMALL ); // 5.7.0.0 (2013/11/03) 上段用 679 680 String last_title = null; // 5.7.0.0 (2013/11/03) 681 int day_length = 0; // 5.7.0.0 (2013/11/03) 682 int base = 2; // 5.7.0.0 (2013/11/03) 時間単位の標準桁数 683 if( useTani ){ base = 4;} 684 685 // daySpan = "0700-2000"; // 開始時刻(HHmm-HHmm) 3.8.0.5 (2005/08/26) 686 // 分の少数計算を行います。加算は1時間(0100)単位です。 687 // 5.6.1.2 (2013/02/22) 688 int ad = daySpan.indexOf( '-' ); 689 int startTime = hm2int( daySpan.substring( 0,ad ) ) ; 690 int endTime = hm2int( daySpan.substring( ad+1 ) ) ; 691 692 // 開始時刻より終了時刻が同じか小さい場合は、翌日なので2400加算します。 693 if( endTime <= startTime ) { endTime += 2400; } 694 695 // 休憩時間を管理する BreakTimes オブジェクトを作成します。 696 BreakTimes breakTimeObj = new BreakTimes( hourOfPixcel/step,breakTimes,breakTimeStyle,startTime,endTime ); 697 698 // 5.6.1.2 (2013/02/22) ベース時刻を管理する BreakTimes オブジェクトを作成します。(利用するクラスは同じ) 699 BreakTimes baseTimeObj = new BreakTimes( hourOfPixcel/step,baseTimes,baseTimeStyle,startTime,endTime ); 700 701 // 現在時刻を求めておきます。 現在時刻に5分加算しておきます。(余計なお世話?) 702 Calendar rightNow = Calendar.getInstance(); 703 rightNow.add( Calendar.MINUTE,5 ); // 5分 加算 704 int now = rightNow.get( Calendar.HOUR_OF_DAY ) ; 705 706 // 3.8.5.0 (2006/02/06) 707 boolean isDebug = isDebug(); 708 if( isDebug ) { 709 System.out.println( "startDate=" + startDate ); 710 System.out.println( "endDate =" + endDate ); 711 } 712 713 Calendar str = HybsSystem.getCalendar( startDate ); 714 Calendar end = HybsSystem.getCalendar( endDate ); 715 716 // 3.6.0.0 (2004/09/17) カレンダDB検索機能を追加 717 CalendarData calData = CalendarFactory.getCalendarData( calDB,arg1,arg2,arg3,arg4 ); 718 719 // 1時間=hourOfPixcel(px) なので、1日分のピクセルを求めておく。(休憩時刻表示用) 720 int dayOfPixel = (int)(hourOfPixcel * Math.ceil((endTime-startTime)/100.0/step) ); // 5.5.4.0 (2012/07/02) 切り上げ 721 722 // 休憩表示における画面上の表示日数。これが、左のバイアス値として1日分と乗算される。 723 int totalDay = 0; 724 725 // 1日分の表示範囲の開始時刻とデータの表示開始時刻との差(オフセット)ピクセル 726 int offsetPixel = (int)(hourOfPixcel/step * (startTime - (int)(str.get( Calendar.HOUR_OF_DAY )*100 + str.get( Calendar.MINUTE )*10.0/6.0))/100.0 ); 727 728 // 3.8.1.4 (2006/03/13) 時間単位(h)の表示有無を USE_MULTI_CLM と関係させます。 729 // 3.8.1.6 (2006/04/25) 日や時間の単位表示を止め、2文字分(24ピクセル)化する。 730 final String tani ; 731 if( useTani ) { tani = "h " ; } // 5.6.5.0 (2013/06/07) useMultiClm を無視します。 732 else { tani = ""; } 733 734 boolean modifyFlag = false; 735 int cnt = 0; // 3.8.1.1 (2005/11/21) 736 while( str.before( end ) ) { // 終了時間は、「含まない」仕様 737 if( isDebug ) { System.out.println( "Calendar str =" + str.getTime() ); } // 3.8.5.0 (2006/02/06) 738 739 // 5.6.5.0 (2013/06/07) 日付と曜日の対応 740 int day = str.get( Calendar.DATE ); 741 String dayStr = ((day >= 10) ? day : ("0" + day) ) 742 + ((useTani) ? DAY_OF_WEEK_ja[str.get( Calendar.DAY_OF_WEEK )] : "") ; 743 744 // 5.5.4.0 (2012/07/02) この場合は枠単位ではなく、日単位で出力する 745 // skipHolidayは無視して、範囲内の全てのカレンダーを出力 746 if(calData.isHoliday( str )){ 747 bufcal.append("1"); 748 } 749 else{ 750 bufcal.append("0"); 751 } 752 753 // 休日判断を、事業所カレンダを使用:休日なら、日付を進める。 754 if( calData.isHoliday( str ) && skipHoliday ) { 755 if( isDebug ) { System.out.println( "Holiday =" + str.getTime() ); } // 3.8.5.0 (2006/02/06) 756 str.add(Calendar.DATE, 1); 757 continue; 758 } 759 760 // 3.8.1.1 (2005/11/21) 日付のツールチップ表示 761 String ganttClass = "class=\"GNT_" + (cnt % 2) + "\"" ; 762 763 Date dt = str.getTime(); 764 String title = format1.format( dt ); 765 buf1.append( "<span " ).append( ganttClass ); 766 buf1.append( " title=\"" ).append( title ).append( "\">" ); 767 768 // 5.7.0.0 (2013/11/03) 上段 769 if( last_title != null & day_length > 0 ){ 770 makeHeaderMD(bufDY , day_length*base , 0 , last_title); 771 day_length = 0; 772 } 773 last_title = format2.format( dt ); 774 775 if( isDebug ) { System.out.println( "title =" + title ); } // 3.8.5.0 (2006/02/06) 776 777 // 5.6.5.0 (2013/06/07) 色バー対応 778 if( useMultiClm ) { 779 if( cnt % 2 == 0 ) { bufH.append( EVEN_CLASS ); } // 偶数の色 780 else { bufH.append( ODD_CLASS ); } // 奇数の色 781 } 782 cnt++; // 5.6.5.0 (2013/06/07) 他の処理は、cnt++ を先にしているが、ここでは初期設定指定ない為、cnt++ を、処理の後で行う。 783 784 // 本日かどうかを判断する。 785 boolean isToday = calData.isContainedToday( str,1 ); 786 787 int tmHd = startTime/100 ; 788 int dayOut = tmHd; // 3.8.1.4 (2006/03/13) 789 boolean isTodayNow = false; // 3.8.9.2 (2007/07/28) 時間ステップ対応 790 791 for( int h=startTime; h<endTime; h+=100 ) { // 加算は1時間単位 792 if( isDebug ) { // 3.8.5.0 (2006/02/06) 793 System.out.println( "hour =" + h ); 794 System.out.println( "tmHd =" + tmHd ); 795 } 796 // 3.8.9.2 (2007/07/28) 時間ステップ対応 797 isTodayNow = isTodayNow || ( isToday && tmHd == now ); 798 if( ( dayOut - tmHd ) % step != 0 ) { tmHd++; continue; } 799 800 day_length++; // 5.7.0.0 (2013/11/03) 801 802 if( tmHd >= 24 ) { 803 tmHd = 0; 804 // 3.8.1.1 (2005/11/21) 日付のツールチップを次の日に設定します。 805 Date dt2 = new Date( str.getTimeInMillis() + 24*3600*1000L ); 806 title = format1.format( dt2 ); 807 buf1.append( "</span><span " ).append( ganttClass ); 808 buf1.append( " title=\"" ).append( title ).append( "\">" ); 809 } 810 811 // 本日の現在時刻は、青色で示します。 812 if( isTodayNow ) { 813 buf1.append( BLUE_COLOR ); 814 bufH.append( BLUE_COLOR ); 815 modifyFlag = true; 816 isTodayNow = false; // 初期化 817 } 818 // 4.0.0.0 休日の場合は赤色で表示 819 else if( calData.isHoliday( str ) && !skipHoliday ) { 820 buf1.append( RED_COLOR ); 821 bufH.append( RED_COLOR ); 822 modifyFlag = true; 823 } 824 825 // 実質表示日数(totalDay) * 1日分のピクセル(dayOfPixel) - オフセット(offsetPixel) 826 String bt = breakTimeObj.makeSpan( totalDay*dayOfPixel-offsetPixel,str,h,step ); 827 if( bt != null ) { bufBT.append( bt ); } // 5.6.5.0 (2013/06/07) 休憩の管理(buf2 ⇒ bufBT 名称変更) 828 829 // 5.6.1.2 (2013/02/22) ベース時刻のタグを出力します。 830 bt = baseTimeObj.makeSpan( totalDay*dayOfPixel-offsetPixel,str,h,step ); 831 if( bt != null ) { bufBT.append( bt ); } // 5.6.5.0 (2013/06/07) 休憩の管理(buf2 ⇒ bufBT 名称変更) 832 833 // 時間当たりの文字数は、4文字: 文字列を詰める。 834 if( tmHd < 10 ) { buf1.append( '0' ); } // 桁数あわせ 835 buf1.append( tmHd ).append( tani ); // 3.8.1.4 (2006/03/13) 836 837 // 3.8.1.4 (2006/03/13) 日付表示、時刻単位(h)削除、2段組(USE_MULTI_CLM) 838 // 3.8.1.6 (2006/04/25) 日や時間の単位表示を止め、2文字分(24ピクセル)化する。 839 if( useMultiClm ) { // 5.6.1.2 (2013/02/22) useMultiClm 追加 840 if( ( dayOut - tmHd ) == 0 ) { // 5.6.5.0 (2013/06/07) 色バー対応 841 bufH.append( dayStr ); // 5.6.5.0 (2013/06/07) 先に日付+曜日の文字列を作成する。"日" を2文字の、"日 " に修正済み。 842 } 843 else { 844 if( useTani ) { bufH.append( " " ); } 845 else { bufH.append( " " ); } 846 } 847 } 848 849 if( modifyFlag ) { 850 buf1.append( END_SPAN ); 851 bufH.append( END_SPAN ); 852 modifyFlag = false; 853 } 854 tmHd++; // ヘッダーに記述する時刻 855 } 856 str.add(Calendar.DATE, 1); 857 totalDay++ ; 858 buf1.append( END_SPAN ); 859 if( useMultiClm ) { bufH.append( END_SPAN ); } // 5.6.5.0 (2013/06/07) 色バー対応 860 } 861 862 // 3.8.1.4 (2006/03/13) 日付表示、時刻単位(h)削除、2段組(USE_MULTI_CLM) 863 if( useMultiClm ) { // 5.6.1.2 (2013/02/22) useMultiClm 追加 864 bufH.append( BR ); 865 } 866 calStr = bufcal.toString(); // 5.5.4.0 (2012/07/02) 867 868 // 5.7.0.0 (2013/11/03) 最後の上段 869 if( last_title != null & day_length > 0 ){ 870 makeHeaderMD(bufDY , day_length*base , 0 , last_title); 871 day_length = 0; 872 } 873 874 if( useMdheader ){ // 5.7.0.0 (2013/11/03) 月日を上段に表示する 875 bufH = bufDY.append( BR ).append(bufH); 876 } 877 return bufBT.append( "<pre>" ).append( bufH ).append( buf1 ).append( "</pre>" ).toString() ; 878 } 879 880 /** 881 * 時間軸での日ヘッダーデータを作成します。 882 * 883 * ヘッダーは、時間表示の場合に上段にMM/ddを表示します。 884 * 885 * @og.rev 5.7.0.0 (2013/11/07) 新規追加 886 * 887 * @param bufH ヘッダーを追記していく StringBuilder 888 * @param fillCnt 日付欄の文字数カウント。通常は2*時間数か、4*時間数のどちらか。 889 * @param mtCnt 月数に基づいた色の設定用の数字。(将来的な拡張用) 890 * @param mdStr ヘッダーに表示する文字列。月日(MM/dd) 891 * 892 * @return ヘッダーが追記された StringBuilder 893 */ 894 private StringBuilder makeHeaderMD( final StringBuilder bufH , final int fillCnt , final int mtCnt , final String mdStr ) { 895 if( mtCnt % 2 == 0 ) { bufH.append( EVEN_CLASS ); } // 偶数色 896 else { bufH.append( ODD_CLASS ); } // 奇数色 897 898 // 表示すべき文字列が、表示すべき幅よりも小さい場合、スペースのみとする。 899 if( fillCnt < mdStr.length() ) { 900 bufH.append( StringUtil.stringXFill(" ",fillCnt) ); 901 } 902 // 大きい場合は、前後にスペースを入れて、センター配置 903 else { 904 bufH.append( StringUtil.stringXFill(mdStr,fillCnt) ); 905 } 906 907 bufH.append( END_SPAN ); 908 909 return bufH; 910 } 911 912 /** 913 * 上段・下段のフォーマットと、加算日に応じたヘッダー文字列を作成します。 914 * 915 * @param upper 上段の表示フォーマット 916 * @param lower 下段の表示フォーマット 917 * @param add 表示日付けの加算 918 * @param useMonth 月日表示でなく、月表示のみにする 919 * 920 * @og.rev 5.6.1.2 (2013/02/22) 新規作成 921 * @og.rev 5.6.2.3 (2013/03/22) 日付の終了日は、「含む」に変更 922 * 923 * @return ヘッダー文字列 924 */ 925 private String makeZoomStack( final String upper ,final String lower ,final int add, final boolean useMonth ) { 926 DateFormat format1 = new SimpleDateFormat( upper,Locale.JAPAN ); 927 DateFormat format2 = new SimpleDateFormat( lower,Locale.JAPAN ); 928 929 DateFormat formatCal = new SimpleDateFormat( "yyyyMMdd",Locale.JAPAN ); 930 931 // 5.5.8.3 (2012/11/17) スタック用にカレンダー枠の情報を保持(開始、休日判定、次枠開始) 932 ArrayList<String[]> calList = new ArrayList<String[]>(); // 個人的には Listを渡す方が好き 933 String[] calArray = new String[3]; // 開始、休日判定、次枠開始 934 935 Calendar str = HybsSystem.getCalendar( startDate ); 936 Calendar end = HybsSystem.getCalendar( endDate ); 937 938 // 週単位の場合の特殊処理。 939 // 年の第一週を完全な一週間分(7日間)として、設定します。 940 if( zoom == 41 ) { // ViewStackTableParam.STACK_ZOOM_WEEK 941 str.setMinimalDaysInFirstWeek( 7 ); 942 format1.setCalendar( str ); 943 format2.setCalendar( str ); 944 } 945 946 if( useMonth ){ 947 str.set(Calendar.DAY_OF_MONTH, 1); 948 startDate = new SimpleDateFormat( "yyyyMMdd",Locale.JAPAN ).format(str.getTime()); 949 } 950 951 StringBuilder buf1 = new StringBuilder( HybsSystem.BUFFER_SMALL ); 952 StringBuilder buf2 = new StringBuilder( HybsSystem.BUFFER_SMALL ); 953 StringBuilder bufcal = new StringBuilder( HybsSystem.BUFFER_SMALL ); 954 955 // カレンダDB検索機能 956 CalendarData calData = CalendarFactory.getCalendarData( calDB,arg1,arg2,arg3,arg4 ); 957 958 boolean modifyFlag = false; 959 // 5.6.2.3 (2013/03/22) 日付の終了日は、「含む」に変更 960 while( str.compareTo( end ) <= 0 ) { 961 Date dt = str.getTime(); 962 calArray[0] = formatCal.format( dt ); // 5.5.8.3 (2012/11/17) 963 964 // 本日は、青色で示します。 965 if( calData.isContainedToday( str,add ) ) { 966 buf1.append( BLUE_COLOR ); 967 buf2.append( BLUE_COLOR ); 968 bufcal.append( "0" ); 969 calArray[1] = "0"; // 5.5.8.3 (2012/11/17) 970 modifyFlag = true; 971 } 972 973 // 休日判断を、事業所カレンダを使用 974 // modifyFlag が立っていない場合 を条件に追加します。 975 if( !modifyFlag && add == 1 && calData.isHoliday( str ) && !useMonth) { 976 buf1.append( RED_COLOR ); 977 buf2.append( RED_COLOR ); 978 bufcal.append( "1" ); // 休日 979 calArray[1] = "1"; // 5.5.8.3 (2012/11/17) 980 modifyFlag = true; 981 } 982 983 buf1.append( format1.format( dt ) ); 984 buf2.append( format2.format( dt ) ); 985 986 if( modifyFlag ) { 987 buf1.append( END_SPAN ); 988 buf2.append( END_SPAN ); 989 modifyFlag = false; 990 } 991 else{ 992 bufcal.append( "0" ); 993 calArray[1] = "0"; // 5.5.8.3 (2012/11/17) 994 } 995 996 // カレンダーを進める 997 if( useMonth ){ 998 str.add(Calendar.MONTH, add); 999 } 1000 else{ 1001 str.add(Calendar.DATE, add); 1002 } 1003 1004 dt = str.getTime(); 1005 calArray[2] = formatCal.format( dt ); // 5.5.8.3 (2012/11/17) 1006 calList.add( calArray.clone() ); 1007 } 1008 1009 // スタックガント用の特別な処理。 1010 // 上位の ViewForm_HTMLStackedGanttTable クラスに対して、「開始、休日判定、次枠開始」リストを渡します。 1011 ViewFormTag viewform = (ViewFormTag)findAncestorWithClass( this,ViewFormTag.class ); 1012 viewform.setViewArrayList( calList ); 1013 1014 calStr = bufcal.toString(); 1015 1016 return "<pre>" + buf1.toString() + BR + buf2.toString() + "</pre>"; 1017 } 1018 1019 /** 1020 * ganttHeaderの属性情報をdisplay:noneで作成します。 1021 * ganttHeaderというタグで、id,class共にganttHeaderDataという名称で出力します。 1022 * 1023 * @og.rev 5.5.4.0 (2012/07/02) 新規作成 1024 * @og.rev 5.6.1.2 (2013/02/22) baseTimes 追加 1025 * 1026 * @return ヘッダー情報の文字列 1027 */ 1028 private String makeHeaderData() { 1029 1030 StringBuilder buf1 = new StringBuilder( HybsSystem.BUFFER_SMALL ); 1031 1032 buf1.append( "\n" ) 1033 .append( "<ganttHeader style='display:none' id='ganttHeaderData' class='ganttHeaderData' " ) 1034 .append( "startDate='" ).append( startDate ).append( "' " ) 1035 .append( "endDate='" ).append( endDate ).append( "' " ) 1036 .append( "zoom='" ).append( zoom ).append( "' " ) 1037 .append( "daySpan='" ).append( daySpan ).append( "' " ) 1038 .append( "calDB='" ).append( calStr ).append( "' " ) 1039 .append( "breakTimes='" ).append( breakTimes ).append( "' " ) 1040 .append( "baseTimes='" ).append( baseTimes ).append( "' " ) // 5.6.1.2 (2013/02/22) baseTimes 追加 1041 .append( "skipHoliday='" ).append( skipHoliday ).append( "' " ) 1042 .append( "useMultiClm='" ).append( useMultiClm ).append( "' " ) // 5.6.1.2 (2013/02/22) useMultiClm 追加 1043 .append( " />" ); 1044 1045 return buf1.toString(); 1046 } 1047 1048 /** 1049 * 【TAG】表示開始日付けを設定します(yyyyMMdd または、yyyyMMddHHmm 形式)。 1050 * 1051 * @og.tag 1052 * この値は、ヘッダーの先頭に表示する日付けを指定します。 1053 * 通常の日付ヘッダーの場合は、 yyyyMMdd 形式ですが、時間ヘッダーの場合は、 1054 * yyyyMMddHHmm 形式で指定します。 1055 * 1056 * @param val 表示開始日付(yyyyMMdd または、yyyyMMddHHmm 形式) 1057 */ 1058 public void setStartDate( final String val ) { 1059 startDate = nval( getRequestParameter( val ),startDate ); 1060 } 1061 1062 /** 1063 * 【TAG】表示最終日を設定します(yyyyMMdd または、yyyyMMddHHmm 形式)。 1064 * 1065 * @og.tag 1066 * 表示開始日から終了日までを、zoom 変数の値に応じてヘッダーラベルを 1067 * 作成します。 1068 * 通常の日付ヘッダーの場合は、 yyyyMMdd 形式ですが、時間ヘッダーの場合は、 1069 * yyyyMMddHHmm 形式で指定します。 1070 * 1071 * @param val 表示最終日(yyyyMMdd または、yyyyMMddHHmm 形式) 1072 */ 1073 public void setEndDate( final String val ) { 1074 endDate = nval( getRequestParameter( val ),endDate ); 1075 } 1076 1077 /** 1078 * 【TAG】1日の開始終了時間を24時間形式(HHmm-HHmm または HH-HH)で設定します(初期値:0700-2000)。 1079 * 1080 * @og.tag 1081 * この値は、1日の開始終了時間を指定します。 1082 * 開始時刻は、内部で1時間単位に変換されます。8時30分~は、8時~になります。 1083 * 終了時間は、その時間を「含みません」 1084 * 開始時刻より終了時刻が小さい場合は、翌日への日またぎとして計算します。 1085 * たとえば、夜勤等で、17:00-07:00 という指定が可能です。 1086 * 初期値は、朝の7:00から夜の20:00までです。(0700-2000)です。 1087 * 1088 * @og.rev 3.8.0.5 (2005/08/26) 本日は、青色で示します。 1089 * @og.rev 5.6.1.2 (2013/02/22) daySpan(時刻表示範囲)は、内部では1時間単位 1090 * 1091 * @param val 開始終了時間(HHmm-HHmm)形式 1092 */ 1093 public void setDaySpan( final String val ) { 1094 daySpan = nval( getRequestParameter( val ),daySpan ); 1095 1096 // 5.6.1.2 (2013/02/22) daySpan(時刻表示範囲)は、内部では1時間単位 1097 if( daySpan.length() == 5 && daySpan.charAt(2) == '-' ) { 1098 daySpan = daySpan.substring( 0,2 ) + "00-" + daySpan.substring( 3 ) + "00" ; // HH-HH ⇒ HH00-HH00 1099 } 1100 else if( daySpan.length() == 9 && daySpan.charAt(4) == '-' ) { 1101 daySpan = daySpan.substring( 0,2 ) + "00-" + daySpan.substring( 5 ) ; // HHmm-HHmm ⇒ HH00-HHmm 1102 } 1103 else { 1104 String errMsg = "1日の開始終了時間は24時間制で(HHmm-HHmm または HH-HH)形式で指定してください。" 1105 + " value=[" + val + "]" 1106 + " daySpan=[" + daySpan + "]" ; // 5.1.8.0 (2010/07/01) errMsg 修正 1107 throw new HybsSystemException( errMsg ); 1108 } 1109 } 1110 1111 /** 1112 * 【TAG】ズーム変数(0~9,10,11,12,20~31,40~42)を設定します(初期値:2)。 1113 * 1114 * @og.tag 1115 * CSSファイルでの定義と、背景画像との関係で、作成します。 1116 * ズーム変数は、CSSファイルや、JavaScript、PL/SQLと連動して、日付間隔 1117 * あたりのピクセルを計算して、ヘッダーを作成しています。 1118 * また、現在の標準的なクライアントでの換算になる為、高解像度のディスプレイや 1119 * 特殊設定された環境では、表示間隔にずれが発生する可能性があります。 1120 * 1121 * ZOOM ラベル 日数ピクセル変換率 ヘッダ上 ヘッダ下 1文字(CSS) 1122 * ======================================================================================== 1123 * 0 : 1週間 日数 * 8 * 6 48 48px = 1日 [02/ ] [23(EE)] 8px 1124 * 1 : 2週間 日数 * 8 * 3 24 24px = 1日 [02/] [23 ] 8px 1125 * 2 : 1ヶ月 日数 * 12* 1 12 12px = 1日 [2] [3] 12px 1126 * 3 : 2ヶ月 日数 * 8 * 7 / 7 8 56px = 7日 [2004/ ] [02/03 ] 8px 1127 * 4 : 3ヶ月 日数 * 8 * 7 / 14 4 56px = 14日 [2004/ ] [02/03 ] 8px 1128 * 5 : 4ヶ月 日数 * 9 * 10 / 30 3 90px = 30日 [2004/ ] [02/03 ] 9px 1129 * 6 : 6ヶ月 日数 * 10 / 6 / 30 2 60px = 30日 [2004/ ] [02/03 ] 10px 1130 * 7 : 1年 日数 * 9 / 10 / 90 1 90px = 90日 [2004/ ] [02/03 ] 9px 1131 * 8 : 2年 日数 * 9 / 10 /180 0.5 90px =180日 [2004/ ] [02/03 ] 9px 1132 * 9 : 3年 日数 * 10 / 6 /180 0.33 60px =180日 [2004/ ] [02/03 ] 10px 1133 * 10 : 週単位 日数 * 8 / 3 / 7 3.43 24px = 7日 [19W] [12 ] 8px 1134 * 11 : 予約済み(他物10件使用済み) 1135 * 12 : 予約済み(他物 8件使用済み) 1136 * 13 : 日(週) 日数 * 8 * 2 16 16px = 1日 [23] [EE] 8px 1137 * ======================================================================================== 1138 * 20 : 1時間 時間 * 12 * 4 48 48px = 1時間 [02EE] [07h ] 12px 1139 * 21 : 1時間2 時間 * 12 * 2 24 24px = 1時間 [02] [07] 12px 1140 * 22 : 2時間 時間 * 12 * 4 / 2 24 48px = 2時間 [02EE] [07h ] 12px 1141 * 23 : 2時間2 時間 * 12 * 2 / 2 12 24px = 2時間 [02] [07] 12px 1142 * 24 : 4時間 時間 * 12 * 4 / 4 12 48px = 4時間 [02EE] [07h ] 12px 1143 * 25 : 4時間2 時間 * 12 * 2 / 4 6 24px = 4時間 [02] [07] 12px 1144 * 26 : 6時間 時間 * 12 * 4 / 6 8 48px = 6時間 [02EE] [07h ] 12px 1145 * 27 : 6時間2 時間 * 12 * 2 / 6 4 24px = 6時間 [02] [07] 12px 1146 * 28 : 8時間 時間 * 12 * 4 / 8 6 48px = 8時間 [02EE] [07h ] 12px 1147 * 29 : 8時間2 時間 * 12 * 2 / 8 3 24px = 8時間 [02] [07] 12px 1148 * 30 : 12時間 時間 * 12 * 4 / 12 4 48px =12時間 [02EE] [07h ] 12px 1149 * 31 : 12時間2 時間 * 12 * 2 / 12 2 24px =12時間 [02] [07] 12px 1150 * ======================================================================================== 1151 * 40 : 積上(日) 48 48px = 1日 [02/ ] [23(EE)] 8px 1152 * 41 : 積上(週) 3.43 48px = 7日 [19W] [12 ] 8px 1153 * 42 : 積上(月) 月数 * 1 1 90px = 30日 [2004/ ] [02/03 ] 9px 1154 * 43 : 日単位ヘッダー予約済み 1155 * ~ 1156 * 49 : 日単位ヘッダー予約済み 1157 * 1158 * @og.rev 5.7.6.2 (2014/05/16) stackHeaderタグの互換機能として、DAY⇒40,WEEK⇒41,MONTH⇒42 対応する。 1159 * 1160 * @param val ズーム変数(0~9,10,11,12,20~31,40~42) 1161 */ 1162 public void setZoom( final String val ) { 1163 String zm = nval( getRequestParameter( val ),null ); 1164 1165 // 6.0.0.1 (2014/04/25) zoom の、DAY⇒40,WEEK⇒41,MONTH⇒42 対応 1166 if( ViewStackTableParam.STACK_ZOOM_DAY.equalsIgnoreCase( zm ) ) { 1167 zoom = 40; 1168 } else if( ViewStackTableParam.STACK_ZOOM_WEEK.equalsIgnoreCase( zm ) ) { 1169 zoom = 41; 1170 } else if( ViewStackTableParam.STACK_ZOOM_MONTH.equalsIgnoreCase( zm ) ) { 1171 zoom = 42; 1172 } 1173 else { 1174 zoom = nval( zm,zoom ); 1175 } 1176 1177 if( zoom < 0 || (13 < zoom && zoom < 20) || (31 < zoom && zoom < 40) || 42 < zoom ) { 1178 String errMsg = "ズーム変数は、(0~9,10,11,12,20~31,40~42)の範囲で指定してください。" 1179 + " zoom=[" + val + "]" ; 1180 throw new HybsSystemException( errMsg ); 1181 } 1182 } 1183 1184 /** 1185 * 【TAG】DB検索するDBを指定します。 1186 * 1187 * @og.tag 1188 * カレンダデータは、システムパラメータ の CalendarQuery_**** で 1189 * 指定する、CalendarQuery クラスの QUERY 文で、実際に取得します。 1190 * 上記の **** 部分に、ここで指定するキーワードを設定して置きます。 1191 * 通常は、データベースID (GE13, ZY01 など)を指定します。 1192 * このキーワードに対する実装クラスを、先のシステムパラメータ の 1193 * キーワード以下に記述しておきます。 1194 * {@og.doc03Link calDB CalendarQuery_****} 1195 * 1196 * @og.rev 3.6.0.0 (2004/09/17) DB検索するDBのキー 1197 * 1198 * @param db DB検索するDBを指定 1199 */ 1200 public void setCalDB( final String db ) { 1201 calDB = nval( getRequestParameter( db ),calDB ); 1202 } 1203 1204 /** 1205 * 【TAG】時間軸での休憩時間の開始-終了時刻をカンマ区切りで複数指定します。 1206 * 1207 * @og.tag 1208 * 休憩時間は、HHmm-HHmm形式、または、yyyyMMddHHmm-HHmm、または、 1209 * yyyyMMddHHmm-yyyyMMddHHmm形式で複数指定できます。 1210 * これは、開始-終了というハイフン形式でつなげます。 1211 * このセットを、カンマで複数指定できます。 1212 * 例えば、200508201200-1245,200508201300-1315 という感じです。 1213 * - の前後が、4桁の場合は、HHmm-HHmm 形式として、日付に関係なく、常にこの時分 1214 * で休憩が入るという認識をします。つまり、開始は、12桁か、4桁の日付形式、 1215 * 終了も、12桁か、4桁の日付形式になります。 1216 * 1217 * @og.rev 3.8.0.5 (2005/08/26) 新規追加 1218 * @og.rev 3.8.0.7 (2005/09/20) 日付またがり追加追加 1219 * 1220 * @param times 休憩時間の開始-終了時刻(CSV区切り) 1221 */ 1222 public void setBreakTimes( final String times ) { 1223 breakTimes = nval( getRequestParameter( times ),null ); 1224 } 1225 1226 /** 1227 * 【TAG】時間軸での休憩時間の表示スタイルを設定します。 1228 * 1229 * @og.tag 1230 * 通常は、ヘッダーのトップからの位置と、色です。 1231 * それ以外にも、スタイルシート属性(キー:値;) というセットを指定できます。 1232 * class="breakTime" を出力していますので、そちらを使用したい場合は、breakTimeStyleを無効化してください。 1233 * そうしないと、こちらは、直接 style属性で設定しているので、強いです。 1234 * 初期値は、top:20px;background-color:yellow;filter:alpha(opacity=60);opacity:0.60; です。 1235 * IE8以下のために、filter:alpha(opacity=60); しています。 1236 * 設定の後ろに、; を付ける様にしてください。 1237 * 1238 * @og.rev 3.8.0.5 (2005/08/26) 新規追加 1239 * 1240 * @param style 休憩時間の表示スタイル 1241 */ 1242 public void setBreakTimeStyle( final String style ) { 1243 breakTimeStyle = nval( getRequestParameter( style ),breakTimeStyle ); 1244 } 1245 1246 /** 1247 * 【TAG】時間軸でのベース時刻の開始時刻をカンマ区切りで複数指定します。 1248 * 1249 * @og.tag 1250 * ベース時刻は、HHmm形式、または、yyyyMMddHHmm形式で複数指定できます。 1251 * このセットを、カンマで複数指定できます。 1252 * 例えば、1700,200508201300 という感じです。 1253 * 1254 * @og.rev 5.6.1.2 (2013/02/22) 新規追加 1255 * 1256 * @param times ベース時刻の開始時刻(CSV区切り) 1257 */ 1258 public void setBaseTimes( final String times ) { 1259 baseTimes = nval( getRequestParameter( times ),null ); 1260 } 1261 1262 /** 1263 * 【TAG】時間軸でのベース時刻の表示スタイルを設定します。 1264 * 1265 * @og.tag 1266 * 通常は、ベース時刻の幅と、ヘッダーのトップからの位置と、色です。 1267 * それ以外にも、スタイルシート属性(キー:値;) というセットを指定できます。 1268 * 初期値は、top:20px;background-color:transparent;border-left:2px dashed red; です。 1269 * 設定の後ろに、; を付ける様にしてください。 1270 * 1271 * @og.rev 5.6.1.2 (2013/02/22) 新規追加 1272 * 1273 * @param style ベース時刻の表示スタイル 1274 */ 1275 public void setBaseTimeStyle( final String style ) { 1276 baseTimeStyle = nval( getRequestParameter( style ),baseTimeStyle ); 1277 } 1278 1279 /** 1280 * 【TAG】DB検索する場合の第1のキーを指定します。 1281 * 1282 * @og.tag 1283 * 例えば、GE13, ZY01 では、事業所コード(CDJGS)を設定します。 1284 * この値は、システムパラメータ の CalendarQuery_**** で 1285 * 指定する、CalendarQuery クラスの QUERY 文に依存します。 1286 * データベース定義の統一を望むところです。 1287 * 1288 * @og.rev 3.6.0.0 (2004/09/17) DB検索の第1キー(事業所コードなど)を追加 1289 * 1290 * @param arg DB検索の第1キー(事業所コードなど) 1291 */ 1292 public void setArg1( final String arg ) { 1293 arg1 = nval( getRequestParameter( arg ),arg1 ); 1294 } 1295 1296 /** 1297 * 【TAG】DB検索する場合の第2のキーを指定します。 1298 * 1299 * @og.tag 1300 * 例えば、TP652 では、事業部コード(CDJGS) と 物件工程コード(CDKTEI)の2つの 1301 * キーで、カレンダを取得します。(+年月で、行を決定) 1302 * 引数が、2つまで対応しています 1303 * この値は、システムパラメータ の CalendarQuery_**** で 1304 * 指定する、CalendarQuery クラスの QUERY 文に依存します。 1305 * データベース定義の統一を望むところです。 1306 * 1307 * @og.rev 3.6.0.0 (2004/09/17) DB検索の第2キー(WCコードなど)を追加 1308 * 1309 * @param arg DB検索の第2キー(WCコードなど) 1310 */ 1311 public void setArg2( final String arg ) { 1312 arg2 = nval( getRequestParameter( arg ),arg2 ); 1313 } 1314 1315 /** 1316 * 【TAG】DB検索する場合の第3のキーを指定します。 1317 * 1318 * @og.tag 1319 * この値は、システムパラメータ の CalendarQuery_**** で 1320 * 指定する、CalendarQuery クラスの QUERY 文に依存します。 1321 * データベース定義の統一を望むところです。 1322 * 1323 * @og.rev 3.6.0.0 (2004/09/17) DB検索の第3キーを追加 1324 * 1325 * @param arg DB検索の第3キー 1326 */ 1327 public void setArg3( final String arg ) { 1328 arg3 = nval( getRequestParameter( arg ),arg3 ); 1329 } 1330 1331 /** 1332 * 【TAG】DB検索する場合の第4のキーを指定します。 1333 * 1334 * @og.tag 1335 * この値は、システムパラメータ の CalendarQuery_**** で 1336 * 指定する、CalendarQuery クラスの QUERY 文に依存します。 1337 * データベース定義の統一を望むところです。 1338 * 1339 * @og.rev 3.6.0.0 (2004/09/17) DB検索の第4キーを追加 1340 * 1341 * @param arg DB検索の第4キー 1342 */ 1343 public void setArg4( final String arg ) { 1344 arg4 = nval( getRequestParameter( arg ),arg4 ); 1345 } 1346 1347 /** 1348 * 【TAG】時間ガントで休日を表示する/しないを設定します 1349 * (初期値:USE_GANTTHEADER_SKIP_HOLIDAY[={@og.value org.opengion.hayabusa.common.SystemData#USE_GANTTHEADER_SKIP_HOLIDAY}])。 1350 * 1351 * @og.tag 1352 * この値をfalseにすると、時間ガントでも休日が赤色で表示 1353 * されるようになります。trueにした場合は、休日は表示されません。 1354 * (初期値:システム定数のUSE_GANTTHEADER_SKIP_HOLIDAY[={@og.value org.opengion.hayabusa.common.SystemData#USE_GANTTHEADER_SKIP_HOLIDAY}])。 1355 * 1356 * @og.rev 4.0.0.0 (2007/09/07) 新規作成 1357 * 1358 * @param skipHol 休日をスキップするかどうか。 1359 * @see org.opengion.hayabusa.common.SystemData#USE_GANTTHEADER_SKIP_HOLIDAY 1360 */ 1361 public void setSkipHoliday( final String skipHol) { 1362 skipHoliday = nval( getRequestParameter( skipHol ),skipHoliday ); 1363 } 1364 1365 /** 1366 * 【TAG】時間ガントで2段組を使用する/しないを設定します 1367 * (初期値:USE_GANTTHEADER_MULTIPLE_COLUMN[={@og.value org.opengion.hayabusa.common.SystemData#USE_GANTTHEADER_MULTIPLE_COLUMN}])。 1368 * 1369 * @og.tag 1370 * ガントヘッダーにおいて、時間ヘッダーの上段に日付を、下段の時間軸の(h)の削除を行います。 1371 * 日付は、表示開始時刻の上と、それの6時間ごとに表示します。 1372 * (初期値:システム定数のUSE_GANTTHEADER_MULTIPLE_COLUMN[={@og.value org.opengion.hayabusa.common.SystemData#USE_GANTTHEADER_MULTIPLE_COLUMN}])。 1373 * 1374 * @og.rev 5.6.1.2 (2013/02/22) 新規作成 1375 * 1376 * @param multiClm 時間ガントで2段組を使用するかどうか(true:する/false:しない)。 1377 * @see org.opengion.hayabusa.common.SystemData#USE_GANTTHEADER_MULTIPLE_COLUMN 1378 */ 1379 public void setUseMultiClm( final String multiClm ) { 1380 useMultiClm = nval( getRequestParameter( multiClm ),useMultiClm ); 1381 } 1382 1383 /** 1384 * 日付、時刻の文字列を時間整数に変換します。 1385 * 1386 * 時間を扱う場合は、厄介なのは、時間と分の単位の違いです。 1387 * 分に換算してしまうと、時間の取得に60進数で扱う必要が出てきます。 1388 * そこで、単純に時間に換算するのではなく、1時間を100として、 1389 * 分を0から99までの整数に換算して計算しています。 1390 * これにより時間の足し算や引き算が可能になり、かつ、時間を求めるのに 1391 * 100で割るだけで求めることが可能になります。 1392 * 1393 * ここでは、引数に、HHmm 、 HHmmss 、yyyyMMddHHmm 、yyyyMMddHHmmss 、null が扱えます。 1394 * null の場合は、-1 を返します。 1395 * yyyyMMdd 部分は、無視されます。 1396 * 1397 * @og.rev 5.6.1.2 (2013/02/22) 日付、秒、null 対応 1398 * 1399 * @param hhmm 時分の文字列 1400 * 1401 * @return 1時間を100として、分を0から99までの整数に換算した値 1402 */ 1403 private static int hm2int( final String hhmm ) { 1404 int rtn = -1; 1405 1406 if( hhmm != null ) { 1407 int len = hhmm.length(); 1408 String hh = null; 1409 String mm = null; 1410 if( len == 4 || len == 6 ) { // HHmm 、HHmmss 1411 hh = hhmm.substring( 0,2 ); 1412 mm = hhmm.substring( 2,4 ); 1413 } 1414 else if( len == 12 || len == 14 ) { // yyyyMMddHHmm 、yyyyMMddHHmmss 1415 hh = hhmm.substring( 8,10 ); 1416 mm = hhmm.substring( 10,12 ); 1417 } 1418 else { 1419 String errMsg = "指定できる時間形式は、HHmm 、HHmmss 、yyyyMMddHHmm 、yyyyMMddHHmmss です。" 1420 + HybsSystem.CR 1421 + "hm2int=[" + hhmm + "]" ; 1422 throw new HybsSystemException( errMsg ); 1423 } 1424 rtn = (int)(Integer.parseInt( hh ) * 100 + Integer.parseInt( mm )*10.0/6.0 ) ; 1425 } 1426 1427 return rtn; 1428 } 1429 1430 /** 1431 * 休憩時間のデータを管理する内部クラスです。 1432 * 1433 * @og.rev 3.8.0.7 (2005/09/20) 内部クラス新規作成 1434 * @og.group 画面部品 1435 * 1436 * @version 4.0 1437 * @author Kazuhiko Hasegawa 1438 * @since JDK5.0, 1439 */ 1440 private static class BreakTimeData { 1441 private final String startDay ; // 開始日付。null の場合は、毎日 1442 private final int startTime ; // 開始時刻のhm2int変換済み値 1443 private final int timeSpan ; // 開始時刻と終了時刻の時間差(hm2int変換済み) 1444 private final String viewTime ; // ツールチップ表示用の文字列(HHmm-HHmm) 1445 1446 /** 1447 * コンストラクター 1448 * 1449 * 開始日付(startDay)、開始時刻(startTime)、時間差(timeSpan)、表示ラベル(viewTime) 1450 * を指定して、休憩時間のデータオブジェクトを構築します。 1451 * 開始日付(startDay)は、null の場合は、毎日、つまり、定常的な休憩時刻として 1452 * 認識します。日付が指定された場合は、その日のみの特別な休憩時間と認識します。 1453 * 開始時刻は、hm2int変換済み値で、1時間が100となり、分は、10進数に変換されている 1454 * 値として認識します。7:30 の場合は、750 という値になります。 1455 * 開始時刻と終了時刻の時間差(timeSpan)も hm2int変換済み値です。 1456 * 表示用の文字列(viewTime)は、休憩時間の HTML表記時の title 属性として 1457 * 設定される為、マウスオーバー時のツールチップに現れます。 1458 * 1459 * @param startDay yyyyMMdd 形式の開始日付。null の場合は、毎日 1460 * @param startTime 開始時刻のhm2int変換済み値 1461 * @param timeSpan 開始時刻と終了時刻の時間差(hm2int変換済み) 1462 * @param viewTime ツールチップ表示用の文字列(HHmm-HHmm) 1463 * @return 含まれる(対象)場合は、true そうでない場合は、false 1464 */ 1465 BreakTimeData( final String startDay,final int startTime,final int timeSpan,final String viewTime ) { 1466 this.startDay = startDay; 1467 this.startTime = startTime; 1468 this.timeSpan = timeSpan; 1469 this.viewTime = viewTime; 1470 } 1471 1472 /** 1473 * 指定の日付と時刻が、この BreakTimeData の開始日時とマッチするかどうかをチェックします。 1474 * 1475 * 開始日時とマッチするとは、内部日付がマッチし、開始時刻が、指定の time の 1476 * 1時間(+100)*stepの範囲に含まれている場合を指します。(true を返します。) 1477 * 内部の日付(startDay)が null の場合は、毎日が対象となります。 1478 * 開始時刻がマッチした場合は、timeSpan 分だけの幅を持った休憩時間を認識します。 1479 * 境界条件の都合で、timeSpan == 0 の状態も存在しますが、これはマッチしないと判断します。 1480 * 1481 * @og.rev 3.8.1.1 (2005/11/21) timeSpan が 0 より大きい場合 条件追加 1482 * @og.rev 3.8.9.2 (2007/07/28) 時間間隔パラメータ追加 1483 * 1484 * @param inDay yyyyMMdd 形式の日付。 1485 * @param time 休憩時間の開始時刻のhm2int変換済み値 1486 * @param step 時間間隔 1487 * @return 含まれる(対象)場合は、true そうでない場合は、false 1488 */ 1489 boolean startsWith( final String inDay,final int time,final int step ) { 1490 return timeSpan > 0 1491 && time <= startTime 1492 && startTime < time+100*step 1493 && ( startDay == null || inDay.equals( startDay ) ) ; 1494 } 1495 1496 /** 1497 * 休憩時間を表す SPANタグを作成します。 1498 * 1499 * 1時間=hourOfPixcel(px) で換算します。分は、すでに分数計算(hm2int)済み 1500 * 1501 * @og.rev 3.8.8.4 (2007/02/17) class="breaktime" 追加 1502 * @og.rev 5.6.1.2 (2013/02/22) ベース時刻対応。width が 0 の場合は、2 をセット 1503 * 1504 * @param offset 表示開始ピクセル数(実質表示日数 * 1日分のピクセル - オフセット) 1505 * @param hourOfPixcel 1時間あたりのピクセル数 1506 * @param breakTimeStyle 休憩時間の指定に追加するスタイル属性 1507 * @return 休憩時間を表す SPANタグ 1508 */ 1509 String getBreakTime( final int offset,final int hourOfPixcel,final String breakTimeStyle ) { 1510 int left = offset + (startTime*hourOfPixcel/100) ; 1511 int width = timeSpan*hourOfPixcel/100 ; 1512 if( width == 0 ) { width = 2; } // 5.6.1.2 (2013/02/22) ベース時刻対応。width が 0 の場合は、2 をセット 1513 1514 return "<span class=\"breaktime\" title=\"" + viewTime + "\"" 1515 + " style=\"position:absolute;z-index:100;height:500000px;" 1516 + "left:" + left + "px;" 1517 + "width:" + width + "px;" 1518 + breakTimeStyle + "\" ></span>" 1519 + HybsSystem.CR ; 1520 } 1521 } 1522 1523 /** 1524 * 休憩時間を管理する内部クラスです。 1525 * 1526 * 内部的に、休憩時間以外に、ベース時刻も処理できるようにします。 1527 * これは、終了時刻を指定されていない場合でも対応できるようにすることを意味します。 1528 * また、時間指定方法を、時分だけでなく、時分秒指定時でも処理できるようにします。(秒は無視) 1529 * 1530 * @og.rev 3.8.0.7 (2005/09/20) 内部クラスBreakTimeDataを使用するように修正 1531 * @og.rev 3.8.1.6 (2006/04/25) 変数の final 化 1532 * @og.rev 5.6.1.2 (2013/02/22) breakTimesの処理方法の見直し 1533 * 1534 * @og.group 画面部品 1535 * 1536 * @version 4.0 1537 * @author Kazuhiko Hasegawa 1538 * @since JDK5.0, 1539 */ 1540 private static class BreakTimes { 1541 private final List<BreakTimeData> timeList = new ArrayList<BreakTimeData>(); 1542 private final int hourOfPixcel ; // 1時間あたりのピクセル数(例:TIME_PIXEL) 1543 private final String breakTimeStyle ; // 休憩時間の指定に追加するスタイル属性 1544 private final int viewStartTime ; // 数値化(hm2int)された表示開始時刻(例:0700) 1545 private final int viewEndTime ; // 数値化(hm2int)された表示終了時刻(例:2000) 1546 1547 /** 1548 * コンストラクター 1549 * 必要な情報を設定して、オブジェクトを構築します。 1550 * 表示終了時刻は、表示開始時刻 >= 表示終了時刻 の場合、2400加算されている。 1551 * 1552 * @og.rev 3.8.0.7 (2005/09/20) breakTimesの日付またがり追加 1553 * @og.rev 3.8.1.1 (2005/11/21) timeSpan の計算方法を見直し 1554 * @og.rev 5.6.1.2 (2013/02/22) breakTimesの処理方法の見直し 1555 * 1556 * @param hOfpx 1時間あたりのピクセル数 1557 * @param breakTimes 休憩時間を、HHmm-HHmm形式、または、yyyyMMddHHmm-HHmm、または、yyyyMMddHHmm-yyyyMMddHHmm形式で指定します。 1558 * @param style 休憩時間の指定に追加するスタイル属性 1559 * @param vStartTime 数値化(hm2int)された表示開始時刻 1560 * @param vEndTime 数値化(hm2int)された表示終了時刻 1561 */ 1562 BreakTimes( final int hOfpx,final String breakTimes,final String style, 1563 final int vStartTime,final int vEndTime ) { 1564 hourOfPixcel = hOfpx; 1565 breakTimeStyle = ( style == null ) ? "" : style ; 1566 viewStartTime = vStartTime; 1567 viewEndTime = vEndTime; 1568 boolean time24 = ( viewEndTime > 2400 ); // 3.8.1.1 (2005/11/21) 開始終了が逆転している場合 true 1569 1570 // 3.8.1.1 (2005/11/21) timeSpan の計算方法を見直し 1571 DateFormat format = new SimpleDateFormat( "yyyyMMdd",Locale.JAPAN ); 1572 String[] startEnds = StringUtil.csv2Array( breakTimes ); 1573 int len = startEnds.length; 1574 1575 String startDay ; // null の場合は、毎日 1576 String endDay ; // 一時変数 1577 int startTime ; // 開始時刻のhm2int変換済み値 1578 int endTime ; // 終了時刻のhm2int変換済み値 1579 int timeSpan ; // 開始時刻と終了時刻の時間差(hm2int変換済み値) 1580 String viewTime ; // ツールチップ表示用の文字列(HH:mm-HH:mm) 1581 1582 Calendar str ; 1583 Calendar end ; 1584 1585 for( int i=0; i<len; i++ ) { 1586 String startEnd = startEnds[i]; 1587 if( startEnd != null ) { 1588 // startEnd = "0700ss-2000ss"; // 開始-終了時刻(HHmm-HHmm) 1589 // startEnd = "200508200700ss-2000ss"; // 開始-終了時刻(yyyyMMddHHmm-HHmm) 1590 // startEnd = "200508200700ss-200508212000ss"; // 開始-終了時刻(yyyyMMddHHmm-yyyyMMddHHmm) 1591 1592 // 5.6.1.2 (2013/02/22) breakTimesの処理方法の見直し 1593 int idx = startEnd.indexOf( '-' ); // ハイフンを見つける。 1594 if( idx > 0 ) { 1595 String st = startEnd.substring( 0,idx ); 1596 String ed = startEnd.substring( idx+1 ); 1597 1598 startDay = (st.length() >= 8) ? st.substring( 0,8 ) : null ; // 8ケタ以上で、yyyyMMdd 取得 1599 endDay = (ed.length() >= 8) ? ed.substring( 0,8 ) : null ; // 8ケタ以上で、yyyyMMdd 取得 1600 startTime = hm2int( st ); 1601 endTime = hm2int( ed ); 1602 } 1603 // startEnd = "0700ss"; // 開始時刻(HHmm) 1604 // startEnd = "200508200700ss"; // 開始時刻(yyyyMMddHHmm) 1605 // startEnd = "200508200700ss"; // 開始時刻(yyyyMMddHHmm) 1606 else { 1607 String st = startEnd; 1608 startDay = (st.length() >= 8) ? st.substring( 0,8 ) : null ; // 8ケタ以上で、yyyyMMdd 取得 1609 endDay = null ; 1610 startTime = hm2int( st ); 1611 endTime = startTime + 1; // 差分を出すため、startTime に 1 だけ加算 1612 } 1613 1614 str = null; 1615 end = null; 1616 if( startDay != null ) { str = HybsSystem.getCalendar( startDay ); } 1617 if( endDay != null ) { end = HybsSystem.getCalendar( endDay ); } 1618 1619 // 表示終了時刻 が 2400 より大きい場合、表示開始時刻 >= 表示終了時刻 である。 1620 if( time24 ) { 1621 // 開始時刻 < 表示終了時刻 => 開始時刻に2400加算する。 1622 if( startTime < viewEndTime-2400 ) { 1623 if( str != null ) { 1624 str.add(Calendar.DATE, -1 ); // -1 日しておく 1625 startDay = format.format( str.getTime() ); 1626 } 1627 startTime += 2400; 1628 } 1629 1630 // 終了時刻 <= 表示終了時刻 => 終了時刻に2400加算する。 1631 if( endTime <= viewEndTime-2400 ) { 1632 if( end != null ) { 1633 end.add(Calendar.DATE, -1 ); // -1 日しておく 1634 endDay = format.format( end.getTime() ); 1635 } 1636 endTime += 2400; 1637 } 1638 } 1639 1640 // 3.8.1.1 (2005/11/21) 判定条件修正 1641 // 開始時刻 < 表示開始時刻 => 開始時刻に表示開始時刻をセット。 1642 if( startTime < viewStartTime ) { startTime = viewStartTime; } 1643 1644 // 開始時刻 > 表示終了時刻 => 開始時刻に表示終了時刻をセット。 1645 if( startTime > viewEndTime ) { startTime = viewEndTime; } 1646 1647 // 終了時刻 < 表示開始時刻 => 終了時刻に表示開始時刻をセット。 1648 if( endTime < viewStartTime ) { endTime = viewStartTime; } 1649 1650 // 終了時刻 > 表示終了時刻 => 終了時刻に表示終了時刻をセット。 1651 if( endTime > viewEndTime ) { endTime = viewEndTime; } 1652 timeSpan = endTime - startTime ; 1653 viewTime = startEnd ; 1654 } 1655 // null の場合は、カンマが連続したり、最後に余分に付いたケースなので、無視する。 1656 else { 1657 continue; 1658 } 1659 1660 // 終了日が入っていないか、開始日と終了日が同じ日の場合。 1661 if( timeSpan >= 0 && ( 1662 endDay == null || ( startDay != null && startDay.equals( endDay ) ) ) ) { 1663 timeSpan = endTime - startTime ; 1664 timeList.add( new BreakTimeData( startDay,startTime,timeSpan,viewTime ) ); 1665 } 1666 else { 1667 // 終了日が入っていると複数日に分かれているので、分解する必要がある。 1668 1669 // 初日の timeSpan は、startTime から viewEndTime まで 1670 timeSpan = viewEndTime - startTime ; 1671 timeList.add( new BreakTimeData( startDay,startTime,timeSpan,viewTime ) ); 1672 1673 // 最終日の timeSpan は、viewStartTime から endTime まで 1674 timeSpan = endTime - viewStartTime ; 1675 timeList.add( new BreakTimeData( endDay,viewStartTime,timeSpan,viewTime ) ); 1676 1677 // 中日の timeSpan は、viewStartTime から viewEndTime まで 1678 timeSpan = viewEndTime - viewStartTime ; 1679 if( str != null && end != null ) { 1680 str.add(Calendar.DATE, 1 ); // +1 日しておく 1681 while( str.before( end ) ) { // 終了時間は、「含まない」仕様 1682 Date dt = str.getTime(); 1683 String tempStartDay = format.format( dt ); 1684 timeList.add( new BreakTimeData( tempStartDay,viewStartTime,timeSpan,viewTime ) ); 1685 str.add(Calendar.DATE, 1); 1686 } 1687 } 1688 } 1689 } 1690 } 1691 1692 /** 1693 * その日のその時間の休憩時間を表す SPANタグ群(複数ありうる)を作成します。 1694 * 1695 * @og.rev 3.8.9.2 (2007/07/28) 時間間隔パラメータ追加 1696 * 1697 * @param offset 表示開始ピクセル数(実質表示日数 * 1日分のピクセル - オフセット) 1698 * @param day Calendar 処理すべき日付のカレンダ 1699 * @param time 処理すべき時間 1700 * @param step 時間間隔 1701 * @return その日のその時間の休憩時間を表す SPANタグ群(複数ありうる) 1702 */ 1703 String makeSpan( final int offset,final Calendar day,final int time,final int step ) { 1704 DateFormat format1 = new SimpleDateFormat( "yyyyMMdd",Locale.JAPAN ); 1705 String inDay = format1.format( day.getTime() ); 1706 1707 StringBuilder buf = new StringBuilder(); 1708 int size = timeList.size(); 1709 for( int i=0; i<size; i++ ) { 1710 BreakTimeData timeData = timeList.get(i); 1711 if( timeData.startsWith( inDay,time,step ) ) { 1712 buf.append( timeData.getBreakTime( offset,hourOfPixcel,breakTimeStyle ) ); 1713 } 1714 } 1715 1716 String rtn = null; 1717 1718 if( buf.length() > 0 ) { rtn = buf.toString(); } 1719 return rtn; 1720 } 1721 } 1722 1723 /** 1724 * このオブジェクトの文字列表現を返します。 1725 * 基本的にデバッグ目的に使用します。 1726 * 1727 * @return このクラスの文字列表現 1728 */ 1729 @Override 1730 public String toString() { 1731 return org.opengion.fukurou.util.ToString.title( this.getClass().getName() ) 1732 .println( "VERSION" ,VERSION ) 1733 .println( "startDate" ,startDate ) 1734 .println( "endDate" ,endDate ) 1735 .println( "daySpan" ,daySpan ) 1736 .println( "zoom" ,zoom ) 1737 .println( "breakTimes" ,breakTimes ) 1738 .println( "breakTimeStyle" ,breakTimeStyle ) 1739 .println( "baseTimes" ,baseTimes ) // 5.6.1.2 (2013/02/22) ベース時刻 1740 .println( "baseTimeStyle" ,baseTimeStyle ) // 5.6.1.2 (2013/02/22) ベース時刻スタイル 1741 .println( "calDB" ,calDB ) 1742 .println( "arg1" ,arg1 ) 1743 .println( "arg2" ,arg2 ) 1744 .println( "arg3" ,arg3 ) 1745 .println( "arg4" ,arg4 ) 1746 .println( "skipHoliday" ,skipHoliday ) 1747 .println( "TIME_PIXEL" ,TIME_PIXEL ) 1748 .println( "Other..." ,getAttributes().getAttribute() ) 1749 .fixForm().toString() ; 1750 } 1751}