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.HybsSystemException;
019    import org.opengion.fukurou.util.StringUtil;
020    import org.opengion.fukurou.util.TagBuffer;
021    
022    /**
023     * ガントチャートを表示するに当たりã?ガントå?体(ã?ージ全体ä¸?�¤設定)ã?æŒ?®šを行いますã?
024     *
025     * iGantt タグは、ガントチャートå?体にä¸?�¤æŒ?®šする事で、最大行数、固定カラãƒ?•°ã€?
026     * 番号列ã?出力有無を指定するã?に使用されますã?
027     * 通常は、単独で使用するのではなくã?iGanttBar タグとçµ?�¿合わせて使用しますã?
028     * 通常の view タグの後に記述しますã?
029     *
030     * ガントにはã€??常のガントと積上ガントã?å†?ƒ¨積上ガントがありますã?
031     * 通常ガントã?ã€??常の view をガント化しますã?
032     * 積上ガントã?、ViewにHTMLstackedGanttTableを指定するå¿?¦�がありますã?
033     * こã?方式ã?利点は、積上と通常のガントバーを混在できることですã?例えば、物件予定をガントバーで、表示しã?
034     * 個人の予定工数を積上るなどの表示が可能ですã?ただしã?件数が多いと、å?ç�?�«時間がかかりますã?
035     * å†?ƒ¨積上ガントã?、エンジンå†?ƒ¨で積上計算しますã?で、å?ç�??早ã�??ですが、ガントバーとの
036     * 混在ができません。これらは、うまく使ã�??けを行うå¿?¦�がありますã?
037     *
038     * @og.formSample
039     * ●形式ï¼?lt;og:iGantt  ... />
040     * ●body?šなã�?
041     * ●前提:headタグで、adjustEvent="Gantt" を指定してくださいã€?
042     *
043     * ●Tag定義??
044     *   <og:iGantt
045     *       margeRows          【TAG】前後ã?行データがä¸??してã�?‚‹場合ã?マã?ジするかどã�?�‹[true/false]æŒ?®šしまã�?初期値:false)
046     *       fixedCols          【TAG】左の固定å?の列数?ˆテーブル?’å?割機è??‰をæŒ?®šしまã�?
047     *       viewNumberType     【TAG】viewタグの出力に番号列が出力されてã�?‚‹かかどã�?�‹?ˆå?力されてã�?�ªã�??å�?deleteを指定ï¼?
048     *       verticalShift      【TAG】ガントã?上下ずらし表示を行うかどã�?�‹[true/false]æŒ?®šしまã�?初期値=true:行う)
049     *       paddingLeft        【TAG】ガントバーの間ã?左区åˆ?‚Šスペã?スを指定しまã�?初期値=null)
050     *       paddingRigth       【TAG】ガントバーの間ã?右区åˆ?‚Šスペã?スを指定しまã�?初期値=null)
051     *       useBgColor         【TAG】ä¸?¦§の背景色の縞ã?模様を再作æ?するか[true/false]æŒ?®šしますï¼?argeRows='true'の場合ã?使用する??
052     *       viewGantt          【TAG】積上ガンãƒ?ガント部åˆ??表示を行うかどã�?�‹[true/false]æŒ?®šしまã�?初期値=true:表示する)
053     *       stackHoliday       【TAG】積上ガンãƒ?休日に積上げるかどã�?�‹[true/false]æŒ?®šしますï¼?oom=DAYの場合ã?み有効。å?期å?=true:積上げã‚?
054     *       viewMode           【TAG】積上ガンãƒ?1:行ã?æœ?¤§値を基準に積上げ高さの計算を行う/0:能力設定å?を基準に積上げ高さの計算を行うã€?
055     *       stdUpper           【TAG】積上ガンãƒ?正常ç¯?›²の上限となる工数ですã?これをè¶?�ˆると積上げの色が変化しまã�?初期値:1)
056     *       stdCost            【TAG】積上ガンãƒ?こã?工数が行ã?2/3の高さとなりまã�?初期値:1)
057     *       stdLower           【TAG】積上ガンãƒ?正常ç¯?›²の下限となる工数ですã?これを下回ると積上げの色が変化しまã�?初期値:0)
058     *       debug              【TAG】デバッグæƒ??をå?力するかどã�?�‹[true/false]を指定しまã�?初期値:false)
059     *   />
060     *
061     * ●使用ä¾?
062     *   (通常ガンãƒ?
063     *  <og:view
064     *      viewFormType = "HTMLCustomTable"
065     *      command      = "{@command}"
066     *      writable     = "false"
067     *      useScrollBar = "false"
068     *  >
069     *    <og:thead rowspan="2">
070     *      <tr>
071     *          <td>[NOORDER]</td>
072     *          <td rowspan="2" class="gantt zoom{@VZOOM}" style="line-height:normal;text-align:left;background-image: url('../image/ganttBG{@VZOOM}.gif');" >
073     *              <div style="position:relative;left:0px;z-index:101; " height="100%" width="100%" >
074     *                  <og:ganttHeader
075     *                      startDate       = "{@startDate}"
076     *                      endDate         = "{@endDate}"
077     *                      zoom            = "{@VZOOM}"
078     *                      daySpan         = "{@daySpan}"
079     *                  />
080     *              </div>
081     *          </td>
082     *      </tr>
083     *    </og:thead>
084     *    <og:tbody rowspan="2">
085     *      <tr>
086     *          <td>[NOORDER]</td>
087     *          <td rowspan="2" class="gantt zoom{@VZOOM}" style="text-align:left;background-image: url('../image/ganttBG{@VZOOM}.gif');" >
088     *              <og:iGanttBar type="1" colorNo="[COLOR]" start="[DYORDER]" end="[DYNOKI]" text="[PN]" />
089     *              <og:iGanttBar type="0" src="../image/dia_blue.gif" start="[DYORDER]"      text="開å§? />
090     *              <og:iGanttBar type="0" src="../image/dia_red.gif"  end="[DYNOKI]"         text="終äº? />
091     *          </td>
092     *      </tr>
093     *    </og:tbody>
094     *  </og:view>
095     *    
096     *   <og:iGantt
097     *       margeRows      = "true"
098     *       fixedCols      = "1"
099     *   />
100     *
101     *   (積上ガンãƒ?
102     *  積上ガントを利用する場合ã?、ViewにHTMLstackedGanttTableを利用するå¿?¦�がありますã?
103     *  <og:view
104     *      viewFormType = "HTMLStackedGanttTable"
105     *      command      = "{@command}"
106     *      writable     = "false"
107     *      useScrollBar = "false"
108     *      useParam     = "true"
109     *      numberType   = "none"
110     *  >
111     *  <og:stackParam
112     *      stackColumns = "NOORDER"
113     *  />
114     * 
115     *    <og:thead rowspan="2">
116     *      <tr>
117     *          <td>[NOORDER]</td>
118     *          <td>[PN]</td>
119     *          <td rowspan="2" class="gantt zoom{@SZOOM}" style="text-align:left;background-image: url('../image/ganttBG{@SZOOM}.gif');" >
120     *              <div style="position:relative;left:0px;z-index:101; " height="100%" width="100%" >
121     *                  <og:ganttHeader
122     *                      startDate   = "{@startDate}"
123     *                      endDate     = "{@endDate}"
124     *                      zoom        = "{@SZOOM}"
125     *                      calDB       = "GE13"
126     *                      arg1        = "A"
127     *                  />
128     *              </div>
129     *          </td>
130     *      </tr>
131     *    </og:thead>
132     *    <og:tbody rowspan="2">
133     *      <tr>
134     *          <td>[NOORDER]</td>
135     *          <td>[PN]</td>
136     *          <td rowspan="2" class="gantt zoom{@VZOOM}" style="text-align:left;background-image: url('../image/ganttBG{@VZOOM}.gif');" >
137     *              <og:iGanttBar type="1" colorNo="[COLOR]" start="[DYORDER]" end="[DYNOKI]"  text="[COSTCLM]"
138     *                    cost="[COSTCLM]" capacity="[CAPACITY]" />
139     *              <og:iGanttBar type="0" src="../image/dia_blue.gif" start="[DYORDER]"      text="開å§? />
140     *          </td>
141     *      </tr>
142     *    </og:tbody>
143     *  </og:view>
144     *    
145     *   <og:iGantt
146     *       margeRows      = "true"
147     *       fixedCols      = "1"
148     *       verticalShift  = "false"
149     *       viewGantt      = "{@viewGantt}"
150     *       stackHoliday   = "{@stackHoliday}"
151     *       useBgColor     = "true"
152     *       viewMode       = "2"
153     *   />
154     *
155     * @og.rev 5.6.3.2 (2013/04/12) 新規作æ?
156     * @og.group 画面部å“?
157     *
158     * @version  5.0
159     * @author       Kazuhiko Hasegawa
160     * @since    JDK6.0,
161     */
162    public class ViewIGanttTag extends CommonTagSupport {
163            //* こã?プログラãƒ??VERSIONæ–?­—å?を設定しますã?       {@value} */
164            private static final String VERSION = "5.6.4.2 (2013/05/17)" ;
165    
166            private static final long serialVersionUID = 564220130517L ;
167    
168            private TagBuffer tag = new TagBuffer( "iGantt" ) ;
169    
170            /**
171             * Taglibの終äº?‚¿グが見つかったときに処ç�?�™ã‚?doEndTag() ã‚?オーバã?ライドしますã?
172             *
173             * @og.rev 5.8.1.0 (2014/11/07) HTML5対応ã?javaScriptで、BODYがなã�?�¨入れ子になってしまã�??
174             * @return      後続å?ç�??æŒ?¤º
175             */
176            @Override
177            public int doEndTag() {
178                    debugPrint();           // 4.0.0 (2005/02/28)
179    
180                    tag.setBody( "<!-- -->" );                // 5.8.1.0 (2014/11/07) HTML5対応ã?
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( "iGantt" );
195            }
196    
197            /**
198             * 【TAG】前後ã?行データがä¸??してã�?‚‹場合ã?マã?ジするかどã�?�‹[true/false]æŒ?®šしまã�?初期値:false)
199             *
200             * @og.tag
201             * これは、ガントデータが同ä¸?‚°ループã?場合に、ガントとしてä¸??に表示するようにしますã?
202             * こã?段階ではã€?šŽ段並べのままですã?
203             * 前後に付けるå?合(ä¸??表示?‰ã?、verticalShift = "true" を指定してくださいã€?
204             * (adjustGanttTable.jsの)初期値は、false:行わなã�?ですã?
205             *
206             * @param   margeRows è¤?•°行ã?マã?ジを行うかどã�?�‹[true/false]
207             * @see         #setVerticalShift( String )
208             */
209            public void setMargeRows( final String margeRows ) {
210                    tag.add( "margeRows",StringUtil.nval( getRequestParameter( margeRows ),null ) );
211            }
212    
213            /**
214             * 【TAG】左の固定å?の列数?ˆテーブル?’å?割機è??‰をæŒ?®šしますã?
215             *
216             * @og.tag
217             * ?‘段çµ?�§も2段çµ?�§もã?固定したいカラãƒ?•°を指定しますã?
218             *
219             * @param   fixedCols 固定したいカラãƒ?•°
220             */
221            public void setFixedCols( final String fixedCols ) {
222                    tag.add( "fixedCols",StringUtil.nval( getRequestParameter( fixedCols ),null ) );
223            }
224    
225            /**
226             * 【TAG】viewタグの出力に番号列が出力されてã�?‚‹かどã�?�‹?ˆå?力されてã�?�ªã�??å�?delete?‰をæŒ?®šしますã?
227             *
228             * @og.tag
229             * viewタグで、numberType属æ?で、行番号を表示しなã�?¨­定を行ったå?合ã?ここでもã?viewNumberType="delete" ã‚?
230             * æŒ?®šするå¿?¦�がありますã?
231             *
232             * @param   viewNumberType viewタグの番号列が出力されてã�?‚‹かかどã�?�‹
233             */
234            public void setViewNumberType( final String viewNumberType ) {
235                    tag.add( "viewNumberType",StringUtil.nval( getRequestParameter( viewNumberType ),null ) );
236            }
237    
238            /**
239             * 【TAG】ガントã?上下ずらし表示を行うかどã�?�‹[true/false]æŒ?®šしまã�?初期値=true:行う)
240             *
241             * @og.tag
242             * 通常のガント表示では、データは階段並べで表示されますã?
243             * 同ä¸?±žæ?のガントを横ä¸??に表示したã�??合ã?、この属æ?にã€?true" を指定しますã?
244             * (adjustGanttTable.jsの)初期値は、true:行う ですã?
245             *
246             * @param   verticalShift 上下ずらし表示を行うかどã�?�‹[true/false]
247             */
248            public void setVerticalShift( final String verticalShift ) {
249                    tag.add( "verticalShift",StringUtil.nval( getRequestParameter( verticalShift ), null ) );
250            }
251    
252            /**
253             * 【TAG】ガントバーの間ã?左区åˆ?‚Šスペã?スをピクセルでæŒ?®šしまã�?初期値:null)
254             *
255             * @og.tag
256             * ガント表示で、margeRows="true" (è¤?•°行ã?マã?ジを行う)場合ã?前後ã?ガントが同ä¸?‰²の
257             * 場合ã?くっつã�?�¦表示されますã?これをã?verticalShift="true" (ガントã?上下ずらし表示を行う)
258             * 場合ã?、å?ã€??バã?が判別可能ですが、そã�?�—たくなã�?‚±ースでは、å?ã€??判別ができませんã€?
259             * そこで、特殊なケースとして、å?ã€??判別が付く様に、ガントバーの長さを調整したã�?‚±ースã�?
260             * ありますã?
261             *
262             * こã?属æ?は、バーの左にæŒ?®šã?空æ¬?‚’用意しますã?
263             * 初期値は、null(属æ?をå?力しなã�? ですã?
264             *
265             * @og.rev 5.6.4.2 (2013/05/17) 新規追åŠ?
266             *
267             * @param   paddingLeft 左区åˆ?‚Šスペã?ス
268             * @see         #setPaddingRigth( String )
269             */
270            public void setPaddingLeft( final String paddingLeft ) {
271                    tag.add( "paddingLeft",StringUtil.nval( getRequestParameter( paddingLeft ),null ) );
272            }
273    
274            /**
275             * 【TAG】ガントバーの間ã?右区åˆ?‚Šスペã?スをピクセルでæŒ?®šしまã�?初期値:null)
276             *
277             * @og.tag
278             * ガント表示で、margeRows="true" (è¤?•°行ã?マã?ジを行う)場合ã?前後ã?ガントが同ä¸?‰²の
279             * 場合ã?くっつã�?�¦表示されますã?これをã?verticalShift="true" (ガントã?上下ずらし表示を行う)
280             * 場合ã?、å?ã€??バã?が判別可能ですが、そã�?�—たくなã�?‚±ースでは、å?ã€??判別ができませんã€?
281             * そこで、特殊なケースとして、å?ã€??判別が付く様に、ガントバーの長さを調整したã�?‚±ースã�?
282             * ありますã?
283             *
284             * こã?属æ?は、バーの右にæŒ?®šã?空æ¬?‚’用意しますã?
285             * 初期値は、null(属æ?をå?力しなã�? ですã?
286             *
287             * @og.rev 5.6.4.2 (2013/05/17) 新規追åŠ?
288             *
289             * @param   paddingRigth 左区åˆ?‚Šスペã?ス
290             * @see         #setPaddingLeft( String )
291             */
292            public void setPaddingRigth( final String paddingRigth ) {
293                    tag.add( "paddingRigth",StringUtil.nval( getRequestParameter( paddingRigth ),null ) );
294            }
295    
296            /**
297             * 【TAG】積上ガンãƒ?ガント部åˆ??表示を行うかどã�?�‹[true/false]æŒ?®šしまã�?初期値=true:表示する)
298             *
299             * @og.tag
300             * falseとするとガント部åˆ?‚’表示せず、積上げのみ表示しますã?
301             * (adjustGanttTable.jsの)初期値は、true:表示するã€?
302             *
303             * @param   viewGantt ガント部åˆ??表示を行うかどã�?�‹[true/false]
304             */
305            public void setViewGantt( final String viewGantt ) {
306                    tag.add( "viewGantt",StringUtil.nval( getRequestParameter( viewGantt ), null ) );
307            }
308    
309            /**
310             * 【TAG】積上ガンãƒ?休日に積上げるかどã�?�‹[true/false]æŒ?®šします(å?期å?=true:積上げã‚?
311             *
312             * @og.tag
313             * 休日に積上る場合ã?平日、休日を合わせた日数で、工数の平準化が行われますã?
314             * false:積上なã�?を指定したå?合ã?平日のみで工数が加算されますã?
315             * 積上ã?、日付関係ã?場å�?zoom=DAY)のみ有効で、時間単位ã?積上機è?はありませんã€?
316             * (adjustGanttTable.jsの)初期値は、true:積上げるã?
317             *
318             * @param   stackHoliday ガントã?表示を行うかどã�?�‹[true/false]
319             */
320            public void setStackHoliday( final String stackHoliday ) {
321                    tag.add( "stackHoliday",StringUtil.nval( getRequestParameter( stackHoliday ), null ) );
322            }
323    
324            /**
325             * 【TAG】ä¸?¦§の背景色の縞ã?模様を再作æ?するか[true/false]æŒ?®šしまã�?初期値:true)
326             *
327             * @og.tag
328             * 背景色の縞ã?模æ§?ゼブラ模æ§?を作æ?する場合ã?ã€?true" にセãƒ?ƒˆしますã?
329             * margeRows='true'の場合ã?使用しますã?
330             * (adjustGanttTable.jsの)初期値は、true:再作æ?するã€?
331             *
332             * @param   useBgColor 背景色ゼブラを行うかどã�?�‹[true/false]
333             * @see         #setMargeRows( String )
334             */
335            public void setUseBgColor( final String useBgColor ) {
336                    tag.add( "useBgColor",StringUtil.nval( getRequestParameter( useBgColor ), null ) );
337            }
338    
339            /**
340             * 【TAG】積上ガンãƒ?積上げ高さの計算方法[0:設定å?基æº?1:æœ?¤§値基準]æŒ?®šします(å?期å?:1:æœ?¤§値基準ï¼?
341             *
342             * @og.tag
343             * 積上ガントã?大きさをã?設定å?を基準にするかã?æœ?¤§値を基準にするか指定しますã?
344             * 1:æœ?¤§値基準ã?ã€?«˜さ固定とè€?�ˆられますã?つまりã?積上ガントã?æœ?¤§ã�?.0の場合ã?
345             * 設定å?がã?0.1 ならã?0.1 åˆ??値としてつみあがりますã??‘00å?çŽ?�§の表示に適してã�?�¾すã?
346             * 0:設定å?基準ã?ã€?«˜さ可変ですã?つまりã?積上ガントã?設定å?のæœ?¤§ã�?0.2 の場合ã?
347             * 0.1 ならã?半å?のæ‰?�¾で積みあがりますã?値にæœ?¤§値がなくã?å�?©�上結果の相対レベルã�?
348             * 見たã�??合にã€?�©してã�?�¾すã?
349             * 
350             * 0:能力設定å?を基準に積上げ高さの計算を行うã€?
351             * 1:行ã?æœ?¤§値を基準に積上げ高さの計算を行うã€?
352             * (adjustGanttTable.jsの)初期値はã€?:æœ?¤§値基æº?ですã?
353             *
354             * @param   viewMode 積上げ高さの計算方法[0:設定å?基æº?1:æœ?¤§値基準]
355             */
356            public void setViewMode( final String viewMode ) {
357                    tag.add( "viewMode",StringUtil.nval( getRequestParameter( viewMode ),null ) );
358            }
359    
360            /**
361             * 【TAG】積上ガンãƒ?正常ç¯?›²の上限となる工数を指定しまã�?初期値:1)ã€?
362             *
363             * @og.tag
364             * 正常ç¯?›²の上限となる工数をè¶?�ˆると積上げの色が変化しますã?
365             * (adjustGanttTable.jsの)初期値はã€? ですã?
366             *
367             * @param   stdUpper 正常ç¯?›²の上限となる工数
368             * @see         #setStdCost( String )
369             */
370            public void setStdUpper( final String stdUpper ) {
371                    tag.add( "stdUpper",StringUtil.nval( getRequestParameter( stdUpper ),null ) );
372            }
373    
374            /**
375             * 【TAG】積上ガンãƒ?行ã?2/3の高さとなる工数を指定しまã�?初期値:1)ã€?
376             *
377             * @og.tag
378             * 正常ç¯?›²の上限をå?期å?の "1" に設定し、この値をå?期å?の "1" を使ã�?�¨ã€?
379             * "1" の高さは、行ã?2/3の高さになるよã�?�«計算されますã?つまりã?オーバã?åˆ??ã€?
380             * 全体ã? 1/3 以下ã?場合に、ちã‚?�†ど良ã�?„Ÿじになりますã?
381             * オーバã?する量との関係でæŒ?®šしますã?
382             * (adjustGanttTable.jsの)初期値はã€? ですã?
383             *
384             * @param   stdCost 行ã?2/3の高さとなる工数
385             * @see         #setStdUpper( String )
386             */
387            public void setStdCost( final String stdCost ) {
388                    tag.add( "stdCost",StringUtil.nval( getRequestParameter( stdCost ),null ) );
389            }
390    
391            /**
392             * 【TAG】積上ガンãƒ?正常ç¯?›²の下限となる工数を指定しまã�?初期値:0)ã€?
393             *
394             * @og.tag
395             * 正常ç¯?›²の下限となる工数を下回ると積上げの色が変化しますã?
396             * (adjustGanttTable.jsの)初期値はã€? ですã?
397             *
398             * @param   stdLower 背景色ゼブラを行うかどã�?�‹[true/false]
399             */
400            public void setStdLower( final String stdLower ) {
401                    tag.add( "stdLower",StringUtil.nval( getRequestParameter( stdLower ),null ) );
402            }
403    
404            /**
405             * タグの名称をã?返しますã?
406             * 自åˆ??身のクラス名よりã?自動的に取り出せなã�?�Ÿめã?こã?メソãƒ?ƒ‰をオーバã?ライドしますã?
407             *
408             * @return  タグの名称
409             */
410            @Override
411            protected String getTagName() {
412                    return "iGantt" ;
413            }
414    
415            /**
416             * こã?オブジェクトã?æ–?­—å?表現を返しますã?
417             * 基本çš?�«ãƒ?ƒ�ãƒ?‚°目çš?�«使用しますã?
418             *
419             * @return こã?クラスのæ–?­—å?表現
420             */
421            @Override
422            public String toString() {
423                    return org.opengion.fukurou.util.ToString.title( this.getClass().getName() )
424                                    .println( "VERSION"             ,VERSION        )
425                                    .println( "tag"                 ,tag.makeTag()  )
426                                    .println( "Other..."    ,getAttributes().getAttribute() )
427                                    .fixForm().toString() ;
428            }
429    }