    001/*
    002 * Copyright (c) 2009 The openGion Project.
    003 *
    004 * Licensed under the Apache License, Version 2.0 (the "License");
    005 * you may not use this file except in compliance with the License.
    006 * You may obtain a copy of the License at
    007 *
    008 *     http://www.apache.org/licenses/LICENSE-2.0
    009 *
    010 * Unless required by applicable law or agreed to in writing, software
    011 * distributed under the License is distributed on an "AS IS" BASIS,
    012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
    013 * either express or implied. See the License for the specific language
    014 * governing permissions and limitations under the License.
    015 */
    016package org.opengion.hayabusa.taglib;
    017
    018import java.util.ArrayList;
    019import java.util.List;
    020import java.util.Set;                                                                                   // 6.4.3.4 (2016/03/11)
    021import java.util.Iterator;                                                                              // 6.7.7.0 (2017/03/31)
    022import java.util.function.IntFunction;                                                  // 7.0.1.3 (2018/11/12)
    023
    024import org.opengion.fukurou.system.BuildNumber;                                 // 7.0.1.2 (2018/11/04)
    025import org.opengion.hayabusa.common.HybsSystem;
    026import org.opengion.hayabusa.common.HybsSystemException;
    027import org.opengion.hayabusa.db.DBTableModelSorter;
    028import org.opengion.hayabusa.db.DBTableModel;
    029import org.opengion.hayabusa.db.DBColumn;                                               // 6.8.3.1 (2017/12/01)
    030import org.opengion.hayabusa.io.JsChartData;                                    // 7.0.1.1 (2018/10/22)
    031
    032import org.opengion.fukurou.util.ArraySet;                                              // 6.4.3.4 (2016/03/11)
    033import org.opengion.fukurou.util.ToString;
    034import org.opengion.fukurou.util.StringUtil;                                    // 6.8.3.1 (2017/12/01)
    035import org.opengion.fukurou.util.ColorMap;                                              // 7.0.1.3 (2018/11/12)
    036import static org.opengion.fukurou.util.StringUtil.nval ;
    037
    038/**
    039 * JsChart は、JavascriptのjsChart用のｽｸﾘﾌﾟﾄを出力するクラスです。
    040 * 複数の JsChartData オブジェクトを合成することも、ここで行っています。
    041 * ChartJSを利用しているため、標準属性以外の項目をセットする場合はoptionAttributesで行ってください。
    042 * 例えばアニメーションをOFFにする場合はanimation:falseをセットします。
    043 *
    044 * 出力されるスクリプトでは、idを指定しない場合はhybscanvas[tableId]が利用されます。
    045 * 複数のグラフを同一画面で出力する場合はidかtableIdを変えてください。
    046 * チャートオブジェクトはchart_[id]という名前で作成されるため、ajax等でコントロールが必要な場合は利用してください。
    047 *
    048 * @og.formSample
    049 * ●形式：&lt;og:jsChart chartType="…" ... /&gt;
    050 * ●body：あり(EVAL_BODY_BUFFERED:BODYを評価し、{$#064;XXXX} を解析します)
    051 *
    052 * ●Tag定義：
    053 *  &lt;og:jsChart
    054 *      chartType       ○【TAG】ﾁｬｰﾄの種類(type属性)を指定します[line/bar/horizontalBar/radar/polarArea/pie/doughnut/bubble/scatter](必須)。
    055 *      labelColumn     ○【TAG】ﾗﾍﾞﾙのｶﾗﾑ名(data:labels属性)を指定します(表示名称）(必須)。
    056 *      id                【TAG】canvasﾀｸﾞのidを指定します(初期値:hybscanvas)。
    057 *      height            【TAG】ﾁｬｰﾄ(canvasﾀｸﾞ)の高さを指定します(初期値:400)。
    058 *      width             【TAG】ﾁｬｰﾄ(canvasﾀｸﾞ)の幅を指定します(初期値:400)。
    059 *      title             【TAG】ﾀｲﾄﾙを指定します(options:title:text)。
    060 *      titlePosition     【TAG】ﾀｲﾄﾙの表示位置[top/right/bottom/left]を指定します(options:title:position)。
    061 *      legendDisplay     【TAG】凡例を表示するか[true/false]を指定します(options:legend:display)。
    062 *      legendPosition    【TAG】凡例の表示位置[top/right/bottom/left]を指定します(options:legend:position)。
    063 *      usePointStyle     【TAG】凡例のスタイル属性を使用するかどうか[true/false]を指定します(options:legend:labels:usePointStyle)。       // 6.8.5.0 (2018/01/09)
    064 *      barWidthPer       【TAG】棒線の横幅を指定します(初期値:0.8, typeがbar,horizontalBarの場合に有効)(options:xAxes:categoryPercentage)。
    065 *      onClick           【TAG】ﾁｬｰﾄｸﾘｯｸ時のｲﾍﾞﾝﾄを指定します(options:onClick)。
    066 *      plugins           【TAG】プラグイン定義された関数を指定します(plugins)。     // 6.9.9.2 (2018/09/18)
    067 *  ===================
    068 *      xposition         【TAG】x軸の表示位置[top/right/bottom/left]を指定します(初期値:bottom)(options:scales:xAxes:position)。         // 7.0.1.2 (2018/11/04)
    069 *      xscaleType        【TAG】x軸のｽｹｰﾙﾀｲﾌﾟ[category/linear/time/realtime]を指定します(初期値:category)(options:scales:xAxes:type)。
    070 *      xlabel            【TAG】x軸のラベルを指定します(options:scales:xAxes:scaleLabel:labelString)。
    071 *      xscaleCallback    【TAG】x軸ｺｰﾙﾊﾞｯｸを指定します(options:scales:xAxes:ticks:callback)。
    072 *      xbeginAtZero      【TAG】x軸を０から書き始まるかどうか(xscaleTypeがlinearの場合に有効)(options:scales:xAxes:ticks:beginAtZero) // 7.0.1.1 (2018/10/22) 初期値 null
    073 *      xmax              【TAG】x軸の最大値を指定します(xscaleTypeがlinearの場合に有効)(options:scales:xAxes:ticks:max)。
    074 *      xmin              【TAG】x軸の最小値を指定します(xscaleTypeがlinearの場合に有効)(options:scales:xAxes:ticks:min)。
    075 *      xstepSize         【TAG】x軸のメモリ幅を指定します(xscaleTypeがlinearの場合に有効)(options:scales:xAxes:ticks:stepSize)。
    076 *      optChart          【TAG】chartの属性に、TLDで未定義の属性を追加指定します。                                                    // 7.0.1.2 (2018/11/04)
    077 *      optOptions        【TAG】optionsの属性に、その他ｵﾌﾟｼｮﾝを追加指定します。                                                   // 7.0.1.2 (2018/11/04)
    078 *      optAxis           【TAG】その他options:scales:xAxesのｵﾌﾟｼｮﾝを指定します。                                                    // 7.0.1.2 (2018/11/04)
    079 *      optTicks          【TAG】その他options:scales:xAxes:ticksのｵﾌﾟｼｮﾝを指定します。                                              // 7.0.1.2 (2018/11/04)
    080 *      optScaleLabel     【TAG】その他options:scales:xAxes:scaleLabelのｵﾌﾟｼｮﾝを指定します。                         // 7.0.1.2 (2018/11/04)
    081 *      optGridLines      【TAG】その他options:scales:xAxes:gridLinesのｵﾌﾟｼｮﾝを指定します。                                  // 7.0.1.2 (2018/11/04)
    082 *  =================== options:scales:xAxes:time 以下の属性(xscaleTypeがtimeの場合に有効)
    083 *      timeUnit          【TAG】x軸のﾀｲﾑの単位[year/quarter/month/week/day/hour/minute/second]を指定(time:unit)します(指定しない場合は自動)。
    084 *      timeMax           【TAG】x軸のﾀｲﾑの最大値を指定します(time:max)。
    085 *      timeMin           【TAG】x軸のﾀｲﾑの最小値を指定します(time:min)。
    086 *      timeUnitStepSize  【TAG】x軸のﾀｲﾑの単位幅を指定します(time:unitStepSize)。
    087 *      timeSetFormat     【TAG】x軸の設定するﾀｲﾑ(入力ﾃﾞｰﾀ)のﾌｫｰﾏｯﾄを指定します(time:format)。
    088 *      timeLblFormat     【TAG】x軸の表示するﾀｲﾑのﾌｫｰﾏｯﾄを指定します(time:displayFormats:year～secondまで同じ値を設定します)。
    089 *      tooltipFormat     【TAG】時間のﾂｰﾙﾁｯﾌﾟに使用するﾌｫｰﾏｯﾄ(time:tooltipFormat)                                                        // 7.0.1.0 (2018/10/15)
    090 *  ===================
    091 *      markValues        【TAG】y軸に横マーカーラインの設定値をCSV形式で複数指定します    // 6.8.5.0 (2018/01/09)
    092 *      markColors        【TAG】y軸に横マーカーラインの色をCSV形式で複数指定します              // 6.8.5.0 (2018/01/09)
    093 *      markLbls          【TAG】y軸に横マーカーラインのラベルをCSV形式で複数指定します(未指定時はラベルを表示しません)   // 6.8.5.0 (2018/01/09)
    094 *      markAdjust        【TAG】y軸に横マーカーラインのラベル表示位置の上下方向を調整します(＋でラインの下側、－で上側に位置を移動します。初期値:-6)。   // 6.8.5.0 (2018/01/09)
    095 *      xmarkValues       【TAG】x軸に縦マーカーラインの設定値をCSV形式で複数指定します    // 7.0.1.1 (2018/10/22)
    096 *      xmarkColors       【TAG】x軸に縦マーカーラインの色をCSV形式で複数指定します              // 7.0.1.1 (2018/10/22)
    097 *      markWidth         【TAG】x軸,y軸全マーカーライン共通のラインの幅を指定します:borderWidth(初期値:2)                                   // 7.0.1.1 (2018/10/22)
    098 *      markDash          【TAG】x軸,y軸全マーカーライン共通のラインに点線を指定([5,2]など)します:borderDash(初期値:null)       // 7.0.1.1 (2018/10/22)
    099 *      markFontSize      【TAG】x軸,y軸全マーカーライン共通のラベルのフォントサイズを指定します:fontSize(初期値:10)               // 7.0.1.1 (2018/10/22)
    100 *  ===================
    101 *      useZeroDataOmit   【TAG】ﾃﾞｰﾀが０の場合、使用しない（除外する）かどうかを指定します[true:０ﾃﾞｰﾀを除外する](初期値:false)
    102 *      useRenderer       【TAG】データ出力でレンデラを利用するかどうか[true/false]を指定します(初期値:false)
    103 *      sortColumn        【TAG】検索結果をこのカラムでソートしなおします(初期値:null)。
    104 *      valueQuot         【TAG】値の前後にクオートをはさむかどうか[true/false]指定します。
    105 *      useZoom           【TAG】ズーム処理を使用するかどうか[true/false]を指定します。        // 6.8.5.0 (2018/01/09)
    106 *      varColumns        【TAG】TableModelの指定のカラムをvarの配列変数として出力します。      // 7.0.1.2 (2018/11/04)
    107 *  ===================
    108 * X    widthEventColumn  【廃止】横幅を動機に設定するｶﾗﾑのIDを指定します。
    109 * X    heightEventColumn 【廃止】縦幅を動的に設定するｶﾗﾑのIDを指定します。
    110 * X    minEventColumn    【廃止】minを動的に設定するｶﾗﾑのIDを指定します。
    111 * X    maxEventColumn    【廃止】maxを動的に設定するｶﾗﾑのIDを指定します。
    112 *  ===================
    113 * X    optionAttributes  【廃止】optionsの属性に、その他ｵﾌﾟｼｮﾝを追加指定します。(7.0.1.2 (2018/11/04) 廃止)
    114 *      tableId           【TAG】(通常は使いません)sessionから所得する DBTableModelオブジェクトの ID
    115 *      scope             【TAG】キャッシュする場合のスコープ[request/page/session/application]を指定します(初期値:session)
    116 *      caseKey           【TAG】このタグ自体を利用するかどうかの条件キーを指定します(初期値:null)
    117 *      caseVal           【TAG】このタグ自体を利用するかどうかの条件値を指定します(初期値:null)
    118 *      caseNN            【TAG】指定の値が、null/ゼロ文字列 でない場合(Not Null=NN)は、このタグは使用されます(初期値:判定しない)
    119 *      caseNull          【TAG】指定の値が、null/ゼロ文字列 の場合は、このタグは使用されます(初期値:判定しない)
    120 *      caseIf            【TAG】指定の値が、true/TRUE文字列の場合は、このタグは使用されます(初期値:判定しない)
    121 *      debug             【TAG】デバッグ情報を出力するかどうか[true/false]を指定します(初期値:false)
    122 *  &gt;   ... Body ...
    123 *  &lt;/og:jsChart&gt;
    124 *
    125 * ●使用例
    126 *      &lt;og:jsChart
    127 *          chartType      = "[line/bar/horizontalBar/radar/polarArea/pie/doughnut/bubble/scatter]"
    128 *          labelColumn    = "LDATA"
    129 *          id             = "hybscanvas"
    130 *          height         = "400"
    131 *          width          = "400"
    132 *          title          = "タイトル"
    133 *          titlePosition  = "top"                              [top/right/bottom/left]
    134 *          xlabel         = "名称"
    135 *          legendPosition = "right"                    [top/right/bottom/left]
    136 *          legendDisplay  = "true"                             [true/false]
    137 *          xsclaeCallback = "function(value){return value + ' 様';}"
    138 *          xscaleType     = "linear"
    139 *          xmax           = "1000000"
    140 *          xmin           = "100000"
    141 *          xstepSize      = "10000"
    142 *          barWidthPer    = "0.4"
    143 *      &gt;
    144 *          &lt;og:jsChartData ... /&gt;
    145 *      &lt;/og:jsChart&gt;
    146 *
    147 * @og.group 画面表示
    148 *
    149 * @version     5.9.17.2                2017/02/08
    150 * @author      T.OTA
    151 * @since       JDK7.0
    152 *
    153 */
    154public class JsChartTag extends CommonTagSupport {
    155        //* このプログラムのVERSION文字列を設定します。{@value} */
    156        private static final String VERSION = "8.0.0.0 (2021/08/31)" ;
    157        private static final long serialVersionUID = 800020210831L ;
    158
    159//      8.0.0.0 (2021/08/31) chartJs V3 以降は、timeもrealtimeも表示するようになった…らしい
    160//      // xscaleType="realtime" のときのみ、ｲﾝｸﾙｰﾄﾞします。
    161//      private static final String STREAMING_JS        = "common/option/chartjs-plugin-streaming.min.js";              // 7.0.1.2 (2018/11/04)
    162//      private static final String SCRIPT_STREAMING_JS
    163//                                                      = "<script type=\"text/javascript\" src=\""
    164//                                                              + "/" + HybsSystem.getContextName() + "/jsp/"
    165//                                                              + STREAMING_JS
    166//                                                              + "?v=" + BuildNumber.BUILD_ID
    167//                                                              + "\" ><!-- --></script>"
    168//                                                              + CR ;
    169
    170        /** chartType 引数に渡す事の出来る タイプ 折れ線 {@value} */
    171        public static final String              CTYPE_LINE                      = "line";
    172        /** chartType 引数に渡す事の出来る タイプ 棒線 {@value} */
    173        public static final String              CTYPE_BAR                       = "bar";
    174        /** chartType 引数に渡す事の出来る タイプ 横棒線 {@value} */
    175        public static final String              CTYPE_HBAR                      = "horizontalBar";
    176        /** chartType 引数に渡す事の出来る タイプ レイダー {@value} */
    177        public static final String              CTYPE_RADAR                     = "radar";
    178        /** chartType 引数に渡す事の出来る タイプ ポーラエリア {@value} */
    179        public static final String              CTYPE_POLAR                     = "polarArea";
    180        /** chartType 引数に渡す事の出来る タイプ 円 {@value} */
    181        public static final String              CTYPE_PIE                       = "pie";
    182        /** chartType 引数に渡す事の出来る タイプ ドーナツ {@value} */
    183        public static final String              CTYPE_DOUGHNUT          = "doughnut";
    184        /** chartType 引数に渡す事の出来る タイプ バブル {@value} 8.0.0.0 (2021/08/20) 追加 */
    185        public static final String              CTYPE_BUBBLE                    = "bubble";
    186        /** chartType 引数に渡す事の出来る タイプ 散乱図 {@value} 8.0.0.0 (2021/08/20) 追加 */
    187        public static final String              CTYPE_SCATTER           = "scatter";
    188
    189        /** chartType 引数に渡す事の出来る タイプ リスト {@value} */
    190//      private static final Set<String> CTYPE_SET              = new ArraySet<>( CTYPE_LINE,CTYPE_BAR,CTYPE_HBAR,CTYPE_RADAR,CTYPE_POLAR,CTYPE_PIE,CTYPE_DOUGHNUT );
    191        private static final Set<String> CTYPE_SET
    192                = new ArraySet<>( CTYPE_LINE,CTYPE_BAR,CTYPE_HBAR,CTYPE_RADAR,CTYPE_POLAR,
    193                                                        CTYPE_PIE,CTYPE_DOUGHNUT,CTYPE_BUBBLE,CTYPE_SCATTER );
    194
    195        // 6.9.9.4 (2018/10/01) String配列から、Set に変更
    196        /** chartType が円形のリスト */
    197        private static final Set<String> SET_CI_TYPE    = new ArraySet<>( CTYPE_RADAR, CTYPE_POLAR, CTYPE_PIE, CTYPE_DOUGHNUT );
    198
    199        private static final String TYPE_CATEGORY               = "category";
    200        private static final String TYPE_LINEAR                 = "linear";
    201        private static final String TYPE_TIME                   = "time";
    202        private static final String TYPE_REALTIME               = "realtime";           // 7.0.1.2 (2018/11/04)
    203
    204        private static final Set<String> SET_POSITION   = new ArraySet<>( "top", "right", "bottom", "left" );
    205        private static final Set<String> SET_TIMEUNIT   = new ArraySet<>( "year", "quarter", "month", "week", "day", "hour", "minute", "second" );                                      // 7.0.0.1 (2018/10/09)
    206        private static final Set<String> SET_XSCALE             = new ArraySet<>( TYPE_CATEGORY, TYPE_TIME, TYPE_LINEAR, TYPE_REALTIME );
    207        private static final Set<String> SET_BOOLEAN    = new ArraySet<>( "true", "false" );
    208
    209        private static final String     CANVAS_NAME             = "hybscanvas";
    210
    211//      private static final String             MARK_DEF_COLOR  = "BLUE";               // 6.8.5.0 (2018/01/09) y軸に横マーカーラインの色の初期値
    212        private static final String             MARK_DEF_ADJUST = "-6";                 // 6.8.5.0 (2018/01/09) y軸に横マーカーラインの位置調整の初期値
    213
    214        // 7.0.1.3 (2018/11/12) バッファキー検索処理追加
    215        private static final String             TIME_FORMAT_JA  = "{year:'YYYY年',quarter:'YYYY年M月',month:'YYYY年M月',week:'M月D日',day:'M月D日',hour:'D日 H時',minute:'H時m分',second:'m分s秒'}" ;
    216        private static final String             TIME_FORMAT             = "{year:'YYYY',quarter:'YYYY/M',month:'YYYY/M',week:'M/D',day:'M/D',hour:'D HH',minute:'HH:mm',second:'HH:mm:ss'}" ;
    217
    218        // 7.0.1.3 (2018/11/12) true/false なので、記号化します。
    219        private static final boolean    USE_QUOTE               = false;
    220        private static final boolean    NO_QUOTE                = true;         // IS_NUMBER か、!USE_QUOTE か、
    221
    222        // 変数宣言
    223        // 6.9.8.0 (2018/05/28) FindBugs:直列化可能クラスの非 transient で非直列化可能なインスタンスフィールド
    224        private final transient List<JsChartData>       jsChartData = new ArrayList<JsChartData>() ;            // 6.7.5.0 (2017/03/10) jsChartDataのﾘｽﾄ
    225
    226        private transient       JsChartData jsXAxis  = new JsChartData();       // xAxes の設定用(datasetは使いません)
    227
    228        private String  chartBody                       ;                                                       // ﾁｬｰﾄタグのBODY部分に書かれた文字列
    229
    230        private String  chartType                       ;                                                       // ﾁｬｰﾄﾀｲﾌﾟ(必須)
    231        private String  labelColumn                     ;                                                       // ﾗﾍﾞﾙｶﾗﾑ(必須)
    232        private String  id                                      ;                                                       // canvasﾀｸﾞのid
    233        private String  height                          = "400";                                        // canvasﾀｸﾞのheight
    234        private String  width                           = "400";                                        // canvasﾀｸﾞのwidth
    235        private String  title                           ;                                                       // ﾀｲﾄﾙ
    236        private String  titlePosition           ;                                                       // ﾀｲﾄﾙ位置
    237        private String  legendPosition          ;                                                       // 凡例位置
    238        private String  legendDisplay           ;                                                       // 凡例表示ﾌﾗｸﾞ
    239        private boolean usePointStyle           ;                                                       // 6.8.5.0 (2018/01/09) 点のスタイル属性を使用するかどうか(初期値:false)
    240        private boolean useLegend                       ;                                                       // Legend関連属性(legendPosition,legendDisplay,usePointStyle) のどれかがセットされれば、true
    241        private String  barWidthPer                     = "0.8";                                        // 棒線の横幅(ﾊﾟｰｾﾝﾄ)
    242        private String  onClick                         ;                                                       // ｸﾘｯｸｲﾍﾞﾝﾄ
    243        private String  plugins                         ;                                                       // 6.9.9.2 (2018/09/18) プラグイン定義された関数を指定します。
    244        private String  xscaleType                      = TYPE_CATEGORY ;                       // x軸のｽｹｰﾙﾀｲﾌﾟ
    245        private String  xposition                       ;                                                       // x軸の表示位置[top/right/bottom/left]        // 7.0.1.2 (2018/11/04)
    246        private boolean valueQuot                       ;                                                       // 値の前後にクオートをはさむかどうか[true/false]指定します。
    247        private String  tableId                         = HybsSystem.TBL_MDL_KEY;       // ﾃｰﾌﾞﾙid
    248        private String  markValues                      ;                                                       // 6.8.5.0 (2018/01/09) y軸に横マーカーラインの設定値をCSV形式で複数指定します
    249        private String  markColors                      ;                                                       // 6.8.5.0 (2018/01/09) y軸に横マーカーラインの色をCSV形式で複数指定します
    250        private String  markLbls                        ;                                                       // 6.8.5.0 (2018/01/09) y軸に横マーカーラインのラベルをCSV形式で複数指定します(未指定時はラベルを表示しません)
    251        private String  markAdjust                      ;                                                       // 6.8.5.0 (2018/01/09) y軸に横マーカーラインのラベル表示位置の上下方向を調整します(初期値:-6)。
    252        private String  xmarkValues                     ;                                                       // 7.0.1.1 (2018/10/22) x軸に縦マーカーラインの設定値をCSV形式で複数指定します
    253        private String  xmarkColors                     ;                                                       // 7.0.1.1 (2018/10/22) x軸に縦マーカーラインの色をCSV形式で複数指定します
    254        private String  markWidth                       = "2";                                          // 7.0.1.1 (2018/10/22) マーカーライン共通のラインの幅を指定します:borderWidth(初期値:2)
    255        private String  markDash                        ;                                                       // 7.0.1.1 (2018/10/22) マーカーライン共通のラインに点線を指定([5,2]など)します:borderDash(初期値:null)
    256        private String  markFontSize            = "10";                                         // 7.0.1.1 (2018/10/22) マーカーライン共通のラベルのフォントサイズを指定します:fontSize(初期値:10)
    257        private boolean useZoom                         ;                                                       // 6.8.5.0 (2018/01/09) ズーム処理を使用するかどうか(初期値:false)
    258        private String  varColumns              ;                                                       // 7.0.1.2 (2018/11/04) TableModelの指定のカラムをvarの配列変数として出力します。
    259//      private String  widthEventColumn        ;                                                       // (廃止)横幅の動的参照ｶﾗﾑ       2017/03/28 ADD
    260//      private String  heightEventColumn       ;                                                       // (廃止)縦幅の動的参照ｶﾗﾑ       2017/03/28 ADD
    261//      private String  minEventColumn          ;                                                       // (廃止)最小値の動的参照ｶﾗﾑ      2017/03/28 ADD
    262//      private String  maxEventColumn          ;                                                       // (廃止)最大値の動的参照ｶﾗﾑ      2017/03/28 ADD
    263        private boolean useZeroDataOmit         ;                                                       // 6.7.7.0 (2017/03/31) ﾃﾞｰﾀが０の場合、使用しない（除外する）かどうか
    264        private boolean useRenderer                     ;                                                       // 6.7.9.0 (2017/04/28) useRenderer 追加
    265        private String  sortColumn                      ;                                                       // 6.8.0.0 (2017/06/02) 検索結果をこのカラムでソートしなおします(初期値:null)。
    266//      private String  optionAttributes        ;                                                       // ｵﾌﾟｼｮﾝ
    267//      private String  chartAttributes         ;                                                       // 6.9.9.2 (2018/09/18) chartの属性に、TLDで未定義の属性を追加指定します。
    268        private String  optChart                        ;                                                       // 7.0.1.2 (2018/11/04) chartの属性に、TLDで未定義の属性を追加指定します。
    269        private String  optOptions                      ;                                                       // 7.0.1.2 (2018/11/04) optionsの属性に、その他ｵﾌﾟｼｮﾝを追加指定します。
    270
    271        /**
    272         * デフォルトコンストラクター
    273         *
    274         * @og.rev 6.9.7.0 (2018/05/14) PMD Each class should declare at least one constructor
    275         */
    276        public JsChartTag() { super(); }                // これも、自動的に呼ばれるが、空のメソッドを作成すると警告されるので、明示的にしておきます。
    277
    278        /**
    279         * タグリブオブジェクトをリリースします。
    280         * キャッシュされて再利用されるので、フィールドの初期設定を行います。
    281         *
    282         * @og.rev 6.7.5.0 (2017/03/10) jsChartData属性の初期化もれ
    283         * @og.rev 5.9.19.0 (2017/04/07) T.OTA 61200-170316-02  ﾁｬｰﾄｻｲｽﾞ・max・minの動的変更対応
    284         * @og.rev 6.7.7.0 (2017/03/31) useZeroDataOmit属性の追加
    285         * @og.rev 6.7.9.0 (2017/04/28) useRenderer 追加
    286         * @og.rev 6.8.0.0 (2017/06/02) sortColumn 追加
    287         * @og.rev 6.8.3.0 (2017/11/27) useEqValOmit属性の追加
    288         * @og.rev 6.8.5.0 (2018/01/09) xbeginAtZero,ybeginAtZero,markValues,markColors,markLbls,markAdjust,rangeMin,rangeMax,usePointStyle属性の追加
    289         * @og.rev 6.9.9.2 (2018/09/18) plugins,chartAttributes属性の追加
    290         * @og.rev 6.9.9.3 (2018/09/25) xscaleType の time 属性廃止。
    291         * @og.rev 6.9.9.4 (2018/10/01) ﾘﾆｱ対応,time 属性復活
    292         * @og.rev 6.9.9.4 (2018/10/01) 7.0.1.0 (2018/10/15) time 属性修正、tooltipFormat属性の追加
    293         * @og.rev 7.0.1.1 (2018/10/22) xmarkValues,xmarkColors属性の追加
    294         * @og.rev 7.0.1.1 (2018/10/22) ylabelColor,y2label,y2labelColor属性の追加
    295         * @og.rev 7.0.1.2 (2018/11/04) ylabelColor,y2label,y2labelColor属性の追加
    296         */
    297        @Override
    298        protected void release2() {
    299                super.release2();
    300                jsChartData.clear();                            // 6.7.5.0 (2017/03/10)
    301                jsXAxis                         = new JsChartData();                            // xAxes の設定用(datasetは使いません)
    302
    303                chartBody                       = null;         // 7.0.1.1 (2018/10/22) ﾁｬｰﾄタグのBODY部分に書かれた文字列
    304                chartType                       = null;
    305                id                                      = null;
    306                height                          = "400";
    307                width                           = "400";
    308                labelColumn                     = null;
    309                title                           = null;
    310                titlePosition           = null;
    311                legendPosition          = null;
    312                legendDisplay           = null;
    313                usePointStyle           = false;        // 6.8.5.0 (2018/01/09) 点のスタイル属性を使用するかどうか
    314                useLegend                       = false;        // 7.0.1.1 (2018/10/22) Legend関連属性(legendPosition,legendDisplay,usePointStyle) のどれかがセットされれば、true
    315                barWidthPer                     = "0.8";
    316                onClick                         = null;
    317                plugins                         = null;         // 6.9.9.2 (2018/09/18) プラグイン定義された関数を指定します。
    318                xscaleType                      = TYPE_CATEGORY;
    319                xposition                       = null;         // 7.0.1.2 (2018/11/04) x軸の表示位置[top/right/bottom/left]
    320                valueQuot                       = false;        // 7.0.1.1 (2018/10/22) 値の前後にクオートをはさむかどうか[true/false]指定します。
    321                tableId                         = HybsSystem.TBL_MDL_KEY;
    322                markValues                      = null;         // 6.8.5.0 (2018/01/09) y軸に横マーカーラインの設定値をCSV形式で複数指定します
    323                markColors                      = null;         // 6.8.5.0 (2018/01/09) y軸に横マーカーラインの色をCSV形式で複数指定します
    324                markLbls                        = null;         // 6.8.5.0 (2018/01/09) y軸に横マーカーラインのラベルをCSV形式で複数指定します(未指定時はラベルを表示しません)
    325                markAdjust                      = null;         // 6.8.5.0 (2018/01/09) y軸に横マーカーラインのラベル表示位置の上下方向を調整します(初期値:-6)。
    326                xmarkValues                     = null;         // 7.0.1.1 (2018/10/22) x軸に縦マーカーラインの設定値をCSV形式で複数指定します
    327                xmarkColors                     = null;         // 7.0.1.1 (2018/10/22) x軸に縦マーカーラインの色をCSV形式で複数指定します
    328                markWidth                       = "2";          // 7.0.1.1 (2018/10/22) マーカーライン共通のラインの幅を指定します:borderWidth(初期値:2)
    329                markDash                        = null;         // 7.0.1.1 (2018/10/22) マーカーライン共通のラインに点線を指定([5,2]など)します:borderDash(初期値:null)
    330                markFontSize            = "10";         // 7.0.1.1 (2018/10/22) マーカーライン共通のラベルのフォントサイズを指定します:fontSize(初期値:10)
    331                useZoom                         = false;        // 6.8.5.0 (2018/01/09) ズーム処理を使用するかどうか(初期値:false)
    332                varColumns              = null;         // 7.0.1.2 (2018/11/04) TableModelの指定のカラムをvarの配列変数として出力します。
    333//              widthEventColumn        = null;         // 5.9.19.0
    334//              heightEventColumn       = null;         // 5.9.19.0
    335//              maxEventColumn          = null;         // 5.9.19.0
    336//              minEventColumn          = null;         // 5.9.19.0
    337                useZeroDataOmit         = false;        // 6.7.7.0 (2017/03/31) ﾃﾞｰﾀが０の場合、使用しない（除外する）かどうか
    338                useRenderer                     = false;        // 6.7.9.0 (2017/04/28) useRenderer 追加
    339                sortColumn                      = null;         // 6.8.0.0 (2017/06/02) 検索結果をこのカラムでソートしなおします(初期値:null)。
    340//              optionAttributes        = null;
    341//              chartAttributes         = null;         // 6.9.9.2 (2018/09/18) chartの属性に、TLDで未定義の属性を追加指定します。
    342                optChart                        = null;         // 7.0.1.2 (2018/11/04) chartの属性に、TLDで未定義の属性を追加指定します。
    343                optOptions                      = null;         // 7.0.1.2 (2018/11/04) optionsの属性に、その他ｵﾌﾟｼｮﾝを追加指定します。
    344        }
    345
    346        /**
    347         * Taglibの開始タグが見つかった時に処理する doStartTag() を オーバーライドします。
    348         *
    349         * @og.rev 6.7.5.0 (2017/03/10) タグの使用を決める共通属性の追加
    350         *
    351         * @return 後続処理の指示
    352         */
    353        @Override
    354        public int doStartTag() {
    355                if( !useTag() ) { return SKIP_BODY ; }          // 6.7.5.0 (2017/03/10)
    356
    357                return EVAL_BODY_BUFFERED; // Bodyを評価する
    358        }
    359
    360        /**
    361         * Taglibのタグ本体を処理する doAfterBody() を オーバーライドします。
    362         *
    363         * @og.rev 7.0.1.1 (2018/10/22) このスクリプトの中に入れたい文字があれば、登録できるようにします。
    364         *
    365         * @return      後続処理の指示(SKIP_BODY)
    366         */
    367        @Override
    368        public int doAfterBody() {
    369                chartBody = getBodyString();
    370
    371                if( chartBody != null ) {
    372                        chartBody = chartBody.trim();
    373                }
    374
    375                return SKIP_BODY ;
    376        }
    377
    378        /**
    379         * Taglibの終了タグが見つかったときに処理する doEndTag() を オーバーライドします。
    380         *
    381         * @og.rev 6.7.5.0 (2017/03/10) タグの使用を決める共通属性の追加
    382         * @og.rev 6.9.9.4 (2018/10/01) idの振り方、データの持ち方変更
    383         *
    384         * @return 後続処理の指示
    385         */
    386        @Override
    387        public int doEndTag() {
    388                debugPrint();
    389                if( !useTag() ) { return EVAL_PAGE ; }                  // 6.7.5.0 (2017/03/10)
    390
    391                id = (id==null ? tableId : id );                                // 6.9.9.4 (2018/10/01) id指定なしの場合はtableId
    392
    393                // jsChart出力
    394                jspPrint( jsChartOutput() );
    395
    396                return EVAL_PAGE;
    397        }
    398
    399        /**
    400         * jsChart出力用
    401         * jsChartTag と jsChartData を使用して、jsChart情報を出力します。
    402         *
    403         * @og.rev 5.9.19.0 (2017/04/07) T.OTA 61200-170316-02  ﾁｬｰﾄｻｲｽﾞ・max・minの動的変更対応
    404         * @og.rev 6.7.7.0 (2017/03/31) ﾁｬｰﾄﾃﾞｰﾀで、ｾﾞﾛ、null カラムを非表示にします。
    405         * @og.rev 6.7.9.0 (2017/04/28) useRenderer 追加
    406         * @og.rev 6.8.0.0 (2017/06/02) sortColumn 追加
    407         * @og.rev 6.8.3.0 (2017/11/27) useZeroDataOmit属性で、nullOmit属性もセットします。
    408         * @og.rev 6.8.3.0 (2017/11/27) useEqValOmit属性の追加
    409         * @og.rev 6.8.3.1 (2017/12/01) 不要なデータを出力しないようにします。
    410         * @og.rev 5.9.27.0 2017/12/01  T.OTA 61200-170831-04   max,minの小数点対応
    411         * @og.rev 6.8.5.0 (2018/01/09) xbeginAtZero,ybeginAtZero,markValues,markColors,markLbls,markAdjust,rangeMin,rangeMax,usePointStyle属性の追加
    412         * @og.rev 6.9.9.2 (2018/09/18) chart.jsが2.4.0から2.7.2にバージョンアップにより、廃止された属性対応
    413         * @og.rev 6.9.9.2 (2018/09/18) plugins,chartAttributes属性の追加
    414         * @og.rev 6.9.9.3 (2018/09/25) xscaleType の time 属性廃止。
    415         * @og.rev 6.9.9.4 (2018/10/01) ﾘﾆｱ対応,time 属性復活
    416         * @og.rev 6.9.9.4 (2018/10/01) idの振り方、データの持ち方変更
    417         * @og.rev 7.0.1.1 (2018/10/22) xmarkValues,xmarkColors属性の追加
    418         * @og.rev 7.0.1.3 (2018/11/12) バッファキー検索処理追加、markColors,xmarkColors属性に、VIVID,PASTELカラー指定に対応します。
    419         * @og.rev 8.0.0.0 (2021/08/31) BUBBLEとSCATTERの追加
    420         *
    421         * @return jsChert用文字列
    422         */
    423        private String jsChartOutput() {
    424                final StringBuilder rtn = new StringBuilder( BUFFER_MIDDLE );
    425
    426                // 各JavaScriptの変数名
    427//              final String qd                 = "qd_" + id;           //queryData
    428                final String cd                 = "cd_" + id;           //chartData
    429                final String myChart    = "chart_"+id;
    430
    431                // JSON形式でﾃｰﾌﾞﾙ情報を取得
    432                // ﾃｰﾌﾞﾙ情報の取得
    433                // 6.8.0.0 (2017/06/02) sortColumn 追加
    434                DBTableModel table = (DBTableModel)getObject( tableId ) ;
    435                if( StringUtil.isNotNull( sortColumn ) ) {                                              // 6.8.5.0 (2018/01/09)
    436                        final int clmNo = table.getColumnNo( sortColumn,false );        // エラーを出さない。
    437
    438                        final DBTableModelSorter temp = new DBTableModelSorter();
    439                        temp.setModel( (DBTableModel)getObject( tableId ) );
    440                        temp.sortByColumn( clmNo,true );                                                        // 順方向のソート
    441                        table = temp;
    442                }
    443
    444                final int rowCount = table.getRowCount();                                               // 6.9.2.0 (2018/03/05)
    445
    446                // 7.0.1.3 (2018/11/12) DBTableModelに存在しないカラムのChartDataは無視します。
    447                // これは、動的にグラフを生成する場合に、カラムの増減に合わせて、JsChartDataTagを生成しなおすのが手間だからです。
    448                final Iterator<JsChartData> itr = jsChartData.iterator();               // 個々のグラフ
    449                while( itr.hasNext() ) {
    450                        final JsChartData jcData = itr.next();
    451                        final String chtClm = jcData.getChartColumn();
    452                        final int    clmNo  = table.getColumnNo( chtClm, false );       // エラーを出さない。
    453
    454                        if( clmNo < 0 ) {
    455                                itr.remove();                                                                                   // 7.0.1.3 (2018/11/12) カラムがDBTableModelに存在しない。
    456                        }
    457                        else if( useZeroDataOmit ) {    // ｾﾞﾛﾃﾞｰﾀを使用しない設定
    458                                // 6.8.3.1 (2017/12/01) ループ処理の判定は、ChartColumn のみでよい。
    459                                boolean isRemove = true;
    460                                for( int row=0; row<rowCount; row++ ) {
    461                                        final String val = table.getValue( row,clmNo );
    462                                        if( StringUtil.isNotNull( val ) && !"0".equals( val ) && !"0.0".equals( val ) && !"0.00".equals( val )  ) {     // 6.8.5.0 (2018/01/09)
    463                                                isRemove = false;
    464                                                break;          // 判定処理打ち切り
    465                                        }
    466                                }
    467
    468                                if( isRemove ) {
    469                                        itr.remove();                                                                           // すべてが、ｾﾞﾛ、null カラムを、削除します。
    470                                }
    471                        }
    472                }
    473
    474//              // ｾﾞﾛﾃﾞｰﾀを使用しない設定
    475//              if( useZeroDataOmit ) {
    476//                      final Iterator<JsChartData> itr = jsChartData.iterator();       // 個々のグラフ
    477//                      while( itr.hasNext() ) {
    478//                              final JsChartData jcData = itr.next();
    479//                              final String chtClm = jcData.getChartColumn();
    480//                              final int    clmNo  = table.getColumnNo( chtClm, false );       // エラーを出さない。
    481//
    482//                              // 6.8.3.1 (2017/12/01) ループ処理の判定は、ChartColumn のみでよい。
    483//                              boolean isRemove = true;
    484//                              if( clmNo >= 0 ) {
    485//                                      for( int row=0; row<rowCount; row++ ) {
    486//                                              final String val = table.getValue( row,clmNo );
    487//                                              if( StringUtil.isNotNull( val ) && !"0".equals( val ) && !"0.0".equals( val ) && !"0.00".equals( val )  ) {     // 6.8.5.0 (2018/01/09)
    488//                                                      isRemove = false;
    489//                                                      break;  // 判定処理打ち切り
    490//                                              }
    491//                                      }
    492//                              }
    493//                              if( isRemove ) {
    494//                                      itr.remove();                                                                                   // すべてが、ｾﾞﾛ、null カラムを、削除します。
    495//                              }
    496//                      }
    497//              }
    498
    499                // 6.8.3.1 (2017/12/01) 不要なデータを出力しないようにします。
    500                final int clmSize = jsChartData.size();                                                         // JsChartTag の 値部分のみの配列
    501
    502                final String[] clmNms = new String[clmSize];                                            // 6.9.9.4 (2018/10/01) カラム名の配列
    503                final int[]    clmNos = new int[clmSize];
    504                final int      lblNos = table.getColumnNo( labelColumn, false );        // エラーを出さない。 6.9.2.0 (2018/03/05)
    505                final DBColumn dbClm  = table.getDBColumn( lblNos );                            // 6.9.2.0 (2018/03/05)
    506
    507                // jsChartDataﾀｸﾞの変数宣言
    508                for( int j=0; j<clmSize; j++ ) {
    509                        final String chtClm = jsChartData.get(j).getChartColumn();
    510                        clmNms[j] = chtClm;                                                                                             // 6.9.9.4 (2018/10/01) カラム名の配列
    511                        clmNos[j] = table.getColumnNo( chtClm, false );                                 // エラーを出さない。
    512                }
    513
    514                //      8.0.0.0 (2021/08/31) chartJs V3 以降は、timeもrealtimeも表示するようになった…らしい
    515//              // 7.0.1.2 (2018/11/04) 原因調査中。chartjs-plugin-streaming.min.js を組み込むと xscaleType="time" が表示しない。
    516//              // 通常、HeadTag で、useChartJS=true で、一括include しているが、streaming だけ、
    517//              // xscaleType="realtime" 時だけ組み込むように変更します。
    518//              if( TYPE_REALTIME.equals( xscaleType ) ) {
    519//                      rtn.append( SCRIPT_STREAMING_JS );
    520//              }
    521
    522                // canvasﾀｸﾞの設定
    523                rtn.append( "<canvas class=\""  ).append( CANVAS_NAME )
    524                        .append( "\" id=\""                     ).append( id            )
    525                        .append( "\" width=\""          ).append( width         )
    526                        .append( "\" height=\""         ).append( height        )
    527                        .append( "\"><!-- --></canvas>" ).append( CR    )
    528                        .append( "<script>" ).append( CR )                                                                      // 6.9.9.4 (2018/10/01) query情報の取得(JSON)
    529                        .append( chartBody );                                                                                           // 7.0.1.1 (2018/10/22) BODY部分の文字列の組み込み
    530
    531                final boolean isXcateType  = TYPE_CATEGORY.equals(      xscaleType );           // 6.9.9.4 (2018/10/01)
    532                final boolean isXlinerType = TYPE_LINEAR.equals(        xscaleType );           // 6.8.5.0 (2018/01/09) xscaleType が linear かどうか。
    533                final boolean isXtimeType  = TYPE_TIME.equals(          xscaleType );           // 6.8.5.0 (2018/01/09) xscaleType が time かどうか。
    534
    535                // 7.0.1.3 (2018/11/12) var 変数に設定する配列情報を、bufに追加します。
    536                final DBTableModel fcTable = table;                     // ラムダ式で使えるのは、final宣言された変数のみ。根本は、Sorterを組み込んでfinalすべき。
    537                final IntFunction<String> lcFunc = (row) -> {
    538                                                                                        final String lval = fcTable.getValue( row,lblNos );
    539                                                                                        return useRenderer && !isXlinerType ? StringUtil.jsonFilter( dbClm.getRendererValue(row,lval) ) : lval ;
    540                                                                                };
    541                setVarArray( rtn,labelColumn,rowCount,isXcateType || isXtimeType || useRenderer,lcFunc );
    542
    543//              // 6.9.9.4 (2018/10/01) ラベル部の出力
    544//              rtn.append( " var " ).append( labelColumn ).append( "=[" );
    545//              for( int row=0; row<rowCount; row++ ) {
    546//                      if( row > 0 ) { rtn.append( ',' ); }            // カンマは、最初のデータ以降の最初につける。
    547//
    548//                      final String lval = table.getValue( row,lblNos );
    549//                      final String lblVal = useRenderer && !isXlinerType ? StringUtil.jsonFilter( dbClm.getRendererValue(row,lval) ) : lval ;
    550//                      if( isXcateType || isXtimeType || useRenderer ) {
    551//                              rtn.append( '"' ).append( lblVal ).append( '"' );
    552//                      }
    553//                      else {
    554//                              rtn.append( lblVal );
    555//                      }
    556//              }
    557//              rtn.append( "];" ).append( CR );
    558
    559                // 6.9.9.4 (2018/10/01) データ部の出力
    560                for( int j=0; j<clmSize; j++ ) {
    561                        final int clmNo = clmNos[j];            // finalしか参照できないため。
    562                        setVarArray( rtn,clmNms[j],rowCount,valueQuot,(row) -> fcTable.getValue( row,clmNo ) );
    563
    564//                      rtn.append( " var " ).append( clmNms[j] ).append( "=[" );
    565//                      for( int row=0; row<rowCount; row++ ) {
    566//                              if( row > 0 ) { rtn.append( ',' ); }            // カンマは、最初のデータ以降の最初につける。
    567//
    568//                              final String val = table.getValue( row,clmNos[j] );
    569//
    570//                              if( valueQuot ) {                                               // 6.8.5.0 (2018/01/09) yscaleType が category
    571//                                      rtn.append( '"' ).append( val ).append( '"' );
    572//                              }
    573//                              else {
    574//                                      rtn.append( val );
    575//                              }
    576//                      }
    577//                      rtn.append( "];" ).append( CR );
    578                }
    579
    580                // x軸がlinearｽｹｰﾙの場合
    581                // [{x:値1,y:値2},{x:値1,y:値2},･･･] 形式のデータが必要
    582                if( isXlinerType ) {
    583                        for( int j=0; j<clmSize; j++ ) {
    584                                final String chtClm = clmNms[j];
    585                                rtn.append( "var LI_" ).append( chtClm ).append( "=[];" ).append( CR );
    586
    587                                // 6.9.9.4 (2018/10/01) x軸がlinearｽｹｰﾙの場合、カラム名が、変わるので、再設定している。(超特殊処理)
    588                                jsChartData.get(j).setChartColumn( "LI_" + chtClm );
    589                        }
    590
    591                        rtn.append( "for(var i=0; i<").append( labelColumn ).append( ".length; i++){" );
    592                        for( int j=0; j<clmSize; j++ ) {
    593                                final String chtClm = clmNms[j];
    594                                        // {x:ﾗﾍﾞﾙ, y:値}の形式で値を設定
    595                                rtn.append( "LI_" ).append( chtClm ).append( "[i]={x:" ).append( labelColumn )
    596                                        .append( "[i],y:" ).append( chtClm ).append( "[i]};" );
    597                        }
    598                        rtn.append( "};" ).append( CR );
    599                }
    600
    601                // 7.0.1.2 (2018/11/04) varColumns 追加
    602                final String[] varClms  = StringUtil.csv2Array( varColumns );   // 独自に出力しておきたいカラム列の値
    603                for( int j=0; j<varClms.length; j++ ) {
    604                        final int varNos = table.getColumnNo( varClms[j], false );      // エラーを出さない。
    605                        final boolean isNumType = table.getDBColumn( varNos ).isNumberType();                   // 6.4.6.0 (2016/05/27)
    606
    607                        setVarArray( rtn,varClms[j],rowCount,!isNumType,(row) -> fcTable.getValue( row,varNos ) );
    608
    609//                      rtn.append( " var " ).append( varClms[j] ).append( "=[" );
    610//                      for( int row=0; row<rowCount; row++ ) {
    611//                              if( row > 0 ) { rtn.append( ',' ); }                                    // カンマは、最初のデータ以降の最初につける。
    612//
    613//                              final String val = table.getValue( row,varNos );
    614//
    615//                              // 注意：valueQuot ではなく、isNumType で判定する。
    616//                              if( isNumType ) {
    617//                                      rtn.append( val );
    618//                              }
    619//                              else {
    620//                                      rtn.append( '"' ).append( val ).append( '"' );
    621//                              }
    622//                      }
    623//                      rtn.append( "];" ).append( CR );
    624                }
    625
    626                // 8.0.0.0 (2021/08/31) BUBBLEとSCATTERの追加
    627                // chartType が BUBBLE の場合、chtClmが x:、varColumns の最初が、y: 次が r: になる。
    628                // SCATTERの場合は、r: がないだけ。
    629                if( CTYPE_BUBBLE.equals( chartType ) || CTYPE_SCATTER.equals( chartType ) ) {
    630                        if( CTYPE_BUBBLE.equals( chartType ) && varClms.length < 2 ||
    631                                CTYPE_SCATTER.equals( chartType ) && varClms.length < 1 ) {
    632                                        final StringBuilder errMsg = new StringBuilder( BUFFER_MIDDLE )
    633                                                .append( "chartTypeが、" ).append( chartType )
    634                                                .append( "の場合は、varColumns で、y: データ、r:データを指定してください。" );
    635                                        throw new HybsSystemException( errMsg.toString() );
    636                        }
    637
    638                        final String chtClm = clmNms[0];                // chartDataの1個目決め打ち
    639                        rtn.append( "var LI_" ).append( chtClm ).append( "=[];" ).append( CR );
    640
    641                        // x軸が[{x: , y: , r: }…} のカラム名が変わるので、再設定している。(超特殊処理)
    642                        jsChartData.get(0).setChartColumn( "LI_" + chtClm );
    643
    644                        rtn.append( "for(var i=0; i<").append( chtClm ).append( ".length; i++){" )
    645                                .append( "LI_" ).append( chtClm ).append( "[i]={x:" ).append( chtClm )
    646                                .append( "[i],y:" ).append( varClms[0] );
    647
    648                        // 切れ切れで分かりにくいかもしれないが、BUBBLEのみ、r: を出す。
    649                        if( CTYPE_BUBBLE.equals( chartType ) ) {
    650                                rtn.append( "[i],r:" ).append( varClms[1] );
    651                        }
    652
    653                        rtn.append( "[i]};}" ).append( CR );
    654                }
    655
    656                // ==================================================================================
    657                // 7.0.1.1 (2018/10/22) jsChartData(X軸)の設定
    658                if( !SET_CI_TYPE.contains( chartType ) ) {
    659                        jsXAxis.setId( "x0" );                                          // X軸のid
    660                        jsXAxis.setUseTime( isXtimeType );                      // x軸の時間表示を使用するかどうか
    661
    662                        // 7.0.1.3 (2018/11/12) バッファキー検索処理追加
    663                        if( isXtimeType && !jsXAxis.contains( JsChartData.TIME , "displayFormats" ) ) {         // ｷｰﾜｰﾄﾞが無ければ追加
    664                                // ほんとはリソースに入れるべきでしょう。
    665                                if( "ja".equalsIgnoreCase( getLanguage() ) ) {                                          // 'ja' なら日本
    666                                        jsXAxis.addTime( "displayFormats" , TIME_FORMAT_JA , NO_QUOTE );        // 標準ﾀｲﾑﾌｫｰﾏｯﾄ適用。ｵﾌﾞｼﾞｪｸﾄなので、クオートなし
    667                                }
    668                                else {
    669                                        jsXAxis.addTime( "displayFormats" , TIME_FORMAT , NO_QUOTE );           // 標準ﾀｲﾑﾌｫｰﾏｯﾄ適用。ｵﾌﾞｼﾞｪｸﾄなので、クオートなし
    670                                }
    671                        }
    672
    673                        // 6.9.9.4 (2018/10/01) 不要な属性は出さない。
    674                        if( CTYPE_BAR.equals( chartType ) || CTYPE_HBAR.equals( chartType ) ) {
    675                                jsXAxis.addAxis( "categoryPercentage" , barWidthPer , NO_QUOTE );               // 数値
    676                        }
    677
    678                        // x軸にﾘﾆｱｽｹｰﾙを設定した場合(これは残す)
    679                        final String xpos = xposition != null ? xposition
    680                                                                                                  : isXlinerType ? "bottom"
    681                                                                                                                                 : CTYPE_HBAR.equals( chartType ) ? "left" : null ;
    682                        jsXAxis.addAxis( "position" , xpos , USE_QUOTE );       // 文字
    683
    684                        rtn.append( jsXAxis.getAxis() ).append( CR );
    685                }
    686
    687                // horizontalBar 時は、X軸とY軸を入れ替える
    688                final char[] yx = CTYPE_HBAR.equals( chartType ) ? new char[] { 'x','y' }               // 入替
    689                                                                                                                 : new char[] { 'y','x' } ;             // 通常の並び順
    690
    691                // ==================================================================================
    692                // jsChartData(Y軸)の設定
    693                // 7.0.1.1 (2018/10/22) data:dataset と、options:scales:yAxes: を変数化して出力します。
    694                for( final JsChartData chData : jsChartData ) {
    695//                      rtn.append(  chData.getDataset()                ).append( CR )
    696                        rtn.append(  chData.getDataset( yx[0])  ).append( CR )          // 横棒線の場合は、'x'が、それ以外は、'y'
    697                                .append( chData.getAxis()                       ).append( CR );
    698                }
    699
    700                rtn.append( "var ").append( cd ).append( "={labels:" ).append( labelColumn ).append( ",datasets:[" );
    701                for( final JsChartData chData : jsChartData ) {
    702                        rtn.append( chData.getDatasetKey() ).append( ',' );
    703                }
    704                rtn.append( "]};" ).append( CR )
    705                        .append(  "var "    ).append( myChart   ).append( "=new Chart(" ).append( id )  // jsChartの生成
    706                        .append( ",{type:'" ).append( chartType )
    707                        .append( "',data:"  ).append( cd );
    708
    709                // 6.9.9.2 (2018/09/18) plugins,chartAttributes属性の追加
    710                if( StringUtil.isNotNull( plugins ) ) {
    711                        rtn.append( ",plugins: [" ).append( plugins ).append( ']' );
    712                }
    713//              if( StringUtil.isNotNull( chartAttributes ) ) {
    714//                      rtn.append( ',' ).append( chartAttributes );
    715//              }
    716
    717                rtn.append( ",options:{responsive:false" );     // ﾚｽﾎﾟﾝｼﾌﾞ OFF
    718
    719                // ｸﾘｯｸｲﾍﾞﾝﾄの設定
    720                // clickLink 変数を使用する場合、内部でﾏｽﾀﾃﾞｰﾀを使用します。ｷｰとして、渡しておく必要があります。
    721                if( StringUtil.isNotNull( onClick ) ) {                                                 // 6.8.5.0 (2018/01/09)
    722                        rtn.append( ",onClick:function(event,obj){" ).append( onClick ).append( '}' );          // 6.9.9.4 (2018/10/01)
    723                }
    724
    725                // ﾀｲﾄﾙ属性の設定
    726                if( StringUtil.isNotNull( title ) ) {                                           // 6.8.5.0 (2018/01/09)
    727                        rtn.append( ",title:{display:true" );
    728                        setProp( rtn, ",text:'"    , title        , "'" );
    729                        setProp( rtn, ",position:'", titlePosition, "'" );
    730                        rtn.append( '}' );
    731                }
    732
    733                // 凡例属性の設定
    734                if( useLegend ) {                                                                                       // 7.0.1.1 (2018/10/22)
    735                        rtn.append( ",legend:{" );
    736                        setProp( rtn, "display:"   , legendDisplay  , ","  );
    737                        setProp( rtn, "position:'" , legendPosition , "'," );
    738
    739                        // 凡例のスタイルを、pointStyle にあわせるかどうか
    740                        if( usePointStyle ) {                                                                   // 7.0.1.1 (2018/10/22)
    741                                rtn.append( "labels:{usePointStyle: true}" );
    742                        }
    743                        rtn.append( '}' );
    744                }
    745
    746                // 6.9.9.2 (2018/09/18) chart.jsが2.4.0から2.7.2にバージョンアップにより、廃止された属性対応
    747                if( !SET_CI_TYPE.contains( chartType ) ) {
    748                        // 円形以外の場合はscales属性に設定
    749                        rtn.append( ",scales:{" )
    750                                .append( yx[0] ).append( "Axes:[" );            // 横棒線の場合は、'x'が、それ以外は、'y'
    751
    752//                      if( CTYPE_HBAR.equals( chartType ) ) {
    753//                              // 横棒線の場合はx軸の設定(axisの複数形)
    754//                              rtn.append( "xAxes:[" );
    755//                      }
    756//                      else {
    757//                              // それ以外はy軸の設定
    758//                              rtn.append( "yAxes:[" );
    759//                      }
    760
    761                        // 7.0.1.1 (2018/10/22) options:scales:yAxes: を変数化して出力しているので、その設定のみでよい。
    762                        for( final JsChartData chData : jsChartData ) {
    763                                if( chData.isUseAxis() ) {
    764                                        rtn.append( chData.getAxisKey() ).append( ',' );
    765                                }
    766                        }
    767                        rtn.append( "]," )
    768                                .append( yx[1] ).append( "Axes:[" );            // 横棒線の場合は、'y'が、それ以外は、'x'
    769
    770//                      if( CTYPE_HBAR.equals( chartType ) ) {
    771//                              // 横棒線の場合はy軸の設定
    772//                              rtn.append( "yAxes:[" );
    773//                      }
    774//                      else {
    775//                              // それ以外はx軸の設定(axisの複数形)
    776//                              rtn.append( "xAxes:[" );
    777//                      }
    778                        rtn.append( jsXAxis.getAxisKey() ).append( "]}" );              // 7.0.1.1 (2018/10/22)
    779
    780                        // 6.8.5.0 (2018/01/09) markValues,markColors,markLbls,markAdjust 属性対応
    781                        // 7.0.1.1 (2018/10/22) xmarkValues,xmarkColors属性の追加
    782                        // 7.0.1.3 (2018/11/12) 色指定に、VIVID,PASTEL を使えるようにします。
    783
    784                        final String[] mkVals  = StringUtil.csv2Array( markValues );    // y軸の値で、横のﾏｰｶｰ
    785                        final String[] xmkVals = StringUtil.csv2Array( xmarkValues );   // x軸の値で、縦のﾏｰｶｰ
    786                        final int vCnt = mkVals.length;
    787                        final int xCnt = xmkVals.length;
    788                        if( vCnt > 0 || xCnt > 0 ) {
    789                                rtn.append( ",annotation:{annotations:[" );
    790
    791                                // 従来の markValues,markColors,markLbls,markAdjust 属性対応
    792                                if( vCnt > 0 ) {
    793//                                      final String[] mkCols = StringUtil.csv2Array( markColors        , ',' , vCnt , MARK_DEF_COLOR );
    794                                        final String[] mkLbls = StringUtil.csv2Array( markLbls          , ',' , vCnt );
    795                                        final String[] mkAjst = StringUtil.csv2Array( markAdjust        , ',' , vCnt , MARK_DEF_ADJUST );
    796                                        final String[] mkCols = colorCsv( markColors ,  vCnt );                                                 // 7.0.1.3 (2018/11/12)
    797
    798                                        // 7.0.1.1 (2018/10/22) 'y-axis-0' → 'y0Ax' これは、JsChartData#getAxisKey() で取得できる値だが、決め打ち
    799                                        for( int i=0; i<vCnt; i++ ) {
    800                                                rtn.append( "{type:'line',scaleID:'y0Ax',mode:'horizontal'" );
    801                                                setProp( rtn, ",borderWidth:"   , markWidth             );
    802                                                setProp( rtn, ",borderDash:"    , markDash              );
    803                                                setProp( rtn, ",value:"                 , mkVals[i]             );
    804                                                setProp( rtn, ",borderColor:'"  , mkCols[i] , "'" );
    805                                                if( !mkLbls[i].isEmpty() ) {
    806                                                        rtn.append( ",label:{enabled:'true',position:'left',backgroundColor:'rgba(0,0,0,0)'" );
    807                                                        setProp( rtn, ",yAdjust:"       , mkAjst[i]             );
    808                                                        setProp( rtn, ",content:'"      , mkLbls[i] , "'" );
    809                                                        setProp( rtn, ",fontColor:'", mkCols[i] , "'" );
    810                                                        setProp( rtn, ",fontSize:"      , markFontSize  );
    811                                                        rtn.append( '}' );
    812                                                }
    813                                                rtn.append( "}," );
    814                                        }
    815                                }
    816
    817                                // 7.0.1.1 (2018/10/22) xmarkValues,xmarkColors属性対応
    818                                if( xCnt > 0 ) {
    819//                                      final String[] xmkCols = StringUtil.csv2Array( xmarkColors      , ',' , xCnt , MARK_DEF_COLOR );
    820                                        final String[] xmkCols = colorCsv( xmarkColors ,  xCnt );               // 7.0.1.3 (2018/11/12)
    821
    822                                        // 7.0.1.1 (2018/10/22) 'x-axis-0' → 'x0Ax' これは、JsChartData#getAxisKey() で取得できる値だが、決め打ち
    823                                        for( int i=0; i<xCnt; i++ ) {
    824                                                rtn.append( "{type:'line',scaleID:'x0Ax',mode:'vertical'" );
    825                                                setProp( rtn, ",borderWidth:"   , markWidth             );
    826                                                setProp( rtn, ",borderDash:"    , markDash              );
    827                                                setProp( rtn, ",value:'"                , xmkVals[i] , "'" );           // 横軸はﾗﾍﾞﾙなので、文字列として対応
    828                                                setProp( rtn, ",borderColor:'"  , xmkCols[i] , "'" );
    829                                                rtn.append( "}," );
    830                                        }
    831                                }
    832                                rtn.append( "]}" );
    833                        }
    834
    835                        // 6.8.5.0 (2018/01/09) ズーム処理を使用するかどうか
    836                        if( useZoom ) {
    837                                rtn.append( ",pan:{enabled:true,mode:'xy'},zoom:{enabled:true,drag:false,mode:'xy'}" );
    838                        }
    839                }
    840//              setProp( rtn, ",", optionAttributes );
    841                setProp( rtn, ",", optOptions );                        // 7.0.1.2 (2018/11/04)
    842                rtn.append( '}' );
    843//              setProp( rtn, ",", chartAttributes );
    844                setProp( rtn, ",", optChart );                          // 7.0.1.2 (2018/11/04)
    845                rtn.append( "});" ).append( CR );
    846
    847//              // ｲﾍﾞﾝﾄ設定用 5.9.19.0
    848//              // 5.9.27.0 (2017/12/01) MODIFY ｲﾍﾞﾝﾄにkeyupを追加
    849//              // 7.0.1.1 (2018/10/22) 複雑すぎるとの、ﾚｲｱｳﾄが難しいのと、zoomがあるので、廃止予定にします。
    850//              // widthEventColumn設定
    851//              if( StringUtil.isNotNull( widthEventColumn ) ) {                                                // 6.8.5.0 (2018/01/09)
    852//                      rtn.append( "$(document).delegate('#" ).append( widthEventColumn ).append( "','mouseup keyup',function(){" )
    853//                              .append( "var width=$(this).val();" )
    854//                              .append( "$('#" ).append( id ).append( "').attr('width',width);" )
    855//                              .append( myChart ).append( ".chart.width=width;" )
    856//                              .append( myChart ).append( ".update();" )
    857//                              .append( "});" ).append( CR )
    858//                              .append( "$(function(){" )
    859//                              .append( "var chartWidth=$('#" ).append( id ).append("').attr('width');" )
    860//                              .append( "$('#" ).append( widthEventColumn ).append( "').val(chartWidth);" )            // 初期値を設定
    861//                              .append( "});" ).append( CR );
    862//              }
    863//              // heightEventColumn設定
    864//              if( StringUtil.isNotNull( heightEventColumn ) ) {                                               // 6.8.5.0 (2018/01/09)
    865//                      rtn.append( "$(document).delegate('#" ).append( heightEventColumn ).append( "','mouseup keyup',function(){" )
    866//                              .append( "var height=$(this).val();" )
    867//                              .append( "$('#" ).append( id ).append( "').attr('height',height);" )
    868//                              .append( myChart ).append( ".chart.height=height;" )
    869//                              .append( myChart ).append( ".update();" )
    870//                              .append( "});").append( CR )
    871//                              .append( "$(function(){")
    872//                              .append( "var chartHeight=$('#" ).append( id ).append("').attr('height');" )
    873//                              .append( "$('#" ).append( heightEventColumn ).append( "').val(chartHeight);" )  // 初期値を設定
    874//                              .append( "});" ).append( CR );
    875//              }
    876//              // minEventColumn設定
    877//              if( StringUtil.isNotNull( minEventColumn ) ) {                                          // 6.8.5.0 (2018/01/09)
    878//                      rtn.append( "$(document).delegate('#" ).append( minEventColumn ).append( "','mouseup keyup',function(){" )
    879//                              // 5.9.27.0 (2017/12/01) MODIFY IntからFloat型に変更
    880//                              .append( "var min=parseFloat($(this).val());")
    881//                              .append( myChart ).append( ".options.scales.yAxes[0].ticks.min = min;" )
    882//                              .append( myChart ).append( ".update();")
    883//                              .append( "});" ).append( CR )
    884//                              .append( "$(function(){" )
    885//              //              // 7.0.1.1 (2018/10/22) 'y-axis-0' → 'y0Ax' これは、JsChartData#getAxisKey() で取得できる値だが、決め打ち
    886//                              .append( "var chartMax=" ).append( myChart ).append( ".scales['y0Ax'].max;" )
    887//                              .append( "var chartMin=" ).append( myChart ).append( ".scales['y0Ax'].min;" )
    888//                              .append( "$('#" ).append( minEventColumn ).append( "').val(chartMin);" )                                        // 初期値を設定
    889//                              .append( "$('#" ).append( minEventColumn ).append( "').attr({'max':chartMax});" )                       // 初期値を設定
    890//                              .append( "$('#" ).append( minEventColumn ).append( "').attr({'min':chartMin});" )                       // 初期値を設定
    891//                              .append( "});" ).append( CR );
    892//              }
    893//              // maxEventColumn設定
    894//              if( StringUtil.isNotNull( maxEventColumn ) ) {                                          // 6.8.5.0 (2018/01/09)
    895//                      rtn.append( "$(document).delegate('#").append( maxEventColumn ).append( "','mouseup keyup',function(){" )
    896//                              // 5.9.27.0 (2017/12/01) MODIFY IntからFloat型に変更
    897//                              .append( "var max=parseFloat($(this).val());")
    898//                              .append( myChart ).append( ".options.scales.yAxes[0].ticks.max = max;")
    899//                              .append( myChart ).append( ".update();")
    900//                              .append( "});").append( CR )
    901//                              .append( "$(function(){" )
    902//              //              // 7.0.1.1 (2018/10/22) 'y-axis-0' → 'y0Ax' これは、JsChartData#getAxisKey() で取得できる値だが、決め打ち
    903//                              .append( "var chartMax=" ).append( myChart ).append( ".scales['y0Ax'].max;" )
    904//                              .append( "var chartMin=" ).append( myChart ).append( ".scales['y0Ax'].min;" )
    905//                              .append( "$('#" ).append( maxEventColumn ).append( "').val(chartMax);" )                                        // 初期値を設定
    906//                              .append( "$('#" ).append( maxEventColumn ).append( "').attr({'max':chartMax});" )                       // 初期値を設定
    907//                              .append( "$('#" ).append( maxEventColumn ).append( "').attr({'min':chartMin});" )                       // 初期値を設定
    908//                              .append( "});" ).append( CR );
    909//              }
    910
    911                // 6.9.2.0 (2018/03/05) ズーム処理を使用する場合、ｸﾀﾞﾌﾞﾙｸﾘｯｸで元に戻すためのｲﾍﾞﾝﾄを発生させます。
    912                if( useZoom ) {
    913                        rtn.append( "window.onload=function(){$('#").append( id ).append( "').dblclick(function(){window." )
    914                                .append( myChart ).append( ".resetZoom();});}" );
    915                }
    916
    917                rtn.append( CR ).append( "</script>" );
    918
    919                return rtn.toString();
    920        }
    921
    922        /**
    923         * setに値が存在する場合、sbにstr + setの形で値を追加する。
    924         *
    925         * @param buf   ベースとなるStringBuilder
    926         * @param str   文字列１(必須)
    927         * @param set   文字列２(nullかゼロ文字列の場合は、追加しません)
    928         */
    929        private void setProp( final StringBuilder buf, final String str, final String set ) {
    930                if( StringUtil.isNotNull( set ) ) {                                             // 6.8.5.0 (2018/01/09)
    931                        buf.append( str ).append( set );
    932                }
    933        }
    934
    935        /**
    936         * setに値が存在する場合、sbにstr + set + endの形で値を追加する。
    937         *
    938         * @param buf   ベースとなるStringBuilder
    939         * @param str   文字列１(必須)
    940         * @param set   文字列２(nullかゼロ文字列の場合は、追加しません)
    941         * @param end   文字列３
    942         */
    943        private void setProp( final StringBuilder buf, final String str, final String set, final String end ) {
    944                if( StringUtil.isNotNull( set ) ) {                                             // 6.8.5.0 (2018/01/09)
    945                        buf.append( str ).append( set ).append( end );
    946                }
    947        }
    948
    949        /**
    950         * var 変数に設定する配列情報を、bufに追加します。
    951         *
    952         * var 変数名が key で、cnt分の繰返しで、IntFunction を呼びます。
    953         * isQuote=trueの場合は、前後にクォーテーションをつけます。
    954         *
    955         * @og.rev 7.0.1.3 (2018/11/12) var 変数に設定する配列情報を、bufに追加します。
    956         *
    957         * @param buf   ベースとなるStringBuilder
    958         * @param key   キー
    959         * @param cnt   ループする個数(通常は行数：rowCount)
    960         * @param isQuote       クォーテーションで括るかどうか [true:括る/false:括らない]
    961         * @param func  数値を引数に取る関数型インタフェース
    962         */
    963        private void setVarArray( final StringBuilder buf, final String key, final int cnt, final boolean isQuote, final IntFunction<String> func ) {
    964                buf.append( " var " ).append( key ).append( "=[" );
    965                for( int row=0; row<cnt; row++ ) {
    966                        if( row > 0 ) { buf.append( ',' ); }            // カンマは、最初のデータ以降の最初につける。
    967
    968                        final String val = func.apply( row );
    969
    970                        if( isQuote ) {
    971                                buf.append( '"' ).append( val ).append( '"' );
    972                        }
    973                        else {
    974                                buf.append( val );
    975                        }
    976                }
    977                buf.append( "];" ).append( CR );
    978        }
    979
    980        /**
    981         * ﾊﾟﾗﾒｰﾀﾁｪｯｸ用ﾒｿｯﾄﾞ。
    982         *
    983         * @param trg           ターゲット
    984         * @param set           使用可能なキーワードのSet
    985         * @param trgStr        ターゲットの名称
    986         */
    987        private void checkPara( final String trg, final Set<String> set, final String trgStr ) {
    988                if( StringUtil.isNotNull( trg ) && !check( trg, set ) ) {                                               // 6.8.5.0 (2018/01/09)
    989                        final StringBuilder errMsg = new StringBuilder( BUFFER_MIDDLE )
    990                                .append( "指定の" ).append( trgStr ).append( "は指定できません。" ).append( CR )
    991                                .append( trgStr ).append( "=[" ).append( trg ).append( ']' ).append( CR )
    992                                .append( set );         // org.opengion.fukurou.util.ArraySet の toStringメソッド
    993                        throw new HybsSystemException( errMsg.toString() );
    994                }
    995        }
    996
    997        /**
    998         * 色コードの配列を返すメソッドです。
    999         *
    1000         * これは、普通のCSV形式のﾃﾞｰﾀなら、そのまま分割します。
    1001         * 配列は、lenの数だけ作成します。
    1002         * nullやゼロ文字列の場合は、ColorMapのOLOR_KEYすべてを対象にします。
    1003         * 1色の場合も、すべて同じ色をlen の数だけセットします。
    1004         *
    1005         * VIVIDとPASTEL はｷｰﾜｰﾄﾞで、org.opengion.fukurou.util.ColorMap のビビッドカラーと
    1006         * パステルカラーの配列を指定したことと同じになります。
    1007         * また、色番号として、ビビッドを、(V0～V11) , パステルを、(P0～P11)
    1008         * に割当てていますので、配列に分解後一旦すべてのｷｰﾜｰﾄﾞを色番号検索に使用します。
    1009         *
    1010         * @og.rev 7.0.1.3 (2018/11/12) 色コードの配列を返すメソッド追加
    1011         *
    1012         * @param colCsv        色コードのCSV形式文字列
    1013         * @param len           作成する配列の個数
    1014         * @return      色コードに変換後の配列
    1015         */
    1016        private String[] colorCsv( final String colCsv, final int len ) {
    1017                // 色の数を、len にあわせる必要があります。
    1018                final String[] mkCols = new String[len];
    1019
    1020                // cols を元に、ColorMap から色配列を取得します。
    1021                final String[] cols = ColorMap.getColorKeys( colCsv );
    1022
    1023                // 色配列に順番に割り当てますが、色が足りない場合は、初期値の色をセットします。
    1024                final int min = Math.min( mkCols.length , cols.length );
    1025                for( int i=0; i<min; i++ ) {
    1026                        mkCols[i] = cols[i];
    1027                }
    1028                for( int i=min; i<mkCols.length; i++ ) {
    1029                        mkCols[i] = cols[0];                                    // 色コードの最初の色
    1030                }
    1031
    1032                return mkCols ;
    1033
    1034//              final String[] mkCols ;
    1035//              if( "VIVID".equalsIgnoreCase( cols ) ) {
    1036//                      mkCols = new String[len];
    1037//                      for( int i=0; i<len; i++ ) {
    1038//                              mkCols[i] = ColorMap.getVividKey( i );
    1039//                      }
    1040//              }
    1041//              else if( "PASTEL".equalsIgnoreCase( cols ) ) {
    1042//                      mkCols = new String[len];
    1043//                      for( int i=0; i<len; i++ ) {
    1044//                              mkCols[i] = ColorMap.getPastelKey( i );
    1045//                      }
    1046//              }
    1047//              else {
    1048//                      mkCols = StringUtil.csv2Array( cols , ',' , len , MARK_DEF_COLOR );
    1049//
    1050//                      // 無条件で回します。
    1051//                      for( int i=0; i<len; i++ ) {
    1052//                              mkCols[i] = ColorMap.getColorKey( mkCols[i],mkCols[i] );        // 自身で検索して無ければ自身を初期値で戻してます。
    1053//                      }
    1054//              }
    1055//
    1056//              return mkCols ;
    1057        }
    1058
    1059        /**
    1060         * jsChartData情報をﾘｽﾄに追加します。
    1061         *
    1062         * @og.rev 6.7.5.0 (2017/03/10) ﾘｽﾄの初期化方法を変更します。
    1063         *
    1064         * @param jsData jsChartData情報
    1065         */
    1066        protected void addJsChartData( final JsChartData jsData ) {
    1067                jsChartData.add( jsData );
    1068        }
    1069
    1070        /**
    1071         * 登録済みのjsChartData情報の個数を返します。
    1072         *
    1073         * @og.rev 6.7.7.0 (2017/03/31) 新規登録
    1074         *
    1075         * @return 登録済みのjsChartData情報の個数
    1076         */
    1077        protected int getJsChartDataSize() {
    1078                return jsChartData.size();
    1079        }
    1080
    1081        /**
    1082         * borderColorとbackgroundColorに色を１色しか使用できないかどうかを返します。
    1083         *
    1084         * chartType に応じて、色配列が使用できないタイプがあります。
    1085         *    line/radar が true  （１色しか使用できない）
    1086         *    それ以外（bar/horizontalBar/polarArea/pie/doughnut）が false （色配列が使用できる）
    1087         *
    1088         * @og.rev 7.0.1.1 (2018/10/22) 新規登録
    1089         *
    1090         * @return 登録済みのjsChartData情報の個数
    1091         */
    1092        protected boolean isOneColor() {
    1093                // line/radar が true  （１色しか使用できない）
    1094                return CTYPE_LINE.equalsIgnoreCase( chartType ) || CTYPE_RADAR.equalsIgnoreCase( chartType );
    1095        }
    1096
    1097        /**
    1098         * 【TAG】ﾁｬｰﾄの種類を指定します[line/bar/horizontalBar/radar/polarArea/pie/doughnut/bubble/scatter](必須)。
    1099         *
    1100         * @og.tag
    1101         * なお、複合グラフ時には、この値を、"bar" にしておかないと、きちんと表示しないようです。
    1102         *
    1103         * 8.0.0.0 (2021/08/31)
    1104         *  chartTypeが、bubbleとscatterの場合は、y:データ、r:データを varColumns で
    1105         *  指定します。詳細は、varColumns の説明をご確認ください。
    1106         *
    1107         * @og.rev 8.0.0.0 (2021/08/31) BUBBLEとSCATTERの追加
    1108         *
    1109         * @param cType ﾁｬｰﾄﾀｲﾌﾟ [line/bar/horizontalBar/radar/polarArea/pie/doughnut/bubble/scatter]
    1110         */
    1111        public void setChartType( final String cType ) {
    1112                chartType = nval( getRequestParameter( cType ) , null );
    1113
    1114                if( !check( chartType, CTYPE_SET ) ) {
    1115                        final StringBuilder errMsg = new StringBuilder( BUFFER_MIDDLE )
    1116                                .append( "指定のチャートタイプは実行できません。"        ).append( CR )
    1117                                .append( "chartType=[" ).append( chartType ).append( ']' ).append( CR )
    1118                                .append( CTYPE_SET );   // org.opengion.fukurou.util.ArraySet の toStringメソッド
    1119                        throw new HybsSystemException( errMsg.toString() );
    1120                }
    1121        }
    1122
    1123        /**
    1124         * 【TAG】ﾗﾍﾞﾙのｶﾗﾑ名を指定します(表示名称）(必須)。
    1125         *
    1126         * @og.tag
    1127         *
    1128         * @param lblclm ﾗﾍﾞﾙｶﾗﾑ
    1129         */
    1130        public void setLabelColumn( final String lblclm ) {
    1131                labelColumn = nval( getRequestParameter( lblclm ),labelColumn );
    1132        }
    1133
    1134        /**
    1135         * 【TAG】canvasﾀｸﾞのidを指定します(初期値:hybscanvas)。
    1136         *
    1137         * @og.tag
    1138         * canvasﾀｸﾞのidに設定します。
    1139         *
    1140         * @param id canvasﾀｸﾞのid
    1141         */
    1142        @Override
    1143        public void setId( final String id ) {
    1144                this.id = nval( getRequestParameter( id ),this.id );
    1145        }
    1146
    1147        /**
    1148         * 【TAG】ﾁｬｰﾄの高さを指定します(初期値:400)。
    1149         *
    1150         * @og.tag
    1151         * canvasﾀｸﾞの高さに設定します。
    1152         *
    1153         * @param hei 設定する高さ
    1154         */
    1155        public void setHeight( final String hei ) {
    1156                height = nval( getRequestParameter( hei ),height );
    1157        }
    1158
    1159        /**
    1160         * 【TAG】ﾁｬｰﾄの幅を指定します(初期値:400)。
    1161         *
    1162         * @og.tag
    1163         * canvasﾀｸﾞの横幅を設定します。
    1164         *
    1165         * @param wid 設定する横幅
    1166         */
    1167        public void setWidth( final String wid ) {
    1168                width = nval( getRequestParameter( wid ),width );
    1169        }
    1170
    1171        /**
    1172         * 【TAG】ﾀｲﾄﾙを指定します。
    1173         *
    1174         * @og.tag
    1175         *
    1176         * @og.rev 6.9.9.3 (2018/09/25) nvalを入れて、初期値を設定します。
    1177         *
    1178         * @param title ﾀｲﾄﾙ
    1179         */
    1180        public void setTitle( final String title ) {
    1181                this.title = nval( getRequestParameter( title ),this.title );
    1182        }
    1183
    1184        /**
    1185         * 【TAG】ﾀｲﾄﾙの表示位置[top/right/bottom/left]を指定します(初期値:top)。
    1186         *
    1187         * @og.tag
    1188         *
    1189         * @og.rev 6.9.9.3 (2018/09/25) nvalを入れて、初期値を設定します。
    1190         *
    1191         * @param titlePosition ﾀｲﾄﾙの表示位置 [top/right/bottom/left]
    1192         */
    1193        public void setTitlePosition( final String titlePosition ) {
    1194                this.titlePosition = nval( getRequestParameter( titlePosition ),this.titlePosition );
    1195
    1196                checkPara( this.titlePosition, SET_POSITION, "titlePosition" );
    1197        }
    1198
    1199        /**
    1200         * 【TAG】凡例を表示するか[true/false]を指定します。
    1201         *
    1202         * @og.tag
    1203         *
    1204         * @og.rev 6.9.9.3 (2018/09/25) nvalを入れて、初期値を設定します。
    1205         *
    1206         * @param display 凡例を表示するか [true/false]
    1207         */
    1208        public void setLegendDisplay( final String display ) {
    1209                legendDisplay = nval( getRequestParameter( display ),legendDisplay );
    1210
    1211                if( legendDisplay != null ) {
    1212                        checkPara( legendDisplay, SET_BOOLEAN, "legendDisplay" );
    1213                        useLegend = true;
    1214                }
    1215        }
    1216
    1217        /**
    1218         * 【TAG】凡例の表示位置[top/right/bottom/left]を指定します(初期値:top)。
    1219         *
    1220         * @og.tag
    1221         *
    1222         * @og.rev 6.9.9.3 (2018/09/25) nvalを入れて、初期値を設定します。
    1223         *
    1224         * @param position 凡例の表示位置 [top/right/bottom/left]
    1225         */
    1226        public void setLegendPosition( final String position ) {
    1227                legendPosition = nval( getRequestParameter( position ),legendPosition );
    1228
    1229                if( legendPosition != null ) {
    1230                        checkPara( legendPosition, SET_POSITION, "legendPosition" );
    1231                        useLegend = true;
    1232                }
    1233        }
    1234
    1235        /**
    1236         * 【TAG】凡例のスタイル属性を使用するかどうか[true/false]を指定します(初期値:false)。
    1237         *
    1238         * @og.tag
    1239         * 凡例のスタイルを、jsChartDataタグのpointStyle属性で指定した形状に変更します。
    1240         * 複数データの場合、片方だけ指定したい場合は、usePointStyle="true" にしておき、
    1241         * 指定したいほうだけ、jsChartDataタグ側で、pointStyle属性を設定してください。
    1242         * options:legend:labels属性のusePointStyle です。
    1243         *
    1244         * @og.rev 6.8.5.0 (2018/01/09) 新規登録
    1245         *
    1246         * @param usePstyle 凡例のスタイル属性を使用するかどうか [true:使用する/false:使用しない]
    1247         */
    1248        public void setUsePointStyle( final String usePstyle ) {
    1249                final String useStyle = nval( getRequestParameter( usePstyle ),null );
    1250
    1251                if( useStyle != null ) {
    1252                        usePointStyle = Boolean.parseBoolean( useStyle );
    1253                        useLegend = true;               // パラメータの設定が行われた場合のみ、設定します。
    1254                }
    1255        }
    1256
    1257        /**
    1258         * 【TAG】棒線の横幅を指定します(初期値:0.8, typeがbar,horizontalBarの場合に有効)。
    1259         *
    1260         * @og.tag
    1261         *
    1262         * @og.rev 6.9.9.3 (2018/09/25) nvalを入れて、初期値を設定します。
    1263         *
    1264         * @param barWidthPer 棒線の横幅
    1265         */
    1266        public void setBarWidthPer( final String barWidthPer ) {
    1267                this.barWidthPer = nval( getRequestParameter( barWidthPer ) , this.barWidthPer );
    1268        }
    1269
    1270        /**
    1271         * 【TAG】ﾁｬｰﾄｸﾘｯｸ時のｲﾍﾞﾝﾄを指定します。
    1272         *
    1273         * @og.tag
    1274         * 下記の値が引数として渡されます。
    1275         *
    1276         * event:ｲﾍﾞﾝﾄ情報
    1277         * obj:ｸﾘｯｸされたｵﾌﾞｼﾞｪｸﾄの情報
    1278         *
    1279         * @param click チャートクリック時のイベントを指定
    1280         */
    1281        public void setOnClick( final String click ) {
    1282                onClick = nval( getRequestParameter( click ),onClick );
    1283        }
    1284
    1285        /**
    1286         * 【TAG】プラグイン定義された関数を指定します。
    1287         *
    1288         * @og.tag
    1289         * プラグインは、plugins: [pinFunc], 形式で追加されます。
    1290         * この属性での指定時は、[]は、不要で、CSV形式の関数名を並べます。
    1291         * 外部に、var pinFunc = { afterDatasetsDraw: function(chart, options) { ･･･ } };
    1292         * 形式のプラグインを指定することで、個別に読ませることが可能です。
    1293         * なお、すべてのチャートに、同一のプラグインを指定する場合は、この属性ではなく、
    1294         * Chart.plugins.register({ afterDatasetsDraw: function(chart, options) { ･･･ } });
    1295         * 形式で、プラグイン登録
    1296         *
    1297         * @og.rev 6.9.9.2 (2018/09/18) プラグイン定義された関数を指定します。
    1298         *
    1299         * @param attri 追加属性の値
    1300         */
    1301        public void setPlugins( final String attri ) {
    1302                plugins = nval( getRequestParameter( attri ),plugins );
    1303        }
    1304
    1305        //========================================================================================
    1306
    1307        /**
    1308         * 【TAG】x軸の表示位置[top/right/bottom/left]を指定します(初期値:bottom)。
    1309         *
    1310         * @og.tag
    1311         * horizontalBar を指定した場合は、left になります。
    1312         * 初期値(null)は、下(bottom)に表示されます。
    1313         * options:scales:xAxes の 要素の属性です。
    1314         *
    1315         * @og.rev 7.0.1.2 (2018/11/04) 新規登録
    1316         *
    1317         * @param pos x軸の表示位置 [top/right/bottom/left]
    1318         */
    1319        public void setXposition( final String pos ) {
    1320                xposition = nval( getRequestParameter( pos ),null );
    1321
    1322                checkPara( xposition, SET_POSITION, "position" );
    1323        }
    1324
    1325        /**
    1326         * 【TAG】x軸のｽｹｰﾙﾀｲﾌﾟ[category/linear/time]を指定します(初期値:category)。
    1327         *
    1328         * @og.tag
    1329         *  8.0.0.0 (2021/08/31)
    1330         *  chartTypeが、bubbleとscatterの場合は、xscaleType は、初期値:category に
    1331         *  しておいてください。内部で、x: y: r: 等のﾃﾞｰﾀの割り当てを行います。
    1332         *
    1333         * @og.rev 6.9.9.3 (2018/09/25) nvalを入れて、初期値を設定します。
    1334         * @og.rev 7.0.1.1 (2018/10/22) JsChartDataｵﾌﾞｼﾞｪｸﾄを使用。
    1335         *
    1336         * @param xscaleType x軸のｽｹｰﾙﾀｲﾌﾟ [category/linear/time]
    1337         */
    1338        public void setXscaleType( final String xscaleType ) {
    1339                this.xscaleType = nval( getRequestParameter( xscaleType ) , this.xscaleType );
    1340
    1341                // プラグインなどで独自の type を指定することがあるため、警告だけにします。
    1342                try {
    1343                        checkPara( this.xscaleType, SET_XSCALE, "xscaleType" );
    1344                }
    1345                catch( final HybsSystemException ex ) {
    1346                        System.err.println( ex.getMessage() );
    1347                }
    1348
    1349                jsXAxis.addAxis( "type" , this.xscaleType , USE_QUOTE );                // 文字
    1350        }
    1351
    1352        /**
    1353         * 【TAG】x軸のラベルを指定します。
    1354         *
    1355         * @og.tag
    1356         *
    1357         * @og.rev 6.9.9.3 (2018/09/25) nvalを入れて、初期値を設定します。
    1358         * @og.rev 7.0.1.1 (2018/10/22) JsChartDataｵﾌﾞｼﾞｪｸﾄを使用。
    1359         *
    1360         * @param xlabel x軸のラベル
    1361         */
    1362        public void setXlabel( final String xlabel ) {
    1363                final String lbl = nval( getRequestParameter( xlabel ),null );
    1364                if( lbl != null ) {
    1365                        final String scLbl = "{display: true,labelString:'" + lbl + "'}" ;
    1366                        jsXAxis.addAxis( "scaleLabel" , scLbl , NO_QUOTE );             // カンマが不要なのは判っている
    1367                }
    1368        }
    1369
    1370        /**
    1371         * 【TAG】x軸ｺｰﾙﾊﾞｯｸを指定します。
    1372         *
    1373         * @og.tag
    1374         * x軸のメモリ編集用スケールバックを設定します。
    1375         *
    1376         * @og.rev 6.9.9.3 (2018/09/25) nvalを入れて、初期値を設定します。
    1377         * @og.rev 7.0.1.1 (2018/10/22) JsChartDataｵﾌﾞｼﾞｪｸﾄを使用。
    1378         *
    1379         * @param callback x軸ｺｰﾙﾊﾞｯｸ
    1380         */
    1381        public void setXscaleCallback( final String callback ) {
    1382                jsXAxis.addTicks( "callback" , nval( getRequestParameter( callback ),null ) , NO_QUOTE );       // ファンクションは、クオートしない
    1383        }
    1384
    1385        /**
    1386         * 【TAG】x軸を０から書き始まるかどうか(初期値:null)。
    1387         *
    1388         * @og.tag
    1389         *
    1390         * @og.rev 6.8.5.0 (2018/01/09) 新規登録
    1391         * @og.rev 7.0.1.1 (2018/10/22) JsChartDataｵﾌﾞｼﾞｪｸﾄを使用。
    1392         *
    1393         * @param xZero x軸のゼロ開始
    1394         */
    1395        public void setXbeginAtZero( final String xZero ) {
    1396                jsXAxis.addTicks( "beginAtZero" , nval( getRequestParameter( xZero ) , null ) , NO_QUOTE );             // Boolean
    1397        }
    1398
    1399        /**
    1400         * 【TAG】x軸の最大値を指定します(xscaleTypeがlinearの場合に有効)。
    1401         *
    1402         * @og.tag
    1403         *
    1404         * @og.rev 6.9.9.3 (2018/09/25) nvalを入れて、初期値を設定します。
    1405         * @og.rev 7.0.1.1 (2018/10/22) JsChartDataｵﾌﾞｼﾞｪｸﾄを使用。
    1406         *
    1407         * @param xmax x軸の最大値
    1408         */
    1409        public void setXmax( final String xmax ) {
    1410                jsXAxis.addTicks( "max" , nval( getRequestParameter( xmax ),null ) , NO_QUOTE );                // 数値
    1411        }
    1412
    1413        /**
    1414         * 【TAG】x軸の最小値を指定します(xscaleTypeがlinearの場合に有効)。
    1415         *
    1416         * @og.tag
    1417         *
    1418         * @og.rev 6.9.9.3 (2018/09/25) nvalを入れて、初期値を設定します。
    1419         * @og.rev 7.0.1.1 (2018/10/22) JsChartDataｵﾌﾞｼﾞｪｸﾄを使用。
    1420         *
    1421         * @param xmin x軸の最小値
    1422         */
    1423        public void setXmin( final String xmin ) {
    1424                jsXAxis.addTicks( "min" , nval( getRequestParameter( xmin ),null ) , NO_QUOTE );                // 数値
    1425        }
    1426
    1427        /**
    1428         * 【TAG】x軸のメモリ幅を指定します(xscaleTypeがlinearの場合に有効)。
    1429         *
    1430         * @og.tag
    1431         *
    1432         * @og.rev 6.9.9.3 (2018/09/25) nvalを入れて、初期値を設定します。
    1433         * @og.rev 7.0.1.1 (2018/10/22) JsChartDataｵﾌﾞｼﾞｪｸﾄを使用。
    1434         *
    1435         * @param xstepSize x軸のメモリ幅
    1436         */
    1437        public void setXstepSize( final String xstepSize ) {
    1438                jsXAxis.addTicks( "stepSize" , nval( getRequestParameter( xstepSize ),null ) , NO_QUOTE );              // 数値
    1439        }
    1440
    1441        /**
    1442         * 【TAG】chartの属性に、TLDで未定義の属性を追加指定します。
    1443         *
    1444         * @og.tag
    1445         * chartの属性に、TLDで未定義の属性を追加指定します。
    1446         * これは、TLDで未定義の属性を、chart.js で使用する場合に、引数の属性をそのまま、追加します。
    1447         *
    1448         * @og.rev 7.0.1.2 (2018/11/04) 属性名変更
    1449         *
    1450         * @param attri 追加属性の値
    1451         */
    1452        public void setOptChart( final String attri ) {
    1453                optChart = nval( getRequestParameter( attri ),optChart );
    1454        }
    1455
    1456        /**
    1457         * 【TAG】optionsの属性に、その他ｵﾌﾟｼｮﾝを追加指定します。
    1458         *
    1459         * @og.tag
    1460         * optionsの属性に、その他ｵﾌﾟｼｮﾝを追加指定します。
    1461         *
    1462         * @og.rev 7.0.1.2 (2018/11/04) 属性名変更
    1463         *
    1464         * @param attri オプションの値
    1465         */
    1466        public void setOptOptions( final String attri ) {
    1467                optOptions = nval( getRequestParameter( attri ),optOptions );
    1468        }
    1469
    1470        /**
    1471         * 【TAG】その他options:scales:xAxesのｵﾌﾟｼｮﾝを指定します。
    1472         *
    1473         * @og.tag
    1474         * options:scales:xAxes の 要素の属性です。
    1475         *  ※ chartJS上は、Axes(axisの複数形)と、Axis を使い分けていますが、属性は、axis で統一します。
    1476         *
    1477         * @og.rev 7.0.1.2 (2018/11/04) 属性の追加。
    1478         *
    1479         * @param attri その他options:scales:xAxesのｵﾌﾟｼｮﾝ
    1480         */
    1481        public void setOptAxis( final String attri ) {
    1482                jsXAxis.addOptions( JsChartData.AXIS , nval( getRequestParameter( attri ),null ) );
    1483        }
    1484
    1485        /**
    1486         * 【TAG】その他options:scales:xAxes:ticksのｵﾌﾟｼｮﾝを指定します。
    1487         *
    1488         * @og.tag
    1489         * options:scales:xAxes:ticks の 要素の属性です。
    1490         *
    1491         * @og.rev 7.0.1.2 (2018/11/04) 属性の追加。
    1492         *
    1493         * @param attri その他options:scales:xAxes:ticksのｵﾌﾟｼｮﾝ
    1494         */
    1495        public void setOptTicks( final String attri ) {
    1496                jsXAxis.addOptions( JsChartData.TICKS , nval( getRequestParameter( attri ),null ) );
    1497        }
    1498
    1499        /**
    1500         * 【TAG】その他options:scales:xAxes:scaleLabelのｵﾌﾟｼｮﾝを指定します。
    1501         *
    1502         * @og.tag
    1503         * options:scales:xAxes:scaleLabel の 要素の属性です。
    1504         *
    1505         * @og.rev 7.0.1.2 (2018/11/04) 属性の追加。
    1506         *
    1507         * @param attri その他options:scales:xAxes:scaleLabelのｵﾌﾟｼｮﾝ
    1508         */
    1509        public void setOptScaleLabel( final String attri ) {
    1510                jsXAxis.addOptions( JsChartData.SCALE_LABEL , nval( getRequestParameter( attri ),null ) );
    1511        }
    1512
    1513        /**
    1514         * 【TAG】その他options:scales:xAxes:gridLinesのｵﾌﾟｼｮﾝを指定します。
    1515         *
    1516         * @og.tag
    1517         * options:scales:xAxes:gridLines の 要素の属性です。
    1518         *
    1519         * @og.rev 7.0.1.2 (2018/11/04) 属性の追加。
    1520         *
    1521         * @param attri その他options:scales:xAxes:gridLinesのｵﾌﾟｼｮﾝ
    1522         */
    1523        public void setOptGridLines( final String attri ) {
    1524                jsXAxis.addOptions( JsChartData.GRID_LINES , nval( getRequestParameter( attri ),null ) );
    1525        }
    1526
    1527        /**
    1528         * 【TAG】x軸のﾀｲﾑの単位[year/quarter/month/week/day/hour/minute/second]を指定します。
    1529         *
    1530         * @og.tag
    1531         * (xscaleTypeがtimeの場合に有効。指定しない場合は自動)
    1532         *
    1533         * @og.rev 6.9.9.3 (2018/09/25) xscaleType の time 属性廃止。
    1534         * @og.rev 6.9.9.4 (2018/10/01) nvalを入れて、属性復活。
    1535         * @og.rev 7.0.1.1 (2018/10/22) JsChartDataｵﾌﾞｼﾞｪｸﾄを使用。
    1536         *
    1537         * @param tunit x軸のﾀｲﾑの単位 [year/quarter/month/week/day/hour/minute/second]
    1538         */
    1539        public void setTimeUnit( final String tunit ) {
    1540                final String timeUnit = nval( getRequestParameter( tunit ),null );
    1541
    1542                checkPara( timeUnit, SET_TIMEUNIT, "timeUnit" );
    1543
    1544                jsXAxis.addTime( "unit" , timeUnit , USE_QUOTE );       // 文字列
    1545        }
    1546
    1547        /**
    1548         * 【TAG】x軸のﾀｲﾑの最大値を指定します(xscaleTypeがtimeの場合に有効)。
    1549         *
    1550         * @og.tag
    1551         *
    1552         * @param tmax x軸のﾀｲﾑの最大値
    1553         * @og.rev 6.9.9.3 (2018/09/25) xscaleType の time 属性廃止。
    1554         * @og.rev 6.9.9.4 (2018/10/01) nvalを入れて、属性復活。
    1555         * @og.rev 7.0.1.1 (2018/10/22) JsChartDataｵﾌﾞｼﾞｪｸﾄを使用。
    1556         */
    1557        public void setTimeMax( final String tmax ) {
    1558                jsXAxis.addTime( "max" , nval( getRequestParameter( tmax ),null ) , USE_QUOTE );        // 時間の最大、最小は、文字列として扱う
    1559        }
    1560
    1561        /**
    1562         * 【TAG】x軸のﾀｲﾑの最小値を指定します(xscaleTypeがtimeの場合に有効)。
    1563         *
    1564         * @og.tag
    1565         * @og.rev 6.9.9.3 (2018/09/25) xscaleType の time 属性廃止。
    1566         * @og.rev 6.9.9.4 (2018/10/01) nvalを入れて、属性復活。
    1567         * @og.rev 7.0.1.1 (2018/10/22) JsChartDataｵﾌﾞｼﾞｪｸﾄを使用。
    1568         *
    1569         * @param tmin x軸のﾀｲﾑの最小値
    1570         */
    1571        public void setTimeMin( final String tmin ) {
    1572                jsXAxis.addTime( "min" , nval( getRequestParameter( tmin ),null ) , USE_QUOTE );        // 時間の最大、最小は、文字列として扱う
    1573        }
    1574
    1575        /**
    1576         * 【TAG】x軸のﾀｲﾑの単位幅を指定します(xscaleTypeがtimeの場合に有効)。
    1577         *
    1578         * @og.tag
    1579         *
    1580         * @og.rev 6.9.9.3 (2018/09/25) xscaleType の time 属性廃止。
    1581         * @og.rev 6.9.9.4 (2018/10/01) nvalを入れて、属性復活。
    1582         * @og.rev 7.0.1.1 (2018/10/22) JsChartDataｵﾌﾞｼﾞｪｸﾄを使用。
    1583         *
    1584         * @param tunitStepSize x軸のﾀｲﾑの単位幅
    1585         */
    1586        public void setTimeUnitStepSize( final String tunitStepSize ) {
    1587                jsXAxis.addTime( "unitStepSize" , nval( getRequestParameter( tunitStepSize ),null ) , NO_QUOTE );       // 数値
    1588        }
    1589
    1590        /**
    1591         * 【TAG】x軸の設定するﾀｲﾑ(入力ﾃﾞｰﾀ)のﾌｫｰﾏｯﾄを指定します(xscaleTypeがtimeの場合に有効)。
    1592         *
    1593         * @og.tag
    1594         * ﾌｫｰﾏｯﾄは、Moment.js の定義を使用します。<a href="http://momentjs.com/docs/#/parsing/">Moment.js Documentation</a>
    1595         * 例：YYYY/MM/DD HH:mm:ss
    1596         *
    1597         * <table class="plain">
    1598         *   <caption>ボタンのタイプ説明</caption>
    1599         *       <tr><th>Input          </th><th>Example                </th><th>Description                                                                                                                                    </th></tr>
    1600         *       <tr><td>YYYY           </td><td>2014                   </td><td>4 or 2 digit year                                                                                                                              </td></tr>
    1601         *       <tr><td>YY             </td><td>14                             </td><td>2 digit year                                                                                                                                   </td></tr>
    1602         *       <tr><td>Y                      </td><td>-25                    </td><td>Year with any number of digits and sign                                                                                </td></tr>
    1603         *       <tr><td>Q                      </td><td>1..4                   </td><td>Quarter of year. Sets month to first month in quarter.                                                 </td></tr>
    1604         *       <tr><td>M MM           </td><td>1..12                  </td><td>Month number                                                                                                                                   </td></tr>
    1605         *       <tr><td>MMM MMMM       </td><td>Jan..December  </td><td>Month name in locale set by moment.locale()                                                                    </td></tr>
    1606         *       <tr><td>D DD           </td><td>1..31                  </td><td>Day of month                                                                                                                                   </td></tr>
    1607         *       <tr><td>Do             </td><td>1st..31st              </td><td>Day of month with ordinal                                                                                                              </td></tr>
    1608         *       <tr><td>DDD DDDD       </td><td>1..365                 </td><td>Day of year                                                                                                                                    </td></tr>
    1609         *       <tr><td>X                      </td><td>1410715641             </td><td>Unix timestamp                                                                                                                                 </td></tr>
    1610         *       <tr><td>x                      </td><td>1.41072E+12    </td><td>Unix ms timestamp                                                                                                                              </td></tr>
    1611         *       <tr><td>                       </td><td>                               </td><td>                                                                                                                                                               </td></tr>
    1612         *       <tr><td>gggg           </td><td>2014                   </td><td>Locale 4 digit week year                                                                                                               </td></tr>
    1613         *       <tr><td>gg             </td><td>14                             </td><td>Locale 2 digit week year                                                                                                               </td></tr>
    1614         *       <tr><td>w ww           </td><td>1..53                  </td><td>Locale week of year                                                                                                                    </td></tr>
    1615         *       <tr><td>e                      </td><td>0..6                   </td><td>Locale day of week                                                                                                                             </td></tr>
    1616         *       <tr><td>ddd dddd       </td><td>Mon...Sunday   </td><td>Day name in locale set by moment.locale()                                                                              </td></tr>
    1617         *       <tr><td>GGGG           </td><td>2014                   </td><td>ISO 4 digit week year                                                                                                                  </td></tr>
    1618         *       <tr><td>GG             </td><td>14                             </td><td>ISO 2 digit week year                                                                                                                  </td></tr>
    1619         *       <tr><td>W WW           </td><td>1..53                  </td><td>ISO week of year                                                                                                                               </td></tr>
    1620         *       <tr><td>E                      </td><td>1..7                   </td><td>ISO day of week                                                                                                                                </td></tr>
    1621         *       <tr><td>                       </td><td>                               </td><td>                                                                                                                                                               </td></tr>
    1622         *       <tr><td>H HH           </td><td>0..23                  </td><td>Hours (24 hour time)                                                                                                                   </td></tr>
    1623         *       <tr><td>h hh           </td><td>1..12                  </td><td>Hours (12 hour time used with a A.)                                                                                    </td></tr>
    1624         *       <tr><td>k kk           </td><td>1..24                  </td><td>Hours (24 hour time from 1 to 24)                                                                                              </td></tr>
    1625         *       <tr><td>a A            </td><td>am pm                  </td><td>Post or ante meridiem (Note the one character a p are also considered valid)   </td></tr>
    1626         *       <tr><td>m mm           </td><td>0..59                  </td><td>Minutes                                                                                                                                                </td></tr>
    1627         *       <tr><td>s ss           </td><td>0..59                  </td><td>Seconds                                                                                                                                                </td></tr>
    1628         *       <tr><td>S SS SSS       </td><td>0..999                 </td><td>Fractional seconds                                                                                                                             </td></tr>
    1629         *       <tr><td>Z ZZ           </td><td>+12:00                 </td><td>Offset from UTC as +-HH:mm, +-HHmm, or Z                                                                               </td></tr>
    1630         * </table>
    1631         *
    1632         * @og.rev 6.9.9.3 (2018/09/25) xscaleType の time 属性廃止。
    1633         * @og.rev 6.9.9.4 (2018/10/01) nvalを入れて、属性復活。
    1634         * @og.rev 7.0.1.1 (2018/10/22) JsChartDataｵﾌﾞｼﾞｪｸﾄを使用。
    1635         *
    1636         * @param tFormat x軸の設定するﾀｲﾑのﾌｫｰﾏｯﾄ
    1637         */
    1638        public void setTimeSetFormat( final String tFormat ) {
    1639                jsXAxis.addTime( "format" , nval( getRequestParameter( tFormat ),null ) , USE_QUOTE );  // 文字列
    1640        }
    1641
    1642        /**
    1643         * 【TAG】x軸の表示するﾀｲﾑのﾌｫｰﾏｯﾄを指定します(xscaleTypeがtimeの場合に有効)。
    1644         *
    1645         * @og.tag
    1646         * ﾌｫｰﾏｯﾄは、Moment.js の定義を使用します。<a href="http://momentjs.com/docs/#/parsing/">Moment.js Documentation</a>
    1647         * 例：YYYY/MM/DD HH:mm:ss
    1648         *
    1649         * timeLblFormatが指定されている場合、全てのdisplayFormatsにtimeLblFormatを設定する
    1650         *
    1651         * @og.rev 6.9.9.3 (2018/09/25) xscaleType の time 属性廃止。
    1652         * @og.rev 6.9.9.4 (2018/10/01) nvalを入れて、属性復活。
    1653         * @og.rev 7.0.1.1 (2018/10/22) JsChartDataｵﾌﾞｼﾞｪｸﾄを使用。
    1654         *
    1655         * @param tLblFormat x軸の表示するﾀｲﾑのﾌｫｰﾏｯﾄ
    1656         * @see         #setTimeSetFormat(String)
    1657         */
    1658        public void setTimeLblFormat( final String tLblFormat ) {
    1659                final String timeFmt = nval( getRequestParameter( tLblFormat ),null );
    1660                if( timeFmt != null ) {
    1661                        final StringBuilder buf = new StringBuilder( BUFFER_MIDDLE )
    1662                                        .append(  "{year:'"             ).append( timeFmt )
    1663                                        .append( "',quarter:'"  ).append( timeFmt )
    1664                                        .append( "',month:'"    ).append( timeFmt )
    1665                                        .append( "',week:'"             ).append( timeFmt )
    1666                                        .append( "',day:'"              ).append( timeFmt )
    1667                                        .append( "',hour:'"             ).append( timeFmt )
    1668                                        .append( "',minute:'"   ).append( timeFmt )
    1669                                        .append( "',second:'"   ).append( timeFmt )
    1670                                        .append( "'}" );
    1671
    1672                        jsXAxis.addTime( "displayFormats" , buf.toString() , NO_QUOTE );        // ｵﾌﾞｼﾞｪｸﾄなので、クオートなし
    1673                }
    1674        }
    1675
    1676        /**
    1677         * 【TAG】x軸の時間のﾂｰﾙﾁｯﾌﾟに使用するﾌｫｰﾏｯﾄ(ﾀｲﾑｽｹｰﾙ用)を指定します(xscaleTypeがtimeの場合に有効)。
    1678         *
    1679         * @og.tag
    1680         * ﾌｫｰﾏｯﾄは、Moment.js の定義を使用します。<a href="http://momentjs.com/docs/#/parsing/">Moment.js Documentation</a>
    1681         * 例：YYYY/MM/DD HH:mm:ss
    1682         *
    1683         * @og.rev 7.0.1.0 (2018/10/15) 時間のﾂｰﾙﾁｯﾌﾟに使用するﾌｫｰﾏｯﾄ(ﾀｲﾑｽｹｰﾙ用)
    1684         * @og.rev 7.0.1.1 (2018/10/22) JsChartDataｵﾌﾞｼﾞｪｸﾄを使用。
    1685         *
    1686         * @param tipFormat x軸の表示するﾀｲﾑのﾌｫｰﾏｯﾄ
    1687         * @see         #setTimeSetFormat(String)
    1688         */
    1689        public void setTooltipFormat( final String tipFormat ) {
    1690                jsXAxis.addTime( "tooltipFormat" , nval( getRequestParameter( tipFormat ),null ) , USE_QUOTE ); // 文字列
    1691        }
    1692
    1693        //========================================================================================
    1694
    1695        /**
    1696         * 【TAG】y軸に横マーカーラインの設定値をCSV形式で複数指定します。
    1697         *
    1698         * @og.tag
    1699         * annotation オプションに値を設定します。
    1700         * X軸に平行に固定値の線を引きます。線の値を、CSV形式で指定します。
    1701         * type: 'line',scaleID: 'y0Ax',mode: 'horizontal',borderWidth: 2 固定です。
    1702         *
    1703         * @og.rev 6.8.5.0 (2018/01/09) 新規登録
    1704         *
    1705         * @param mkVals y軸に横マーカーラインの設定値(CSV形式)
    1706         */
    1707        public void setMarkValues( final String mkVals ) {
    1708                markValues = nval( getRequestParameter( mkVals ) , markValues );
    1709        }
    1710
    1711        /**
    1712         * 【TAG】y軸に横マーカーラインの色をCSV形式で複数指定します。
    1713         *
    1714         * @og.tag
    1715         * annotation オプションに値を設定します。
    1716         * X軸に平行に固定値の線を引きます。線の色を、CSV形式で指定します。
    1717         * markValues が指定されており、markColorsが指定されていない場合は、青色(BLUE)になります。
    1718         * 色指定に、VIVID,PASTEL を使えるようにします。
    1719         *
    1720         * @og.rev 6.8.5.0 (2018/01/09) 新規登録
    1721         * @og.rev 7.0.1.3 (2018/11/12) 色指定に、VIVID,PASTEL を使えるようにします。
    1722         *
    1723         * @param mkCols y軸に横マーカーラインの色(CSV形式)
    1724         */
    1725        public void setMarkColors( final String mkCols ) {
    1726                markColors = nval( getRequestParameter( mkCols ) , markColors );
    1727        }
    1728
    1729        /**
    1730         * 【TAG】y軸に横マーカーラインのラベルをCSV形式で複数指定します。
    1731         *
    1732         * @og.tag
    1733         * annotations の label 属性 の content 属性に値をセットします。
    1734         * label 属性は、enabled: 'true',position: 'left',backgroundColor: 'rgba(0,0,0,0)',
    1735         * fontSize: 10, は固定で、fontColor は、markColors 属性で指定した
    1736         * y軸に横マーカーラインの色を使用します。
    1737         * 色指定に、VIVID,PASTEL を使えるようにします。
    1738         *
    1739         * @og.rev 6.8.5.0 (2018/01/09) 新規登録
    1740         *
    1741         * @param mklbls y軸に横マーカーラインのラベル(CSV形式)
    1742         */
    1743        public void setMarkLbls( final String mklbls ) {
    1744                markLbls = nval( getRequestParameter( mklbls ) , markLbls );
    1745        }
    1746
    1747        /**
    1748         * 【TAG】y軸に横マーカーラインのラベル表示位置の上下方向を調整します(初期値:-6)。
    1749         *
    1750         * @og.tag
    1751         * annotation オプションに値を設定します。
    1752         * annotations の label 属性の yAdjust に値をセットします。
    1753         * これは、ラインに対するラベルの位置を表します。＋で、下側、－で上側に表示します。
    1754         * 初期値は、－６ で、ラインの上側に来るように調整しています。
    1755         *
    1756         * @og.rev 6.8.5.0 (2018/01/09) 新規登録
    1757         *
    1758         * @param mkAjst y軸に横マーカーラインのラベル表示位置の上下方向調整
    1759         */
    1760        public void setMarkAdjust( final String mkAjst ) {
    1761                markAdjust = nval( getRequestParameter( mkAjst ) , markAdjust );
    1762        }
    1763
    1764        /**
    1765         * 【TAG】x軸に縦マーカーラインの設定値をCSV形式で複数指定します。
    1766         *
    1767         * @og.tag
    1768         * annotation オプションに値を設定します。
    1769         * Y軸に平行に固定値の縦線を引きます。線の値を、CSV形式で指定します。
    1770         * type: 'line',borderDash:[5,2],scaleID: 'x0Ax',mode:'vertical',borderWidth:0.5 固定です。
    1771         *
    1772         * @og.rev 7.0.1.1 (2018/10/22) xmarkValues,xmarkColors属性の追加
    1773         *
    1774         * @param mkVals x軸に縦マーカーラインの設定値(CSV形式)
    1775         */
    1776        public void setXmarkValues( final String mkVals ) {
    1777                xmarkValues = nval( getRequestParameter( mkVals ) , xmarkValues );
    1778        }
    1779
    1780        /**
    1781         * 【TAG】x軸に縦マーカーラインの色をCSV形式で複数指定します。
    1782         *
    1783         * @og.tag
    1784         * annotation オプションに値を設定します。
    1785         * Y軸に平行に固定値の縦線を引きます。線の色を、CSV形式で指定します。
    1786         * xmarkValues が指定されており、markColorsが指定されていない場合は、青色(BLUE)になります。
    1787         *
    1788         * @og.rev 7.0.1.1 (2018/10/22) xmarkValues,xmarkColors属性の追加
    1789         * @og.rev 7.0.1.3 (2018/11/12) 色指定に、VIVID,PASTEL を使えるようにします。
    1790         *
    1791         * @param mkCols x軸に縦マーカーラインの色(CSV形式)
    1792         */
    1793        public void setXmarkColors( final String mkCols ) {
    1794                xmarkColors = nval( getRequestParameter( mkCols ) , xmarkColors );
    1795        }
    1796
    1797        /**
    1798         * 【TAG】x軸,y軸全マーカーライン共通のラインの幅を指定します:borderWidth(初期値:2)。
    1799         *
    1800         * @og.tag
    1801         * annotation オプションに値を設定します。
    1802         * この値は、x軸,y軸関係なく、マーカーラインの順番も関係なく、共通設定になります。
    1803         *
    1804         * @og.rev 7.0.1.1 (2018/10/22) markWidth,markDash,markFontSize属性の追加
    1805         *
    1806         * @param width マーカーライン共通のラインの幅
    1807         */
    1808        public void setMarkWidth( final String width ) {
    1809                markWidth = nval( getRequestParameter( width ) , markWidth );
    1810        }
    1811
    1812        /**
    1813         * 【TAG】x軸,y軸全マーカーライン共通のラインに点線を指定([5,2]など)します:borderDash(初期値:null)。
    1814         *
    1815         * @og.tag
    1816         * annotation オプションに値を設定します。
    1817         * この値は、x軸,y軸関係なく、マーカーラインの順番も関係なく、共通設定になります。
    1818         * markDash="[5,2]" とすれば、線の長さが5px , 線と線の間が2px になります。
    1819         *
    1820         * @og.rev 7.0.1.1 (2018/10/22) markWidth,markDash,markFontSize属性の追加
    1821         *
    1822         * @param dash マーカーライン共通のラインの点線の形状
    1823         */
    1824        public void setMarkDash( final String dash ) {
    1825                markDash = nval( getRequestParameter( dash ) , markDash );
    1826        }
    1827
    1828        /**
    1829         * 【TAG】x軸,y軸全マーカーライン共通のラベルのフォントサイズを指定します:fontSize(初期値:10)。
    1830         *
    1831         * @og.tag
    1832         * annotation オプションに値を設定します。
    1833         * この値は、x軸,y軸関係なく、マーカーラインの順番も関係なく、共通設定になります。
    1834         *
    1835         * @og.rev 7.0.1.1 (2018/10/22) markWidth,markDash,markFontSize属性の追加
    1836         *
    1837         * @param size マーカーライン共通のフォントサイズ
    1838         */
    1839        public void setMarkFontSize( final String size ) {
    1840                markFontSize = nval( getRequestParameter( size ) , markFontSize );
    1841        }
    1842
    1843        //========================================================================================
    1844
    1845        /**
    1846         * 【TAG】すべてのﾃﾞｰﾀが０の場合、使用しないかどうか[true:除外する/false:除外しない]を指定します(初期値:false)。
    1847         *
    1848         * @og.tag
    1849         * JSON データを作成して、JsChartに渡しますが、このフラグを true に設定すると
    1850         * 0 または、null（空文字列）のデータを出力しません。  6.8.3.0 (2017/11/27)
    1851         * グラフ系で、0 が、ありえない値として設定されている場合に、使用すると、
    1852         * 出力するデータ量を抑えることが出来ます。
    1853         *
    1854         * @og.rev 6.7.7.0 (2017/03/31) useZeroDataOmit属性の追加
    1855         *
    1856         * @param useZeroOmit ﾃﾞｰﾀが０の場合の使用可否 [true:除外する/false:除外しない]
    1857         */
    1858        public void setUseZeroDataOmit( final String useZeroOmit ) {
    1859                useZeroDataOmit = nval( getRequestParameter( useZeroOmit ) , useZeroDataOmit );
    1860        }
    1861
    1862        /**
    1863         * 【TAG】JSON出力で、値出力にレンデラを利用するかどうか[true/false]を指定します(初期値:false)。
    1864         *
    1865         * @og.tag
    1866         * JSONのデータのレンデラー変換を行うかどうか。
    1867         * 数値部分にはレンデラー変換は行いません。ラベル文字に行います。
    1868         * 指定しない場合は使用しない(false)です。
    1869         *
    1870         * @og.rev 6.7.9.0 (2017/04/28) useRenderer 追加
    1871         *
    1872         * @param       usernd レンデラーを利用するかどうか [true/false]
    1873         */
    1874        public void setUseRenderer( final String usernd ) {
    1875                useRenderer = nval( getRequestParameter( usernd ) , useRenderer );
    1876        }
    1877
    1878        /**
    1879         * 【TAG】検索結果をこのカラムでソートし直します(初期値:null)。
    1880         *
    1881         * @og.tag
    1882         * query で検索した結果を、JsChartで利用する場合、チャート上のソート順と、
    1883         * リストや、別のチャートでの表示準が異なる場合に、このカラムで、ソートしなおします。
    1884         * 通常は、labelColumn と同じ値でソートすることで、X軸の順番に表示されます。
    1885         *
    1886         * @og.rev 6.8.0.0 (2017/06/02) sortColumn 追加
    1887         *
    1888         * @param       sortClm このカラムでソートし直す
    1889         */
    1890        public void setSortColumn( final String sortClm ) {
    1891                sortColumn = nval( getRequestParameter( sortClm ) , sortColumn );
    1892        }
    1893
    1894        /**
    1895         * 【TAG】値の前後にクオートをはさむかどうか[true/false]指定します(初期値:false)。
    1896         *
    1897         * @og.tag
    1898         * 以前は、yscaleType="category" のときに、値が、文字列のため、クオートで囲う判断をしていました。
    1899         * その属性は、JsChartDataTag に移ったため、新たなパラメータを用意します。
    1900         * 将来的に、自動判定にするか、JsChartDataTag から情報を取得するかもしれません。
    1901         *
    1902         * @og.rev 7.0.1.1 (2018/10/22) 新規登録
    1903         *
    1904         * @param flag 値の前後にクオートをはさむかどうか [true/false]
    1905         */
    1906        public void setValueQuot( final String flag ) {
    1907                valueQuot = nval( getRequestParameter( flag ),valueQuot );
    1908        }
    1909
    1910        /**
    1911         * 【TAG】ズーム処理を使用するかどうか[true/false]を指定します(初期値:false)。
    1912         *
    1913         * @og.tag
    1914         * annotation オプションにpan と zoom を設定します。
    1915         * これは、chartjs-plugin-zoom.js を使用します。
    1916         * 初期値は、false:使用しないです。
    1917         *
    1918         * <ul>
    1919         *   <li>ﾎｲｰﾙでxy軸の拡大、縮小                 </li>
    1920         *   <li>canvasをクリックでzoomリセット   </li>
    1921         *   <li>ｸﾘｯｸした状態で移動で、ﾊﾟﾝ動作     </li>
    1922         *   <li>数値(日付)ｽｹｰﾙの方向のみ可能      </li>
    1923         * </ul>
    1924         *
    1925         * @og.rev 6.8.5.0 (2018/01/09) 新規登録
    1926         *
    1927         * @param zoom ズーム処理を使用するかどうか [true:使用する/false:使用しない]。
    1928         */
    1929        public void setUseZoom( final String zoom ) {
    1930                useZoom = nval( getRequestParameter( zoom ) , useZoom );
    1931        }
    1932
    1933        /**
    1934         * 【TAG】TableModelの指定のカラム(CSV形式)をvarの配列変数として出力します。
    1935         *
    1936         * @og.tag
    1937         * これは、指定のカラムのデータをJavaScriptのvar変数定義で配列として出力します。
    1938         * labelColumn や、JsChartDataTag の chartColumn と同じ方法です。
    1939         *
    1940         * 例えば、TableModelを、sortColumn でソートすると、JsChartDataTag の pointBGColor
    1941         * の配列順も変わりますので、ソートされた状態で出力したいことがあると思います。
    1942         *
    1943         * 8.0.0.0 (2021/08/31)
    1944         *  chartTypeが、bubble の場合、
    1945         *    x:は、jsChartData の chartColumn
    1946         *    y:は、varColumns で指定した1番目のカラム
    1947         *    r:は、varColumns で指定した2番目のカラム
    1948         *  scatter の場合は、y:の1番目のカラムのみ使用します。
    1949         *
    1950         * @og.rev 7.0.1.2 (2018/11/04) 新規登録
    1951         * @og.rev 8.0.0.0 (2021/08/31) BUBBLEとSCATTERの追加
    1952         *
    1953         * @param clms 指定のカラム(CSV形式)をvarの配列変数として出力
    1954         */
    1955        public void setVarColumns( final String clms ) {
    1956                varColumns = nval( getRequestParameter( clms ) , varColumns );
    1957        }
    1958
    1959        //========================================================================================
    1960
    1961//      /**
    1962//       * 【廃止】横幅の動的設定カラムを設定します。
    1963//       *
    1964//       * @og.tag
    1965//       * 7.0.1.1 (2018/10/22) 複雑すぎるとの、ﾚｲｱｳﾄが難しいのと、zoomがあるので、廃止予定にします。
    1966//       *
    1967//       * @og.rev 5.9.19.0 (2017/04/07) 追加
    1968//       * @og.rev 6.9.9.3 (2018/09/25) nvalを入れて、初期値を設定します。
    1969//       *
    1970//       * @param widthEventColumn 横幅の動的設定カラム
    1971//       */
    1972//      public void setWidthEventColumn( final String widthEventColumn ) {
    1973//              this.widthEventColumn = nval( getRequestParameter( widthEventColumn ),this.widthEventColumn );
    1974//      }
    1975
    1976//      /**
    1977//       * 【廃止】縦幅の動的設定カラムを設定します。
    1978//       *
    1979//       * @og.tag
    1980//       * 7.0.1.1 (2018/10/22) 複雑すぎるとの、ﾚｲｱｳﾄが難しいのと、zoomがあるので、廃止予定にします。
    1981//       *
    1982//       * @og.rev 5.9.19.0 (2017/04/07) 追加
    1983//       * @og.rev 6.9.9.3 (2018/09/25) nvalを入れて、初期値を設定します。
    1984//       *
    1985//       * @param heightEventColumn 縦幅の動的設定カラム
    1986//       */
    1987//      public void setHeightEventColumn( final String heightEventColumn ) {
    1988//              this.heightEventColumn = nval( getRequestParameter( heightEventColumn ),this.heightEventColumn );
    1989//      }
    1990
    1991//      /**
    1992//       * 【廃止】minの動的設定カラムを設定します。
    1993//       *
    1994//       * @og.tag
    1995//       * 7.0.1.1 (2018/10/22) 複雑すぎるとの、ﾚｲｱｳﾄが難しいのと、zoomがあるので、廃止予定にします。
    1996//       *
    1997//       * @og.rev 5.9.19.0 (2017/04/07) 追加
    1998//       * @og.rev 6.9.9.3 (2018/09/25) nvalを入れて、初期値を設定します。
    1999//       *
    2000//       * @param minEventColumn minの動的設定カラム
    2001//       */
    2002//      public void setMinEventColumn( final String minEventColumn ) {
    2003//              this.minEventColumn = nval( getRequestParameter( minEventColumn ),this.minEventColumn );
    2004//      }
    2005
    2006//      /**
    2007//       * 【廃止】maxの動的設定カラムを設定します。
    2008//       *
    2009//       * @og.tag
    2010//       * 7.0.1.1 (2018/10/22) 複雑すぎるとの、ﾚｲｱｳﾄが難しいのと、zoomがあるので、廃止予定にします。
    2011//       *
    2012//       * @og.rev 5.9.19.0 (2017/04/07) 追加
    2013//       * @og.rev 6.9.9.3 (2018/09/25) nvalを入れて、初期値を設定します。
    2014//       *
    2015//       * @param maxEventColumn maxの動的設定カラム
    2016//       */
    2017//      public void setMaxEventColumn( final String maxEventColumn ) {
    2018//              this.maxEventColumn = nval( getRequestParameter( maxEventColumn ),this.maxEventColumn );
    2019//      }
    2020
    2021//      /**
    2022//       * 【TAG】optionsの属性に、その他ｵﾌﾟｼｮﾝを追加指定します。
    2023//       *
    2024//       * @og.tag
    2025//       * optionsの属性に、その他ｵﾌﾟｼｮﾝを追加指定します。
    2026//       *
    2027//       * @param attri オプションの値
    2028//       */
    2029//      public void setOptionAttributes( final String attri ) {
    2030//              optionAttributes = nval( getRequestParameter( attri ),optionAttributes );
    2031//      }
    2032//
    2033//      /**
    2034//       * 【TAG】chartの属性に、TLDで未定義の属性を追加指定します。
    2035//       *
    2036//       * @og.tag
    2037//       * chartの属性に、TLDで未定義の属性を追加指定します。
    2038//       * これは、TLDで未定義の属性を、chart.js で使用する場合に、引数の属性をそのまま、追加します。
    2039//       *
    2040//       * @og.rev 6.9.9.2 (2018/09/18) chartの属性に、TLDで未定義の属性を追加指定します。
    2041//       *
    2042//       * @param attri 追加属性の値
    2043//       */
    2044//      public void setChartAttributes( final String attri ) {
    2045//              chartAttributes = nval( getRequestParameter( attri ),chartAttributes );
    2046//      }
    2047
    2048        /**
    2049         * 【TAG】(通常は使いません)sessionから所得する DBTableModelオブジェクトの ID。
    2050         *
    2051         * @og.tag
    2052         *
    2053         * @og.rev 6.9.9.3 (2018/09/25) nvalを入れて、初期値を設定します。
    2054         *
    2055         * @param tableId テーブルID
    2056         */
    2057        public void setTableId( final String tableId ) {
    2058                this.tableId = nval( getRequestParameter( tableId ) , this.tableId );
    2059        }
    2060
    2061        /**
    2062         * このオブジェクトの文字列表現を返します。
    2063         * 基本的にデバッグ目的に使用します。
    2064         *
    2065         * @return このクラスの文字列表現
    2066         */
    2067        @Override
    2068        public String toString() {
    2069                final StringBuilder buf = new StringBuilder( BUFFER_MIDDLE )
    2070                                .append( "X_AXIS=" ).append( jsXAxis ).append( CR );
    2071
    2072                jsChartData.forEach( js -> buf.append( "Y_AXIS=" ).append( jsXAxis ).append( CR ) );
    2073
    2074                return ToString.title( this.getClass().getName() )
    2075                        .println( "VERSION"                             , VERSION                               )
    2076                        .println( "id"                                  , id                                    )
    2077                        .println( "tableId"                             , tableId                               )
    2078                        .println( "chartType"                   , chartType                             )
    2079                        .println( "width"                               , width                                 )
    2080                        .println( "height"                              , height                                )
    2081                        .println( "barWidthPer"                 , barWidthPer                   )
    2082                        .println( "title"                               , title                                 )
    2083                        .println( "titlePosition"               , titlePosition                 )
    2084                        .println( "legendPosition"              , legendPosition                )
    2085                        .println( "legendDisplay"               , legendDisplay                 )
    2086                        .println( "xscaleType"                  , xscaleType                    )
    2087        //              .println( "widthEventColumn"    , widthEventColumn              )       // 2017/03/28 追加
    2088        //              .println( "heightEventColumn"   , heightEventColumn             )       // 2017/03/28 追加
    2089        //              .println( "minEventColumn"              , minEventColumn                )       // 2017/03/28 追加
    2090        //              .println( "maxEventColumn"              , maxEventColumn                )       // 2017/03/28 追加
    2091                        .println( "optOptions"                  , optOptions                    )       // 7.0.1.2 (2018/11/04)
    2092                        .println( "optChart"                    , optChart                              )       // 7.0.1.2 (2018/11/04)
    2093        //              .fixForm().toString()
    2094                        .fixForm().println()
    2095                        .println( buf ).toString();
    2096        }
    2097}