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.fukurou.util.StringUtil;
021import org.opengion.fukurou.util.TagBuffer;
022
023/**
024 * 明細棒グラフ(横棒、縦棒)に使用します。
025 *
026 * iBar タグは、TDタグの繰返し部に記述することで、横棒、縦棒グラフを作成します。
027 * 使用するには、headタグで、xxxx ="true" を設定する必要があります。
028 * これにより、common/option/adjustBar.js が読み込まれます。
029 * 
030 * type は、グラフ要素の表示形式を指定します。0〜9 が予約語で、0,1,2,6 が現時点で実装済みです。
031 *    0:ラベル表示 1:横棒 2:差分枠 6:縦棒
032 *
033 * <table border="1" frame="box" rules="all">
034 *   <caption>棒グラフ 描画方向</caption>
035 *   <tr><th colspan="2">横方向描画                  </th><th colspan="2">縦方向描画   </th></tr>
036 *   <tr><td>0</td><td>ラベル表示(比率、進捗率など)</td><td>5</td><td>(保留  未実装) </td></tr>
037 *   <tr><td>1</td><td>横棒                          </td><td>6</td><td>縦棒           </td></tr>
038 *   <tr><td>2</td><td>差分枠                        </td><td>7</td><td>(保留  未実装) </td></tr>
039 *   <tr><td>3</td><td>(保留  未実装)                </td><td>8</td><td>(保留  未実装) </td></tr>
040 *   <tr><td>4</td><td>(保留  未実装)                </td><td>9</td><td>(保留  未実装) </td></tr>
041 * </table>
042 *
043 * value は、位置、長さを設定します。設定方法は、type 毎に異なります。
044 * baseVal は、グラフ要素の描画開始位置を設定します。
045 * type=2:差分枠 は、value > baseVal の場合は、超過を、value < baseValの場合は、不足を表します。
046 * <table border="1" frame="box" rules="all">
047 *   <caption>type 別設定方法</caption>
048 *   <tr><th>type</th><th>設定値           </th><th>説明           </th></tr>
049 *   <tr><td>0   </td><td>[V1]             </td><td>xx% または 0.xx の比率を設定する。(一つのみ) , 描画位置=baseValの各カラムの合計値 * カラムV1の値</td></tr>
050 *   <tr><td>1   </td><td>[V1],[V2],…,[Vn]</td><td>棒の長さ=[V1],[V2],…,[Vn]各カラムの合計値</td></tr>
051 *   <tr><td>2   </td><td>[V1],[V2],…,[Vn]</td><td>描画位置=baseValの各カラムの合計値 , 差分枠の長さ=valueの各カラムの合計値 - baseValの各カラム合計値</td></tr>
052 *   <tr><td>6   </td><td>[V1],[V2],…,[Vn]</td><td>棒の長さ=[V1],[V2],…,[Vn]各カラムの合計値</td></tr>
053 * </table>
054 * 
055 * color は、棒グラフ要素(type="1"(横棒),"6"(縦棒))の色コードを設定します。
056 *       このコードは、予め決められた色画像を呼び出しますので、任意の色が使えるという事ではありません。
057 * <table border="1" frame="box" rules="all">
058 *   <caption>色番号 対応表</caption>
059 *   <tr><th>色番号</th><th>設定値 </th><th>棒色  </th><th> </th><th>横棒サンプル</th><th>縦棒サンプル</th></tr>
060 *   <tr><td> 0</td><td>blue  </td><td>青  </td><td> </td><td style="background-image:url(../image/W_blue.png);">   </td><td style="background-image:url(../image/H_blue.png);">   </td></tr>
061 *   <tr><td> 1</td><td>black </td><td>黒  </td><td> </td><td style="background-image:url(../image/W_black.png);">   </td><td style="background-image:url(../image/H_black.png);">   </td></tr>
062 *   <tr><td> 2</td><td>brown </td><td>茶  </td><td> </td><td style="background-image:url(../image/W_brown.png);">   </td><td style="background-image:url(../image/H_brown.png);">   </td></tr>
063 *   <tr><td> 3</td><td>green </td><td>緑  </td><td> </td><td style="background-image:url(../image/W_green.png);">   </td><td style="background-image:url(../image/H_green.png);">   </td></tr>
064 *   <tr><td> 4</td><td>lightblue </td><td>薄青  </td><td> </td><td style="background-image:url(../image/W_lightblue.png);">  </td><td style="background-image:url(../image/H_lightblue.png);">  </td></tr>
065 *   <tr><td> 5</td><td>lightgreen </td><td>薄緑  </td><td> </td><td style="background-image:url(../image/W_lightgreen.png);">  </td><td style="background-image:url(../image/H_lightgreen.png);">  </td></tr>
066 *   <tr><td> 6</td><td>orange </td><td>オレンジ </td><td> </td><td style="background-image:url(../image/W_orange.png);">  </td><td style="background-image:url(../image/H_orange.png);">  </td></tr>
067 *   <tr><td> 7</td><td>pink  </td><td>ピンク </td><td> </td><td style="background-image:url(../image/W_pink.png);">   </td><td style="background-image:url(../image/H_pink.png);">   </td></tr>
068 *   <tr><td> 8</td><td>purple </td><td>紫  </td><td> </td><td style="background-image:url(../image/W_purple.png);">  </td><td style="background-image:url(../image/H_purple.png);">  </td></tr>
069 *   <tr><td> 9</td><td>red  </td><td>赤  </td><td> </td><td style="background-image:url(../image/W_red.png);">   </td><td style="background-image:url(../image/H_red.png);">   </td></tr>
070 *   <tr><td> 10</td><td>yellow </td><td>黄  </td><td> </td><td style="background-image:url(../image/W_yellow.png);">  </td><td style="background-image:url(../image/H_yellow.png);">  </td></tr>
071 *   <tr><td> 11</td><td>navy  </td><td>濃紺  </td><td> </td><td style="background-image:url(../image/W_navy.png);">   </td><td style="background-image:url(../image/H_navy.png);">   </td></tr>
072 *   <tr><td> 12</td><td>teal  </td><td>青緑  </td><td> </td><td style="background-image:url(../image/W_teal.png);">   </td><td style="background-image:url(../image/H_teal.png);">   </td></tr>
073 *   <tr><td> 13</td><td>gray  </td><td>灰  </td><td> </td><td style="background-image:url(../image/W_gray.png);">   </td><td style="background-image:url(../image/H_gray.png);">   </td></tr>
074 *   <tr><td> 14</td><td>indigo </td><td>藍  </td><td> </td><td style="background-image:url(../image/W_indigo.png);">  </td><td style="background-image:url(../image/H_indigo.png);">  </td></tr>
075 *   <tr><td> 15</td><td>slategray </td><td>鉄色  </td><td> </td><td style="background-image:url(../image/W_slategray.png);">  </td><td style="background-image:url(../image/H_slategray.png);">  </td></tr>
076 *   <tr><td> 16</td><td>chocorlate </td><td>チョコレート </td><td> </td><td style="background-image:url(../image/W_chocorlate.png);">  </td><td style="background-image:url(../image/H_chocorlate.png);">  </td></tr>
077 *   <tr><td> 17</td><td>darkgreen </td><td>深緑  </td><td> </td><td style="background-image:url(../image/W_darkgreen.png);">  </td><td style="background-image:url(../image/H_darkgreen.png);">  </td></tr>
078 *   <tr><td> 18</td><td>violet </td><td>すみれ </td><td> </td><td style="background-image:url(../image/W_violet.png);">  </td><td style="background-image:url(../image/H_violet.png);">  </td></tr>
079 *   <tr><td> 19</td><td>darkslategray</td><td>深鉄色 </td><td> </td><td style="background-image:url(../image/W_darkslategray.png);">  </td><td style="background-image:url(../image/H_darkslategray.png);">  </td></tr>
080 *   <tr><td> 20</td><td>lime  </td><td>緑  </td><td> </td><td style="background-image:url(../image/W_lime.png);">   </td><td style="background-image:url(../image/H_lime.png);">   </td></tr>
081 *   <tr><td> 21</td><td>aqua  </td><td>水色  </td><td> </td><td style="background-image:url(../image/W_aqua.png);">   </td><td style="background-image:url(../image/H_aqua.png);">   </td></tr>
082 *   <tr><td> 22</td><td>maroon </td><td>ひわだいろ </td><td> </td><td style="background-image:url(../image/W_maroon.png);">  </td><td style="background-image:url(../image/H_maroon.png);">  </td></tr>
083 *   <tr><td> 23</td><td>olive </td><td>オリーブ </td><td> </td><td style="background-image:url(../image/W_olive.png);">   </td><td style="background-image:url(../image/H_olive.png);">   </td></tr>
084 *   <tr><td> 24</td><td>silver </td><td>銀  </td><td> </td><td style="background-image:url(../image/W_silver.png);">  </td><td style="background-image:url(../image/H_silver.png);">  </td></tr>
085 *   <tr><td> 25</td><td>fuchsia </td><td>赤紫  </td><td> </td><td style="background-image:url(../image/W_fuchsia.png);">  </td><td style="background-image:url(../image/H_fuchsia.png);">  </td></tr>
086 *   <tr><td>  </td><td>  </td><td>  </td><td> </td><td>         </td><td>         </td></tr>
087 *   <tr><td> BK</td><td>black2 </td><td>黒  </td><td> </td><td style="background-image:url(../image/W_black2.png);">  </td><td style="background-image:url(../image/H_black2.png);">  </td></tr>
088 *   <tr><td> WT</td><td>white2 </td><td>白  </td><td> </td><td style="background-image:url(../image/W_white2.png);">  </td><td style="background-image:url(../image/H_white2.png);">  </td></tr>
089 *   <tr><td> BL</td><td>blue2 </td><td>青  </td><td> </td><td style="background-image:url(../image/W_blue2.png);">   </td><td style="background-image:url(../image/H_blue2.png);">   </td></tr>
090 *   <tr><td> RD</td><td>red2  </td><td>赤  </td><td> </td><td style="background-image:url(../image/W_red2.png);">   </td><td style="background-image:url(../image/H_red2.png);">   </td></tr>
091 *   <tr><td> YL</td><td>yellow2 </td><td>黄  </td><td> </td><td style="background-image:url(../image/W_yellow2.png);">  </td><td style="background-image:url(../image/H_yellow2.png);">  </td></tr>
092 * </table>
093 *
094 * colorNo 色番号は、色コードを直接指定するのではなく、番号で指定する場合に使用します。
095 *         棒グラフ要素(type="1"(横棒),"6"(縦棒))の色を設定します。
096 *         "1〜25 , BK,WT,BL,RD,YL" の色番号で指定します。
097 *         色番号は、与えた数字を内部色数で割り算した余を使用しますので、連番の場合でも
098 *         繰返し使われます。特殊な色として、BK,WT,BL,RD,YLは、番号ではなく記号で指定できます。
099 * 
100 * zeroBorder は、"true" で、値がゼロの時にも、最小のバーを表示する。
101 * 
102 * graphThick は、グラフのバーの幅を指定します。
103 *
104 * @og.formSample
105 * ●形式:&lt;og:iBar  ... /&gt;
106 * ●body:なし
107 * ●前提:headタグで、adjustEvent="Bar" を指定してください。
108 *
109 * ●Tag定義:
110 *   &lt;og:iBar
111 *       type               【TAG】グラフ要素の表示形式を設定(0:ラベル表示 1:横棒 2:差分枠 6:縦棒)(必須)
112 *       value              【TAG】グラフ要素の位置、長さを設定(typeにより設定方法が異なる)(必須)
113 *       baseVal            【TAG】グラフ要素の描画開始位置を設定(type=0,2の場合必須)
114 *       color              【TAG】棒グラフ要素(type="1"(横棒),"6"(縦棒))の色コードを設定する。
115 *       colorNo            【TAG】"1〜25 , BK,WT,BL,RD,YL" の色番号を設定する。
116 *       text               【TAG】バー上に表示するテキストを指定します。
117 *       href               【TAG】リンク作成時の値を設定します。
118 *       target             【TAG】リンク作成時のターゲット名を指定します。
119 *       optionAttributes   【TAG】 {kay:val,key:val} 形式で、属性を追加します。
120 *       zeroBorder         【TAG】最小のバーを表示するかどうか[true/false]を指定します(初期値:false)
121 *       graphThick         【TAG】グラフのバーの幅を指定します。
122 *       paddingLeft        【TAG】ガントバーの間の左区切りスペースを指定します(初期値=null)
123 *       paddingRigth       【TAG】ガントバーの間の右区切りスペースを指定します(初期値=null)
124 *       debug              【TAG】デバッグ情報を出力するかどうか[true/false]を指定します(初期値:false)
125 *   /&gt;
126 *
127 * ●使用例
128 *    &lt;og:view command="{&#064;command}" /&gt;
129 *      &lt;og:tbody rowspan="1" &gt;
130 *        &lt;tr&gt;
131 *          &lt;og:td&gt;
132 *            &lt;og:iBar
133 *                  type    = "X"
134 *                  value   = "[V1],[V2],…,[Vn]"
135 *                  baseVal = "[BV1],[BV2],…,[BVn]"
136 *                  color   = "C1,C2,…,Cn"
137 *            /&gt;
138 *        &lt;/td&gt; &lt;/tr&gt;
139 *      &lt;/og:tbody&gt;
140 *    &lt;/og:view&gt;
141 *
142 * @og.rev 5.6.3.2 (2013/04/12) 新規作成
143 * @og.group 画面部品
144 *
145 * @version  5.0
146 * @author       Kazuhiko Hasegawa
147 * @since    JDK1.7,
148 */
149public class ViewIBarTag extends CommonTagSupport {
150        //* このプログラムのVERSION文字列を設定します。   {@value} */
151        private static final String VERSION = "5.6.4.3 (2013/05/24)" ;
152
153        private static final long serialVersionUID = 564320130524L ;
154
155        /** type 引数に渡す事の出来る タイプリスト  */
156        private static final String[] TYPE_LIST = new String[] { "0" , "1" , "2" , "6" };
157
158        private TagBuffer tag = new TagBuffer( "iBar" ) ;
159
160        // ページ内の iBar タグのid設定用のユニーク番号。
161        // java.util.concurrent.atomic.AtomicInteger を使うまでもない。
162        private static int tagId = 100;
163
164        /**
165         * Taglibの終了タグが見つかったときに処理する doEndTag() を オーバーライドします。
166         *
167         * @og.rev 5.8.1.0 (2014/11/07) HTML5対応。javaScriptで、BODYがないと入れ子になってしまう。
168         * @return      後続処理の指示
169         */
170        @Override
171        public int doEndTag() {
172                debugPrint();           // 4.0.0 (2005/02/28)
173
174                tag.add( "id",getTagId() );
175
176                tag.setBody( "<!-- -->" );                // 5.8.1.0 (2014/11/07) HTML5対応。
177                jspPrint( tag.makeTag() );
178
179                return(EVAL_PAGE);              // ページの残りを評価する。
180        }
181
182        /**
183         * タグリブオブジェクトをリリースします。
184         * キャッシュされて再利用されるので、フィールドの初期設定を行います。
185         *
186         */
187        @Override
188        protected void release2() {
189                super.release2();
190                tag = new TagBuffer( "iBar" );
191        }
192
193        /**
194         * 【TAG】グラフ要素の表示形式を設定(0:ラベル表示 1:横棒 2:差分枠 6:縦棒)します(必須)。
195         *
196         * @og.tag
197         * type は、グラフ要素の表示形式を指定します。0〜9 が予約語で、0,1,2,6 が現時点で実装済みです。
198         * 0:ラベル表示 1:横棒 2:差分枠 6:縦棒
199         *
200         * @param   type グラフ要素の表示形式[0:ラベル表示 1:横棒 2:差分枠 6:縦棒]
201         */
202        public void setType( final String type ) {
203                String tmpType = StringUtil.nval( getRequestParameter( type ),null );
204
205                if( tmpType == null || !check( tmpType, TYPE_LIST ) ) {
206                        String errMsg = "指定の表示形式(type)は必須か、または、指定の値のみ登録可能です。"
207                                                        + HybsSystem.CR
208                                                        + "type=[" + tmpType + "] "
209                                                        + HybsSystem.CR
210                                                        + "登録可能な値=" + StringUtil.array2csv( TYPE_LIST ) ;
211                        throw new HybsSystemException( errMsg );
212                }
213
214                tag.add( "type",tmpType );
215        }
216
217        /**
218         * 【TAG】グラフ要素の位置、長さを設定します(typeにより設定方法が異なる)(必須)
219         *
220         * @og.tag
221         * value は、グラフ要素の位置、長さを設定します。設定方法は、type 毎に異なります。
222         * baseVal は、グラフ要素の描画開始位置を設定します。
223         * type=2:差分枠 は、value > baseVal の場合は、超過を、value < baseValの場合は、不足を表します。
224         * <table border="1" frame="box" rules="all">
225         *   <caption>グラフのtype別設定方法</caption>
226         *   <tr><th>type</th><th>設定値           </th><th>説明           </th></tr>
227         *   <tr><td>0   </td><td>[V1]             </td><td>xx% または 0.xx の比率を設定する。(一つのみ), 描画位置=baseValの各カラムの合計値 * カラムV1の値</td></tr>
228         *   <tr><td>1   </td><td>[V1],[V2],…,[Vn]</td><td>棒の長さ=[V1],[V2],…,[Vn]各カラムの合計値</td></tr>
229         *   <tr><td>2   </td><td>[V1],[V2],…,[Vn]</td><td>描画位置=baseValの各カラムの合計値 , 差分枠の長さ=valueの各カラムの合計値 - baseValの各カラム合計値</td></tr>
230         *   <tr><td>6   </td><td>[V1],[V2],…,[Vn]</td><td>棒の長さ=[V1],[V2],…,[Vn]各カラムの合計値</td></tr>
231         * </table>
232         *
233         * @param   val グラフ要素の位置、長さ
234         */
235        public void setValue( final String val ) {
236                String tmpVal = StringUtil.nval( getRequestParameter( val ),null );
237
238                if( tmpVal == null ) {
239                        String errMsg = "value は、必須です。";
240                        throw new HybsSystemException( errMsg );
241                }
242
243                tag.add( "value",tmpVal );
244        }
245
246        /**
247         * 【TAG】グラフ要素の描画開始位置を設定します。
248         *
249         * @og.tag
250         * この値は、type=0,2の場合、必須になります。
251         * type=2:差分枠 は、value > baseVal の場合は、超過を、value < baseValの場合は、不足を表します。
252         * <table border="1" frame="box" rules="all">
253         *   <caption>グラフのtype別設定方法</caption>
254         *   <tr><th>type</th><th>設定値           </th><th>説明           </th></tr>
255         *   <tr><td>0   </td><td>[V1]             </td><td>xx% または 0.xx の比率を設定する。(一つのみ) , 描画位置=baseValの各カラムの合計値 * カラムV1の値</td></tr>
256         *   <tr><td>2   </td><td>[V1],[V2],…,[Vn]</td><td>描画位置=baseValの各カラムの合計値 , 差分枠の長さ=valueの各カラムの合計値 - baseValの各カラム合計値</td></tr>
257         * </table>
258         *
259         * @param   bval グラフ要素の描画開始位置
260         */
261        public void setBaseVal( final String bval ) {
262                tag.add( "baseVal",StringUtil.nval( getRequestParameter( bval ), null ) );
263        }
264
265        /**
266         * 【TAG】棒グラフ要素(type="1"(横棒),"6"(縦棒))の色コードを設定します。
267         *
268         * @og.tag
269         * color は、棒グラフ要素(type="1"(横棒),"6"(縦棒))の色コードを設定します。
270         * このコードは、予め決められた色画像を呼び出しますので、任意の色が使えるという事ではありません。
271         * 色指定は、横棒の場合は、image/W_色コード.png で、縦棒の場合は、image/H_色コード.png の画像を使います。
272         * 色コード と 色番号が同時に指定された場合は、色コード が優先されます。
273         *
274         * type=2:差分枠 は、value > baseVal の場合は、超過を、value < baseValの場合は、不足を表します。
275         * <table border="1" frame="box" rules="all">
276         *   <caption>色番号 対応表</caption>
277         *   <tr><th>色番号</th><th>設定値 </th><th>棒色  </th><th> </th><th>横棒サンプル</th><th>縦棒サンプル</th></tr>
278         *   <tr><td> 0</td><td>blue  </td><td>青  </td><td> </td><td style="background-image:url(../image/W_blue.png);">   </td><td style="background-image:url(../image/H_blue.png);">   </td></tr>
279         *   <tr><td> 1</td><td>black </td><td>黒  </td><td> </td><td style="background-image:url(../image/W_black.png);">   </td><td style="background-image:url(../image/H_black.png);">   </td></tr>
280         *   <tr><td> 2</td><td>brown </td><td>茶  </td><td> </td><td style="background-image:url(../image/W_brown.png);">   </td><td style="background-image:url(../image/H_brown.png);">   </td></tr>
281         *   <tr><td> 3</td><td>green </td><td>緑  </td><td> </td><td style="background-image:url(../image/W_green.png);">   </td><td style="background-image:url(../image/H_green.png);">   </td></tr>
282         *   <tr><td> 4</td><td>lightblue </td><td>薄青  </td><td> </td><td style="background-image:url(../image/W_lightblue.png);">  </td><td style="background-image:url(../image/H_lightblue.png);">  </td></tr>
283         *   <tr><td> 5</td><td>lightgreen </td><td>薄緑  </td><td> </td><td style="background-image:url(../image/W_lightgreen.png);">  </td><td style="background-image:url(../image/H_lightgreen.png);">  </td></tr>
284         *   <tr><td> 6</td><td>orange </td><td>オレンジ </td><td> </td><td style="background-image:url(../image/W_orange.png);">  </td><td style="background-image:url(../image/H_orange.png);">  </td></tr>
285         *   <tr><td> 7</td><td>pink  </td><td>ピンク </td><td> </td><td style="background-image:url(../image/W_pink.png);">   </td><td style="background-image:url(../image/H_pink.png);">   </td></tr>
286         *   <tr><td> 8</td><td>purple </td><td>紫  </td><td> </td><td style="background-image:url(../image/W_purple.png);">  </td><td style="background-image:url(../image/H_purple.png);">  </td></tr>
287         *   <tr><td> 9</td><td>red  </td><td>赤  </td><td> </td><td style="background-image:url(../image/W_red.png);">   </td><td style="background-image:url(../image/H_red.png);">   </td></tr>
288         *   <tr><td> 10</td><td>yellow </td><td>黄  </td><td> </td><td style="background-image:url(../image/W_yellow.png);">  </td><td style="background-image:url(../image/H_yellow.png);">  </td></tr>
289         *   <tr><td> 11</td><td>navy  </td><td>濃紺  </td><td> </td><td style="background-image:url(../image/W_navy.png);">   </td><td style="background-image:url(../image/H_navy.png);">   </td></tr>
290         *   <tr><td> 12</td><td>teal  </td><td>青緑  </td><td> </td><td style="background-image:url(../image/W_teal.png);">   </td><td style="background-image:url(../image/H_teal.png);">   </td></tr>
291         *   <tr><td> 13</td><td>gray  </td><td>灰  </td><td> </td><td style="background-image:url(../image/W_gray.png);">   </td><td style="background-image:url(../image/H_gray.png);">   </td></tr>
292         *   <tr><td> 14</td><td>indigo </td><td>藍  </td><td> </td><td style="background-image:url(../image/W_indigo.png);">  </td><td style="background-image:url(../image/H_indigo.png);">  </td></tr>
293         *   <tr><td> 15</td><td>slategray </td><td>鉄色  </td><td> </td><td style="background-image:url(../image/W_slategray.png);">  </td><td style="background-image:url(../image/H_slategray.png);">  </td></tr>
294         *   <tr><td> 16</td><td>chocorlate </td><td>チョコレート </td><td> </td><td style="background-image:url(../image/W_chocorlate.png);">  </td><td style="background-image:url(../image/H_chocorlate.png);">  </td></tr>
295         *   <tr><td> 17</td><td>darkgreen </td><td>深緑  </td><td> </td><td style="background-image:url(../image/W_darkgreen.png);">  </td><td style="background-image:url(../image/H_darkgreen.png);">  </td></tr>
296         *   <tr><td> 18</td><td>violet </td><td>すみれ </td><td> </td><td style="background-image:url(../image/W_violet.png);">  </td><td style="background-image:url(../image/H_violet.png);">  </td></tr>
297         *   <tr><td> 19</td><td>darkslategray</td><td>深鉄色 </td><td> </td><td style="background-image:url(../image/W_darkslategray.png);">  </td><td style="background-image:url(../image/H_darkslategray.png);">  </td></tr>
298         *   <tr><td> 20</td><td>lime  </td><td>緑  </td><td> </td><td style="background-image:url(../image/W_lime.png);">   </td><td style="background-image:url(../image/H_lime.png);">   </td></tr>
299         *   <tr><td> 21</td><td>aqua  </td><td>水色  </td><td> </td><td style="background-image:url(../image/W_aqua.png);">   </td><td style="background-image:url(../image/H_aqua.png);">   </td></tr>
300         *   <tr><td> 22</td><td>maroon </td><td>ひわだいろ </td><td> </td><td style="background-image:url(../image/W_maroon.png);">  </td><td style="background-image:url(../image/H_maroon.png);">  </td></tr>
301         *   <tr><td> 23</td><td>olive </td><td>オリーブ </td><td> </td><td style="background-image:url(../image/W_olive.png);">   </td><td style="background-image:url(../image/H_olive.png);">   </td></tr>
302         *   <tr><td> 24</td><td>silver </td><td>銀  </td><td> </td><td style="background-image:url(../image/W_silver.png);">  </td><td style="background-image:url(../image/H_silver.png);">  </td></tr>
303         *   <tr><td> 25</td><td>fuchsia </td><td>赤紫  </td><td> </td><td style="background-image:url(../image/W_fuchsia.png);">  </td><td style="background-image:url(../image/H_fuchsia.png);">  </td></tr>
304         *   <tr><td>  </td><td>  </td><td>  </td><td> </td><td>         </td><td>         </td></tr>
305         *   <tr><td> BK</td><td>black2 </td><td>黒  </td><td> </td><td style="background-image:url(../image/W_black2.png);">  </td><td style="background-image:url(../image/H_black2.png);">  </td></tr>
306         *   <tr><td> WT</td><td>white2 </td><td>白  </td><td> </td><td style="background-image:url(../image/W_white2.png);">  </td><td style="background-image:url(../image/H_white2.png);">  </td></tr>
307         *   <tr><td> BL</td><td>blue2 </td><td>青  </td><td> </td><td style="background-image:url(../image/W_blue2.png);">   </td><td style="background-image:url(../image/H_blue2.png);">   </td></tr>
308         *   <tr><td> RD</td><td>red2  </td><td>赤  </td><td> </td><td style="background-image:url(../image/W_red2.png);">   </td><td style="background-image:url(../image/H_red2.png);">   </td></tr>
309         *   <tr><td> YL</td><td>yellow2 </td><td>黄  </td><td> </td><td style="background-image:url(../image/W_yellow2.png);">  </td><td style="background-image:url(../image/H_yellow2.png);">  </td></tr>
310         * </table>
311         *
312         * @param   color グラフ要素の位置、長さ
313         */
314        public void setColor( final String color ) {
315                tag.add( "color",StringUtil.nval( getRequestParameter( color ),null ) );
316        }
317
318        /**
319         * 【TAG】グラフ要素の色番号を設定します。
320         *
321         * @og.tag
322         * 色番号は、色コードを直接指定するのではなく、番号で指定する場合に使用します。
323         * 棒グラフ要素(type="1"(横棒),"6"(縦棒))の色を設定します。
324         * "1〜25 , BK,WT,BL,RD,YL" の色番号で指定します。
325         * 色番号は、与えた数字を内部色数で割り算した余を使用しますので、連番の場合でも
326         * 繰返し使われます。特殊な色として、BK,WT,BL,RD,YLは、番号ではなく記号で指定できます。
327         * 色コード と 色番号が同時に指定された場合は、色コード が優先されます。
328         *
329         * @param   clrNo グラフ要素の描画開始位置
330         * @see         #setColor( String )
331         */
332        public void setColorNo( final String clrNo ) {
333                tag.add( "colorNo",StringUtil.nval( getRequestParameter( clrNo ),null ) );
334        }
335
336        /**
337         * 【TAG】バー上に表示するテキストを指定します。
338         *
339         * @og.tag
340         * バーの上に、値などの文字を重ねて表示できます。
341         *
342         * @param   text バー上に表示するテキスト
343         */
344        public void setText( final String text ) {
345                tag.add( "text",StringUtil.nval( getRequestParameter( text ),null ) );
346        }
347
348        /**
349         * 【TAG】リンク作成時の値を設定します。
350         *
351         * @og.tag
352         * バーの上の文字に対して、リンクを作成できます。
353         *
354         * @param   href バー上に表示するテキスト
355         * @see         #setTarget( String )
356         */
357        public void setHref( final String href ) {
358                tag.add( "href",StringUtil.nval( getRequestParameter( href ),null ) );
359        }
360
361        /**
362         * 【TAG】リンク作成時のターゲット名を指定します。
363         *
364         * @og.tag
365         * バーの上の文字に対して、リンクを作成するときの、ターゲット名を指定できます。
366         *
367         * @param   target リンク作成時のターゲット
368         * @see         #setHref( String )
369         */
370        public void setTarget( final String target ) {
371                tag.add( "target",StringUtil.nval( getRequestParameter( target ),null ) );
372        }
373
374        /**
375         * 【TAG】既定の属性以外の属性を追加します。
376         *
377         * @og.tag
378         * {kay:val,key:val} 形式で、属性を追加します。
379         *
380         * @param   optAtt 属性を追加
381         */
382        public void setOptionAttributes( final String optAtt ) {
383                tag.add( "optionAttributes",StringUtil.nval( getRequestParameter( optAtt ),null ) );
384        }
385
386        /**
387         * 【TAG】最小のバーを表示するかどうか[true/false]を指定します(初期値:false)
388         *
389         * @og.tag
390         * 設定値が、ゼロの場合に、バーを出したい場合は、true に、
391         * 何も出したくない場合は、false に設定します。
392         * 初期値は、false(バーを出さない) です。
393         *
394         * @param   zeroBorder 最小のバーを表示するかどうか[true/false]
395         */
396        public void setZeroBorder( final String zeroBorder ) {
397                tag.add( "zeroBorder",StringUtil.nval( getRequestParameter( zeroBorder ),null ) );
398        }
399
400        /**
401         * 【TAG】グラフのバーの幅を指定します。
402         *
403         * @og.tag
404         * 何も指定しない場合は、通常のバーの画像ファイルが適用されます。
405         *
406         * @param   graphThick グラフのバーの幅
407         */
408        public void setGraphThick( final String graphThick ) {
409                tag.add( "graphThick",StringUtil.nval( getRequestParameter( graphThick ),null ) );
410        }
411
412        /**
413         * 【TAG】バーの間の左区切りスペースをピクセルで指定します(初期値:null)
414         *
415         * @og.tag
416         * バー表示で連続して同じ色で繋げる場合、くっついて表示されます。
417         * これを、区別できるように、左区切りスペースをピクセルで指定します。
418         *
419         * 初期値は、null(属性を出力しない) です。
420         *
421         * @og.rev 5.6.4.3 (2013/05/24) 新規追加
422         *
423         * @param   paddingLeft 左区切りスペース
424         * @see         #setPaddingRigth( String )
425         */
426        public void setPaddingLeft( final String paddingLeft ) {
427                tag.add( "paddingLeft",StringUtil.nval( getRequestParameter( paddingLeft ),null ) );
428        }
429
430        /**
431         * 【TAG】バーの間の右区切りスペースをピクセルで指定します(初期値:null)
432         *
433         * @og.tag
434         * バー表示で連続して同じ色で繋げる場合、くっついて表示されます。
435         * これを、区別できるように、右区切りスペースをピクセルで指定します。
436         *
437         * 初期値は、null(属性を出力しない) です。
438         *
439         * @og.rev 5.6.4.3 (2013/05/24) 新規追加
440         *
441         * @param   paddingRigth 左区切りスペース
442         * @see         #setPaddingLeft( String )
443         */
444        public void setPaddingRigth( final String paddingRigth ) {
445                tag.add( "paddingRigth",StringUtil.nval( getRequestParameter( paddingRigth ),null ) );
446        }
447
448        /**
449         * iBar タグがユニークになるように id 値を返します。
450         *
451         * iBar は、レコードに複数作成されるため、まず、iBar作成都度のユニークIDと
452         * それをViewFormで展開後にユニークな番号になる様にするための行番号が組み合わされた
453         * ID が必要です。
454         * iBatXXX_[I] 形式のIDを作成します。
455         * 別スレッドによる同時アクセスで整合性が破綻(同じ番号が返る)しても、問題ありません。
456         *
457         * @return  ユニークな id 値
458         */
459        private static String getTagId() {
460                String id = "IBar" + ( tagId++ ) + "_[I]";
461
462                if( tagId > 999 ) { tagId = 100; }
463
464                return ( id );
465        }
466
467        /**
468         * タグの名称を、返します。
469         * 自分自身のクラス名より、自動的に取り出せないため、このメソッドをオーバーライドします。
470         *
471         * @return  タグの名称
472         */
473        @Override
474        protected String getTagName() {
475                return "iBar" ;
476        }
477
478        /**
479         * このオブジェクトの文字列表現を返します。
480         * 基本的にデバッグ目的に使用します。
481         *
482         * @return このクラスの文字列表現
483         */
484        @Override
485        public String toString() {
486                return org.opengion.fukurou.util.ToString.title( this.getClass().getName() )
487                                .println( "VERSION"             ,VERSION                )
488                                .println( "tag"                 ,tag.makeTag()  )
489                                .println( "Other..."    ,getAttributes().getAttribute() )
490                                .fixForm().toString() ;
491        }
492}