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