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