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