    001package org.opengion.hayabusa.taglib;
    002
    003import java.util.ArrayList;
    004import java.util.Arrays;
    005import java.util.List;
    006import java.util.Set;                                                                                   // 6.4.3.4 (2016/03/11)
    007import java.util.Iterator;                                                                              // 6.7.7.0 (2017/03/31)
    008import java.util.regex.Matcher;
    009import java.util.regex.Pattern;
    010
    011import org.opengion.hayabusa.db.DBTableModelSorter;
    012import org.opengion.hayabusa.db.DBTableModel;
    013import org.opengion.hayabusa.common.HybsSystem;
    014import org.opengion.hayabusa.common.HybsSystemException;
    015import org.opengion.hayabusa.db.DBColumn;                                               // 6.8.3.1 (2017/12/01)
    016
    017import org.opengion.hayabusa.io.JsChartData;
    018import org.opengion.fukurou.util.ArraySet;                                              // 6.4.3.4 (2016/03/11)
    019import org.opengion.fukurou.util.ToString;
    020import org.opengion.fukurou.util.StringUtil;                                    // 6.8.3.1 (2017/12/01)
    021import static org.opengion.fukurou.util.StringUtil.nval ;
    022
    023/**
    024 * JsChart は、JavascriptのjsChart用のｽｸﾘﾌﾟﾄを出力するクラスです。
    025 * 複数の JsChartData オブジェクトを合成することも、ここで行っています。
    026 * ChartJSを利用しているため、標準属性以外の項目をセットする場合はoptionAttributesで行ってください。
    027 * 例えばアニメーションをOFFにする場合はanimation:falseをセットします。
    028 *
    029 * 出力されるスクリプトでは、idを指定しない場合はhybscanvas[tableId]が利用されます。
    030 * 複数のグラフを同一画面で出力する場合はidかtableIdを変えてください。
    031 * チャートオブジェクトはchart_[id]という名前で作成されるため、ajax等でコントロールが必要な場合は利用してください。
    032 *
    033 * @og.formSample
    034 * ●形式：&lt;og:column chartType="…" ... /&gt;
    035 * ●body：あり(EVAL_BODY_BUFFERED:BODYを評価し、{$#064;XXXX} を解析します)
    036 *
    037 * ●Tag定義：
    038 *  &lt;og:jsChart
    039 *      chartType       ○【TAG】ﾁｬｰﾄの種類を指定します[line/bar/horizontalBar/radar/polarArea/pie/doughnut](必須)。
    040 *      labelColumn     ○【TAG】ﾗﾍﾞﾙのｶﾗﾑ名を指定します(表示名称）(必須)。
    041 *      id                【TAG】canvasﾀｸﾞのidを指定します(初期値:hybscanvas)。
    042 *      height            【TAG】ﾁｬｰﾄの高さを指定します(初期値:400)。
    043 *      width             【TAG】ﾁｬｰﾄの幅を指定します(初期値:400)。
    044 *      title             【TAG】ﾀｲﾄﾙを指定します。
    045 *      titlePosition     【TAG】ﾀｲﾄﾙの表示位置[top/right/bottom/left]を指定します(初期値:top)。
    046 *      legendDisplay     【TAG】凡例を表示するか[true/false]を指定します。
    047 *      legendPosition    【TAG】凡例の表示位置[top/right/bottom/left]を指定します(初期値:top)。
    048 *      barWidthPer       【TAG】棒線の横幅を指定します(初期値:0.8, typeがbar,horizontalBarの場合に有効)。
    049 *      onClick           【TAG】ﾁｬｰﾄｸﾘｯｸ時のｲﾍﾞﾝﾄを指定します。
    050 *      plugins           【TAG】プラグイン定義された関数を指定します。      // 6.9.9.2 (2018/09/18)
    051 *      usePointStyle     【TAG】点のスタイル属性を使用するかどうか[true/false]を指定します(初期値:null)。   // 6.8.5.0 (2018/01/09)
    052 *  ===================
    053 *      xscaleType        【TAG】x軸のｽｹｰﾙﾀｲﾌﾟ[category/linear]を指定します(初期値:category)。  6.9.9.3 (2018/09/25) time 廃止
    054 *      xlabel            【TAG】x軸のラベルを指定します。
    055 *      xscaleCallback    【TAG】x軸ｺｰﾙﾊﾞｯｸを指定します。
    056 *      xbeginAtZero      【TAG】x軸を０から書き始まるかどうか(初期値:true)                // 6.8.5.0 (2018/01/09)
    057 *      xmax              【TAG】x軸の最大値を指定します(xscaleTypeがlinearの場合に有効)。
    058 *      xmin              【TAG】x軸の最小値を指定します(xscaleTypeがlinearの場合に有効)。
    059 *      xstepSize         【TAG】x軸のメモリ幅を指定します(xscaleTypeがlinearの場合に有効)。
    060 *  ===================
    061 *      timeUnit          【廃止】x軸のﾀｲﾑの単位[year/quarter/month/week/day/hour/minute/second/millsecond]を指定します(xscaleTypeがtimeの場合に有効。指定しない場合は自動)。
    062 *      timeUnitStepSize  【廃止】x軸のﾀｲﾑの単位幅を指定します。(xscaleTypeがtimeの場合に有効)
    063 *      timeSetFormat     【廃止】x軸の設定するﾀｲﾑのﾌｫｰﾏｯﾄを指定します(xscaleTypeがtimeの場合に有効)。
    064 *      timeLblFormat     【廃止】x軸の表示するﾀｲﾑのﾌｫｰﾏｯﾄを指定します(xscaleTypeがtimeの場合に有効)。
    065 *      timeMax           【廃止】x軸のﾀｲﾑの最大値を指定します(xscaleTypeがtimeの場合に有効)。
    066 *      timeMin           【廃止】x軸のﾀｲﾑの最小値を指定します(xscaleTypeがtimeの場合に有効)。
    067 *  ===================
    068 *      yscaleType        【TAG】y軸のｽｹｰﾙﾀｲﾌﾟ[linear/category]を指定します(初期値:linear)。
    069 *      ylabel            【TAG】y軸のラベルを指定します。
    070 *      yscaleCallback    【TAG】y軸ｺｰﾙﾊﾞｯｸを指定します。
    071 *      ybeginAtZero      【TAG】y軸を０から書き始まるかどうか(初期値:true)(円形の場合もこの値)             // 6.8.5.0 (2018/01/09)
    072 *      max               【TAG】y軸の最大値を指定します(yscaleTypeがlinearの場合に有効)。
    073 *      min               【TAG】y軸の最小値を指定します(yscaleTypeがlinearの場合に有効)。
    074 *      stepSize          【TAG】y軸のメモリ幅を指定します(yscaleTypeがlinearの場合に有効)。
    075 *      ycategoryList     【TAG】y軸のﾒﾓﾘﾘｽﾄをカンマ区切りで指定します(yscaleTypeがcategoryの場合に有効)
    076 *  ===================
    077 *      markValues        【TAG】マーカーラインの設定値をCSV形式で複数指定します        // 6.8.5.0 (2018/01/09)
    078 *      markColors        【TAG】マーカーラインの色をCSV形式で複数指定します          // 6.8.5.0 (2018/01/09)
    079 *      markLbls          【TAG】マーカーラインのラベルをCSV形式で複数指定します(未指定時はラベルを表示しません)       // 6.8.5.0 (2018/01/09)
    080 *      markAdjust        【TAG】マーカーラインのラベル表示位置の上下方向を調整します(＋でラインの下側、－で上側に位置を移動します。初期値:-6)。       // 6.8.5.0 (2018/01/09)
    081 *  ===================
    082 *      useZoom           【TAG】ズーム処理を使用するかどうか[true/false]を指定します。        // 6.8.5.0 (2018/01/09)
    083 *  ===================
    084 *      widthEventColumn  【TAG】横幅を動機に設定するｶﾗﾑのIDを指定します。
    085 *      heightEventColumn 【TAG】縦幅を動的に設定するｶﾗﾑのIDを指定します。
    086 *      minEventColumn    【TAG】minを動的に設定するｶﾗﾑのIDを指定します。
    087 *      maxEventColumn    【TAG】maxを動的に設定するｶﾗﾑのIDを指定します。
    088 *  ===================
    089 *      useZeroDataOmit   【TAG】ﾃﾞｰﾀが０の場合、使用しない（除外する）かどうかを指定します[true:０ﾃﾞｰﾀを除外する](初期値:false)
    090 *      useRenderer       【TAG】データ出力でレンデラを利用するかどうか(初期値:false)
    091 *      sortColumn        【TAG】検索結果をこのカラムでソートしなおします(初期値:null)。
    092 *      optionAttributes  【TAG】optionsの属性に、その他ｵﾌﾟｼｮﾝを追加指定します。
    093 *      chartAttributes   【TAG】chartの属性に、TLDで未定義の属性を追加指定します。                                    // 6.9.9.2 (2018/09/18)
    094 *      tableid           【TAG】(通常は使いません)sessionから所得する DBTableModelオブジェクトの ID
    095 *      scope             【TAG】キャッシュする場合のスコープ[request/page/session/application]を指定します(初期値:session)
    096 *      caseKey           【TAG】このタグ自体を利用するかどうかの条件キーを指定します(初期値:null)
    097 *      caseVal           【TAG】このタグ自体を利用するかどうかの条件値を指定します(初期値:null)
    098 *      caseNN            【TAG】指定の値が、null/ゼロ文字列 でない場合(Not Null=NN)は、このタグは使用されます(初期値:判定しない)
    099 *      caseNull          【TAG】指定の値が、null/ゼロ文字列 の場合は、このタグは使用されます(初期値:判定しない)
    100 *      caseIf            【TAG】指定の値が、true/TRUE文字列の場合は、このタグは使用されます(初期値:判定しない)
    101 *      debug             【TAG】デバッグ情報を出力するかどうか[true/false]を指定します(初期値:false)
    102 *  &gt;   ... Body ...
    103 *  &lt;/og:jsChart&gt;
    104 *
    105 * ●使用例
    106 *      &lt;og:jsChart
    107 *          chartType      = "[line/bar/horizontalBar/radar/polarArea/pie/doughnut]"
    108 *          labelColumn    = "LDATA"
    109 *          id             = "hybscanvas"
    110 *          height         = "400"
    111 *          width          = "400"
    112 *          title          = "タイトル"
    113 *          titlePosition  = "top"                              [top/right/bottom/left]
    114 *          ylabel         = "給料"
    115 *          xlabel         = "名称"
    116 *          legendPosition = "right"                    [top/right/bottom/left]
    117 *          legendDisplay  = "true"                             [true/false]
    118 *          xsclaeCallback = "function(value){return value + ' 様';}"
    119 *          ysclaeCallback = "function(value){return value.toLocaleString();}"
    120 *          xscaleType     = "linear"
    121 *          max            = "1000000"
    122 *          min            = "100000"
    123 *          stepSize       = "10000"
    124 *          barWidthPer    = "0.4"
    125 *      &gt;
    126 *          &lt;og:jsChartData ... /&gt;
    127 *      &lt;/og:jsChart&gt;
    128 *
    129 * @og.group 画面表示
    130 *
    131 * @version     5.9.17.2                2017/02/08
    132 * @author      T.OTA
    133 * @since       JDK7.0
    134 *
    135 */
    136public class JsChartTag extends CommonTagSupport {
    137        //* このプログラムのVERSION文字列を設定します。{@value} */
    138        private static final String VERSION = "6.9.9.3 (2018/09/25)" ;
    139        private static final long serialVersionUID = 699320180925L ;
    140
    141        /** chartType 引数に渡す事の出来る タイプ 折れ線 {@value} **/
    142        public static final String              CTYPE_LINE                      = "line";
    143        /** chartType 引数に渡す事の出来る タイプ 棒線 {@value} **/
    144        public static final String              CTYPE_BAR                       = "bar";
    145        /** chartType 引数に渡す事の出来る タイプ 横棒線 {@value} **/
    146        public static final String              CTYPE_HBAR                      = "horizontalBar";
    147        /** chartType 引数に渡す事の出来る タイプ レイダー {@value} **/
    148        public static final String              CTYPE_RADAR                     = "radar";
    149        /** chartType 引数に渡す事の出来る タイプ ポーラエリア {@value} **/
    150        public static final String              CTYPE_PA                        = "polarArea";
    151        /** chartType 引数に渡す事の出来る タイプ 円 {@value} **/
    152        public static final String              CTYPE_PIE                       = "pie";
    153        /** chartType 引数に渡す事の出来る タイプ ドーナツ {@value} **/
    154        public static final String              CTYPE_DOUGHNUT          = "doughnut";
    155        /** chartType 引数に渡す事の出来る タイプ リスト {@value} */
    156
    157        private static final Set<String> CTYPE_SET = new ArraySet<>( CTYPE_LINE, CTYPE_BAR, CTYPE_HBAR, CTYPE_RADAR, CTYPE_PA, CTYPE_PIE, CTYPE_DOUGHNUT );
    158
    159        /** chartType が円形のリスト */
    160        private static final String[]   CTYPE_CI                = new String[] { CTYPE_RADAR, CTYPE_PA, CTYPE_PIE, CTYPE_DOUGHNUT };
    161
    162        private static final String TYPE_CATEGORY               = "category";
    163//      private static final String TYPE_TIME                   = "time";               // 6.9.9.3 (2018/09/25) xscaleType の time 属性廃止。
    164        private static final String TYPE_LINEAR                 = "linear";
    165
    166        private static final Set<String> SET_POSITION   = new ArraySet<>( "top", "right", "bottom", "left" );
    167//      private static final Set<String> SET_TIMEUNIT   = new ArraySet<>( "year", "quarter", "month", "week", "day", "hour", "minute", "second", "millsecond" );        // 6.9.9.3 (2018/09/25)
    168//      private static final Set<String> SET_XSCALE             = new ArraySet<>( TYPE_CATEGORY, TYPE_TIME, TYPE_LINEAR );              // 6.9.9.3 (2018/09/25) xscaleType の time 属性廃止。
    169        private static final Set<String> SET_XSCALE             = new ArraySet<>( TYPE_CATEGORY, TYPE_LINEAR );
    170        private static final Set<String> SET_YSCALE             = new ArraySet<>( TYPE_LINEAR, TYPE_CATEGORY );
    171        private static final Set<String> SET_BOOLEAN    = new ArraySet<>( "true", "false" );
    172
    173        private static final String     CANVAS_NAME             = "hybscanvas";
    174
    175        private static final String             MARK_DEF_COLOR  = "BLUE";               // 6.8.5.0 (2018/01/09) マーカーラインの色の初期値
    176        private static final String             MARK_DEF_ADJUST = "-6";                 // 6.8.5.0 (2018/01/09) マーカーラインの位置調整の初期値
    177
    178        // 変数宣言
    179        // 6.9.8.0 (2018/05/28) FindBugs:直列化可能クラスの非 transient で非直列化可能なインスタンスフィールド
    180        private final transient List<JsChartData>       jsChartData = new ArrayList<JsChartData>() ;            // 6.7.5.0 (2017/03/10) jsChartDataのﾘｽﾄ
    181
    182        private String  chartType                       ;                                                       // ﾁｬｰﾄﾀｲﾌﾟ(必須)
    183        private String  labelColumn                     ;                                                       // ﾗﾍﾞﾙｶﾗﾑ(必須)
    184        private String  id                                      ;                                                       // canvasﾀｸﾞのid
    185        private String  height                          = "400";                                        // canvasﾀｸﾞのheight
    186        private String  width                           = "400";                                        // canvasﾀｸﾞのwidth
    187        private String  title                           ;                                                       // ﾀｲﾄﾙ
    188        private String  titlePosition           ;                                                       // ﾀｲﾄﾙ位置
    189        private String  legendPosition          ;                                                       // 凡例位置
    190        private String  legendDisplay           ;                                                       // 凡例表示ﾌﾗｸﾞ
    191        private String  barWidthPer                     = "0.8";                                        // 棒線の横幅(ﾊﾟｰｾﾝﾄ)
    192        private String  onClick                         ;                                                       // ｸﾘｯｸｲﾍﾞﾝﾄ
    193        private String  plugins                         ;                                                       // 6.9.9.2 (2018/09/18) プラグイン定義された関数を指定します。
    194        private String  usePointStyle           ;                                                       // 6.8.5.0 (2018/01/09) 点のスタイル属性を使用するかどうか(初期値:false)
    195        private String  xlabel                          ;                                                       // x軸ﾗﾍﾞﾙ
    196        private String  xscaleCallback          ;                                                       // x軸のﾒﾓﾘ編集用ｺｰﾙﾊﾞｯｸ
    197        private String  xscaleType                      = TYPE_CATEGORY ;                       // x軸のｽｹｰﾙﾀｲﾌﾟ
    198        private boolean xbeginAtZero            = true;                                         //  6.8.5.0 (2018/01/09) x軸を０から書き始まるかどうか(初期値:true)
    199        private String  xmax                            ;                                                       // x軸の最大値(ﾘﾆｱｽｹｰﾙ用)
    200        private String  xmin                            ;                                                       // x軸の最小値(ﾘﾆｱｽｹｰﾙ用)
    201        private String  xstepSize                       ;                                                       // x軸のﾒﾓﾘ幅(ﾘﾆｱｽｹｰﾙ用)
    202//      private String  timeUnit                        ;                                                       // 時間の単位(ﾀｲﾑｽｹｰﾙ用)               // 6.9.9.3 (2018/09/25) xscaleType の time 属性廃止。
    203//      private String  timeUnitStepSize        ;                                                       // 時間のﾒﾓﾘ幅(ﾀｲﾑｽｹｰﾙ用)             // 6.9.9.3 (2018/09/25) xscaleType の time 属性廃止。
    204//      private String  timeSetFormat           ;                                                       // 時間の入力ﾌｫｰﾏｯﾄ(ﾀｲﾑｽｹｰﾙ用)         // 6.9.9.3 (2018/09/25) xscaleType の time 属性廃止。
    205//      private String  timeLblFormat           ;                                                       // 時間の表示ﾌｫｰﾏｯﾄ(ﾀｲﾑｽｹｰﾙ用)         // 6.9.9.3 (2018/09/25) xscaleType の time 属性廃止。
    206//      private String  timeMax                         ;                                                       // 最大の時間(ﾀｲﾑｽｹｰﾙ用)               // 6.9.9.3 (2018/09/25) xscaleType の time 属性廃止。
    207//      private String  timeMin                         ;                                                       // 最小の時間(ﾀｲﾑｽｹｰﾙ用)               // 6.9.9.3 (2018/09/25) xscaleType の time 属性廃止。
    208        private String  ylabel                          ;                                                       // y軸ﾗﾍﾞﾙ
    209        private String  yscaleCallback          ;                                                       // y軸のﾒﾓﾘ編集用ｺｰﾙﾊﾞｯｸ
    210        private String  yscaleType                      = TYPE_LINEAR;                          // y軸のｽｹｰﾙﾀｲﾌﾟ
    211        private String  stepSize                        ;                                                       // y軸のﾒﾓﾘ幅(ﾘﾆｱｽｹｰﾙ用)
    212        private String  ycategoryList           ;                                                       // y軸のｶﾃｺﾞﾘｰﾘｽﾄ(ｶﾃｺﾞﾘｰｽｹｰﾙ用)
    213        private boolean ybeginAtZero            = true;                                         //  6.8.5.0 (2018/01/09) y軸を０から書き始まるかどうか(初期値:true)(円形の場合もこの値)
    214        private String  max                                     ;                                                       // y軸の最大値(ﾘﾆｱｽｹｰﾙ用)
    215        private String  min                                     ;                                                       // y軸の最小値(ﾘﾆｱｽｹｰﾙ用)
    216        private String  tableId                         = HybsSystem.TBL_MDL_KEY;       // ﾃｰﾌﾞﾙid
    217        private String  markValues                      ;                                                       // 6.8.5.0 (2018/01/09) マーカーラインの設定値をCSV形式で複数指定します
    218        private String  markColors                      ;                                                       // 6.8.5.0 (2018/01/09) マーカーラインの色をCSV形式で複数指定します
    219        private String  markLbls                        ;                                                       // 6.8.5.0 (2018/01/09) マーカーラインのラベルをCSV形式で複数指定します(未指定時はラベルを表示しません)
    220        private String  markAdjust                      ;                                                       // 6.8.5.0 (2018/01/09) マーカーラインのラベル表示位置の上下方向を調整します(初期値:-6)。
    221        private boolean useZoom                         ;                                                       // 6.8.5.0 (2018/01/09) ズーム処理を使用するかどうか(初期値:false)
    222        private String  widthEventColumn        ;                                                       // 横幅の動的参照ｶﾗﾑ   2017/03/28 ADD
    223        private String  heightEventColumn       ;                                                       // 縦幅の動的参照ｶﾗﾑ   2017/03/28 ADD
    224        private String  minEventColumn          ;                                                       // 最小値の動的参照ｶﾗﾑ  2017/03/28 ADD
    225        private String  maxEventColumn          ;                                                       // 最大値の動的参照ｶﾗﾑ  2017/03/28 ADD
    226        private boolean useZeroDataOmit         ;                                                       // 6.7.7.0 (2017/03/31) ﾃﾞｰﾀが０の場合、使用しない（除外する）かどうか
    227        private boolean useRenderer                     ;                                                       // 6.7.9.0 (2017/04/28) useRenderer 追加
    228        private String  sortColumn                      ;                                                       // 6.8.0.0 (2017/06/02) 検索結果をこのカラムでソートしなおします(初期値:null)。
    229        private String  optionAttributes        ;                                                       // ｵﾌﾟｼｮﾝ
    230        private String  chartAttributes         ;                                                       // 6.9.9.2 (2018/09/18) chartの属性に、TLDで未定義の属性を追加指定します。
    231
    232        /**
    233         * デフォルトコンストラクター
    234         *
    235         * @og.rev 6.9.7.0 (2018/05/14) PMD Each class should declare at least one constructor
    236         */
    237        public JsChartTag() { super(); }                // これも、自動的に呼ばれるが、空のメソッドを作成すると警告されるので、明示的にしておきます。
    238
    239        /**
    240         * タグリブオブジェクトをリリースします。
    241         * キャッシュされて再利用されるので、フィールドの初期設定を行います。
    242         *
    243         * @og.rev 6.7.5.0 (2017/03/10) jsChartData属性の初期化もれ
    244         * @og.rev 5.9.19.0 (2017/04/07) T.OTA 61200-170316-02  ﾁｬｰﾄｻｲｽﾞ・max・minの動的変更対応
    245         * @og.rev 6.7.7.0 (2017/03/31) useZeroDataOmit属性の追加
    246         * @og.rev 6.7.9.0 (2017/04/28) useRenderer 追加
    247         * @og.rev 6.8.0.0 (2017/06/02) sortColumn 追加
    248         * @og.rev 6.8.3.0 (2017/11/27) useEqValOmit属性の追加
    249         * @og.rev 6.8.5.0 (2018/01/09) xbeginAtZero,ybeginAtZero,markValues,markColors,markLbls,markAdjust,rangeMin,rangeMax,usePointStyle属性の追加
    250         * @og.rev 6.9.9.2 (2018/09/18) plugins,chartAttributes属性の追加
    251         * @og.rev 6.9.9.3 (2018/09/25) xscaleType の time 属性廃止。
    252         */
    253        @Override
    254        protected void release2() {
    255                super.release2();
    256                jsChartData.clear();                            // 6.7.5.0 (2017/03/10)
    257                chartType                       = null;
    258                id                                      = null;
    259                height                          = "400";
    260                width                           = "400";
    261                labelColumn                     = null;
    262                title                           = null;
    263                titlePosition           = null;
    264                legendPosition          = null;
    265                legendDisplay           = null;
    266                barWidthPer                     = "0.8";
    267                onClick                         = null;
    268                plugins                         = null;         // 6.9.9.2 (2018/09/18) プラグイン定義された関数を指定します。
    269                usePointStyle           = null;         // 6.8.5.0 (2018/01/09) 点のスタイル属性を使用するかどうか
    270                xlabel                          = null;
    271                xscaleCallback          = null;
    272                xscaleType                      = TYPE_CATEGORY;
    273                xbeginAtZero            = true;         //  6.8.5.0 (2018/01/09) x軸を０から書き始まるかどうか(初期値:true)
    274                xmax                            = null;
    275                xmin                            = null;
    276                xstepSize                       = null;
    277//              timeUnit                        = null;         // 6.9.9.3 (2018/09/25) xscaleType の time 属性廃止。
    278//              timeUnitStepSize        = null;         // 6.9.9.3 (2018/09/25) xscaleType の time 属性廃止。
    279//              timeSetFormat           = null;         // 6.9.9.3 (2018/09/25) xscaleType の time 属性廃止。
    280//              timeLblFormat           = null;         // 6.9.9.3 (2018/09/25) xscaleType の time 属性廃止。
    281//              timeMax                         = null;         // 6.9.9.3 (2018/09/25) xscaleType の time 属性廃止。
    282//              timeMin                         = null;         // 6.9.9.3 (2018/09/25) xscaleType の time 属性廃止。
    283                ylabel                          = null;
    284                yscaleCallback          = null;
    285                yscaleType                      = TYPE_LINEAR;
    286                ycategoryList           = null;
    287                ybeginAtZero            = true;         //  6.8.5.0 (2018/01/09) y軸を０から書き始まるかどうか(初期値:true)(円形の場合もこの値)
    288                max                                     = null;
    289                min                                     = null;
    290                stepSize                        = null;
    291                tableId                         = HybsSystem.TBL_MDL_KEY;
    292                markValues                      = null;         // 6.8.5.0 (2018/01/09) マーカーラインの設定値をCSV形式で複数指定します
    293                markColors                      = null;         // 6.8.5.0 (2018/01/09) マーカーラインの色をCSV形式で複数指定します
    294                markLbls                        = null;         // 6.8.5.0 (2018/01/09) マーカーラインのラベルをCSV形式で複数指定します(未指定時はラベルを表示しません)
    295                markAdjust                      = null;         // 6.8.5.0 (2018/01/09) マーカーラインのラベル表示位置の上下方向を調整します(初期値:-6)。
    296                useZoom                         = false;        // 6.8.5.0 (2018/01/09) ズーム処理を使用するかどうか(初期値:false)
    297                widthEventColumn        = null;         // 5.9.19.0
    298                heightEventColumn       = null;         // 5.9.19.0
    299                maxEventColumn          = null;         // 5.9.19.0
    300                minEventColumn          = null;         // 5.9.19.0
    301                useZeroDataOmit         = false;        // 6.7.7.0 (2017/03/31) ﾃﾞｰﾀが０の場合、使用しない（除外する）かどうか
    302                useRenderer                     = false;        // 6.7.9.0 (2017/04/28) useRenderer 追加
    303                sortColumn                      = null;         // 6.8.0.0 (2017/06/02) 検索結果をこのカラムでソートしなおします(初期値:null)。
    304                optionAttributes        = null;
    305                chartAttributes         = null;         // 6.9.9.2 (2018/09/18) chartの属性に、TLDで未定義の属性を追加指定します。
    306        }
    307
    308        /**
    309         * Taglibの開始タグが見つかった時に処理する doStartTag() を オーバーライドします。
    310         *
    311         * @og.rev 6.7.5.0 (2017/03/10) タグの使用を決める共通属性の追加
    312         *
    313         * @return 後続処理の指示
    314         */
    315        @Override
    316        public int doStartTag() {
    317                if( !useTag() ) { return SKIP_BODY ; }          // 6.7.5.0 (2017/03/10)
    318
    319                // ﾁｪｯｸ処理の実行
    320                checkData();
    321
    322                return EVAL_BODY_BUFFERED; // Bodyを評価する
    323        }
    324
    325        /**
    326         * ﾁｪｯｸ処理。
    327         */
    328        private void checkData() {
    329                // xscaleTypeに「linear」、yscaleTypeに「category」を指定した場合は、エラー
    330                if( TYPE_LINEAR.equals( xscaleType ) && TYPE_CATEGORY.equals( yscaleType ) ) {
    331                        final StringBuilder errMsg = new StringBuilder( BUFFER_MIDDLE )
    332                                .append( "指定のｽｹｰﾙﾀｲﾌﾟの組み合わせは実行できません。" )
    333                                .append( CR )
    334                                .append( "xscaleType:" ).append( xscaleType ).append( " yscaleType:" ).append( yscaleType );
    335
    336                        throw new HybsSystemException( errMsg.toString() );
    337                }
    338        }
    339
    340        /**
    341         * Taglibの終了タグが見つかったときに処理する doEndTag() を オーバーライドします。
    342         *
    343         * @og.rev 6.7.5.0 (2017/03/10) タグの使用を決める共通属性の追加
    344         *
    345         * @return 後続処理の指示
    346         */
    347        @Override
    348        public int doEndTag() {
    349                debugPrint();
    350                if( !useTag() ) { return EVAL_PAGE ; }                  // 6.7.5.0 (2017/03/10)
    351
    352                id = (id==null ? CANVAS_NAME + tableId : id );  // id指定なしの場合はCANVAS_NAME+tableId
    353
    354                // jsChart出力
    355                jspPrint( jsChartOutput() );
    356
    357                return EVAL_PAGE;
    358        }
    359
    360        /**
    361         * jsChart出力用
    362         * jsChartTag と jsChartData を使用して、jsChart情報を出力します。
    363         *
    364         * @og.rev 5.9.19.0 (2017/04/07) T.OTA 61200-170316-02  ﾁｬｰﾄｻｲｽﾞ・max・minの動的変更対応
    365         * @og.rev 6.7.7.0 (2017/03/31) ﾁｬｰﾄﾃﾞｰﾀで、ｾﾞﾛ、null カラムを非表示にします。
    366         * @og.rev 6.7.9.0 (2017/04/28) useRenderer 追加
    367         * @og.rev 6.8.0.0 (2017/06/02) sortColumn 追加
    368         * @og.rev 6.8.3.0 (2017/11/27) useZeroDataOmit属性で、nullOmit属性もセットします。
    369         * @og.rev 6.8.3.0 (2017/11/27) useEqValOmit属性の追加
    370         * @og.rev 6.8.3.1 (2017/12/01) 不要なデータを出力しないようにします。
    371         * @og.rev 5.9.27.0 2017/12/01  T.OTA 61200-170831-04   max,minの小数点対応
    372         * @og.rev 6.8.5.0 (2018/01/09) xbeginAtZero,ybeginAtZero,markValues,markColors,markLbls,markAdjust,rangeMin,rangeMax,usePointStyle属性の追加
    373         * @og.rev 6.9.9.2 (2018/09/18) chart.jsが2.4.0から2.7.2にバージョンアップにより、廃止された属性対応
    374         * @og.rev 6.9.9.2 (2018/09/18) plugins,chartAttributes属性の追加
    375         * @og.rev 6.9.9.3 (2018/09/25) xscaleType の time 属性廃止。
    376         *
    377         * @return jsChert用文字列
    378         */
    379        private String jsChartOutput() {
    380                final StringBuilder rtn = new StringBuilder( BUFFER_MIDDLE );
    381
    382                // 各JavaScriptの変数名
    383                final String qd                 = "qd_" + id;           //queryData
    384                final String cd                 = "cd_" + id;           //chartData
    385                final String myChart    = "chart_"+id;
    386                final String lblClm             = labelColumn + id;
    387
    388                // JSON形式でﾃｰﾌﾞﾙ情報を取得
    389                // ﾃｰﾌﾞﾙ情報の取得
    390                // 6.8.0.0 (2017/06/02) sortColumn 追加
    391                DBTableModel table = (DBTableModel)getObject( tableId ) ;
    392                if( !StringUtil.isNull( sortColumn ) ) {                                                // 6.8.5.0 (2018/01/09)
    393                        final int clmNo = table.getColumnNo( sortColumn,false );        // エラーを出さない。
    394
    395                        final DBTableModelSorter temp = new DBTableModelSorter();
    396                        temp.setModel( (DBTableModel)getObject( tableId ) );
    397                        temp.sortByColumn( clmNo,true );                                                        // 順方向のソート
    398                        table = temp;
    399                }
    400
    401//              final int rowCount = table.getRowCount();                                               // 6.9.2.0 (2018/03/05)
    402
    403                // ｾﾞﾛﾃﾞｰﾀを使用しない設定
    404                if( useZeroDataOmit ) {
    405                        final Iterator<JsChartData> itr = jsChartData.iterator();       // 個々のグラフ
    406                        while( itr.hasNext() ) {
    407                                final JsChartData jcData = itr.next();
    408                                final String chtClm = jcData.getChartColumn();
    409                                final int    clmNo  = table.getColumnNo( chtClm, false );       // エラーを出さない。
    410
    411                                // 6.8.3.1 (2017/12/01) ループ処理の判定は、ChartColumn のみでよい。
    412                                boolean isRemove = true;
    413                                if( clmNo >= 0 ) {
    414                                        for( int row=0; row<table.getRowCount(); row++ ) {
    415                                                final String val = table.getValue( row,clmNo );
    416                                                if( !StringUtil.isNull( val ) && !"0".equals( val ) && !"0.0".equals( val ) && !"0.00".equals( val )  ) {       // 6.8.5.0 (2018/01/09)
    417                                                        isRemove = false;
    418                                                        break;  // 判定処理打ち切り
    419                                                }
    420                                        }
    421                                }
    422                                if( isRemove ) {
    423                                        itr.remove();                                                                           // すべてが、ｾﾞﾛ、null カラムを、削除します。
    424                                }
    425                        }
    426                }
    427
    428                // 6.8.3.1 (2017/12/01) 不要なデータを出力しないようにします。
    429                final int clmSize = jsChartData.size();                         // JsChartTag の 値部分のみの配列
    430
    431                final int[]    clmNos = new int[clmSize];
    432                final int      lblNos = table.getColumnNo( labelColumn, false );        // エラーを出さない。 6.9.2.0 (2018/03/05)
    433                final DBColumn dbClm  = table.getDBColumn( lblNos );                            // 6.9.2.0 (2018/03/05)
    434
    435                // jsChartDataﾀｸﾞの変数宣言
    436                for( int i=0; i<clmSize; i++ ) {
    437                        final String chtClm = jsChartData.get(i).getChartColumn();
    438                        clmNos[i] = table.getColumnNo( chtClm, false ); // エラーを出さない。
    439                }
    440
    441                // canvasﾀｸﾞの設定
    442                rtn.append( "<canvas class=\""  ).append( CANVAS_NAME )
    443                        .append( "\" id=\""                     ).append( id     )
    444                        .append( "\" width=\""          ).append( width  )
    445                        .append( "\" height=\""         ).append( height )
    446                        .append( "\"><!-- --></canvas>" )
    447
    448                        // 6.8.3.1 (2017/12/01) 不要なデータを出力しないようにします。
    449                        .append( "<script>var " ).append( qd ).append( "={\"DATA\":[" );        // query情報の取得(JSON)
    450
    451                final boolean isYcateType  = TYPE_CATEGORY.equals( yscaleType );                // 6.8.5.0 (2018/01/09) yscaleType が category かどうか。
    452                final boolean isXlinerType = TYPE_LINEAR.equals(   xscaleType );                // 6.8.5.0 (2018/01/09) xscaleType が linear かどうか。
    453
    454                // 6.9.9.3 (2018/09/25) linear のデータも、category と同じにする。
    455        //      if( isXlinerType ) {
    456        //              // 何か、isXlinerType はうまく動かない
    457        //              final String[] clmNms = table.getNames();
    458        //              for( int row=0; row<table.getRowCount(); row++ ) {
    459        //                      // ラベル部の出力
    460        //                      rtn.append( "{\"" ).append( clmNms[lblNos] ).append( "\":\"" ).append( table.getValue( row,lblNos ) ).append( '"' );
    461        //                      // データ部の出力
    462        //                      for( final int clm : clmNos ) {
    463        //                              final String val = table.getValue( row,clm );
    464        //                              rtn.append( ",\"" ).append( clmNms[clm] ).append( "\":\"" ).append( val ).append( '"' );
    465        //                      }
    466        //                      rtn.append( "}," );                                                             // 最後に
    467        //              }
    468        //              rtn.append( "]};" ).append( CR );
    469        //      }
    470        //      else {
    471                        for( int row=0; row<table.getRowCount(); row++ ) {
    472                                // ラベル部の出力
    473                                final String lval = table.getValue( row,lblNos );
    474                                final String lblVal = useRenderer ? StringUtil.jsonFilter( dbClm.getRendererValue(row,lval) ) : lval ;
    475                                rtn.append( '[' ).append( '"' ).append( lblVal ).append( '"' );
    476                                // データ部の出力
    477                                for( final int clm : clmNos ) {
    478                                        final String val = table.getValue( row,clm );
    479                                        rtn.append( ',' );
    480                                        if( isYcateType ) {                                             // 6.8.5.0 (2018/01/09) yscaleType が category
    481                                                rtn.append( '"' ).append( val ).append( '"' );
    482                                        }
    483                                        else {
    484                                                rtn.append( val );
    485                                        }
    486                                }
    487                                rtn.append( "]," );
    488                        }
    489                        rtn.append( "]};" ).append( CR );
    490        //      }
    491
    492                // jsChartDataﾀｸﾞの変数宣言
    493                for( int i=0; i<clmSize; i++ ) {
    494                        rtn.append( " var " ).append( jsChartData.get( i ).getChartColumn() ).append( "=[];" );
    495                }
    496                rtn.append( "var " ).append( lblClm ).append( "=[];" )
    497
    498                // query情報をjsChartDataの変数に入れ替え
    499                        .append( "for(var i=0; i < ").append( qd ).append( ".DATA.length; i++){" );
    500                for( int i=0; i<clmSize; i++ ) {
    501                        final String chtClm = jsChartData.get( i ).getChartColumn();
    502                //      6.9.9.3 (2018/09/25) linear のデータも、category と同じにする。
    503                //      // x軸がlinearｽｹｰﾙの場合
    504                //      if( isXlinerType ) {
    505                //              // {x:ﾗﾍﾞﾙ, y:値}の形式で値を設定
    506                //              rtn.append( chtClm ).append( "[i]={x:" ).append( qd ).append( ".DATA[i]." ).append( labelColumn )
    507                //                                                              .append( ",y:" ).append( qd ).append( ".DATA[i]." ).append( chtClm ).append( "};" );
    508                //      }
    509                //      else {
    510                                // その他は値を設定
    511                                rtn.append( chtClm ).append( "[i]=" ).append(qd).append( ".DATA[i][" ).append( i+1 ).append( "];" );
    512                //      }
    513                }
    514        //      if( isXlinerType ) {
    515        //              rtn.append( lblClm ).append( "[i]=").append( qd ).append( ".DATA[i]." ).append( labelColumn ).append( ";}" );
    516        //      }
    517        //      else {
    518                        rtn.append( lblClm ).append( "[i]=").append( qd ).append( ".DATA[i][0];}" );
    519        //      }
    520
    521                // y軸にｶﾃｺﾞﾘｰｽｹｰﾙを設定した場合
    522                if( isYcateType ) {
    523                        rtn.append( "var ycateList=[];" );
    524                        if( !StringUtil.isNull( ycategoryList ) ) {                                             // 6.8.5.0 (2018/01/09)
    525                                // 「,」を「','」に変換して設定。(,前後の半角ｽﾍﾟｰｽは除去する)
    526                                final String regex = " *, *";
    527                                final Pattern pttn = Pattern.compile( regex );
    528
    529                                final Matcher mtch = pttn.matcher( ycategoryList );
    530                                // y軸ｶﾃｺﾞﾘｰﾘｽﾄの設定
    531                                rtn.append( "ycateList=['" ).append( mtch.replaceAll( "','" ) ).append( "'];" );
    532                        }
    533                }
    534
    535                // jsChartDataの設定
    536                rtn.append( "var ").append( cd ).append( "={labels:" ).append( lblClm );
    537                // y軸にｶﾃｺﾞﾘｰｽｹｰﾙを設定した場合
    538                if( isYcateType ) {
    539                        rtn.append( ",yLabels:ycateList" );
    540                }
    541                rtn.append( ",datasets:[" );
    542                for( int i=0; i<clmSize; i++ ) {
    543                        if( i != 0 ) {
    544                                rtn.append( ',' );
    545                        }
    546                        rtn.append( jsChartData.get( i ).getParameter() );
    547                }
    548                rtn.append( "]};" )
    549
    550                // jsChartの生成
    551                .append(  "var "    ).append( myChart   ).append( "=new Chart(" ).append( id )
    552                .append( ",{type:'" ).append( chartType )
    553                .append( "',data:"  ).append( cd );
    554//              .append( ",options:{responsive:false" );        // ﾚｽﾎﾟﾝｼﾌﾞ OFF
    555
    556                // 6.9.9.2 (2018/09/18) plugins,chartAttributes属性の追加
    557                if( !StringUtil.isNull( plugins ) ) {
    558                        rtn.append( ",plugins: [" ).append( plugins ).append( ']' );
    559                }
    560                if( !StringUtil.isNull( chartAttributes ) ) {
    561                        rtn.append( ',' ).append( chartAttributes );
    562                }
    563
    564                rtn.append( ",options:{responsive:false" );     // ﾚｽﾎﾟﾝｼﾌﾞ OFF
    565
    566                // ｸﾘｯｸｲﾍﾞﾝﾄの設定
    567                // clickLink 変数を使用する場合、内部でﾏｽﾀﾃﾞｰﾀを使用します。ｷｰとして、渡しておく必要があります。
    568                if( !StringUtil.isNull( onClick ) ) {                                                   // 6.8.5.0 (2018/01/09)
    569                        rtn.append( ",onClick:function(event,obj){" ).append( onClick ).append( '}' )
    570                        .append( ",master:" ).append( qd ).append( ".DATA" );           // 6.9.9.2 (2018/09/18)
    571                }
    572
    573                // ﾀｲﾄﾙ属性の設定
    574                if( !StringUtil.isNull( title ) ) {                                             // 6.8.5.0 (2018/01/09)
    575                        rtn.append( ",title:{display:true" );
    576                        setProp( rtn, ",text:'"    , title        , "'" );
    577                        setProp( rtn, ",position:'", titlePosition, "'" );
    578                        rtn.append( '}' );
    579                }
    580
    581                // 凡例属性の設定
    582                if( !StringUtil.isNull( legendDisplay ) ) {                             // 6.8.5.0 (2018/01/09)
    583                        rtn.append( ",legend:{" );
    584                        setProp( rtn, "display:"   , legendDisplay );
    585                        setProp( rtn, ",position:'", legendPosition, "'" );
    586                        rtn.append( '}' );
    587                }
    588
    589                // 点のスタイル属性の設定
    590                setProp( rtn, ",usePointStyle:" , usePointStyle );              // 6.8.5.0 (2018/01/09)
    591
    592                // chartTypeの円形ﾁｪｯｸ
    593                final List<String> list = Arrays.asList( CTYPE_CI );
    594                if( list.contains( chartType ) ) {
    595                        // 6.9.9.2 (2018/09/18) chart.jsが2.4.0から2.7.2にバージョンアップにより、廃止された属性対応
    596                        // scale属性は、使用しません。
    597//                      // 円形の場合はscale属性に値を設定
    598//                      rtn.append( ",scale:{ticks:{beginAtZero:" ).append( ybeginAtZero );             // 6.8.5.0 (2018/01/09)
    599//                      setProp( rtn, ",max:"           , max );
    600//                      setProp( rtn, ",min:"           , min );
    601//                      setProp( rtn, ",stepSize:"      , stepSize );
    602//                      rtn.append( "}}" );
    603                }
    604                else {
    605                        // 円形以外の場合はscales属性に設定
    606                        rtn.append( ",scales:{" );
    607                        if( CTYPE_HBAR.equals( chartType ) ) {
    608                                // 横棒線の場合はx軸の設定
    609                                rtn.append( "xAxes" );
    610                        }
    611                        else {
    612                                // それ以外はy軸の設定
    613                                rtn.append( "yAxes" );
    614                        }
    615                        rtn.append( ":[{type:'" ).append( yscaleType ).append( '\'' );
    616                        // y軸にｶﾃｺﾞﾘｰｽｹｰﾙを設定した場合
    617                        if( isYcateType ) {
    618                                rtn.append( ",position:'left'" );
    619                        }
    620                        if( !StringUtil.isNull( ylabel ) ) {                                            // 6.8.5.0 (2018/01/09)
    621                                rtn.append( ",scaleLabel:{display:true" )
    622                                        .append( ",labelString:'" ).append( ylabel ).append( "'}" );
    623                        }
    624                        rtn.append( ",ticks:{beginAtZero:" ).append( ybeginAtZero );    // 6.8.5.0 (2018/01/09)
    625                        setProp( rtn, ",max:"           , max );
    626                        setProp( rtn, ",min:"           , min );
    627                        setProp( rtn, ",stepSize:"      , stepSize );
    628                        setProp( rtn, ",callback:"      , yscaleCallback );
    629                        rtn.append( "}}]," );
    630
    631                        if( CTYPE_HBAR.equals( chartType ) ) {
    632                                // 横棒線の場合はy軸の設定
    633                                rtn.append( "yAxes" );
    634                        }
    635                        else {
    636                                // それ以外はx軸の設定
    637                                rtn.append( "xAxes" );
    638                        }
    639                        rtn.append( ":[{type:'" ).append( xscaleType ).append( '\'' );
    640
    641                        setProp( rtn, ",categoryPercentage:", barWidthPer  );
    642                        // x軸にﾘﾆｱｽｹｰﾙを設定した場合(これは残す)
    643                        if( isXlinerType ) {
    644                                rtn.append( ",position:'bottom'" );
    645                        }
    646                        // ﾁｬｰﾄﾀｲﾌﾟが横棒線の場合
    647                        if(  CTYPE_HBAR.equals( chartType ) ){
    648                                rtn.append( ",position:'left'" );
    649                        }
    650
    651                        if( !StringUtil.isNull( xlabel ) ) {                                            // 6.8.5.0 (2018/01/09)
    652                                rtn.append(  ",scaleLabel:{display:true," )
    653                                        .append( "labelString:'" ).append( xlabel ).append( "'}" );
    654                        }
    655//                      // 6.9.9.3 (2018/09/25) xscaleType の time 属性廃止。
    656//                      // 固定値がないので、先頭カンマが使えない。
    657//                      rtn.append( ",time:{" );
    658//                      setProp( rtn, "format:'", timeSetFormat, "'," );
    659//                      // timeLblFormatが指定されている場合、全てのdisplayFormatsにtimeLblFormatを設定する
    660//                      if( !StringUtil.isNull( timeLblFormat ) ) {                                             // 6.8.5.0 (2018/01/09)
    661//                              rtn.append(  "displayFormats:{year:'" ).append( timeLblFormat )
    662//                                      .append( "',quarter:'"  ).append( timeLblFormat )
    663//                                      .append( "',month:'"    ).append( timeLblFormat )
    664//                                      .append( "',week:'"             ).append( timeLblFormat )
    665//                                      .append( "',day:'"              ).append( timeLblFormat )
    666//                                      .append( "',hour:'"             ).append( "',minute:'"          ).append( timeLblFormat )
    667//                                                                                       .append( "',second:'"          ).append( timeLblFormat )
    668//                                                                                       .append( "',millisecond:''}," );
    669//                      }
    670//                      setProp( rtn, "max:"                    , timeMax                       , "," );
    671//                      setProp( rtn, "min:"                    , timeMin                       , "," );
    672//                      setProp( rtn, "unit:"                   , timeUnit                      , "," );
    673//                      setProp( rtn, "unitStepSize:"   , timeUnitStepSize      , "," );
    674//                      rtn.append( "}" );
    675
    676                        // 固定値がないので、先頭カンマが使えない。
    677                        rtn.append( ",ticks:{" );
    678                        setProp( rtn, "callback:", xscaleCallback       , ","  );
    679                        // x軸にﾘﾆｱｽｹｰﾙを設定した場合(これは残す)
    680                        if( isXlinerType ) {
    681                                setProp( rtn, "beginAtZero:"    , String.valueOf( xbeginAtZero ) , "," );               // 6.8.5.0 (2018/01/09)
    682                                setProp( rtn, "max:"                    , xmax                  , "," );
    683                                setProp( rtn, "min:"                    , xmin                  , "," );
    684                                setProp( rtn, "stepSize:"               , xstepSize             , "," );
    685                        }
    686                        rtn.append( "}}]}" );
    687
    688                        // 6.8.5.0 (2018/01/09) markValues,markColors,markLbls,markAdjust 属性対応
    689                        final String[] mkVals = StringUtil.csv2Array( markValues );
    690                        final int vCnt = mkVals.length;
    691                        if( vCnt > 0 ) {
    692                                final String[] mkCols = StringUtil.csv2Array( markColors        , ',' , vCnt , MARK_DEF_COLOR );
    693                                final String[] mkLbls = StringUtil.csv2Array( markLbls          , ',' , vCnt );
    694                                final String[] mkAjst = StringUtil.csv2Array( markAdjust        , ',' , vCnt , MARK_DEF_ADJUST );
    695
    696                                rtn.append( ",annotation:{annotations:[" );
    697                                for( int i=0; i<vCnt; i++ ) {
    698                                        rtn.append( "{type:'line',scaleID:'y-axis-0',mode:'horizontal',borderWidth:2" );
    699                                        setProp( rtn, ",value:"                 , mkVals[i] );
    700                                        setProp( rtn, ",borderColor:'"  , mkCols[i] , "'" );
    701                                        if( !mkLbls[i].isEmpty() ) {
    702                                                rtn.append( ",label:{enabled:'true',position:'left',backgroundColor:'rgba(0,0,0,0)',fontSize:10" );
    703                                                setProp( rtn, ",yAdjust:"       , mkAjst[i] );
    704                                                setProp( rtn, ",content:'"      , mkLbls[i] , "'" );
    705                                                setProp( rtn, ",fontColor:'", mkCols[i] , "'" );
    706                                                rtn.append( '}' );
    707                                        }
    708                                        rtn.append( "}," );
    709                                }
    710                                rtn.append( "]}" );
    711                        }
    712
    713                        // 6.8.5.0 (2018/01/09) ズーム処理を使用するかどうか
    714                        if( useZoom ) {
    715                                rtn.append( ",pan:{enabled:true,mode:'xy'},zoom:{enabled:true,drag:false,mode:'xy'}" );
    716                        }
    717                }
    718                setProp( rtn, ",", optionAttributes );
    719
    720                rtn.append( "}});" );
    721
    722                // ｲﾍﾞﾝﾄ設定用 5.9.19.0
    723                // 5.9.27.0 (2017/12/01) MODIFY ｲﾍﾞﾝﾄにkeyupを追加
    724                // widthEventColumn設定
    725                if( !StringUtil.isNull( widthEventColumn ) ) {                                          // 6.8.5.0 (2018/01/09)
    726                        rtn.append( "$(document).delegate('#" ).append( widthEventColumn ).append( "','mouseup keyup',function(){" )
    727                                .append( "var width=$(this).val();" )
    728                                .append( "$('#" ).append( id ).append( "').attr('width',width);" )
    729                                .append( myChart ).append( ".chart.width=width;" )
    730                                .append( myChart ).append( ".update();" )
    731                                .append( "});" )
    732                                .append( "$(function(){" )
    733                                .append( "var chartWidth=$('#" ).append( id ).append("').attr('width');" )
    734                                .append( "$('#" ).append( widthEventColumn ).append( "').val(chartWidth);" )            // 初期値を設定
    735                                .append( "});" );
    736                }
    737                // heightEventColumn設定
    738                if( !StringUtil.isNull( heightEventColumn ) ) {                                         // 6.8.5.0 (2018/01/09)
    739                        rtn.append( "$(document).delegate('#" ).append( heightEventColumn ).append( "','mouseup keyup',function(){" )
    740                                .append( "var height=$(this).val();" )
    741                                .append( "$('#" ).append( id ).append( "').attr('height',height);" )
    742                                .append( myChart ).append( ".chart.height=height;" )
    743                                .append( myChart ).append( ".update();" )
    744                                .append( "});")
    745                                .append( "$(function(){")
    746                                .append( "var chartHeight=$('#" ).append( id ).append("').attr('height');" )
    747                                .append( "$('#" ).append( heightEventColumn ).append( "').val(chartHeight);" )  // 初期値を設定
    748                                .append( "});" );
    749                }
    750                // minEventColumn設定
    751                if( !StringUtil.isNull( minEventColumn ) ) {                                            // 6.8.5.0 (2018/01/09)
    752                        rtn.append( "$(document).delegate('#" ).append( minEventColumn ).append( "','mouseup keyup',function(){" )
    753                                // 5.9.27.0 (2017/12/01) MODIFY IntからFloat型に変更
    754                                .append( "var min=parseFloat($(this).val());")
    755                                .append( myChart ).append( ".options.scales.yAxes[0].ticks.min = min;" )
    756                                .append( myChart ).append( ".update();")
    757                                .append( "});" )
    758                                .append( "$(function(){" )
    759                                .append( "var chartMax=" ).append( myChart ).append( ".scales['y-axis-0'].max;" )
    760                                .append( "var chartMin=" ).append( myChart ).append( ".scales['y-axis-0'].min;" )
    761                                .append( "$('#" ).append( minEventColumn ).append( "').val(chartMin);" )                                        // 初期値を設定
    762                                .append( "$('#" ).append( minEventColumn ).append( "').attr({'max':chartMax});" )                       // 初期値を設定
    763                                .append( "$('#" ).append( minEventColumn ).append( "').attr({'min':chartMin});" )                       // 初期値を設定
    764                                .append( "});" );
    765                }
    766                // maxEventColumn設定
    767                if( !StringUtil.isNull( maxEventColumn ) ) {                                            // 6.8.5.0 (2018/01/09)
    768                        rtn.append( "$(document).delegate('#").append( maxEventColumn ).append( "','mouseup keyup',function(){" )
    769                                // 5.9.27.0 (2017/12/01) MODIFY IntからFloat型に変更
    770                                .append( "var max=parseFloat($(this).val());")
    771                                .append( myChart ).append( ".options.scales.yAxes[0].ticks.max = max;")
    772                                .append( myChart ).append( ".update();")
    773                                .append( "});")
    774                                .append( "$(function(){" )
    775                                .append( "var chartMax=" ).append( myChart ).append( ".scales['y-axis-0'].max;" )
    776                                .append( "var chartMin=" ).append( myChart ).append( ".scales['y-axis-0'].min;" )
    777                                .append( "$('#" ).append( maxEventColumn ).append( "').val(chartMax);" )                                        // 初期値を設定
    778                                .append( "$('#" ).append( maxEventColumn ).append( "').attr({'max':chartMax});" )                       // 初期値を設定
    779                                .append( "$('#" ).append( maxEventColumn ).append( "').attr({'min':chartMin});" )                       // 初期値を設定
    780                                .append( "});" );
    781                }
    782
    783                // 6.9.2.0 (2018/03/05) ズーム処理を使用する場合、ｸﾀﾞﾌﾞﾙｸﾘｯｸで元に戻すためのｲﾍﾞﾝﾄを発生させます。
    784                if( useZoom ) {
    785                        rtn.append( "window.onload=function(){$('#").append( id ).append( "').dblclick(function(){window." )
    786                                .append( myChart ).append( ".resetZoom();});}" );
    787                }
    788
    789                rtn.append( "</script>" );
    790
    791                return rtn.toString();
    792        }
    793
    794        /**
    795         * setに値が存在する場合、sbにstr + setの形で値を追加する。
    796         *
    797         * @param sb    ベースとなるStringBuilder
    798         * @param str   文字列１
    799         * @param set   文字列２
    800         */
    801        private void setProp( final StringBuilder sb, final String str, final String set ) {
    802                if( !StringUtil.isNull( set ) ) {                                               // 6.8.5.0 (2018/01/09)
    803                        sb.append( str ).append( set );
    804                }
    805        }
    806
    807        /**
    808         * setに値が存在する場合、sbにstr + set + endの形で値を追加する。
    809         *
    810         * @param sb    ベースとなるStringBuilder
    811         * @param str   文字列１
    812         * @param set   文字列２
    813         * @param end   文字列３
    814         */
    815        private void setProp( final StringBuilder sb, final String str, final String set, final String end ) {
    816                if( !StringUtil.isNull( set ) ) {                                               // 6.8.5.0 (2018/01/09)
    817                        sb.append( str ).append( set ).append( end );
    818                }
    819        }
    820
    821        /**
    822         * ﾊﾟﾗﾒｰﾀﾁｪｯｸ用ﾒｿｯﾄﾞ。
    823         *
    824         * @param trg           ターゲット
    825         * @param set           使用可能なキーワードのSet
    826         * @param trgStr        ターゲットの名称
    827         */
    828        private void checkPara( final String trg, final Set<String> set, final String trgStr ) {
    829                if( !StringUtil.isNull( trg ) && !check( trg, set ) ) {                                         // 6.8.5.0 (2018/01/09)
    830                        final StringBuilder errMsg = new StringBuilder( BUFFER_MIDDLE )
    831                                .append( "指定の" ).append( trgStr ).append( "は指定できません。" ).append( CR )
    832                                .append( trgStr ).append( "=[" ).append( trg ).append( ']' ).append( CR );
    833                        for( final String lst : set ) {
    834                                errMsg.append( " | " ).append( lst );
    835                        }
    836                        throw new HybsSystemException( errMsg.toString() );
    837                }
    838        }
    839
    840        /**
    841         * 【TAG】ﾁｬｰﾄの種類を指定します[line/bar/horizontalBar/radar/polarArea/pie/doughnut](必須)。
    842         *
    843         * @og.tag
    844         *
    845         * @param cType ﾁｬｰﾄﾀｲﾌﾟ [line/bar/horizontalBar/radar/polarArea/pie/doughnut]
    846         */
    847        public void setChartType( final String cType ) {
    848                chartType = getRequestParameter( cType );
    849
    850                if( !StringUtil.isNull( chartType ) && !check( chartType, CTYPE_SET ) ) {
    851                        final StringBuilder errMsg = new StringBuilder( BUFFER_MIDDLE )
    852                                .append( "指定のチャートタイプは実行できません。"        ).append( CR )
    853                                .append( "chartType=[" ).append( chartType ).append( ']' ).append( CR );
    854                        for( final String lst : CTYPE_SET ) {
    855                                errMsg.append( " | " ).append( lst );
    856                        }
    857                        throw new HybsSystemException( errMsg.toString() );
    858                }
    859        }
    860
    861        /**
    862         * 【TAG】canvasﾀｸﾞのidを指定します(初期値:hybscanvas)。
    863         *
    864         * @og.tag
    865         * canvasﾀｸﾞのidに設定します。
    866         *
    867         * @param id canvasﾀｸﾞのid
    868         */
    869        @Override
    870        public void setId( final String id ) {
    871                this.id = nval( getRequestParameter( id ),this.id );
    872        }
    873
    874        /**
    875         * 【TAG】ﾁｬｰﾄの高さを指定します(初期値:400)。
    876         *
    877         * @og.tag
    878         * canvasﾀｸﾞの高さに設定します。
    879         *
    880         * @param hei 設定する高さ
    881         */
    882        public void setHeight( final String hei ) {
    883                height = nval( getRequestParameter( hei ),height );
    884        }
    885
    886        /**
    887         * 【TAG】ﾁｬｰﾄの幅を指定します(初期値:400)。
    888         *
    889         * @og.tag
    890         * canvasﾀｸﾞの横幅を設定します。
    891         *
    892         * @param wid 設定する横幅
    893         */
    894        public void setWidth( final String wid ) {
    895                width = nval( getRequestParameter( wid ),width );
    896        }
    897
    898        /**
    899         * 【TAG】ﾗﾍﾞﾙのｶﾗﾑ名を指定します(表示名称）(必須)。
    900         *
    901         * @og.tag
    902         *
    903         * @param lblclm ﾗﾍﾞﾙｶﾗﾑ
    904         */
    905        public void setLabelColumn( final String lblclm ) {
    906                labelColumn = nval( getRequestParameter( lblclm ),labelColumn );
    907        }
    908
    909        /**
    910         * 【TAG】ﾀｲﾄﾙを指定します。
    911         *
    912         * @og.tag
    913         *
    914         * @og.rev 6.9.9.3 (2018/09/25) nvalを入れて、初期値を設定します。
    915         *
    916         * @param title ﾀｲﾄﾙ
    917         */
    918        public void setTitle( final String title ) {
    919//              this.title = getRequestParameter( title );
    920                this.title = nval( getRequestParameter( title ),this.title );
    921        }
    922
    923        /**
    924         * 【TAG】ﾀｲﾄﾙの表示位置[top/right/bottom/left]を指定します(初期値:top)。
    925         *
    926         * @og.tag
    927         *
    928         * @og.rev 6.9.9.3 (2018/09/25) nvalを入れて、初期値を設定します。
    929         *
    930         * @param titlePosition ﾀｲﾄﾙの表示位置
    931         */
    932        public void setTitlePosition( final String titlePosition ) {
    933//              this.titlePosition = getRequestParameter( titlePosition );
    934                this.titlePosition = nval( getRequestParameter( titlePosition ),this.titlePosition );
    935
    936                checkPara( this.titlePosition, SET_POSITION, "titlePosition" );
    937        }
    938
    939        /**
    940         * 【TAG】x軸のラベルを指定します。
    941         *
    942         * @og.tag
    943         *
    944         * @og.rev 6.9.9.3 (2018/09/25) nvalを入れて、初期値を設定します。
    945         *
    946         * @param xlabel x軸のラベル
    947         */
    948        public void setXlabel( final String xlabel ) {
    949//              this.xlabel = getRequestParameter( xlabel );
    950                this.xlabel = nval( getRequestParameter( xlabel ),this.xlabel );
    951        }
    952
    953        /**
    954         * 【TAG】y軸のラベルを指定します。
    955         *
    956         * @og.tag
    957         *
    958         * @og.rev 6.9.9.3 (2018/09/25) nvalを入れて、初期値を設定します。
    959         *
    960         * @param ylabel y軸のラベル
    961         */
    962        public void setYlabel( final String ylabel ) {
    963//              this.ylabel = getRequestParameter( ylabel );
    964                this.ylabel = nval( getRequestParameter( ylabel ),this.ylabel );
    965        }
    966
    967        /**
    968         * 【TAG】凡例の表示位置[top/right/bottom/left]を指定します(初期値:top)。
    969         *
    970         * @og.tag
    971         *
    972         * @og.rev 6.9.9.3 (2018/09/25) nvalを入れて、初期値を設定します。
    973         *
    974         * @param legendPosition 凡例の表示位置
    975         */
    976        public void setLegendPosition( final String legendPosition ) {
    977//              this.legendPosition = getRequestParameter( legendPosition );
    978                this.legendPosition = nval( getRequestParameter( legendPosition ),this.legendPosition );
    979
    980                checkPara( this.legendPosition, SET_POSITION, "legendPosition" );
    981        }
    982
    983        /**
    984         * 【TAG】凡例を表示するか[true/false]を指定します。
    985         *
    986         * @og.tag
    987         *
    988         * @og.rev 6.9.9.3 (2018/09/25) nvalを入れて、初期値を設定します。
    989         *
    990         * @param legendDisplay 凡例を表示するか [true/false]
    991         */
    992        public void setLegendDisplay( final String legendDisplay ) {
    993//              this.legendDisplay = getRequestParameter( legendDisplay );
    994                this.legendDisplay = nval( getRequestParameter( legendDisplay ),this.legendDisplay );
    995
    996                checkPara( this.legendDisplay, SET_BOOLEAN, "legendDisplay" );
    997        }
    998
    999        /**
    1000         * 【TAG】x軸ｺｰﾙﾊﾞｯｸを指定します。
    1001         *
    1002         * @og.tag
    1003         * x軸のメモリ編集用スケールバックを設定します。
    1004         *
    1005         * @og.rev 6.9.9.3 (2018/09/25) nvalを入れて、初期値を設定します。
    1006         *
    1007         * @param xscaleCallback x軸ｺｰﾙﾊﾞｯｸ
    1008         */
    1009        public void setXscaleCallback( final String xscaleCallback ) {
    1010//              this.xscaleCallback = getRequestParameter( xscaleCallback );
    1011                this.xscaleCallback = nval( getRequestParameter( xscaleCallback ),this.xscaleCallback );
    1012        }
    1013
    1014        /**
    1015         * 【TAG】y軸ｺｰﾙﾊﾞｯｸを指定します。
    1016         *
    1017         * @og.tag
    1018         * y軸のメモリ編集用スケールバックを設定します。
    1019         *
    1020         * @og.rev 6.9.9.3 (2018/09/25) nvalを入れて、初期値を設定します。
    1021         *
    1022         * @param yscaleCallback y軸ｺｰﾙﾊﾞｯｸ
    1023         */
    1024        public void setYscaleCallback( final String yscaleCallback ) {
    1025//              this.yscaleCallback = getRequestParameter( yscaleCallback );
    1026                this.yscaleCallback = nval( getRequestParameter( yscaleCallback ),this.yscaleCallback );
    1027        }
    1028
    1029        /**
    1030         * 【TAG】x軸のｽｹｰﾙﾀｲﾌﾟ[category/linear]を指定します(初期値:category)。
    1031         *
    1032         * @og.tag
    1033         *
    1034         * @og.rev 6.9.9.3 (2018/09/25) nvalを入れて、初期値を設定します。
    1035         *
    1036         * @param xscaleType x軸のｽｹｰﾙﾀｲﾌﾟ
    1037         */
    1038        public void setXscaleType( final String xscaleType ) {
    1039//              this.xscaleType = getRequestParameter( xscaleType );
    1040                this.xscaleType = nval( getRequestParameter( xscaleType ) , this.xscaleType );
    1041
    1042                checkPara( this.xscaleType, SET_XSCALE, "xscaleType" );
    1043        }
    1044
    1045        /**
    1046         * 【TAG】x軸を０から書き始まるかどうか(初期値:true)。
    1047         *
    1048         * @og.tag
    1049         *
    1050         * @og.rev 6.8.5.0 (2018/01/09) 新規追加
    1051         *
    1052         * @param xZero x軸のゼロ開始
    1053         */
    1054        public void setXbeginAtZero( final String xZero ) {
    1055                xbeginAtZero = nval( getRequestParameter( xZero ) , xbeginAtZero ) ;
    1056        }
    1057
    1058        /**
    1059         * 【TAG】y軸を０から書き始まるかどうか(初期値:true)(円形の場合もこの値)。
    1060         *
    1061         * @og.tag
    1062         *
    1063         * @og.rev 6.8.5.0 (2018/01/09) 新規追加
    1064         *
    1065         * @param yZero x軸のゼロ開始
    1066         */
    1067        public void setYbeginAtZero( final String yZero ) {
    1068                ybeginAtZero = nval( getRequestParameter( yZero ) , ybeginAtZero ) ;
    1069        }
    1070
    1071        /**
    1072         * 【TAG】y軸のｽｹｰﾙﾀｲﾌﾟ[linear/category]を指定します(初期値:linear)。
    1073         *
    1074         * @og.tag
    1075         *
    1076         * @og.rev 6.9.9.3 (2018/09/25) nvalを入れて、初期値を設定します。
    1077         *
    1078         * @param yscaleType y軸のｽｹｰﾙﾀｲﾌﾟ
    1079         */
    1080        public void setYscaleType( final String yscaleType ) {
    1081//              this.yscaleType = getRequestParameter( yscaleType );
    1082                this.yscaleType = nval( getRequestParameter( yscaleType ) , this.yscaleType );
    1083
    1084                checkPara( this.yscaleType, SET_YSCALE, "yscaleType" );
    1085        }
    1086
    1087        /**
    1088         * 【TAG】y軸のﾒﾓﾘﾘｽﾄをカンマ区切りで指定します(xscaleTypeがcategoryの場合に有効)。
    1089         *
    1090         * @og.tag
    1091         *
    1092         * @og.rev 6.9.9.3 (2018/09/25) nvalを入れて、初期値を設定します。
    1093         *
    1094         * @param ycategoryList y軸のﾒﾓﾘﾘｽﾄ
    1095         */
    1096        public void setYcategoryList( final String ycategoryList ) {
    1097//              this.ycategoryList = getRequestParameter( ycategoryList );
    1098                this.ycategoryList = nval( getRequestParameter( ycategoryList ),this.ycategoryList );
    1099        }
    1100
    1101        /**
    1102         * 【TAG】x軸の最大値を指定します(xscaleTypeがlinearの場合に有効)。
    1103         *
    1104         * @og.tag
    1105         *
    1106         * @og.rev 6.9.9.3 (2018/09/25) nvalを入れて、初期値を設定します。
    1107         *
    1108         * @param xmax x軸の最大値
    1109         */
    1110        public void setXmax( final String xmax ) {
    1111//              this.xmax = getRequestParameter( xmax );
    1112                this.xmax = nval( getRequestParameter( xmax ),this.xmax );
    1113        }
    1114
    1115        /**
    1116         * 【TAG】x軸の最小値を指定します(xscaleTypeがlinearの場合に有効)。
    1117         *
    1118         * @og.tag
    1119         *
    1120         * @og.rev 6.9.9.3 (2018/09/25) nvalを入れて、初期値を設定します。
    1121         *
    1122         * @param xmin x軸の最小値
    1123         */
    1124        public void setXmin( final String xmin ) {
    1125//              this.xmin = getRequestParameter( xmin );
    1126                this.xmin = nval( getRequestParameter( xmin ),this.xmin );
    1127        }
    1128
    1129        /**
    1130         * 【TAG】x軸のメモリ幅を指定します(xscaleTypeがlinearの場合に有効)。
    1131         *
    1132         * @og.tag
    1133         *
    1134         * @og.rev 6.9.9.3 (2018/09/25) nvalを入れて、初期値を設定します。
    1135         *
    1136         * @param xstepSize x軸のメモリ幅
    1137         */
    1138        public void setXstepSize( final String xstepSize ) {
    1139//              this.xstepSize = getRequestParameter( xstepSize );
    1140                this.xstepSize = nval( getRequestParameter( xstepSize ),this.xstepSize );
    1141        }
    1142
    1143        /**
    1144         * 【TAG】棒線の横幅を指定します(初期値:0.8, typeがbar,horizontalBarの場合に有効)。
    1145         *
    1146         * @og.tag
    1147         *
    1148         * @og.rev 6.9.9.3 (2018/09/25) nvalを入れて、初期値を設定します。
    1149         *
    1150         * @param barWidthPer 棒線の横幅
    1151         */
    1152        public void setBarWidthPer( final String barWidthPer ) {
    1153//              this.barWidthPer = getRequestParameter( barWidthPer );
    1154                this.barWidthPer = nval( getRequestParameter( barWidthPer ) , this.barWidthPer );
    1155        }
    1156
    1157        /**
    1158         * jsChartData情報をﾘｽﾄに追加します。
    1159         *
    1160         * @og.rev 6.7.5.0 (2017/03/10) ﾘｽﾄの初期化方法を変更します。
    1161         *
    1162         * @param jsData jsChartData情報
    1163         */
    1164        protected void addJsChartData( final JsChartData jsData ) {
    1165                jsChartData.add( jsData );
    1166        }
    1167
    1168        /**
    1169         * 登録済みのjsChartData情報の個数を返します。
    1170         *
    1171         * @og.rev 6.7.7.0 (2017/03/31) 新規追加
    1172         *
    1173         * @return 登録済みのjsChartData情報の個数
    1174         */
    1175        protected int getJsChartDataSize() {
    1176                return jsChartData.size();
    1177        }
    1178
    1179//      /**
    1180//       * 【TAG】x軸のﾀｲﾑの単位[year/quarter/month/week/day/hour/minute/second/millsecond]を指定します。
    1181//       *
    1182//       * @og.tag
    1183//       * (xscaleTypeがtimeの場合に有効。指定しない場合は自動)
    1184//       * @og.rev 6.9.9.3 (2018/09/25) xscaleType の time 属性廃止。
    1185//       *
    1186//       * @param timeUnit x軸のﾀｲﾑの単位
    1187//       */
    1188//      public void setTimeUnit( final String timeUnit ) {
    1189//              this.timeUnit = getRequestParameter( timeUnit );
    1190//
    1191//              checkPara( this.timeUnit, SET_TIMEUNIT, "timeUnit" );
    1192//      }
    1193
    1194//      /**
    1195//       * 【TAG】x軸のﾀｲﾑの単位幅を指定します(xscaleTypeがtimeの場合に有効)。
    1196//       *
    1197//       * @og.tag
    1198//       * @og.rev 6.9.9.3 (2018/09/25) xscaleType の time 属性廃止。
    1199//       *
    1200//       * @param timeUnitStepSize x軸のﾀｲﾑの単位幅
    1201//       */
    1202//      public void setTimeUnitStepSize( final String timeUnitStepSize ) {
    1203//              this.timeUnitStepSize = getRequestParameter( timeUnitStepSize );
    1204//      }
    1205
    1206//      /**
    1207//       * 【TAG】x軸の設定するﾀｲﾑのﾌｫｰﾏｯﾄを指定します(xscaleTypeがtimeの場合に有効)。
    1208//       *
    1209//       * @og.tag
    1210//       * @og.rev 6.9.9.3 (2018/09/25) xscaleType の time 属性廃止。
    1211//       *
    1212//       * @param timeSetFormat x軸の設定するﾀｲﾑのﾌｫｰﾏｯﾄ
    1213//       */
    1214//      public void setTimeSetFormat( final String timeSetFormat ) {
    1215//              this.timeSetFormat = getRequestParameter( timeSetFormat );
    1216//      }
    1217
    1218//      /**
    1219//       * 【TAG】x軸の表示するﾀｲﾑのﾌｫｰﾏｯﾄを指定します(xscaleTypeがtimeの場合に有効)。
    1220//       *
    1221//       * @og.tag
    1222//       * @og.rev 6.9.9.3 (2018/09/25) xscaleType の time 属性廃止。
    1223//       *
    1224//       * @param timeLblFormat x軸の表示するﾀｲﾑのﾌｫｰﾏｯﾄ
    1225//       */
    1226//      public void setTimeLblFormat( final String timeLblFormat ) {
    1227//              this.timeLblFormat = getRequestParameter( timeLblFormat );
    1228//      }
    1229
    1230//      /**
    1231//       * 【TAG】x軸のﾀｲﾑの最大値を指定します(xscaleTypeがtimeの場合に有効)。
    1232//       *
    1233//       * @og.tag
    1234//       *
    1235//       * @param timeMax x軸のﾀｲﾑの最大値
    1236//       * @og.rev 6.9.9.3 (2018/09/25) xscaleType の time 属性廃止。
    1237//       */
    1238//      public void setTimeMax( final String timeMax ) {
    1239//              this.timeMax = getRequestParameter( timeMax );
    1240//      }
    1241
    1242//      /**
    1243//       * 【TAG】x軸のﾀｲﾑの最小値を指定します(xscaleTypeがtimeの場合に有効)。
    1244//       *
    1245//       * @og.tag
    1246//       * @og.rev 6.9.9.3 (2018/09/25) xscaleType の time 属性廃止。
    1247//       *
    1248//       * @param timeMin x軸のﾀｲﾑの最小値
    1249//       */
    1250//      public void setTimeMin( final String timeMin ) {
    1251//              this.timeMin = getRequestParameter( timeMin );
    1252//      }
    1253
    1254        /**
    1255         * 【TAG】y軸の最大値を指定します(xscaleTypeがlinearの場合に有効)。
    1256         *
    1257         * @og.tag
    1258         *
    1259         * @param max メモリの最大値
    1260         */
    1261        public void setMax( final String max ) {
    1262                this.max = nval( getRequestParameter( max ) , this.max );
    1263        }
    1264
    1265        /**
    1266         * 【TAG】y軸の最小値を指定します(xscaleTypeがlinearの場合に有効)。
    1267         *
    1268         * @og.tag
    1269         *
    1270         * @param min メモリの最小値
    1271         */
    1272        public void setMin( final String min ) {
    1273                this.min = nval( getRequestParameter( min ) , this.min );
    1274        }
    1275
    1276        /**
    1277         * 【TAG】y軸のメモリ幅を指定します(xscaleTypeがlinearの場合に有効)。
    1278         *
    1279         * @og.tag
    1280         *
    1281         * @param stepSize y軸のメモリ幅
    1282         */
    1283        public void setStepSize( final String stepSize ) {
    1284                this.stepSize = nval( getRequestParameter( stepSize ) , this.stepSize );
    1285        }
    1286
    1287        /**
    1288         * 【TAG】ﾁｬｰﾄｸﾘｯｸ時のｲﾍﾞﾝﾄを指定します。
    1289         *
    1290         * @og.tag
    1291         * 下記の値が引数として渡されます。
    1292         *
    1293         * event:ｲﾍﾞﾝﾄ情報
    1294         * obj:ｸﾘｯｸされたｵﾌﾞｼﾞｪｸﾄの情報
    1295         *
    1296         * @param click チャートクリック時のイベントを指定
    1297         */
    1298        public void setOnClick( final String click ) {
    1299                onClick = nval( getRequestParameter( click ),onClick );
    1300        }
    1301
    1302        /**
    1303         * 【TAG】プラグイン定義された関数を指定します。
    1304         *
    1305         * @og.tag
    1306         * プラグインは、plugins: [pinFunc], 形式で追加されます。
    1307         * この属性での指定時は、[]は、不要で、ｶﾝﾏ区切りの関数名を並べます。
    1308         * 外部に、var pinFunc = { afterDatasetsDraw: function(chart, options) { ･･･ } };
    1309         * 形式のプラグインを指定することで、個別に読ませることが可能です。
    1310         * なお、すべてのチャートに、同一のプラグインを指定する場合は、この属性ではなく、
    1311         * Chart.plugins.register({ afterDatasetsDraw: function(chart, options) { ･･･ } });
    1312         * 形式で、プラグイン登録
    1313         *
    1314         * @og.rev 6.9.9.2 (2018/09/18) プラグイン定義された関数を指定します。
    1315         *
    1316         * @param attri 追加属性の値
    1317         */
    1318        public void setPlugins( final String attri ) {
    1319                plugins = nval( getRequestParameter( attri ),plugins );
    1320        }
    1321
    1322        /**
    1323         * 【TAG】点のスタイル属性を使用するかどうか[true/false]を指定します(初期値:false)。
    1324         *
    1325         * @og.tag
    1326         * 具体的なスタイルは、jsChartDataタグで、指定します。
    1327         * 複数データの場合、片方だけ指定したい場合は、usePointStyle="true" にしておき、
    1328         * jsChartDataタグ側で、指定したいほうだけ、pointStyle属性を設定してください。
    1329         *
    1330         * @og.rev 6.8.5.0 (2018/01/09) 新規追加
    1331         *
    1332         * @param usePstyle 点のスタイル属性を使用するかどうか [true:使用する/false:使用しない]
    1333         */
    1334        public void setUsePointStyle( final String usePstyle ) {
    1335                usePointStyle = nval( getRequestParameter( usePstyle ),usePointStyle );
    1336        }
    1337
    1338        /**
    1339         * 【TAG】(通常は使いません)sessionから所得する DBTableModelオブジェクトの ID。
    1340         *
    1341         * @og.tag
    1342         *
    1343         * @og.rev 6.9.9.3 (2018/09/25) nvalを入れて、初期値を設定します。
    1344         *
    1345         * @param tableId テーブルID
    1346         */
    1347        public void setTableId( final String tableId ) {
    1348//              this.tableId = getRequestParameter( tableId );
    1349                this.tableId = nval( getRequestParameter( tableId ) , this.tableId );
    1350        }
    1351
    1352        /**
    1353         * 【TAG】マーカーラインの設定値をCSV形式で複数指定します。
    1354         *
    1355         * @og.tag
    1356         * annotation オプションに値を設定します。
    1357         * X軸に平行に固定値の線を引きます。線の値を、CSV形式で指定します。
    1358         * type: 'line',scaleID: 'y-axis-0',mode: 'horizontal',borderWidth: 2 固定です。
    1359         *
    1360         * @og.rev 6.8.5.0 (2018/01/09) 新規追加
    1361         *
    1362         * @param mkVals マーカーラインの設定値(CSV形式)
    1363         */
    1364        public void setMarkValues( final String mkVals ) {
    1365                markValues = nval( getRequestParameter( mkVals ) , markValues );
    1366        }
    1367
    1368        /**
    1369         * 【TAG】マーカーラインの色をCSV形式で複数指定します。
    1370         *
    1371         * @og.tag
    1372         * annotation オプションに値を設定します。
    1373         * X軸に平行に固定値の線を引きます。線の色を、CSV形式で指定します。
    1374         * markValues が指定されており、markColorsが指定されていない場合は、青色(BLUE)になります。
    1375         *
    1376         * @og.rev 6.8.5.0 (2018/01/09) 新規追加
    1377         *
    1378         * @param mkCols マーカーラインの色(CSV形式)
    1379         */
    1380        public void setMarkColors( final String mkCols ) {
    1381                markColors = nval( getRequestParameter( mkCols ) , markColors );
    1382        }
    1383
    1384        /**
    1385         * 【TAG】マーカーラインのラベルをCSV形式で複数指定します。
    1386         *
    1387         * @og.tag
    1388         * annotations の label 属性 の content 属性に値をセットします。
    1389         * label 属性は、enabled: 'true',position: 'left',backgroundColor: 'rgba(0,0,0,0)',
    1390         * fontSize: 10, は固定で、fontColor は、markColors 属性で指定した
    1391         * マーカーラインの色を使用します。
    1392         *
    1393         * @og.rev 6.8.5.0 (2018/01/09) 新規追加
    1394         *
    1395         * @param mklbls マーカーラインのラベル(CSV形式)
    1396         */
    1397        public void setMarkLbls( final String mklbls ) {
    1398                markLbls = nval( getRequestParameter( mklbls ) , markLbls );
    1399        }
    1400
    1401        /**
    1402         * 【TAG】マーカーラインのラベル表示位置の上下方向を調整します(初期値:-6)。
    1403         *
    1404         * @og.tag
    1405         * annotation オプションに値を設定します。
    1406         * annotations の label 属性の yAdjust に値をセットします。
    1407         * これは、ラインに対するラベルの位置を表します。＋で、下側、－で上側に表示します。
    1408         * 初期値は、－６ で、ラインの上側に来るように調整しています。
    1409         *
    1410         * @og.rev 6.8.5.0 (2018/01/09) 新規追加
    1411         *
    1412         * @param mkAjst マーカーラインのラベル表示位置の上下方向調整
    1413         */
    1414        public void setMarkAdjust( final String mkAjst ) {
    1415                markAdjust = nval( getRequestParameter( mkAjst ) , markAdjust );
    1416        }
    1417
    1418        /**
    1419         * 【TAG】ズーム処理を使用するかどうか[true/false]を指定します。
    1420         *
    1421         * @og.tag
    1422         * annotation オプションにpan と zoom を設定します。
    1423         * これは、chartjs-plugin-zoom.js を使用します。
    1424         * 初期値は、false:使用しないです。
    1425         *
    1426         * <ul>
    1427         *   <li>ﾎｲｰﾙでxy軸の拡大、縮小                 </li>
    1428         *   <li>canvasをクリックでzoomリセット   </li>
    1429         *   <li>ｸﾘｯｸした状態で移動で、ﾊﾟﾝ動作     </li>
    1430         *   <li>数値(日付)ｽｹｰﾙの方向のみ可能      </li>
    1431         * </ul>
    1432         *
    1433         * @og.rev 6.8.5.0 (2018/01/09) 新規追加
    1434         *
    1435         * @param zoom ズーム処理を使用するかどうか [true:使用する/false:使用しない] (初期値:false)。
    1436         */
    1437        public void setUseZoom( final String zoom ) {
    1438                useZoom = nval( getRequestParameter( zoom ) , useZoom );
    1439        }
    1440
    1441        /**
    1442         * 【TAG】横幅の動的設定カラムを設定します。
    1443         *
    1444         * @og.tag
    1445         *
    1446         * @og.rev 5.9.19.0 (2017/04/07) 追加
    1447         * @og.rev 6.9.9.3 (2018/09/25) nvalを入れて、初期値を設定します。
    1448         *
    1449         * @param widthEventColumn 横幅の動的設定カラム
    1450         */
    1451        public void setWidthEventColumn( final String widthEventColumn ) {
    1452//              this.widthEventColumn = getRequestParameter( widthEventColumn );
    1453                this.widthEventColumn = nval( getRequestParameter( widthEventColumn ),this.widthEventColumn );
    1454        }
    1455
    1456        /**
    1457         * 【TAG】縦幅の動的設定カラムを設定します。
    1458         *
    1459         * @og.tag
    1460         *
    1461         * @og.rev 5.9.19.0 (2017/04/07) 追加
    1462         * @og.rev 6.9.9.3 (2018/09/25) nvalを入れて、初期値を設定します。
    1463         *
    1464         * @param heightEventColumn 縦幅の動的設定カラム
    1465         */
    1466        public void setHeightEventColumn( final String heightEventColumn ) {
    1467                this.heightEventColumn = getRequestParameter( heightEventColumn );
    1468                this.heightEventColumn = nval( getRequestParameter( heightEventColumn ),this.heightEventColumn );
    1469        }
    1470
    1471        /**
    1472         * 【TAG】minの動的設定カラムを設定します。
    1473         *
    1474         * @og.tag
    1475         *
    1476         * @og.rev 5.9.19.0 (2017/04/07) 追加
    1477         * @og.rev 6.9.9.3 (2018/09/25) nvalを入れて、初期値を設定します。
    1478         *
    1479         * @param minEventColumn minの動的設定カラム
    1480         */
    1481        public void setMinEventColumn( final String minEventColumn ) {
    1482//              this.minEventColumn = getRequestParameter( minEventColumn );
    1483                this.minEventColumn = nval( getRequestParameter( minEventColumn ),this.minEventColumn );
    1484        }
    1485
    1486        /**
    1487         * 【TAG】maxの動的設定カラムを設定します。
    1488         *
    1489         * @og.tag
    1490         *
    1491         * @og.rev 5.9.19.0 (2017/04/07) 追加
    1492         * @og.rev 6.9.9.3 (2018/09/25) nvalを入れて、初期値を設定します。
    1493         *
    1494         * @param maxEventColumn maxの動的設定カラム
    1495         */
    1496        public void setMaxEventColumn( final String maxEventColumn ) {
    1497//              this.maxEventColumn = getRequestParameter( maxEventColumn );
    1498                this.maxEventColumn = nval( getRequestParameter( maxEventColumn ),this.maxEventColumn );
    1499        }
    1500
    1501        /**
    1502         * 【TAG】ﾃﾞｰﾀが０の場合、使用しない（除外する）かどうかを指定します[true:０ﾃﾞｰﾀを除外する](初期値:false)。
    1503         *
    1504         * @og.tag
    1505         * JSON データを作成して、JsChartに渡しますが、このフラグを true に設定すると
    1506         * 0 または、null（空文字列）のデータを出力しません。  6.8.3.0 (2017/11/27)
    1507         * グラフ系で、0 が、ありえない値として設定されている場合に、使用すると、
    1508         * 出力するデータ量を抑えることが出来ます。
    1509         *
    1510         * @og.rev 6.7.7.0 (2017/03/31) useZeroDataOmit属性の追加
    1511         *
    1512         * @param useZeroOmit ﾃﾞｰﾀが０の場合、使用しないかどうか
    1513         */
    1514        public void setUseZeroDataOmit( final String useZeroOmit ) {
    1515                this.useZeroDataOmit = nval( getRequestParameter( useZeroOmit ) , this.useZeroDataOmit );
    1516        }
    1517
    1518//      /**
    1519//       * 【TAG】ﾃﾞｰﾀを、間引いて表示します。(初期値:0:間引かない)。
    1520//       *
    1521//       * @og.tag
    1522//       * データ量が非常に多いと、JavaScriptの表示が遅くなります。
    1523//       * そこで、指定のﾃﾞｰﾀ量を間引きます。
    1524//       * 単純に間引くと、重要なデータが消失する可能性があるため、間引いている間の
    1525//       * ﾃﾞｰﾀは、最大値と最小値の２つの配列に設定し、そのﾃﾞｰﾀを表示します。
    1526//       * yscaleType が  category か、xscaleType が linear の場合は、間引き処理は行いません。
    1527//       * マイナスを指定すると、自動設定になります。
    1528//       * 自動設定は、{@og.value #AUTO_SKIP_MIN_COUNT} 以上の行数の場合、
    1529//       * {@og.value #AUTO_SKIP_SIZE} になるように、間引き件数を決めます。
    1530//       * 初期値は、0:間引かないです。
    1531//       *
    1532//       * @og.rev 6.9.2.0 (2018/03/05) skipDataNum 属性の追加
    1533//       *
    1534//       * @param skipDataNum ﾃﾞｰﾀを、間引く数
    1535//       * @see         #AUTO_SKIP_MIN_COUNT
    1536//       * @see         #AUTO_SKIP_SIZE
    1537//       */
    1538//      public void setSkipDataNum( final String skipDataNum ) {
    1539//              this.skipDataNum = nval( getRequestParameter( skipDataNum ) , this.skipDataNum );
    1540//      }
    1541
    1542        /**
    1543         * 【TAG】JSON出力で、値出力にレンデラを利用するかどうかを指定します。
    1544         *
    1545         * @og.tag
    1546         * JSONのデータのレンデラー変換を行うかどうか。
    1547         * 数値部分にはレンデラー変換は行いません。ラベル文字に行います。
    1548         * 指定しない場合は使用しない(false)です。
    1549         *
    1550         * @og.rev 6.7.9.0 (2017/04/28) useRenderer 追加
    1551         *
    1552         * @param       usernd レンデラーを利用するかどうか
    1553         */
    1554        public void setUseRenderer( final String usernd ) {
    1555                this.useRenderer = nval( getRequestParameter( usernd ) , this.useRenderer );
    1556        }
    1557
    1558        /**
    1559         * 【TAG】検索結果をこのカラムでソートし直します(初期値:null)。
    1560         *
    1561         * @og.tag
    1562         * query で検索した結果を、JsChartで利用する場合、チャート上のソート順と、
    1563         * リストや、別のチャートでの表示準が異なる場合に、このカラムで、ソートしなおします。
    1564         * 通常は、labelColumn と同じ値でソートすることで、X軸の順番に表示されます。
    1565         *
    1566         * @og.rev 6.8.0.0 (2017/06/02) sortColumn 追加
    1567         *
    1568         * @param       sortClm このカラムでソートし直す
    1569         */
    1570        public void setSortColumn( final String sortClm ) {
    1571                sortColumn = nval( getRequestParameter( sortClm ) , sortColumn );
    1572        }
    1573
    1574        /**
    1575         * 【TAG】optionsの属性に、その他ｵﾌﾟｼｮﾝを追加指定します。
    1576         *
    1577         * @og.tag
    1578         * optionsの属性に、その他ｵﾌﾟｼｮﾝを追加指定します。
    1579         *
    1580         * @param attri オプションの値
    1581         */
    1582        public void setOptionAttributes( final String attri ) {
    1583                optionAttributes = nval( getRequestParameter( attri ),optionAttributes );
    1584        }
    1585
    1586        /**
    1587         * 【TAG】chartの属性に、TLDで未定義の属性を追加指定します。
    1588         *
    1589         * @og.tag
    1590         * chartの属性に、TLDで未定義の属性を追加指定します。
    1591         * これは、TLDで未定義の属性を、chart.js で使用する場合に、引数の属性をそのまま、追加します。
    1592         *
    1593         * @og.rev 6.9.9.2 (2018/09/18) chartの属性に、TLDで未定義の属性を追加指定します。
    1594         *
    1595         * @param attri 追加属性の値
    1596         */
    1597        public void setChartAttributes( final String attri ) {
    1598                chartAttributes = nval( getRequestParameter( attri ),chartAttributes );
    1599        }
    1600
    1601        /**
    1602         * このオブジェクトの文字列表現を返します。
    1603         * 基本的にデバッグ目的に使用します。
    1604         *
    1605         * @og.rev 2017/03/28 widthEventColumn,heightEventColumn,minEventColumn,maxEventColumnを追加
    1606         * @og.rev 6.9.9.3 (2018/09/25) xscaleType の time 属性廃止。
    1607         *
    1608         * @return このクラスの文字列表現
    1609         */
    1610        @Override
    1611        public String toString() {
    1612                return ToString.title( this.getClass().getName() )
    1613                        .println( "VERSION"                             , VERSION                               )
    1614                        .println( "id"                                  , id                                    )
    1615                        .println( "tableId"                             , tableId                               )
    1616                        .println( "chartType"                   , chartType                             )
    1617                        .println( "width"                               , width                                 )
    1618                        .println( "height"                              , height                                )
    1619                        .println( "max"                                 , max                                   )
    1620                        .println( "min"                                 , min                                   )
    1621                        .println( "stepSize"                    , stepSize                              )
    1622                        .println( "barWidthPer"                 , barWidthPer                   )
    1623//                      .println( "timeUnit"                    , timeUnit                              )       // 6.9.9.3 (2018/09/25) xscaleType の time 属性廃止。
    1624//                      .println( "timeUnitStepSize"    , timeUnitStepSize              )       // 6.9.9.3 (2018/09/25) xscaleType の time 属性廃止。
    1625//                      .println( "timeLblFormat"               , timeLblFormat                 )       // 6.9.9.3 (2018/09/25) xscaleType の time 属性廃止。
    1626//                      .println( "timeSetFormat"               , timeSetFormat                 )       // 6.9.9.3 (2018/09/25) xscaleType の time 属性廃止。
    1627//                      .println( "timeMax"                             , timeMax                               )       // 6.9.9.3 (2018/09/25) xscaleType の time 属性廃止。
    1628//                      .println( "timeMin"                             , timeMin                               )       // 6.9.9.3 (2018/09/25) xscaleType の time 属性廃止。
    1629                        .println( "title"                               , title                                 )
    1630                        .println( "titlePosition"               , titlePosition                 )
    1631                        .println( "xlabel"                              , xlabel                                )
    1632                        .println( "ylabel"                              , ylabel                                )
    1633                        .println( "legendPosition"              , legendPosition                )
    1634                        .println( "legendDisplay"               , legendDisplay                 )
    1635                        .println( "yscaleCallback"              , yscaleCallback                )
    1636                        .println( "xscaleCallback"              , xscaleCallback                )
    1637                        .println( "xscaleType"                  , xscaleType                    )
    1638                        .println( "xmax"                                , xmax                                  )
    1639                        .println( "xmin"                                , xmin                                  )
    1640                        .println( "xstepSize"                   , xstepSize                             )
    1641                        .println( "yscaleType"                  , yscaleType                    )
    1642                        .println( "ycategoryList"               , ycategoryList                 )
    1643                        .println( "widthEventColumn"    , widthEventColumn              )       // 2017/03/28 追加
    1644                        .println( "heightEventColumn"   , heightEventColumn             )       // 2017/03/28 追加
    1645                        .println( "minEventColumn"              , minEventColumn                )       // 2017/03/28 追加
    1646                        .println( "maxEventColumn"              , maxEventColumn                )       // 2017/03/28 追加
    1647                        .println( "optionAttributes"    , optionAttributes              )
    1648                        .fixForm().toString();
    1649        }
    1650}