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