001 /*
002 * Copyright (c) 2009 The openGion Project.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
013 * either express or implied. See the License for the specific language
014 * governing permissions and limitations under the License.
015 */
016 package org.opengion.hayabusa.taglib;
017
018 import org.opengion.hayabusa.common.HybsSystem;
019 import org.opengion.hayabusa.common.HybsSystemException;
020 import org.opengion.hayabusa.html.ViewStackTableParam;
021 import org.opengion.hayabusa.resource.CalendarData;
022 import org.opengion.hayabusa.resource.CalendarFactory;
023 import static org.opengion.fukurou.util.StringUtil.nval ;
024
025 import java.util.ArrayList;
026 import java.util.Calendar;
027 import java.util.Date;
028 import java.util.Locale ;
029 import java.text.DateFormat;
030 import java.text.SimpleDateFormat;
031
032 /**
033 * 【?】スタ?ガントチャート用のヘッ????(日付け?を?力するタグです?
034 *
035 * スライドバー式ガントチャート?表示時に、スライドバーの長さと日付とを関連付けるため?
036 * ヘッ????(日付け?を?力します?スライドバーと日付間隔?、zoom 属?によって?
037 * CSSファイルのフォントサイズと、JavaScript の?配?に依存して?す?
038 * また?こ?ヘッ??では、日付?休日??を?カレン?ーブルを参照することで取得して?す?
039 * calDB 属?への??、CalendarFactory で生?されるテーブル?CalendarDataの実?ラス)
040 * を指定します?
041 *
042 * @og.formSample
043 * ●形式?lt;og:ganttHeader startDate="…" endDate="…" zoom="[…]" />
044 * ●body?な?
045 *
046 * ●Tag定義??
047 * <og:stackHeader
048 * startDate 【TAG】表示開始日付けを設定しま?yyyyMMdd また?、yyyyMMddHHmm 形?
049 * endDate 【TAG】表示?日を設定しま?yyyyMMdd また?、yyyyMMddHHmm 形?
050 * zoom 【TAG】ズー?設定しま?初期値:DAY)
051 * calDB 【TAG】DB検索する??を指定しま?
052 * arg1 【TAG】D?検索する場合?第??キーを指定しま?
053 * arg2 【TAG】D?検索する場合?第??キーを指定しま?
054 * arg3 【TAG】D?検索する場合?第??キーを指定しま?
055 * arg4 【TAG】D?検索する場合?第??キーを指定しま?
056 * debug 【TAG】デバッグ??を?力するかど?[true/false]を指定しま?初期値:false)
057 * />
058 *
059 * ●使用?
060 * 参??jsp/GANTT06 フォル?
061 *
062 * <og:stackHeader
063 * startDate = "{@VIEW_DATE}"
064 * endDate = "{@DYMAX}"
065 * zoom = "{@VIEW_ZOOM}"
066 * calDB = "GE13"
067 * arg1 = "{@CDJGS}"
068 * arg2 = ""
069 * /og:stackHeader>
070 *
071 *
072 * ●定義・解説
073 * stackedGanttView用のヘッ??作?タグです?
074 *
075 * 表示のタイ?zoom)は
076 * DAY?日単位)?WEEK??単位)?MONTH(月単位?
077 * です?
078 *
079 *
080 * ヘッ??部のカレン?、事業?レン?使用することが?来ます?
081 * 使用する場合?、事業?ー? arg1 )属?のセ?と、シス?パラメータ の
082 * USE_CALENDAR_DATABASE 属??true に設定しておく?があります?
083 * こ?フラグは、事業?レン?ーブル(GE13)を使用するために?です?
084 *
085 * zoom="WEEK"(週単? を使用の週数の計算?、年初???の?日間が含まれる週を?第??と数えます?
086 *
087 * @og.rev 5.5.7.0 (2012/10/01) 新規作?
088 * @og.rev 5.6.1.2 (2013/02/22) ???anttHeaderTagに統合?
089 * @og.group (?)画面部?
090 *
091 * @version 5.0
092 * @author Takahashi Masakazu
093 * @since JDK5.0,
094 */
095 @Deprecated public class StackHeaderTag extends CommonTagSupport {
096 //* こ?プログラ??VERSION??を設定します? {@value} */
097 private static final String VERSION = "5.6.1.2 (2013/02/22)" ;
098
099 private static final long serialVersionUID = 561220130222L ;
100
101 private String startDate = null;
102 private String endDate = null;
103 private String zoom = ViewStackTableParam.STACK_ZOOM_DAY;
104 private String daySpan = "0700-2000"; // ?日の時間?(HHmm-HHmm)
105 private String calDB = null; // DB検索する??のキー
106 private String arg1 = null; // DB検索の第?キー(事業?ードなど)
107 private String arg2 = null; // DB検索の第?キー(??コードなど)
108 private String arg3 = null; // DB検索の第?キー(事業?ードなど)
109 private String arg4 = null; // DB検索の第?キー(??コードなど)
110 private String calStr = null; // 出勤日・休日のフラグ
111
112 private ArrayList<String[]> calList = null; // 5.5.8.3 (2012/11/17) 開始?休日判定?次??
113
114 //private static final boolean USE_MONTH_DATE = HybsSystem.sysBool( "USE_GANTTHEADER_MONTH_DATE" );
115
116
117 private static final String BLUE_COLOR = "<span style=\"color:Blue;\">" ;
118 private static final String RED_COLOR = "<span style=\"color:Red;\">" ;
119 private static final String END_SPAN = "</span>" ;
120 private static final String BR = "<br/>" ;
121
122 /**
123 * Taglibの終?グが見つかったときに処??doEndTag() ?オーバ?ライドします?
124 *
125 * @og.rev 5.5.8.3 (2012/11/17) ??ListをObjectとしてviewformに渡す?
126 * @og.rev 5.5.9.0 (2012/12/03) ObjectではなくArrayList渡?
127 *
128 * @return 後続????
129 */
130 @Override
131 public int doEndTag() {
132 debugPrint(); // 4.0.0 (2005/02/28)
133 if( startDate == null || endDate == null ||
134 startDate.length() < 8 || endDate.length() < 8 ) {
135 String errMsg = "開始日と終?は、どちらも yyyyMMdd 形式で、??です?"
136 + " startDate=[" + startDate + "] endDate=[" + endDate + "]" ;
137 throw new HybsSystemException( errMsg );
138 }
139
140 ViewFormTag viewform = (ViewFormTag)findAncestorWithClass( this,ViewFormTag.class );
141
142 String header = "";
143 if( ViewStackTableParam.STACK_ZOOM_MONTH.equals(zoom) ) {
144 header = makeZoom( "yy/ " ,"MM " , 1 ,true ) ;
145 }
146 else if( ViewStackTableParam.STACK_ZOOM_WEEK.equals(zoom) ) { // 月曜開始にはして??
147 header = makeZoom( "ww'W' " ,"MM/dd " ,7 ,false ) ;
148 }
149 else{
150 header = makeZoom( "MM/ " ,"dd(EE)" , 1 ,false ) ;
151 }
152
153 // 5.5.9.0 (2012/12/03) objectからArrayList
154 // 5.5.8.3 (2012/11/17)
155 // Map<String,Object> param = new HashMap<String,Object>();
156 // param.put( ViewStackTableParam.STACK_CAL_KEY, (String[][])calList.toArray(new String[][]{}) );
157 // viewform.setViewObject( param );
158 viewform.setViewArrayList( calList );
159
160 jspPrint( header );
161 jspPrint(makeHeaderData());
162 return(EVAL_PAGE);
163 }
164
165 /**
166 * タグリブオブジェクトをリリースします?
167 *
168 * キャ?ュされて再利用される?で、フィールド?初期設定を行います?
169 *
170 */
171 @Override
172 protected void release2() {
173 super.release2();
174 startDate = null;
175 endDate = null;
176 zoom = ViewStackTableParam.STACK_ZOOM_DAY;
177 calDB = null; // DB検索する??のキー
178 arg1 = null; // DB検索の第?キー(事業?ードなど)
179 arg2 = null; // DB検索の第?キー(??コードなど)
180 arg3 = null; // DB検索の第?キー
181 arg4 = null; // DB検索の第?キー
182 calStr = null;
183 daySpan = "0700-2000"; // 開始時刻(HHmm-HHmm)
184 calList = null;
185 }
186
187 /**
188 * 上段・下段のフォーマットと、加算日に応じた??ー??を作?します?
189 *
190 *
191 * @param upper 上段の表示フォーマッ?
192 * @param lower 下段の表示フォーマッ?
193 * @param add 表示日付けの??
194 * @param useMonth 月日表示でなく?月表示のみにする
195 *
196 * @og.rev 5.5.8.3 (2012/11/17) ?積上げ対?
197 *
198 * @return ヘッ????
199 */
200 private String makeZoom( final String upper ,final String lower ,final int add, final boolean useMonth ) {
201 DateFormat format1 = new SimpleDateFormat( upper,Locale.JAPAN );
202 DateFormat format2 = new SimpleDateFormat( lower,Locale.JAPAN );
203
204 DateFormat formatCal = new SimpleDateFormat( "yyyyMMdd",Locale.JAPAN );
205
206 // 5.5.8.3 (2012/11/17) スタ?用にカレン??????を保持
207 calList = new ArrayList<String[]>();
208 String[] calArray = new String[3]; // 開始?休日判定?次??
209
210 Calendar str = HybsSystem.getCalendar( startDate );
211 Calendar end = HybsSystem.getCalendar( endDate );
212
213 // 週単位?場合?特殊???
214 // 年の第??を完?な??間?(?日?として、設定します?
215 if( ViewStackTableParam.STACK_ZOOM_WEEK.equals( zoom ) ) {
216 str.setMinimalDaysInFirstWeek( 7 );
217 format1.setCalendar( str );
218 format2.setCalendar( str );
219 }
220
221 if( useMonth ){
222 str.set(Calendar.DAY_OF_MONTH, 1);
223 startDate = new SimpleDateFormat( "yyyyMMdd",Locale.JAPAN ).format(str.getTime());
224 }
225
226
227 StringBuilder buf1 = new StringBuilder( HybsSystem.BUFFER_SMALL );
228 StringBuilder buf2 = new StringBuilder( HybsSystem.BUFFER_SMALL );
229 StringBuilder bufcal = new StringBuilder( HybsSystem.BUFFER_SMALL );
230
231 // カレン?B検索機?
232 CalendarData calData = CalendarFactory.getCalendarData( calDB,arg1,arg2,arg3,arg4 );
233
234 boolean modifyFlag = false;
235 while( str.before( end ) ) {
236 Date dt = str.getTime();
237 calArray[0] = formatCal.format( dt ); // 5.5.8.3 (2012/11/17)
238
239 // 本日は?色で示します?
240 if( calData.isContainedToday( str,add ) ) {
241 buf1.append( BLUE_COLOR );
242 buf2.append( BLUE_COLOR );
243 bufcal.append( "0" );
244 calArray[1] = "0"; // 5.5.8.3 (2012/11/17)
245 modifyFlag = true;
246 }
247
248 // 休日判断を?事業?レン?使用
249 // modifyFlag が立って????を条件に追?ます?
250 if( !modifyFlag && add == 1 && calData.isHoliday( str ) && !useMonth) {
251 buf1.append( RED_COLOR );
252 buf2.append( RED_COLOR );
253 bufcal.append( "1" ); // 休日
254 calArray[1] = "1"; // 5.5.8.3 (2012/11/17)
255 modifyFlag = true;
256 }
257
258 buf1.append( format1.format( dt ) );
259 buf2.append( format2.format( dt ) );
260
261 if( modifyFlag ) {
262 buf1.append( END_SPAN );
263 buf2.append( END_SPAN );
264 modifyFlag = false;
265 }
266 else{
267 bufcal.append( "0" );
268 calArray[1] = "0"; // 5.5.8.3 (2012/11/17)
269 }
270
271 // カレン??を?める
272 if( useMonth ){
273 str.add(Calendar.MONTH, add);
274 }
275 else{
276 str.add(Calendar.DATE, add);
277 }
278
279 dt = str.getTime();
280 calArray[2] = formatCal.format( dt ); // 5.5.8.3 (2012/11/17)
281 calList.add( calArray.clone() );
282 }
283 calStr = bufcal.toString();
284
285 return "<pre>" + buf1.toString() + BR + buf2.toString() + "</pre>";
286 }
287
288 /**
289 * Headerの属???をdisplay:noneで作?します?
290 * ganttHeaderと?タグで、id,class共にganttHeaderDataと?名称で出力します?
291 * ??anttHeaderと同じ形式での出力?
292 *
293 * @og.rev 5.5.4.0 (2012/07/02) 新規作?
294 *
295 * @return ヘッ????の??
296 */
297 private String makeHeaderData() {
298
299 StringBuilder buf1 = new StringBuilder( HybsSystem.BUFFER_SMALL );
300
301 buf1.append( "\n" )
302 .append( "<ganttHeader style='display:none' id='ganttHeaderData' class='ganttHeaderData' " )
303 .append( "startDate='" ).append( startDate ).append( "' " )
304 .append( "endDate='" ).append( endDate ).append( "' " )
305 .append( "zoom='" ).append( zoom ).append( "' " )
306 .append( "calDB='" ).append( calStr ).append( "' " )
307 .append( "daySpan='" ).append( daySpan ).append( "' " )
308 .append( " />" );
309
310 return buf1.toString();
311 }
312
313 /**
314 * 【TAG】表示開始日付けを設定しま?yyyyMMdd また?、yyyyMMddHHmm 形??
315 *
316 * @og.tag
317 * こ?値は、??ーの先?に表示する日付けを指定します?
318 * 通常の日付??ーの場合??yyyyMMdd 形式ですが、時間??ーの場合??
319 * yyyyMMddHHmm 形式で?します?
320 *
321 * @param val 表示開始日?yyyyMMdd また?、yyyyMMddHHmm 形?
322 */
323 public void setStartDate( final String val ) {
324 startDate = nval( getRequestParameter( val ),startDate );
325 }
326
327 /**
328 * 【TAG】表示?日を設定しま?yyyyMMdd また?、yyyyMMddHHmm 形??
329 *
330 * @og.tag
331 * 表示開始日から終?までを?zoom 変数の値に応じてヘッ??ラベル?
332 * 作?します?
333 * 通常の日付??ーの場合??yyyyMMdd 形式ですが、時間??ーの場合??
334 * yyyyMMddHHmm 形式で?します?
335 *
336 * @param val 表示?日(yyyyMMdd また?、yyyyMMddHHmm 形?
337 */
338 public void setEndDate( final String val ) {
339 endDate = nval( getRequestParameter( val ),endDate );
340 }
341
342 /**
343 * 【TAG】ズー?設定しま?初期値:DAY)?
344 *
345 * @og.tag
346 * CSSファイルでの定義と、背景画像との関係で、作?します?
347 * ズー?数は、CSSファイル??JavaScript、PL/SQLと連動して、日付間?
348 * あたり?ピクセルを計算して、??ーを作?して?す?
349 * また?現在の標準的なクライアントでの換算になる為?解像度の?スプレイ?
350 * 特殊設定された環?は、表示間隔にずれが発生する可能性があります?
351 * DAY,WEEK,MONTHの?つの設定が可能です?
352 *
353 *
354 * @param val ズー?数(MONTH,WEEK,DAY)
355 */
356 public void setZoom( final String val ) {
357 zoom = nval( getRequestParameter( val ),zoom );
358 }
359
360 /**
361 * 【TAG】DB検索する??を指定します?
362 *
363 * @og.tag
364 * カレン?ータは、シス?パラメータ の CalendarQuery_**** で
365 * ?する?CalendarQuery クラスの QUERY ?、実際に取得します?
366 * 上記? **** 部?、ここで?するキーワードを設定して置きます?
367 * 通常は、データベ?スID (GE13, ZY01 など)を指定します?
368 * こ?キーワードに対する実?ラスを?先?シス?パラメータ の
369 * キーワード以下に記述しておきます?
370 * {@og.doc03Link calDB CalendarQuery_****}
371 *
372 * @param db DB検索する??を指?
373 */
374 public void setCalDB( final String db ) {
375 calDB = nval( getRequestParameter( db ),calDB );
376 }
377
378 /**
379 * 【TAG】D?検索する場合?第??キーを指定します?
380 *
381 * @og.tag
382 * 例えば、GE13, ZY01 では、事業?ー?CDJGS)を設定します?
383 * こ?値は、シス?パラメータ の CalendarQuery_**** で
384 * ?する?CalendarQuery クラスの QUERY ?依存します?
385 * ??タベ?ス定義の統?望?ところです?
386 *
387 *
388 * @param arg DB検索の第?キー(事業?ードなど)
389 */
390 public void setArg1( final String arg ) {
391 arg1 = nval( getRequestParameter( arg ),arg1 );
392 }
393
394 /**
395 * 【TAG】D?検索する場合?第??キーを指定します?
396 *
397 * @og.tag
398 * 例えば、TP652 では、事業部コー?CDJGS) と 物件工程コー?CDKTEI)の?つの
399 * キーで、カレン?取得します?(?年月で、行を決?
400 * 引数が??つまで対応して??
401 * こ?値は、シス?パラメータ の CalendarQuery_**** で
402 * ?する?CalendarQuery クラスの QUERY ?依存します?
403 * ??タベ?ス定義の統?望?ところです?
404 *
405 *
406 * @param arg DB検索の第?キー(??コードなど)
407 */
408 public void setArg2( final String arg ) {
409 arg2 = nval( getRequestParameter( arg ),arg2 );
410 }
411
412 /**
413 * 【TAG】D?検索する場合?第??キーを指定します?
414 *
415 * @og.tag
416 * こ?値は、シス?パラメータ の CalendarQuery_**** で
417 * ?する?CalendarQuery クラスの QUERY ?依存します?
418 * ??タベ?ス定義の統?望?ところです?
419 *
420 *
421 * @param arg DB検索の第?キー
422 */
423 public void setArg3( final String arg ) {
424 arg3 = nval( getRequestParameter( arg ),arg3 );
425 }
426
427 /**
428 * 【TAG】D?検索する場合?第??キーを指定します?
429 *
430 * @og.tag
431 * こ?値は、シス?パラメータ の CalendarQuery_**** で
432 * ?する?CalendarQuery クラスの QUERY ?依存します?
433 * ??タベ?ス定義の統?望?ところです?
434 *
435 *
436 * @param arg DB検索の第?キー
437 */
438 public void setArg4( final String arg ) {
439 arg4 = nval( getRequestParameter( arg ),arg4 );
440 }
441
442 /**
443 * こ?オブジェクト???表現を返します?
444 * 基本???目?使用します?
445 *
446 * @return こ?クラスの??表現
447 */
448 @Override
449 public String toString() {
450 return org.opengion.fukurou.util.ToString.title( this.getClass().getName() )
451 .println( "VERSION" ,VERSION )
452 .println( "startDate" ,startDate )
453 .println( "endDate" ,endDate )
454 .println( "zoom" ,zoom )
455 .println( "calDB" ,calDB )
456 .println( "arg1" ,arg1 )
457 .println( "arg2" ,arg2 )
458 .println( "arg3" ,arg3 )
459 .println( "arg4" ,arg4 )
460 .println( "Other..." ,getAttributes().getAttribute() )
461 .fixForm().toString() ;
462 }
463 }