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