001package org.opengion.hayabusa.taglib;
002
003import java.util.Set;                                                                                   // 6.4.3.4 (2016/03/11)
004import java.util.regex.Matcher;                                                                 // 7.0.1.1 (2018/10/22)
005import java.util.regex.Pattern;                                                                 // 7.0.1.1 (2018/10/22)
006// import java.util.StringJoiner;                                                                       // 7.0.1.2 (2018/11/04)
007
008import org.opengion.hayabusa.common.HybsSystemException;
009import org.opengion.hayabusa.io.JsChartDataV3;
010import org.opengion.fukurou.util.ArraySet;                                              // 6.4.3.4 (2016/03/11)
011import org.opengion.fukurou.util.ToString;
012import org.opengion.fukurou.util.ColorMap;                                              // 6.7.7.0 (2017/03/31)
013import org.opengion.fukurou.util.StringUtil ;
014
015import static org.opengion.fukurou.util.StringUtil.nval ;
016
017/**
018 * 設定された値をJsChartDataV3に設定し、
019 * JsChartV3TagのJsChartDataV3リストに追加するタグです。
020 *
021 * @og.formSample
022 * ●形式:<og:jsChartData chartColumn="…" … />
023 * ●body:なし
024 *
025 * ●Tag定義:
026 * <og:jsChartDataV3
027 *  ===================    data:datasets: の 要素の属性です。
028 *      chartColumn     ○【TAG】チャートのカラム名を指定します(必須)。
029 *      label             【TAG】凡例の値を指定します。
030 *      type              【TAG】複合チャートの種類を指定します[line/bar]                                                                                                        // 7.0.1.1 (2018/10/22)
031 *      fill              【TAG】線下を塗りつぶすかどうか[true/false]を指定します(初期値:false)。
032 *      tension           【TAG】線の伸張を指定します。0で直線になります(初期値:0.4)。
033 *      backgroundColor   【TAG】データの背景色を指定します(色,色番号,VIVID,PASTEL,V0~,P0~)。
034 *      borderColor       【TAG】線の色を指定します(色,色番号,VIVID,PASTEL,V0~,P0~)。
035 *      borderWidth       【TAG】線の幅を指定します。
036 *      borderDash        【TAG】点線のスタイルを配列で指定します。
037 *      pointStyle        【TAG】点のスタイル(circle,triangle,rect,rectRot,cross,crossRot,star,line,dash)を指定します。 // 6.8.5.0 (2018/01/09)
038 *      pointRadius       【TAG】点の大きさを指定します。                                                                                                                             // 6.8.5.0 (2018/01/09)
039 *      showLine          【TAG】ラインを表示するかどうか[true/false]を指定します(初期値:null)。                                                // 6.8.5.0 (2018/01/09)
040 *      spanGaps          【TAG】spanGaps属性を行うかどうか[true/false]を指定します(初期値:null)。                                           // 7.0.1.2 (2018/11/04)
041 *      pointBGColor      【TAG】pointBackgroundColor属性を指定します(色,色番号,VIVID,PASTEL,V0~,P0~)。                                // 7.0.1.2 (2018/11/04)
042 *  ===================    options:scales:yAxes の 要素の属性です。
043 *      useAxis           【TAG】y軸表示を行うかどうか[true/false]を指定します(初期値:null)。                                                 // 7.0.1.1 (2018/10/22)
044 *      id                【TAG】y軸のid(自動採番 'y'+連番)                                                                                                                               // 7.0.1.1 (2018/10/22)
045 *      position          【TAG】y軸の表示位置[left,right]を指定します(初期値:null)。                                                                     // 7.0.1.1 (2018/10/22)
046 *      scaleType         【TAG】y軸のスケールタイプ[linear/category/realtime]を指定します(初期値:linear)                                          // 7.0.1.1 (2018/10/22)
047 *      categoryList      【TAG】y軸のメモリリストをCSV形式で指定します(scaleTypeがcategoryの場合に有効)                                  // 7.0.1.1 (2018/10/22)
048 *      ylabel            【TAG】scaleLabel:y軸に表示するラベル文字                                                                                                         // 7.0.1.1 (2018/10/22)
049 *      beginAtZero       【TAG】ticks:y軸を0から書き始まるかどうか[true/false]を指定(初期値:true)(円形の場合もこの値)        // 7.0.1.1 (2018/10/22)
050 *      fontColor         【TAG】ticks:y軸のフォントの色(色,色番号,VIVID,PASTEL,V0~,P0~)                                                              // 7.0.1.1 (2018/10/22)
051 *      scaleCallback     【TAG】ticks:y軸コールバックを指定します。                                                                                                                   // 7.0.1.1 (2018/10/22)
052 *      max               【TAG】ticks:y軸の最大値を指定します(scaleTypeがlinearの場合に有効)                                                       // 7.0.1.1 (2018/10/22)
053 *      min               【TAG】ticks:y軸の最小値を指定します(scaleTypeがlinearの場合に有効)                                                       // 7.0.1.1 (2018/10/22)
054 *      stepSize          【TAG】ticks:y軸のメモリ幅を指定します(scaleTypeがlinearの場合に有効)                                                      // 7.0.1.1 (2018/10/22)
055 *      ticks             【TAG】ticks属性(他のticks属性とは、同時に使用できません)                                                                          // 7.0.1.1 (2018/10/22)
056 *      gridColor         【TAG】gridLines:color属性( gridLines:{ color:'red', } を生成)                                                               // 7.0.1.1 (2018/10/22)
057 *      gridLines         【TAG】gridLines属性(gridColorは、同時に使用できません)                                                                               // 7.0.1.1 (2018/10/22)
058 *  ===================
059 *      optDataset        【TAG】その他data:datasetのオプションを指定します。                                                                                            // 7.0.1.2 (2018/11/04)
060 *      optAxis           【TAG】その他options:scales:yAxesのオプションを指定します。                                                                            // 7.0.1.2 (2018/11/04)
061 *      optTicks          【TAG】その他options:scales:yAxes:ticksのオプションを指定します。                                                                      // 7.0.1.2 (2018/11/04)
062 *      optScaleLabel     【TAG】その他options:scales:yAxes:scaleLabelのオプションを指定します。                                                 // 7.0.1.2 (2018/11/04)
063 *      optGridLines      【TAG】その他options:scales:yAxes:gridLinesのオプションを指定します。                                                          // 7.0.1.2 (2018/11/04)
064 *  ===================
065 *      caseKey           【TAG】このタグ自体を利用するかどうかの条件キーを指定します(初期値:null)
066 *      caseVal           【TAG】このタグ自体を利用するかどうかの条件値を指定します(初期値:null)
067 *      caseNN            【TAG】指定の値が、null/ゼロ文字列 でない場合(Not Null=NN)は、このタグは使用されます(初期値:判定しない)
068 *      caseNull          【TAG】指定の値が、null/ゼロ文字列 の場合は、このタグは使用されます(初期値:判定しない)
069 *      caseIf            【TAG】指定の値が、true/TRUE文字列の場合は、このタグは使用されます(初期値:判定しない)
070 *      debug             【TAG】デバッグ情報を出力するかどうか[true/false]を指定します(初期値:false)                                     // 7.0.1.1 (2018/10/22)
071 *  />
072 *
073 * ●使用例
074 * <og:jsChartV3...>
075 *     <og:jsChartDataV3
076 *         chartColumn ="CLM1"
077 *         label       ="ラベル"
078 *         fill        ="true"
079 *         tension     ="0"
080 *         borderColor ="rbga(150,150,150,0.7)"
081 *         borderWidth ="2"
082 *     />
083 * </og:jsChartV3>
084 *
085 * @og.rev 8.0.0.0 (2021/07/31) Ver3対応 大幅見直し
086 * @og.group 画面表示
087 *
088 * @version     8.0
089 * @author   Kazuhiko Hasegawa
090 * @since       JDK11.0
091 */
092public class JsChartDataV3Tag extends CommonTagSupport {
093        //* このプログラムのVERSION文字列を設定します。{@VALUE} */
094        private static final String VERSION = "7.0.1.3 (2018/11/12)" ;
095        private static final long serialVersionUID = 701320181112L ;
096
097        private static final boolean    USE_QUOTE               = false;
098        private static final boolean    NO_QUOTE                = true;         // IS_NUMBER か、!USE_QUOTE か、
099
100        private static final Set<String> SET_TYPE               = new ArraySet<>( "line", "bar" );
101        private static final Set<String> SET_PSTYLE             = new ArraySet<>( "circle","triangle","rect","rectRot","cross","crossRot","star","line","dash" );
102        private static final Set<String> SET_POSITION   = new ArraySet<>( "left", "right" );
103        private static final Set<String> SET_SCALE              = new ArraySet<>( "linear", "category", "realtime" );
104        private static final Set<String> SET_BOOLEAN    = new ArraySet<>( "true", "false" );
105
106        private transient JsChartDataV3 jsData  = new JsChartDataV3();
107
108        private String  yAxisID                         ;       // 7.0.1.1 (2018/10/22) y軸のid(自動採番 'y'+連番)
109
110        private boolean fill                            ;       // 7.0.1.1 (2018/10/22) lineチャートの下部塗りつぶし(初期値:falseが、chartJS の初期値と異なるので、後付する)
111        private String  borderColor                     ;       // borderColor は、colorNo と競合するので、最後に判定します。
112        private String  backgroundColor         ;       // backgroundColor が未設定の場合は、borderColor を使用します。
113
114        private static final String D_TENSION   = "0.4";        // 7.0.1.1 (2018/10/22) 初期値
115
116        /**
117         * デフォルトコンストラクター
118         *
119         * @og.rev 6.9.7.0 (2018/05/14) PMD Each class should declare at least one constructor
120         */
121        public JsChartDataV3Tag() { super(); }          // これも、自動的に呼ばれるが、空のメソッドを作成すると警告されるので、明示的にしておきます。
122
123        /**
124         * Taglibの終了タグが見つかった時に処理する doEndTag() を オーバーライドします。
125         *
126         * @og.rev 6.7.6.0 (2017/03/17) タグの使用を決める共通属性の追加
127         * @og.rev 6.7.7.0 (2017/03/31) backgroundColor が未設定の場合は、borderColor を使用します。
128         * @og.rev 6.8.5.0 (2018/01/09) pointStyle , pointRadius , showLine 属性の追加。
129         * @og.rev 7.0.1.1 (2018/10/22) rightAxis 属性の追加。
130         *
131         * @return 後続処理の指示
132         */
133        @Override
134        public int doEndTag() {
135                debugPrint();
136                if( !useTag() ) { return EVAL_PAGE ; }                  // 6.7.6.0 (2017/03/17)
137
138                final JsChartV3Tag jsChartTag = (JsChartV3Tag) findAncestorWithClass( this, JsChartV3Tag.class );
139
140                if( jsChartTag == null ) {
141                        final String errMsg = "jsChart タグが見つかりませんでした。";
142                        throw new HybsSystemException( errMsg );
143                }
144
145                final int size = jsChartTag.getJsChartDataSize();               // 登録順で、現時点で持っている個数
146                if( yAxisID == null ) { yAxisID = "y" + size ; }                // 指定しない場合は、y軸のid(自動採番 'y'+連番)
147
148                if( size == 0 ) { jsData.setUseAxis( true ); }                  // 要方法検討。false でもY軸が表示されるが不完全
149                jsData.setId( yAxisID );
150
151                // borderColor と、backgroundColor の設定
152                setBorderOrBackColor( jsChartTag.isOneColor() ? size : -1 );            // 7.0.1.3 (2018/11/12) 変数の集約
153
154                // fill は、未設定時に、false をあえて設定する必要がある。
155                jsData.addDataset( "fill" , String.valueOf( fill ) , NO_QUOTE );        // 数値(boolean)
156
157                jsChartTag.addJsChartData( jsData );
158
159                return EVAL_PAGE;
160        }
161
162        /**
163         * タグリブオブジェクトをリリースします。
164         * キャッシュされて再利用されるので、フィールドの初期設定を行います。
165         *
166         * @og.rev 6.7.7.0 (2017/03/31) jsDataのローカル変数化。
167         * @og.rev 6.8.5.0 (2018/01/09) pointStyle , pointRadius , showLine 属性の追加。
168         * @og.rev 7.0.1.1 (2018/10/22) rightAxis 属性の追加。
169         * @og.rev 7.0.1.1 (2018/10/22) 初期値は、デフォルト(出力しない)に変更。
170         */
171        @Override
172        protected void release2() {
173                super.release2();
174                jsData                          = new JsChartDataV3();
175
176                yAxisID                         = null;         // 7.0.1.1 (2018/10/22) y軸のid(自動採番 'y'+連番)
177
178                fill                            = false;        // 7.0.1.1 (2018/10/22) lineチャートの下部塗りつぶし(初期値:falseが、chartJS の初期値と異なるので、後付する)
179                borderColor                     = null;         // borderColor は、colorNo と競合するので、最後に判定します。
180                backgroundColor         = null;         // backgroundColor が未設定の場合は、borderColor を使用します。
181        }
182
183        /**
184         * borderColorとbackgroundColor の設定
185         *
186         * borderColorとbackgroundColor は、どちらか一方が設定されている場合は、
187         * もう片方も、そちらにあわせます。
188         * どちらも設定されていない場合は、チャートの番号から、色コードを自動で割り当てます。
189         * また、キーワード PASTELとVIVID が指定された場合は、グラフごとに、色を変える配列を設定します。
190         *
191         * @og.rev 7.0.1.3 (2018/11/12) 色情報を返すメソッドを集約します。
192         *
193         * @param cnt 現在のチャートの番号(マイナスの場合は、JavaScript配列形式で返します。)
194         */
195        private void setBorderOrBackColor( final int cnt ) {
196                // 7.0.1.3 (2018/11/12) 色情報を返すメソッドを集約します。
197                if( borderColor == null ) {                                     // borderColorが未設定
198                        backgroundColor = makeColor( backgroundColor , cnt );
199                        borderColor = backgroundColor;
200                }
201                else if( backgroundColor == null ) {            // backgroundColorが未設定
202                        borderColor             = makeColor( borderColor         , cnt );
203                        backgroundColor = borderColor;
204                }
205                else {
206                        backgroundColor = makeColor( backgroundColor , cnt );
207                        borderColor             = makeColor( borderColor         , cnt );
208                }
209
210                jsData.addDataset( "borderColor"                , borderColor           , NO_QUOTE );   // 文字はすでにクオート付き、配列の場合はクオート不用
211                jsData.addDataset( "backgroundColor"    , backgroundColor       , NO_QUOTE );   // 文字はすでにクオート付き、配列の場合はクオート不用
212        }
213
214        /**
215         * パラメータチェック用メソッド。
216         *
217         * @param trg           ターゲット
218         * @param set           使用可能なキーワードのSet
219         * @param trgStr        ターゲットの名称
220         */
221        private void checkPara( final String trg, final Set<String> set, final String trgStr ) {
222                if( StringUtil.isNotNull( trg ) && !check( trg, set ) ) {                                               // 6.8.5.0 (2018/01/09)
223                        final StringBuilder errMsg = new StringBuilder( BUFFER_MIDDLE )
224                                .append( "指定の" ).append( trgStr ).append( "は指定できません。" ).append( CR )
225                                .append( trgStr ).append( "=[" ).append( trg ).append( ']' ).append( CR )
226                                .append( set );         // org.opengion.fukurou.util.ArraySet の toStringメソッド
227
228                        throw new HybsSystemException( errMsg.toString() );
229                }
230        }
231
232        /**
233         * 色情報を返します。
234         *
235         * 通常の、#XXXXXX形式の16bitRGB表記や、rgb(r,g,b)や、rgba(r,g,b,a) などが設定可能です。
236         * 色の代わりに、ColorMapの色番号や色記号を指定できます。
237         *
238         * 特殊キーワードとして、VIVIDとPASTEL やビビッド、0~11 (V0~V11) , パステル、12~23 (P0~P11)
239         * を指定できます。
240         * CSV形式の場合、cnt で指定された番号の色を使用します。-1 の場合は、JavaScriptの配列文字列で返します。
241         *
242         * キーがnull の場合は、色番号から初期設定の値を返します。
243         *
244         * @og.rev 7.0.1.3 (2018/11/12) 色情報を返すメソッドを集約します。
245         *
246         * @param colKey        色を表すキーワード(色,色番号,VIVID,PASTEL,V0~,P0~)
247         * @param cnt           CSV形式か、VIVID,PASTEL の場合、指定の番号の色を使用します。
248         * @return 色文字列
249         */
250        private String makeColor( final String colKey, final int cnt ) {
251                // cnt < 0 の場合、CSV形式なら、JavaScript配列で色を返します。
252                final StringBuilder buf = new StringBuilder( BUFFER_MIDDLE );
253                if( cnt < 0 ) {
254                        final String[] cols = ColorMap.getColorKeys( colKey );          // nullの場合は、ビビッドとパステルの全24色
255                        if( cols.length == 1 ) {                // 配列が1の場合、配列にせず、値をそのまま設定します。
256                                buf.append( '\'' ).append( cols[0] ).append( '\'' );
257                        }
258                        else {
259                                buf.append( "['" ).append( String.join( "','", cols ) ).append( "']" );
260                        }
261                }
262                else {
263                        // 色順指定されているので、1色だけ返します。
264                        final String[] cols = StringUtil.csv2Array( colKey );
265                        if( cols.length == 0 ) {                // 元のcolKeyがnullかゼロ文字列
266                                buf.append( '\'' ).append( ColorMap.getColorKey( cnt ) ).append( '\'' );                // cnt に応じた自動設定
267                        }
268                        else {
269                                final String col = cols[cnt % cols.length];                                     // オーバーする場合は、繰返しになります。
270                                buf.append( '\'' ).append( ColorMap.getColorKey( col , col ) ).append( '\'' );
271                        }
272                }
273
274                return buf.toString();
275        }
276
277        /**
278         * 【TAG】チャートのカラム名を指定します(必須)。
279         *
280         * @og.tag
281         *
282         * @param clm チャートのカラム名
283         */
284        public void setChartColumn( final String clm ) {
285                jsData.setChartColumn( nval( getRequestParameter( clm ),null ) );
286        }
287
288        /**
289         * 【TAG】凡例の値を指定します。
290         *
291         * @og.tag
292         *
293         * @param lbl 凡例
294         */
295        public void setLabel( final String lbl ) {
296                jsData.addDataset( "label" , nval( getRequestParameter( lbl ),null ) , USE_QUOTE );             // 文字
297        }
298
299        /**
300         * 【TAG】複合チャートの種類を指定します[line/bar]。
301         *
302         * 通常は、JsChartV3TagタグのchartTypeで指定しますが、複合グラフの場合は、個々のJsChartDataV3Tag でタイプを指定します。
303         * なお、複合グラフ時には、JsChartV3TagタグのchartTypeを、"bar" にしておかないと、きちんと表示しないようです。
304         *
305         * @og.tag
306         *
307         * @param type 種類 [line/bar]
308         */
309        public void setType( final String type ) {
310                final String ctype = nval( getRequestParameter( type ),null );
311
312                checkPara( ctype, SET_TYPE, "type" );
313                jsData.addDataset( "type" , ctype , USE_QUOTE );                // 文字
314        }
315
316        /**
317         * 【TAG】線下を塗りつぶすかどうか[true/false]を指定します(初期値:false)。
318         *
319         * @og.tag
320         * フィル(線より下の塗りつぶし) を設定します。
321         *
322         * @param fill 塗りつぶすかどうか [true/false]
323         */
324        public void setFill( final String fill ) {
325                // 7.0.1.1 (2018/10/22) lineチャートの下部塗りつぶし(初期値:falseが、chartJS の初期値と異なるので、後付する)
326                this.fill = nval( getRequestParameter( fill ),this.fill );
327        }
328
329        /**
330         * 【TAG】線の伸張を指定します。0で直線になります(初期値:0.4)。
331         *
332         * @og.tag
333         * 伸張 を設定します。
334         *
335         * @og.rev 7.0.1.1 (2018/10/22) 初期値は、デフォルト(出力しない)に変更。
336         *
337         * @param tension 線の伸張
338         */
339        public void setTension( final String tension ) {
340                jsData.addDataset( "tension" , nval( getRequestParameter( tension ),D_TENSION ) , NO_QUOTE );           // 数値
341        }
342
343        /**
344         * 【TAG】データの背景色を指定します。
345         *
346         * @og.tag
347         * backgroundColor = "BLUE" とすると、すべての背景色を指定できます。
348         * 配列で指定すると、データの順番に適用されます。
349         * 例:backgroundColor = "['#ffaaaa','#ffffaa','#aaffaa','#aaaaff','#aaaaff']"
350         *
351         * 特殊キーワードとして、PASTELとVIVID を指定することで、パステルカラーやビビッドカラーの色コードを指定できます。
352         *
353         * 背景色を指定しない場合、線の色(borderColor)を使用します。
354         *
355         * @og.rev 6.9.9.2 (2018/09/18) パステルカラーの色文字列のCSV形式文字列
356         *
357         * @param bgColor 背景色
358         * @see         #setBorderColor(String)
359         */
360        public void setBackgroundColor( final String bgColor ) {
361                backgroundColor = nval( getRequestParameter( bgColor ),null );
362        }
363
364        /**
365         * 【TAG】線の色を指定します。
366         *
367         * @og.tag
368         * borderColor = "BLUE" とすると、すべての線の色を指定できます。
369         * 配列で指定すると、データの順番に適用されます。
370         * 例:borderColor = "['#ffaaaa','#ffffaa','#aaffaa','#aaaaff','#aaaaff']"
371         *
372         * 色の代わりに、ColorMapの色番号を指定したい場合は、colorNo を指定します。
373         * 両方指定した場合は、borderColor が優先されます。
374         * どちらも指定しない場合は、JsChartV3Tagに登録した順番に色コードで指定されます。
375         *
376         * 特殊キーワードとして、PASTELとVIVID を指定することで、パステルカラーやビビッドカラーの
377         * 色コード配列を指定できます。
378         *
379         * @param color 線の色
380         */
381        public void setBorderColor( final String color ) {
382                // colorNo で、初期値設定されている可能性があるので、nval の初期値は、borderColor にしておく。
383                borderColor = nval( getRequestParameter( color ),borderColor );
384        }
385
386        /**
387         * 【TAG】線の幅を指定します。
388         *
389         * @og.tag
390         *
391         * @param width 線の幅
392         */
393        public void setBorderWidth( final String width ) {
394                jsData.addDataset( "borderWidth" , nval( getRequestParameter( width ),null ) , NO_QUOTE );              // 数値
395        }
396
397        /**
398         * 【TAG】点線のスタイルを配列で指定します。
399         *
400         * ダッシュ線のスタイルは、配列で指定します。
401         * borderDash="[5,2]" とすれば、線の長さが5px , 線と線の間が2px になります。
402         *
403         * @og.tag
404         *
405         * @og.rev 7.0.1.3 (2018/11/12) 点線のスタイル追加
406         *
407         * @param dash 点線のスタイル
408         */
409        public void setBorderDash( final String dash ) {
410                jsData.addDataset( "borderDash" , nval( getRequestParameter( dash ),null ) , NO_QUOTE );                // 配列
411        }
412
413        /**
414         * 【TAG】点のスタイル[circle,triangle,rect,rectRot,cross,crossRot,star,line,dash]を指定します。
415         *
416         * @og.tag
417         * jsChartTag で、usePointStyle = "true" をセットした場合に有効になります。
418         * 点のスタイルは、circle,triangle,rect,rectRot,cross,crossRot,star,line,dash が、
419         *
420         * @og.rev 6.8.5.0 (2018/01/09) 新規登録
421         *
422         * @param ptStyle 点のスタイル [circle,triangle,rect,rectRot,cross,crossRot,star,line,dash]
423         */
424        public void setPointStyle( final String ptStyle ) {
425                final String pointStyle = nval( getRequestParameter( ptStyle ),null );
426
427                checkPara( pointStyle, SET_PSTYLE, "pointStyle" );
428                jsData.addDataset( "pointStyle" , pointStyle , USE_QUOTE );             // 文字
429        }
430
431        /**
432         * 【TAG】点の大きさを指定します。
433         *
434         * @og.tag
435         * jsChartTag で、usePointStyle = "true" をセットした場合に有効になります。
436         *
437         * @og.rev 6.8.5.0 (2018/01/09) 新規登録
438         *
439         * @param ptRadius 点の大きさを指定します。
440         */
441        public void setPointRadius( final String ptRadius ) {
442                jsData.addDataset( "pointRadius" , nval( getRequestParameter( ptRadius ),null ) , NO_QUOTE );           // 数値
443        }
444
445        /**
446         * 【TAG】ラインを表示するかどうか[true/false]を指定します(初期値:null)。
447         *
448         * @og.tag
449         * jsChartTag で、usePointStyle = "true" をセットした場合に有効になります。
450         * 初期値(null)は、showLine 属性を設定しませんが、chartJS 自体の初期値が true
451         * なので、表示されます。
452         *
453         * @og.rev 6.8.5.0 (2018/01/09) 新規登録
454         *
455         * @param show ラインを表示するかどうか [true:表示する/false:表示しない]
456         */
457        public void setShowLine( final String show ) {
458                jsData.addDataset( "showLine" , nval( getRequestParameter( show ),null ) , NO_QUOTE );          // Boolean
459        }
460
461        /**
462         * 【TAG】spanGaps属性を行うかどうか[true/false]を指定します(初期値:null)。
463         *
464         * @og.tag
465         * trueの場合、データがない点またはヌルの点との間に線が描画されます。
466         * falseの場合、 NaN データ点では線が途切れます。
467         *
468         * @og.rev 7.0.1.2 (2018/11/04) 新規登録
469         *
470         * @param flag spanGaps属性を行うかどうか [true/false]
471         */
472        public void setSpanGaps( final String flag ) {
473                jsData.addDataset( "spanGaps" , nval( getRequestParameter( flag ),null ) , NO_QUOTE );          // Boolean
474        }
475
476        /**
477         * 【TAG】pointBackgroundColor属性を指定します(初期値:null)。
478         *
479         * @og.tag
480         * 点の塗りつぶしの色を指定します。属性名が長いので、短縮しています。
481         * 単独文字列の場合は、すべての点を同じ色で塗ります。配列([]で囲う)の場合は、
482         * 点の並び順に応じて、色付けを行います。
483         *
484         * 配列([]で囲う)か、var定義変数を想定していますので、前後にクオートを付けません。
485         * 単独文字列を指定する場合は、"'red'" のように、クオートを付けてください。
486         * 通常は、backgroundColorが使用されますので、単独文字で色指定は行わないと思います。
487         *
488         * ポイントの色指定に、ColorMapの色コードは使えません。
489         *
490         * @og.rev 6.8.5.0 (2018/01/09) 新規登録
491         *
492         * @param cols 点の塗りつぶしの色(単独、配列)
493         */
494        public void setPointBGColor( final String cols ) {
495                jsData.addDataset( "pointBackgroundColor" , nval( getRequestParameter( cols ),null ) , NO_QUOTE );              // 配列[]か、変数なので、クオート無しにします。
496        }
497
498        //========================================================================================
499
500        /**
501         * 【TAG】このデータのy軸を表示するかどうか[true/false]を指定します(初期値:false)。
502         *
503         * @og.tag
504         * true にセットした場合、jsChartTag で、yAxis に対して、一連の設定を行います。
505         * 初期値(false)ですが、1つのデータセットは必ず表示されるようです。
506         *
507         * @og.rev 7.0.1.1 (2018/10/22) useAxis 属性の追加。
508         *
509         * @param use 右側のy軸表示するかどうか [true:表示する/false:表示しない]
510         */
511        public void setUseAxis( final String use ) {
512                jsData.setUseAxis( nval( getRequestParameter( use ), false ) );
513        }
514
515        /**
516         * 【TAG】データチャートのIDを指定します。
517         *
518         * @og.tag
519         * 指定しない場合は、y軸のid(自動採番 'y'+連番) になります。
520         * options:scales:yAxes の 要素の属性です。
521         *
522         * @og.rev 7.0.1.1 (2018/10/22) 属性の追加。
523         *
524         * @param   id 固有の名前
525         */
526        @Override
527        public void setId( final String id ) {
528                yAxisID  = nval( getRequestParameter( id ),null );
529        }
530
531        /**
532         * 【TAG】y軸の表示位置[left,right]を指定します(初期値:null)。
533         *
534         * @og.tag
535         * 複合グラフ表示で、指定のデータのy軸を、右に表示したい場合は、right を指定します。
536         * 初期値(null)は、左に表示されます。
537         * options:scales:yAxes の 要素の属性です。
538         *
539         * @og.rev 7.0.1.1 (2018/10/22) 属性の追加。
540         *
541         * @param pos y軸の表示位置 [left,right]
542         */
543        public void setPosition( final String pos ) {
544                final String position = nval( getRequestParameter( pos ),null );
545
546                checkPara( position, SET_POSITION, "position" );
547
548                jsData.addAxis( "position" , position , USE_QUOTE );            // 文字
549        }
550
551        /**
552         * 【TAG】y軸のスケールタイプ[linear/category]を指定します(初期値:null)。
553         *
554         * @og.tag
555         * 未指定(null)の場合は、linear になります。
556         * options:scales:yAxes の 要素の属性です。
557         *
558         * @og.rev 7.0.1.1 (2018/10/22) 属性の追加。
559         *
560         * @param type y軸のスケールタイプ [linear/category]
561         */
562        public void setScaleType( final String type ) {
563                final String sType = nval( getRequestParameter( type ),null );
564
565                // プラグインなどで独自の type を指定することがあるため、警告だけにします。
566                try {
567                        checkPara( sType, SET_SCALE, "type" );
568                }
569                catch( final HybsSystemException ex ) {
570                        System.err.println( ex.getMessage() );
571                }
572
573                jsData.addAxis( "type" , sType , USE_QUOTE );           // 文字
574        }
575
576        /**
577         * 【TAG】y軸のメモリリストをCSV形式で指定します(scaleTypeがcategoryの場合に有効)。
578         *
579         * @og.tag
580         * ※ 通常のCSVで指定します。
581         *
582         * @og.rev 7.0.1.1 (2018/10/22) 属性の追加。
583         *
584         * @param categoryList y軸のメモリリスト
585         */
586        public void setCategoryList( final String categoryList ) {
587                final String lbls = nval( getRequestParameter( categoryList ),null );
588
589                if( lbls != null ) {
590                        // 「,」を「','」に変換して設定。(,前後の半角スペースは除去する)
591                        final String regex = " *, *";
592                        final Pattern pttn = Pattern.compile( regex );
593                        final Matcher mtch = pttn.matcher( lbls );
594
595                        // y軸カテゴリーリストの設定
596                        final String labels = "['" + mtch.replaceAll( "','" ) + "']" ;
597
598                        jsData.addAxis( "labels" , labels , NO_QUOTE );         // 配列なので、クオート不用
599                }
600        }
601
602        /**
603         * 【TAG】scaleLabel:y軸に表示するラベル文字を指定します(初期値:null)。
604         *
605         * @og.tag
606         * 横軸に表示する文字を指定します。
607         * options:scales:yAxes:scaleLabel の 要素の属性です。
608         * scaleLabel: { display: true, labelString: 'ラベル文字', } がセットされます。
609         *
610         * @og.rev 7.0.1.1 (2018/10/22) 属性の追加。
611         *
612         * @param label y軸に表示するラベル文字
613         */
614        public void setYlabel( final String label ) {
615                final String lbl = nval( getRequestParameter( label ),null );
616                if( lbl != null ) {
617                        final String scLbl = "{display: true,labelString:'" + lbl + "'}" ;
618                        jsData.addAxis( "scaleLabel" , scLbl , NO_QUOTE );              // カンマが不要なのは判っている
619                }
620        }
621
622        /**
623         * 【TAG】y軸を0から書き始まるかどうか[true/false]を指定します(初期値:null)。
624         *
625         * @og.tag
626         * ticks と同時には使用できません。
627         * 初期値(null)は、0から書き始めます。
628         * options:scales:yAxes:ticks の 要素の属性です。
629         *
630         * @og.rev 7.0.1.1 (2018/10/22) 属性の追加。
631         *
632         * @param atZero y軸を0から書き始まるかどうか [true/false]
633         */
634        public void setBeginAtZero( final String atZero ) {
635                final String beginAtZero =  nval( getRequestParameter( atZero ),null );
636
637                checkPara( beginAtZero, SET_BOOLEAN, "beginAtZero" );
638                jsData.addTicks( "beginAtZero" , beginAtZero , NO_QUOTE );              // 数値(boolean)
639        }
640
641        /**
642         * 【TAG】y軸のフォントの色を指定(初期値:null)。
643         *
644         * @og.tag
645         * ticks と同時には使用できません。
646         * options:scales:yAxes:ticks の 要素の属性です。
647         *
648         * ColorMapの色コード(色,色番号,VIVID,PASTEL,V0~,P0~)が使えます。
649         *
650         * @og.rev 7.0.1.1 (2018/10/22) 属性の追加。
651         * @og.rev 7.0.1.3 (2018/11/12) 色情報を返すメソッドを集約します。
652         *
653         * @param fontColor y軸のフォントの色
654         */
655        public void setFontColor( final String fontColor ) {
656                final String col = nval( getRequestParameter( fontColor ),null );
657                if( col != null ) {
658                        jsData.addTicks( "fontColor" , ColorMap.getColorKey( col , col ) , USE_QUOTE );         // 文字
659                }
660        }
661
662        /**
663         * 【TAG】y軸コールバックを指定します。
664         *
665         * @og.tag
666         * y軸のメモリ編集用スケールバックを設定します。
667         * options:scales:yAxes:ticks の 要素の属性です。
668         *
669         * @og.rev 7.0.1.1 (2018/10/22) 属性の追加。
670         *
671         * @param callback y軸コールバック
672         */
673        public void setScaleCallback( final String callback ) {
674                jsData.addTicks( "callback" , nval( getRequestParameter( callback ),null ) , NO_QUOTE );                // ファンクションは、クオートしない
675        }
676
677        /**
678         * 【TAG】y軸の最大値を指定します(scaleTypeがlinearの場合に有効)。
679         *
680         * @og.tag
681         * options:scales:yAxes:ticks の 要素の属性です。
682         *
683         * @og.rev 7.0.1.1 (2018/10/22) 属性の追加。
684         *
685         * @param max メモリの最大値
686         */
687        public void setMax( final String max ) {
688                jsData.addTicks( "max" , nval( getRequestParameter( max ),null ) , NO_QUOTE );          // 数値
689        }
690
691        /**
692         * 【TAG】y軸の最小値を指定します(scaleTypeがlinearの場合に有効)。
693         *
694         * @og.tag
695         * options:scales:yAxes:ticks の 要素の属性です。
696         *
697         * @og.rev 7.0.1.1 (2018/10/22) 属性の追加。
698         *
699         * @param min メモリの最小値
700         */
701        public void setMin( final String min ) {
702                jsData.addTicks( "min" , nval( getRequestParameter( min ),null ) , NO_QUOTE );          // 数値
703        }
704
705        /**
706         * 【TAG】y軸のメモリ幅を指定します(scaleTypeがlinearの場合に有効)。
707         *
708         * @og.tag
709         * options:scales:yAxes:ticks の 要素の属性です。
710         *
711         * @og.rev 7.0.1.1 (2018/10/22) 属性の追加。
712         *
713         * @param stepSize y軸のメモリ幅
714         */
715        public void setStepSize( final String stepSize ) {
716                jsData.addTicks( "stepSize" , nval( getRequestParameter( stepSize ),null ) , NO_QUOTE );                // 数値
717        }
718
719        /**
720         * 【TAG】y軸のticks属性を指定(初期値:null)。
721         *
722         * @og.tag
723         * ticks に登録する内容をそのまま書き込みます。
724         * tics = "{ beginAtZero:true,fontColor:'blue'  }" という感じに、{} なども含めて書きます。
725         * この設定と、beginAtZero、fontColor を同時に設定した場合の動作は、不定です。
726         * options:scales:yAxes:ticks の 要素の属性です。
727         *
728         * @og.rev 7.0.1.1 (2018/10/22) 属性の追加。
729         *
730         * @param ticks y軸のticks属性
731         */
732        public void setTicks( final String ticks ) {
733                jsData.addAxis( "ticks" , nval( getRequestParameter( ticks ),null ) , USE_QUOTE );              // 文字
734        }
735
736        /**
737         * 【TAG】gridLinesのcolor属性( gridLines:{ color:'red', } を生成)(初期値:null)。
738         *
739         * @og.tag
740         * gridLines と同時には使用できません。
741         * options:scales:yAxes:gridLines の 要素の属性です。
742         *
743         * ColorMapの色コード(色,色番号,VIVID,PASTEL,V0~,P0~)が使えます。
744         *
745         * @og.rev 7.0.1.1 (2018/10/22) 属性の追加。
746         * @og.rev 7.0.1.3 (2018/11/12) 色情報を返すメソッドを集約します。
747         *
748         * @param gridColor y軸のフォントの色
749         */
750        public void setGridColor( final String gridColor ) {
751                final String col = nval( getRequestParameter( gridColor ),null );
752                if( col != null ) {
753                        final String grid = "{color:'" + ColorMap.getColorKey( col , col ) + "'}" ;
754                        jsData.addAxis( "gridLines" , grid , NO_QUOTE );                // カンマが不要なのは判っている
755                }
756        }
757
758        /**
759         * 【TAG】gridLines属性(gridColorを同時に設定した場合は、不定です)(初期値:null)。
760         *
761         * @og.tag
762         * gridLines に登録する内容をそのまま書き込みます。
763         * gridLines = "{ color:'rgba(256,0,0,0.2)' }" という感じに、{} なども含めて書きます。
764         * この設定と、gridColor を同時に設定した場合の動作は、不定です。
765         * options:scales:yAxes:gridLines の 要素の属性です。
766         *
767         * @og.rev 7.0.1.1 (2018/10/22) 属性の追加。
768         *
769         * @param gridLines y軸のgridLines属性
770         */
771        public void setGridLines( final String gridLines ) {
772                jsData.addAxis( "gridLines" , nval( getRequestParameter( gridLines ),null ) , USE_QUOTE );              // 文字
773        }
774
775        //========================================================================================
776
777        /**
778         * 【TAG】その他data:datasetのオプションを指定します。
779         *
780         * @og.tag
781         *
782         * @og.rev 7.0.1.2 (2018/11/04) 属性の追加。
783         *
784         * @param attri その他data:datasetのオプション
785         */
786        public void setOptDataset( final String attri ) {
787                jsData.addOptions( JsChartDataV3.DATASET , nval( getRequestParameter( attri ),null ) );
788        }
789
790        /**
791         * 【TAG】その他options:scales:yAxesのオプションを指定します。
792         *
793         * @og.tag
794         * options:scales:yAxes の 要素の属性です。
795         *  ※ chartJS上は、Axes(axisの複数形)と、Axis を使い分けていますが、属性は、axis で統一します。
796         *
797         * @og.rev 7.0.1.2 (2018/11/04) 属性の追加。
798         *
799         * @param attri その他options:scales:yAxesのオプション
800         */
801        public void setOptAxis( final String attri ) {
802                jsData.addOptions( JsChartDataV3.AXIS , nval( getRequestParameter( attri ),null ) );
803        }
804
805        /**
806         * 【TAG】その他options:scales:yAxes:ticksのオプションを指定します。
807         *
808         * @og.tag
809         * options:scales:yAxes:ticks の 要素の属性です。
810         *
811         * @og.rev 7.0.1.2 (2018/11/04) 属性の追加。
812         *
813         * @param attri その他options:scales:yAxes:ticksのオプション
814         */
815        public void setOptTicks( final String attri ) {
816                jsData.addOptions( JsChartDataV3.TICKS , nval( getRequestParameter( attri ),null ) );
817        }
818
819        /**
820         * 【TAG】その他options:scales:yAxes:scaleLabelのオプションを指定します。
821         *
822         * @og.tag
823         * options:scales:yAxes:scaleLabel の 要素の属性です。
824         *
825         * @og.rev 7.0.1.2 (2018/11/04) 属性の追加。
826         *
827         * @param attri その他options:scales:yAxes:scaleLabelのオプション
828         */
829        public void setOptScaleLabel( final String attri ) {
830                jsData.addOptions( JsChartDataV3.SCALE_LABEL , nval( getRequestParameter( attri ),null ) );
831        }
832
833        /**
834         * 【TAG】その他options:scales:yAxes:gridLinesのオプションを指定します。
835         *
836         * @og.tag
837         * options:scales:yAxes:gridLines の 要素の属性です。
838         *
839         * @og.rev 7.0.1.2 (2018/11/04) 属性の追加。
840         *
841         * @param attri その他options:scales:yAxes:gridLinesのオプション
842         */
843        public void setOptGridLines( final String attri ) {
844                jsData.addOptions( JsChartDataV3.GRID_LINES , nval( getRequestParameter( attri ),null ) );
845        }
846
847        /**
848         * このオブジェクトの文字列表現を返します。
849         * 基本的にデバッグ目的に使用します。
850         *
851         * @return このクラスの文字列表現
852         */
853        @Override
854        public String toString() {
855                return ToString.title( this.getClass().getName() )
856                        .println( "VERSIION"                    , VERSION       )
857                        .println( "JsChartDataV3"               , jsData        )
858                        .fixForm().toString();
859        }
860}