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.fukurou.util.TagBuffer;
019import org.opengion.fukurou.util.ToString;                                              // 6.1.1.0 (2015/01/17)
020
021import static org.opengion.fukurou.util.StringUtil.nval ;               // 6.1.0.0 (2014/12/26)
022
023/**
024 * ガントチャートの繰り返しタグのフォーマットに使用します。
025 *
026 * iGanttBar タグは、TDタグの繰返し部に記述することで、個々のガントのタスクを作成します。
027 * これを使用する場合は、iGant タグを全体に一つ指定する必要があります。
028 *
029 * @og.formSample
030 * ●形式:<og:iGanttBar  ... />
031 * ●body:なし
032 * ●前提:headタグで、adjustEvent="Gantt" を指定してください。
033 *
034 * ●Tag定義:
035 *   <og:iGanttBar
036 *       type       ○【TAG】ガント要素のタイプ(0:マイルストーン 1:バー )(必須)
037 *       color        【TAG】バーの色(マイルストーンの場合は不要)
038 *       colorNo      【TAG】バーの色番号で指定します
039 *       src          【TAG】マイルストーンのアイコン画像(URIより設定)
040 *       start        【TAG】開始日(YYYYMMDD)、または開始時間(YYYYMMDDHH24MM)
041 *       end          【TAG】終了日(YYYYMMDD)、または終了時間(YYYYMMDDHH24MM)
042 *       text         【TAG】ガント要素の注釈メッセージ。
043 *       href         【TAG】入力した場合はガントにリンクを付加します。
044 *       target       【TAG】hrefを指定した場合に付加されるリンクのターゲット
045 *       barLink      【TAG】hrefで付加されるリンクの範囲にバー本体を含めるかどうか[true/false]を指定します(初期値:false)
046 *       startInput   【保留】ガント要素の開始日に紐付く入力欄(開始日または終了日に紐付く入力欄が設定しなければガント要素は動かせない)
047 *       endInput     【保留】ガント要素の終了日に紐付く入力欄(開始日または終了日に紐付く入力欄が設定しなければガント要素は動かせない)
048 *       chbox        【保留】行選択のチェックボックス 設定値:[ROW.ID]
049 *       id           【TAG】要素を一意に指定する値を指定します。(ガント要素を動かす際に指定)
050 *       cost         【TAG】開始日、終了日を利用して積上げられる工数を指定します。
051 *       capacity     【TAG】積上げの最大値(キャパシティ)を指定します。
052 *       debug        【TAG】デバッグ情報を出力するかどうか[true/false]を指定します(初期値:false)
053 *   />
054 *
055 * ●使用例
056 *   (通常ガント)
057 *  <og:view
058 *      viewFormType = "HTMLCustomTable"
059 *      command      = "{@command}"
060 *      writable     = "false"
061 *      useScrollBar = "false"
062 *  >
063 *    <og:thead rowspan="2">
064 *      <tr>
065 *          <td>[NOORDER]</td>
066 *          <td rowspan="2" class="gantt zoom{@VZOOM}" style="line-height:normal;text-align:left;background-image: url('../image/ganttBG{@VZOOM}.gif');" >
067 *              <div style="position:relative;left:0px;z-index:101; " height="100%" width="100%" >
068 *                  <og:ganttHeader
069 *                      startDate       = "{@startDate}"
070 *                      endDate         = "{@endDate}"
071 *                      zoom            = "{@VZOOM}"
072 *                      daySpan         = "{@daySpan}"
073 *                  />
074 *              </div>
075 *          </td>
076 *      </tr>
077 *    </og:thead>
078 *    <og:tbody rowspan="2">
079 *      <tr>
080 *          <td>[NOORDER]</td>
081 *          <td rowspan="2" class="gantt zoom{@VZOOM}" style="text-align:left;background-image: url('../image/ganttBG{@VZOOM}.gif');" >
082 *              <og:iGanttBar type="1" colorNo="[COLOR]" start="[DYORDER]" end="[DYNOKI]" text="[PN]" />
083 *              <og:iGanttBar type="0" src="../image/dia_blue.gif" start="[DYORDER]"      text="開始" />
084 *              <og:iGanttBar type="0" src="../image/dia_red.gif"  end="[DYNOKI]"         text="終了" />
085 *          </td>
086 *      </tr>
087 *    </og:tbody>
088 *  </og:view>
089 *    
090 *   <og:iGantt
091 *       margeRows      = "true"
092 *       fixedCols      = "1"
093 *   />
094 *
095 *   (積み上げガント)
096 *  <og:view
097 *      viewFormType = "HTMLStackedGanttTable"
098 *      command      = "{@command}"
099 *      writable     = "false"
100 *      useScrollBar = "false"
101 *      useParam     = "true"
102 *      numberType   = "none"
103 *  >
104 *  <og:stackParam
105 *      stackColumns = "NOORDER"
106 *  />
107 * 
108 *    <og:thead rowspan="2">
109 *      <tr>
110 *          <td>[NOORDER]</td>
111 *          <td>[PN]</td>
112 *          <td rowspan="2" class="gantt zoom{@SZOOM}" style="text-align:left;background-image: url('../image/ganttBG{@SZOOM}.gif');" >
113 *              <div style="position:relative;left:0px;z-index:101; " height="100%" width="100%" >
114 *                  <og:ganttHeader
115 *                      startDate   = "{@startDate}"
116 *                      endDate     = "{@endDate}"
117 *                      zoom        = "{@SZOOM}"
118 *                      calDB       = "GE13"
119 *                      arg1        = "A"
120 *                  />
121 *              </div>
122 *          </td>
123 *      </tr>
124 *    </og:thead>
125 *    <og:tbody rowspan="2">
126 *      <tr>
127 *          <td>[NOORDER]</td>
128 *          <td>[PN]</td>
129 *          <td rowspan="2" class="gantt zoom{@VZOOM}" style="text-align:left;background-image: url('../image/ganttBG{@VZOOM}.gif');" >
130 *              <iGanttBar type="1" colorNo="[COLOR]" start="[DYORDER]" end="[DYNOKI]"  text="[COSTCLM]"
131 *                    cost="[COSTCLM]" capacity="[CAPACITY]" />
132 *              <og:iGanttBar type="0" src="../image/dia_blue.gif" start="[DYORDER]"      text="開始" />
133 *          </td>
134 *      </tr>
135 *    </og:tbody>
136 *  </og:view>
137 *    
138 *   <og:iGantt
139 *       margeRows      = "true"
140 *       fixedCols      = "1"
141 *       verticalShift  = "false"
142 *       viewGantt      = "{@viewGantt}"
143 *       stackHoliday   = "{@stackHoliday}"
144 *       useBgColor     = "true"
145 *       viewMode       = "2"
146 *   />
147 *
148 * @og.rev 5.6.3.2 (2013/04/12) 新規作成
149 * @og.group 画面部品
150 *
151 * @version  5.0
152 * @author       Kazuhiko Hasegawa
153 * @since    JDK6.0,
154 */
155public class ViewIGanttBarTag extends CommonTagSupport {
156        /** このプログラムのVERSION文字列を設定します。   {@value} */
157        private static final String VERSION = "6.4.2.0 (2016/01/29)" ;
158        private static final long serialVersionUID = 642020160129L ;
159
160        private transient TagBuffer tag = new TagBuffer( "iGanttBar" ).addBody( "<!-- -->" );           // 6.1.1.0 (2015/01/17) TagBufferの連結記述
161
162        /**
163         * デフォルトコンストラクター
164         *
165         * @og.rev 6.4.2.0 (2016/01/29) PMD refactoring. Each class should declare at least one constructor.
166         */
167        public ViewIGanttBarTag() { super(); }          // これも、自動的に呼ばれるが、空のメソッドを作成すると警告されるので、明示的にしておきます。
168
169        /**
170         * Taglibの終了タグが見つかったときに処理する doEndTag() を オーバーライドします。
171         *
172         * @og.rev 6.0.2.5 (2014/10/31) HTML5対応。javaScriptで、BODYがないと入れ子になってしまう。
173         *
174         * @return      後続処理の指示
175         */
176        @Override
177        public int doEndTag() {
178                debugPrint();           // 4.0.0 (2005/02/28)
179
180                // 6.1.1.0 (2015/01/17) TagBufferの連結記述
181                jspPrint( tag.makeTag() );
182
183                return EVAL_PAGE ;              // ページの残りを評価する。
184        }
185
186        /**
187         * タグリブオブジェクトをリリースします。
188         * キャッシュされて再利用されるので、フィールドの初期設定を行います。
189         *
190         */
191        @Override
192        protected void release2() {
193                super.release2();
194                tag = new TagBuffer( "iGanttBar" ).addBody( "<!-- -->" );               // 6.1.1.0 (2015/01/17) TagBufferの連結記述
195        }
196
197        /**
198         * 【TAG】ガント要素のタイプ[0:マイルストーン/1:バー]を指定します。
199         *
200         * @og.tag
201         * 0:マイルストーン を指定すると、その日(時間)に、マーカーがされます。
202         * ガントのような期間ではなく、そのポイントを表すのに使用します。
203         * 例えば、受注日、納期 などの設定値です。
204         * start か end どちらかの指定で構いません。
205         * start を使用した場合は、指定日(時間)の前方に、endを使用した場合は、
206         * 指定日(時間)の後方にマーカーが置かれます。
207         *
208         * @param   type ガント要素のタイプ [0:マイルストーン/1:バー]
209         */
210        public void setType( final String type ) {
211                tag.add( "type",nval( getRequestParameter( type ),null ) );
212        }
213
214        /**
215         * 【TAG】ガント要素(バー)の色コードを設定します。
216         *
217         * @og.tag
218         * color は、ガント要素の色コードを設定します。
219         * type="0:マイルストーン" の場合は不要です。
220         * このコードは、予め決められた色画像を呼び出しますので、任意の色が使えるという事ではありません。
221         * 色指定は、横棒の場合は、image/W_色コード.png の画像を使います。
222         * 色コード と 色番号が同時に指定された場合は、色コード が優先されます。
223         *
224         * type=2:差分枠 は、value > baseVal の場合は、超過を、value < baseValの場合は、不足を表します。
225         * <table border="1" frame="box" rules="all">
226         *   <caption>色番号 対応表</caption>
227     *   <tr><th>色番号</th><th>設定値    </th><th>棒色   </th><th> </th><th>横棒サンプル</th></tr>
228     *   <tr><td> 0    </td><td>blue      </td><td>青     </td><td> </td><td style="background-image:url(../image/W_blue.png);">    </td></tr>
229     *   <tr><td> 1    </td><td>black     </td><td>黒     </td><td> </td><td style="background-image:url(../image/W_black.png);">   </td></tr>
230     *   <tr><td> 2    </td><td>brown     </td><td>茶     </td><td> </td><td style="background-image:url(../image/W_brown.png);">   </td></tr>
231     *   <tr><td> 3    </td><td>green     </td><td>緑     </td><td> </td><td style="background-image:url(../image/W_green.png);">   </td></tr>
232     *   <tr><td> 4    </td><td>lightblue </td><td>薄青   </td><td> </td><td style="background-image:url(../image/W_lightblue.png);">  </td></tr>
233     *   <tr><td> 5    </td><td>lightgreen</td><td>薄緑   </td><td> </td><td style="background-image:url(../image/W_lightgreen.png);">  </td></tr>
234     *   <tr><td> 6    </td><td>orange    </td><td>オレンジ</td><td> </td><td style="background-image:url(../image/W_orange.png);">  </td></tr>
235     *   <tr><td> 7    </td><td>pink      </td><td>ピンク </td><td> </td><td style="background-image:url(../image/W_pink.png);">   </td></tr>
236     *   <tr><td> 8    </td><td>purple    </td><td>紫     </td><td> </td><td style="background-image:url(../image/W_purple.png);">   </td></tr>
237     *   <tr><td> 9    </td><td>red       </td><td>赤     </td><td> </td><td style="background-image:url(../image/W_red.png);">        </td></tr>
238     *   <tr><td> 10   </td><td>yellow    </td><td>黄     </td><td> </td><td style="background-image:url(../image/W_yellow.png);">  </td></tr>
239     *   <tr><td> 11   </td><td>navy      </td><td>濃紺   </td><td> </td><td style="background-image:url(../image/W_navy.png);">   </td></tr>
240     *   <tr><td> 12   </td><td>teal      </td><td>青緑   </td><td> </td><td style="background-image:url(../image/W_teal.png);">   </td></tr>
241     *   <tr><td> 13   </td><td>gray      </td><td>灰     </td><td> </td><td style="background-image:url(../image/W_gray.png);">     </td></tr>
242     *   <tr><td> 14   </td><td>indigo    </td><td>藍     </td><td> </td><td style="background-image:url(../image/W_indigo.png);">  </td></tr>
243     *   <tr><td> 15   </td><td>slategray </td><td>鉄色   </td><td> </td><td style="background-image:url(../image/W_slategray.png);">  </td></tr>
244     *   <tr><td> 16   </td><td>chocorlate</td><td>チョコレート</td><td> </td><td style="background-image:url(../image/W_chocorlate.png);">  </td></tr>
245     *   <tr><td> 17   </td><td>darkgreen </td><td>深緑   </td><td> </td><td style="background-image:url(../image/W_darkgreen.png);">  </td></tr>
246     *   <tr><td> 18   </td><td>violet    </td><td>すみれ </td><td> </td><td style="background-image:url(../image/W_violet.png);">  </td></tr>
247     *   <tr><td> 19   </td><td>darkslategray</td><td>深鉄色</td><td> </td><td style="background-image:url(../image/W_darkslategray.png);">  </td></tr>
248     *   <tr><td> 20   </td><td>lime      </td><td>緑     </td><td> </td><td style="background-image:url(../image/W_lime.png);">     </td></tr>
249     *   <tr><td> 21   </td><td>aqua      </td><td>水色   </td><td> </td><td style="background-image:url(../image/W_aqua.png);">   </td></tr>
250     *   <tr><td> 22   </td><td>maroon    </td><td>ひわだいろ</td><td> </td><td style="background-image:url(../image/W_maroon.png);">  </td></tr>
251     *   <tr><td> 23   </td><td>olive     </td><td>オリーブ</td><td> </td><td style="background-image:url(../image/W_olive.png);">   </td></tr>
252     *   <tr><td> 24   </td><td>silver    </td><td>銀     </td><td> </td><td style="background-image:url(../image/W_silver.png);">  </td></tr>
253     *   <tr><td> 25   </td><td>fuchsia   </td><td>赤紫   </td><td> </td><td style="background-image:url(../image/W_fuchsia.png);">  </td></tr>
254     *   <tr><td colspan="6"> </td></tr>
255     *   <tr><td> BK   </td><td>black2    </td><td>黒     </td><td> </td><td style="background-image:url(../image/W_black2.png);">  </td></tr>
256     *   <tr><td> WT   </td><td>white2    </td><td>白     </td><td> </td><td style="background-image:url(../image/W_white2.png);">  </td></tr>
257     *   <tr><td> BL   </td><td>blue2     </td><td>青     </td><td> </td><td style="background-image:url(../image/W_blue2.png);">    </td></tr>
258     *   <tr><td> RD   </td><td>red2      </td><td>赤     </td><td> </td><td style="background-image:url(../image/W_red2.png);">    </td></tr>
259     *   <tr><td> YL   </td><td>yellow2   </td><td>黄     </td><td> </td><td style="background-image:url(../image/W_yellow2.png);">  </td></tr>
260         * </table>
261         *
262         * @param   color バー色
263         */
264        public void setColor( final String color ) {
265                tag.add( "color",nval( getRequestParameter( color ),null ) );
266        }
267
268        /**
269         * 【TAG】グラフ要素の色番号を設定します。
270         *
271         * @og.tag
272         * 色番号は、色コードを直接指定するのではなく、番号で指定する場合に使用します。
273         * 棒グラフ要素(type="1"(横棒),"6"(縦棒))の色を設定します。
274         * "1~25 , BK,WT,BL,RD,YL" の色番号で指定します。
275         * 色番号は、与えた数字を内部色数で割り算した余を使用しますので、連番の場合でも
276         * 繰返し使われます。特殊な色として、BK,WT,BL,RD,YLは、番号ではなく記号で指定できます。
277         * 色コード と 色番号が同時に指定された場合は、色コード が優先されます。
278         *
279         * @param   clrNo 色番号 [1~25/BK/WT/BL/RD/YL]
280         * @see         #setColor( String )
281         */
282        public void setColorNo( final String clrNo ) {
283                tag.add( "colorNo",nval( getRequestParameter( clrNo ),null ) );
284        }
285
286        /**
287         * 【TAG】マイルストーンのアイコン画像(URIより設定)を設定します。
288         *
289         * @og.tag
290         * type="0:マイルストーン" の場合、表示するアイコンイメージの所在を指定します。
291         * 例:"../image/xxx.png" 
292         *
293         * @param   src アイコン画像
294         */
295        public void setSrc( final String src ) {
296                tag.add( "src",nval( getRequestParameter( src ),null ) );
297        }
298
299        /**
300         * 【TAG】開始日(YYYYMMDD)、または開始時間(YYYYMMDDHH24MM)を設定します。
301         *
302         * @og.tag
303         * type="1:バー" の場合は、バー表示の場合の書き始め(開始)を指定します。
304         * この値は、バーでは、「含む」になります。
305         * type="0:マイルストーン" の場合は、マイルストンを左端に表示します。
306         *
307         * @param   start 開始日or開始時間 (YYYYMMDD or YYYYMMDDHH24MM)
308         * @see         #setType( String )
309         * @see         #setEnd( String )
310         */
311        public void setStart( final String start ) {
312                tag.add( "start",nval( getRequestParameter( start ),null ) );
313        }
314
315        /**
316         * 【TAG】終了日(YYYYMMDD)、または終了時間(YYYYMMDDHH24MM)を設定します。
317         *
318         * @og.tag
319         * type="1:バー" の場合は、バー表示の場合の書き終わり(終了)を指定します。
320         * この値は、日付か時刻かで「含む」/「含まない」が異なります。
321         * 日付の場合は、この値を「含む」です。例えば、4/12 を指定した場合、4/12は含みます。
322         * 時刻の場合は、「含まない」です。4/12 070000 を指定した場合は、午前7時は含まないので、
323         * 6時59分59秒までのバーが引かれます。
324         * type="0:マイルストーン" の場合は、マイルストンを右端に表示します。
325         *
326         * @param   end 終了日or終了時間 (YYYYMMDD or YYYYMMDDHH24MM)
327         * @see         #setType( String )
328         * @see         #setStart( String )
329         */
330        public void setEnd( final String end ) {
331                tag.add( "end",nval( getRequestParameter( end ),null ) );
332        }
333
334        /**
335         * 【TAG】バー上に表示するテキストを指定します。
336         *
337         * @og.tag
338         * バーの上に、値などの文字を重ねて表示できます。
339         *
340         * @param   text 表示テキスト
341         */
342        public void setText( final String text ) {
343                tag.add( "text",nval( getRequestParameter( text ),null ) );
344        }
345
346        /**
347         * 【TAG】リンク作成時の値を設定します。
348         *
349         * @og.tag
350         * バーの上の文字に対して、リンクを作成できます。
351         *
352         * @param   href リンク
353         * @see         #setTarget( String )
354         */
355        public void setHref( final String href ) {
356                tag.add( "href",nval( getRequestParameter( href ),null ) );
357        }
358
359        /**
360         * 【TAG】リンク作成時のターゲット名を指定します。
361         *
362         * @og.tag
363         * バーの上の文字に対して、リンクを作成するときの、ターゲット名を指定できます。
364         *
365         * @param   target ターゲット
366         * @see         #setHref( String )
367         */
368        public void setTarget( final String target ) {
369                tag.add( "target",nval( getRequestParameter( target ),null ) );
370        }
371
372        /**
373         * 【TAG】hrefで付加されるリンクの範囲にバー本体を含めるかどうか[true/false]を指定します(初期値:false)。
374         *
375         * @og.tag
376         * true を指定すると、hrefで付加されるリンクの範囲にバー本体を含めます。
377         *
378         * @param   barLink バー可否 [true:する/false:しない]
379         * @see         #setHref( String )
380         */
381        public void setBarLink( final String barLink ) {
382                tag.add( "barLink",nval( getRequestParameter( barLink ),null ) );
383        }
384
385        /**
386         * 【保留】ガント要素の開始日に紐付く入力欄を指定します。
387         *
388         * @og.tag
389         * この入力欄がないと、ガント要素は動かせません。
390         * 
391         * @og.rev 5.9.14.1 (2016/11/11) startInputではなくstartDateInut
392         *
393         * @param   startInput 開始日入力欄
394         * @see         #setStart( String )
395         */
396        public void setStartInput( final String startInput ) {
397                tag.add( "startDateInput",nval( getRequestParameter( startInput ),null ) );
398        }
399
400        /**
401         * 【保留】ガント要素の終了日に紐付く入力欄を指定します。
402         *
403         * @og.tag
404         * この入力欄がないと、ガント要素は動かせません。
405         * 
406         * @og.rev 5.9.14.1 (2016/11/11) endInputではなくendDateInut
407         *
408         * @param   endInput 終了日入力欄
409         * @see         #setEnd( String )
410         */
411        public void setEndInput( final String endInput ) {
412                tag.add( "endDateInput",nval( getRequestParameter( endInput ),null ) );
413        }
414
415        /**
416         * 【TAG】行選択のチェックボックスを指定します。
417         *
418         * @og.tag
419         * 例えば、[ROW.ID] を指定する事で、選択行を指定する事ができます。
420         *
421         * @param   chbox チェックボックス指定
422         */
423        public void setChbox( final String chbox ) {
424                tag.add( "chbox",nval( getRequestParameter( chbox ),null ) );
425        }
426
427        /**
428         * 【TAG】積み上げガントの工数を指定します。
429         *
430         * @og.tag
431         * 積み上げガントの工数を指定します。
432         * 開始日、終了日を利用して積上げ計算されます。
433         *
434         * @param   cost 積み上げガントの工数
435         */
436        public void setCost( final String cost ) {
437                tag.add( "cost",nval( getRequestParameter( cost ),null ) );
438        }
439
440        /**
441         * 【TAG】積上げの最大値(キャパシティ)を指定します。
442         *
443         * @og.tag
444         * 最大値を超えた場合は、マーカーされます。
445         *
446         * @param   capacity 積み上げガントの工数
447         */
448        public void setCapacity( final String capacity ) {
449                tag.add( "capacity",nval( getRequestParameter( capacity ),null ) );
450        }
451
452        /**
453         * 【TAG】要素を一意に指定するためのidを指定します。
454         *
455         * @og.tag
456         * 要素を一意に指定するためのID体系を指定します。
457         * 例えばA__[I]のように設定します。
458         * ガント要素は動かす際には必要です。
459         * 
460         * @og.rev 5.9.14.1 (2016/11/11)
461         *
462         * @param   id 一意になる文字列
463         */
464        @Override
465        public void setId( final String id ) {
466                tag.add( "id",nval( getRequestParameter( id ),null ) );
467        }
468
469        /**
470         * タグの名称を、返します。
471         * 自分自身のクラス名より、自動的に取り出せないため、このメソッドをオーバーライドします。
472         *
473         * @return  タグの名称
474         * @og.rtnNotNull
475         */
476        @Override
477        protected String getTagName() {
478                return "iGanttBar" ;
479        }
480
481        /**
482         * このオブジェクトの文字列表現を返します。
483         * 基本的にデバッグ目的に使用します。
484         *
485         * @return このクラスの文字列表現
486         * @og.rtnNotNull
487         */
488        @Override
489        public String toString() {
490                return ToString.title( this.getClass().getName() )
491                                .println( "VERSION"             ,VERSION        )
492                                .println( "tag"                 ,tag.makeTag()  )
493                                .println( "Other..."    ,getAttributes().getAttribute() )
494                                .fixForm().toString() ;
495        }
496}