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 * @param clm チャートのカラム名 326 */ 327 public void setChartColumn( final String clm ) { 328 jsData.setChartColumn( nval( getRequestParameter( clm ),null ) ); 329 } 330 331 /** 332 * 【TAG】このデータのy軸を表示するかどうか[true/false]を指定します(初期値:false)。 333 * 334 * @og.tag 335 * true にセットした場合、jsChartTag で、yAxis に対して、一連の設定を行います。 336 * 初期値(false)ですが、1つのデータセットは必ず表示されるようです。 337 * 338 * @og.rev 7.0.1.1 (2018/10/22) useAxis 属性の追加。 339 * 340 * @param use 右側のy軸表示するかどうか [true:表示する/false:表示しない] 341 */ 342 public void setUseAxis( final String use ) { 343 jsData.setUseAxis( nval( getRequestParameter( use ), false ) ); 344 } 345 346 /** 347 * 【TAG】データチャートのIDを指定します。 348 * 349 * @og.tag 350 * 指定しない場合は、y軸のid(自動採番 'y'+連番) になります。 351 * options:scales:y の 要素の属性です。 352 * 353 * @og.rev 7.0.1.1 (2018/10/22) 属性の追加。 354 * 355 * @param id 固有の名前 356 */ 357 @Override 358 public void setId( final String id ) { 359 yAxisID = nval( getRequestParameter( id ),null ); 360 } 361 362 //=================== data:datasets[idx]: の 要素。y[idx]Ds 変数の最上位にセットします 363 364 /** 365 * 【TAG】凡例の値を指定します。 366 * 367 * @og.tag 368 * data:datasets[idx]: の 要素 369 * 370 * @param lbl 凡例 371 */ 372 public void setLabel( final String lbl ) { 373 jsData.addDataset( "label" , nval( getRequestParameter( lbl ),null ) , USE_QUOTE ); // 文字 374 } 375 376 /** 377 * 【TAG】複合チャートの種類を指定します[line/bar]。 378 * 379 * @og.tag 380 * data:datasets[idx]: の 要素 381 * 382 * 通常は、JsChartV3TagタグのchartTypeで指定しますが、複合グラフの場合は、個々のJsChartDataV3Tag でタイプを指定します。 383 * なお、複合グラフ時には、JsChartV3TagタグのchartTypeを、"bar" にしておかないと、きちんと表示しないようです。 384 * 385 * @param type 種類 [line/bar] 386 */ 387 public void setType( final String type ) { 388 final String ctype = nval( getRequestParameter( type ),null ); 389 390 checkPara( ctype, SET_TYPE, "type" ); 391 jsData.addDataset( "type" , ctype , USE_QUOTE ); // 文字 392 } 393 394 /** 395 * 【TAG】線下を塗りつぶすかどうか[true/false]を指定します(fill[初期値:false])。 396 * 397 * @og.tag 398 * data:datasets[idx]: の 要素 399 * フィル(線より下の塗りつぶし) を設定します。 400 * 401 * @og.rev 8.0.0.0 (2021/08/31) chartJS V3 の初期値と同じになったので、直接登録します。 402 * 403 * @param flag 塗りつぶすかどうか [true/false] 404 */ 405 public void setFill( final String flag ) { 406 // 8.0.0.0 (2021/08/31) lineチャートの下部塗りつぶし(初期値:falseが、chartJS V3 の初期値と同じになったので、後付する必要がなくなった。) 407 final String fill = nval( getRequestParameter( flag ),null ); 408 checkPara( fill, SET_BOOLEAN, "fill" ); 409 jsData.addDataset( "fill" , fill , NO_QUOTE ); // 数値(boolean) 410 } 411 412 /** 413 * 【TAG】線の伸張を指定します。0で直線になります(初期値:0.4 → 0.0)。 414 * 415 * @og.tag 416 * data:datasets[idx]: の 要素 417 * 伸張 を設定します。 418 * 419 * 8.0.0.0 (2021/08/31) 420 * 以前のバージョンでは初期値は、0.4 でしたが、Ver3 では、0.0 になりました。 421 * 互換性は考慮しませんので、必要な場合は、各自で設定してください。 422 * 423 * @og.rev 7.0.1.1 (2018/10/22) 初期値は、デフォルト(出力しない)に変更。 424 * @og.rev 8.0.0.0 (2021/08/31) 初期値変更(0.4 → 0.0) 425 * 426 * @param tension 線の伸張 427 */ 428 public void setTension( final String tension ) { 429 jsData.addDataset( "tension" , nval( getRequestParameter( tension ),D_TENSION ) , NO_QUOTE ); // 数値 430 } 431 432 /** 433 * 【TAG】データを表示OFFの状態にするかどうか[true/false]を指定します(hidden[初期値:false])。 434 * 435 * @og.tag 436 * data:datasets[idx]: の 要素 437 * グラフ表示後に凡例をクリックすると表示がOFFします。これを初期状態に設定します。 438 * 初回表示時に、グラフを非表示にしてあるので、必要都度表示することが可能になります。 439 * 440 * @param hide データを表示OFFかどうか [true/false] 441 */ 442 public void setHidden( final String hide ) { 443 final String hidden = nval( getRequestParameter( hide ),null ); 444 445 checkPara( hidden, SET_BOOLEAN, "hidden" ); 446 jsData.addDataset( "hidden" , hidden , NO_QUOTE ); // 数値(boolean) 447 } 448 449 /** 450 * 【TAG】データの背景色を指定します(backgroundColor[初期値:自動])。 451 * 452 * @og.tag 453 * data:datasets[idx]: の 要素 454 * 色,色番号,VIVID,PASTEL,V0~,P0~ で指定します。 455 * backgroundColor = "BLUE" とすると、すべての背景色を指定できます。 456 * 配列で指定すると、データの順番に適用されます。 457 * 例:backgroundColor = "['#ffaaaa','#ffffaa','#aaffaa','#aaaaff','#aaaaff']" 458 * 459 * 特殊キーワードとして、PASTELとVIVID を指定することで、パステルカラーやビビッドカラーの色コードを指定できます。 460 * 461 * ※ 引数の先頭が $ の場合は、先に、JsChartV3Tag#varColumns などで、配列のオブジェクトを 462 * 作成している場合に、そのまま使用するように指示します。なお $ は外して設定します。 463 * 464 * 背景色を指定しない場合、線の色(borderColor)を使用します。 465 * 466 * @og.rev 6.9.9.2 (2018/09/18) パステルカラーの色文字列のCSV形式文字列 467 * 468 * @param bgColor 背景色 469 * @see #setBorderColor(String) 470 */ 471 public void setBackgroundColor( final String bgColor ) { 472 backgroundColor = nval( getRequestParameter( bgColor ),null ); 473 } 474 475 /** 476 * 【TAG】線の色を指定します(borderColor[初期値:自動])。 477 * 478 * @og.tag 479 * data:datasets[idx]: の 要素 480 * 色,色番号,VIVID,PASTEL,V0~,P0~ で指定します。 481 * borderColor = "BLUE" とすると、すべての線の色を指定できます。 482 * 配列で指定すると、データの順番に適用されます。 483 * 例:borderColor = "['#ffaaaa','#ffffaa','#aaffaa','#aaaaff','#aaaaff']" 484 * 485 * 色の代わりに、ColorMapの色番号を指定したい場合は、colorNo を指定します。 486 * 両方指定した場合は、borderColor が優先されます。 487 * どちらも指定しない場合は、JsChartV3Tagに登録した順番に色コードで指定されます。 488 * 489 * ※ 引数の先頭が $ の場合は、先に、JsChartV3Tag#varColumns などで、配列のオブジェクトを 490 * 作成している場合に、そのまま使用するように指示します。なお $ は外して設定します。 491 * 492 * 特殊キーワードとして、PASTELとVIVID を指定することで、パステルカラーやビビッドカラーの 493 * 色コード配列を指定できます。 494 * 495 * @param color 線の色 496 */ 497 public void setBorderColor( final String color ) { 498 // colorNo で、初期値設定されている可能性があるので、nval の初期値は、borderColor にしておく。 499 borderColor = nval( getRequestParameter( color ),borderColor ); 500 } 501 502 /** 503 * 【TAG】線の幅を指定します(borderWidth[初期値:null(=3)])。 504 * 505 * @og.tag 506 * data:datasets[idx]: の 要素 507 * 508 * @param width 線の幅 509 */ 510 public void setBorderWidth( final String width ) { 511 jsData.addDataset( "borderWidth" , nval( getRequestParameter( width ),null ) , NO_QUOTE ); // 数値 512 } 513 514 /** 515 * 【TAG】点線のスタイルを配列で指定します(borderDash[初期値:null(=[])])。 516 * 517 * @og.tag 518 * data:datasets[idx]: の 要素 519 * 520 * ダッシュ線のスタイルは、配列で指定します。 521 * borderDash="[5,2]" とすれば、線の長さが5px , 線と線の間が2px になります。 522 * 523 * @og.rev 7.0.1.3 (2018/11/12) 点線のスタイル追加 524 * 525 * @param dash 点線のスタイル 526 */ 527 public void setBorderDash( final String dash ) { 528 jsData.addDataset( "borderDash" , nval( getRequestParameter( dash ),null ) , NO_QUOTE ); // 配列 529 } 530 531 /** 532 * 【TAG】点のスタイル[circle,triangle,rect,…]を指定します(pointStyle[初期値:null(=[])])。 533 * 534 * @og.tag 535 * data:datasets[idx]: の 要素 536 * jsChartTag で、usePointStyle = "true" をセットした場合に有効になります。 537 * 点のスタイルは、circle,triangle,rect,rectRot,cross,crossRot,star,line,dash,rectRounded 538 * 539 * @og.rev 6.8.5.0 (2018/01/09) 新規登録 540 * 541 * @param ptStyle 点のスタイル [circle,triangle,rect,rectRot,cross,crossRot,star,line,dash,rectRounded] 542 */ 543 public void setPointStyle( final String ptStyle ) { 544 final String pointStyle = nval( getRequestParameter( ptStyle ),null ); 545 546 checkPara( pointStyle, SET_PSTYLE, "pointStyle" ); 547 jsData.addDataset( "pointStyle" , pointStyle , USE_QUOTE ); // 文字 548 } 549 550 /** 551 * 【TAG】点の大きさを指定します(pointRadius[初期値:null(=3)])。 552 * 553 * @og.tag 554 * data:datasets[idx]: の 要素 555 * jsChartTag で、usePointStyle = "true" をセットした場合に有効になります。 556 * 557 * @og.rev 6.8.5.0 (2018/01/09) 新規登録 558 * 559 * @param ptRadius 点の大きさを指定します。 560 */ 561 public void setPointRadius( final String ptRadius ) { 562 jsData.addDataset( "pointRadius" , nval( getRequestParameter( ptRadius ),null ) , NO_QUOTE ); // 数値 563 } 564 565 /** 566 * 【TAG】ラインを表示するかどうか[true/false]を指定します(showLine[初期値:null(=true)])。 567 * 568 * @og.tag 569 * data:datasets[idx]: の 要素 570 * jsChartTag で、usePointStyle = "true" をセットした場合に有効になります。 571 * 初期値(null)は、showLine 属性を設定しませんが、chartJS 自体の初期値が true 572 * なので、表示されます。 573 * 574 * @og.rev 6.8.5.0 (2018/01/09) 新規登録 575 * 576 * @param show ラインを表示するかどうか [true:表示する/false:表示しない] 577 */ 578 public void setShowLine( final String show ) { 579 jsData.addDataset( "showLine" , nval( getRequestParameter( show ),null ) , NO_QUOTE ); // Boolean 580 } 581 582 /** 583 * 【TAG】データがないポイント間の処理方法を指定します[true/false]を指定します(spanGaps[初期値:null])。 584 * 585 * @og.tag 586 * data:datasets[idx]: の 要素 587 * trueの場合、データがないかnullのポイント間に線が引かれます。 588 * falseの場合、データがnullのポイントは、行に切れ目を作成します。 589 * 590 * @og.rev 7.0.1.2 (2018/11/04) 新規登録 591 * 592 * @param flag データがないポイント間の処理を行うかどうか [true/false] 593 */ 594 public void setSpanGaps( final String flag ) { 595 jsData.addDataset( "spanGaps" , nval( getRequestParameter( flag ),null ) , NO_QUOTE ); // Boolean 596 } 597 598 /** 599 * 【TAG】ポイントの色を指定します(pointBackgroundColor[初期値:自動])。 600 * 601 * @og.tag 602 * data:datasets[idx]: の 要素 603 * 色,色番号,VIVID,PASTEL,V0~,P0~ で指定します。 604 * 点の塗りつぶしの色を指定します。属性名が長いので、短縮しています。 605 * 単独文字列の場合は、すべての点を同じ色で塗ります。配列([]で囲う)の場合は、 606 * 点の並び順に応じて、色付けを行います。 607 * 608 * 配列([]で囲う)か、const定義変数を想定していますので、前後にクオートを付けません。 609 * 単独文字列を指定する場合は、"'red'" のように、クオートを付けてください。 610 * 通常は、backgroundColorが使用されますので、単独文字で色指定は行う必要はありません。 611 * 612 * ポイントの色指定に、ColorMapの色コードは使えません。 613 * 614 * @og.rev 6.8.5.0 (2018/01/09) 新規登録 615 * 616 * @param cols 点の塗りつぶしの色(単独、配列) 617 */ 618 public void setPointBGColor( final String cols ) { 619 // 配列[]か、変数なので、クオート無しにします。 620 jsData.addDataset( "pointBackgroundColor" , nval( getRequestParameter( cols ),null ) , NO_QUOTE ); 621 } 622 623 //=================== options:scales:y: の 要素を指定する場合に、設定します 624 625 /** 626 * 【TAG】y軸の表示位置[left,right]を指定します(position[初期値:null(=left)])。 627 * 628 * @og.tag 629 * options:scales:y: の 要素 630 * 複合グラフ表示で、指定のデータのy軸を、右に表示したい場合は、right を指定します。 631 * 初期値(null)は、左に表示されます。 632 * 633 * @og.rev 7.0.1.1 (2018/10/22) 属性の追加。 634 * 635 * @param pos y軸の表示位置 [left,right] 636 */ 637 public void setPosition( final String pos ) { 638 final String position = nval( getRequestParameter( pos ),null ); 639 640 checkPara( position, SET_POSITION, "position" ); 641 jsData.addAxis( "position" , position , USE_QUOTE ); // 文字 642 } 643 644 /** 645 * 【TAG】y軸のスケールタイプ[linear/category/time/…]を指定します(type[初期値:linear])。 646 * 647 * @og.tag 648 * options:scales:y: の 要素 649 * 未指定(null)の場合は、linear になります。 650 * スケールタイプ[linear/logarithmic/category/time/timeseries/realtime]を指定します。 651 * 652 * realtime は、chartjs-plugin-streaming を使用時の縦スクロール時のみ適用可能です。 653 * 654 * @og.rev 7.0.1.1 (2018/10/22) 属性の追加。 655 * 656 * @param type y軸のスケールタイプ [linear/logarithmic/category/time/timeseries/realtime] 657 */ 658 public void setScaleType( final String type ) { 659 final String sType = nval( getRequestParameter( type ),null ); 660 661 // プラグインなどで独自の type を指定することがあるため、警告だけにします。 662 try { 663 checkPara( sType, SET_SCALE, "type" ); 664 } 665 catch( final HybsSystemException ex ) { 666 System.err.println( ex.getMessage() ); 667 } 668 669 jsData.addAxis( "type" , sType , USE_QUOTE ); // 文字 670 } 671 672 /** 673 * 【TAG】y軸のメモリリストをCSV形式で指定します(scaleTypeがcategoryの場合に有効)。 674 * 675 * @og.tag 676 * ※ 通常のCSVで指定します。 677 * options:scales:y: の 要素の属性です。 678 * 679 * @og.rev 7.0.1.1 (2018/10/22) 属性の追加。 680 * 681 * @param categoryList y軸のメモリリスト 682 */ 683 public void setCategoryList( final String categoryList ) { 684 final String lbls = nval( getRequestParameter( categoryList ),null ); 685 686 if( lbls != null ) { 687 // 「,」を「','」に変換して設定。(,前後の半角スペースは除去する) 688 final String regex = " *, *"; 689 final Pattern pttn = Pattern.compile( regex ); 690 final Matcher mtch = pttn.matcher( lbls ); 691 692 // y軸カテゴリーリストの設定 693 final String labels = "['" + mtch.replaceAll( "','" ) + "']" ; 694 695 jsData.addAxis( "labels" , labels , NO_QUOTE ); // 配列なので、クオート不用 696 } 697 } 698 699 /** 700 * 【TAG】y軸に表示するラベル文字(title:text)を指定します(初期値:null)。 701 * 702 * @og.tag 703 * 横軸に表示する文字を指定します。 704 * options:scales:yAxes:scaleLabel:labelString → options:scales:y:title:text の 要素の属性です。 705 * title:{display:true,text:'ラベル文字',} がセットされます。 706 * 707 * @og.rev 7.0.1.1 (2018/10/22) 属性の追加。 708 * 709 * @param label y軸に表示するラベル文字 710 */ 711 public void setYlabel( final String label ) { 712 final String lbl = nval( getRequestParameter( label ),null ); 713 if( lbl != null ) { 714 final String scLbl = "display: true,text:'" + lbl + "'" ; 715 jsData.addAxis( JsChartDataV3.TITLE , scLbl ); 716 } 717 } 718 719 /** 720 * 【TAG】y軸を0から書き始まるかどうか[true/false]を指定します(beginAtZero[初期値:null(=false)])。 721 * 722 * @og.tag 723 * <del>ticks と同時には使用できません。</del> 724 * <del>初期値(null)は、0から書き始めます。</del> 725 * 初期値(null)は、false と同じで、最小データから書き始めます。 726 * options:scales:yAxes:ticks:beginAtZero → options:scales:y:beginAtZero の 要素の属性です。 727 * 728 * @og.rev 7.0.1.1 (2018/10/22) 属性の追加。 729 * 730 * @param atZero y軸を0から書き始まるかどうか [true/false] 731 */ 732 public void setBeginAtZero( final String atZero ) { 733 final String beginAtZero = nval( getRequestParameter( atZero ),null ); 734 735 checkPara( beginAtZero, SET_BOOLEAN, "beginAtZero" ); 736 jsData.addAxis( "beginAtZero" , beginAtZero , NO_QUOTE ); // 数値(boolean) 737 } 738 739 /** 740 * 【TAG】y軸の最大、最小値から指定分スケールを大きくとる(grace[初期値:null])。 741 * 742 * @og.tag 743 * 最大値または最小値から指定した数値分、スケールを大きくとる。 744 * '20%' のように最大値(最小値)に対する割合で示すことも可。 745 * ここでは、割合を文字列で指定するのみとします。 746 * 747 * options:scales:y:grace の 要素の属性です。 748 * 749 * @og.rev 8.0.0.0 (2021/08/31) 新規追加 750 * 751 * @param size y軸を指定分スケールを大きくとる[初期値:null] 752 */ 753 public void setGrace( final String size ) { 754 final String grace = nval( getRequestParameter( size ),null ); 755 756 jsData.addAxis( "grace" , grace , USE_QUOTE ); // 文字 757 } 758 759 /** 760 * 【TAG】y軸の最大値を指定します(scaleTypeがlinearの場合に有効)。 761 * 762 * @og.tag 763 * options:scales:yAxes:ticks:max → options:scales:y:max の 要素の属性です。 764 * 765 * @og.rev 7.0.1.1 (2018/10/22) 属性の追加。 766 * 767 * @param max メモリの最大値 768 */ 769 public void setMax( final String max ) { 770 jsData.addAxis( "max" , nval( getRequestParameter( max ),null ) , NO_QUOTE ); // 数値 771 } 772 773 /** 774 * 【TAG】y軸の最小値を指定します(scaleTypeがlinearの場合に有効)。 775 * 776 * @og.tag 777 * options:scales:yAxes:ticks:max → options:scales:y:max の 要素の属性です。 778 * 779 * @og.rev 7.0.1.1 (2018/10/22) 属性の追加。 780 * 781 * @param min メモリの最小値 782 */ 783 public void setMin( final String min ) { 784 jsData.addAxis( "min" , nval( getRequestParameter( min ),null ) , NO_QUOTE ); // 数値 785 } 786 787 /** 788 * 【TAG】y軸のフォントの色を指定(ticks:color[初期値:自動])。 789 * 790 * @og.tag 791 * ticks と同時には使用できません。 792 * options:scales:yAxes:ticks:fontColor → options:scales:y:ticks:color の 要素の属性です。 793 * 794 * ColorMapの色コード(色,色番号,VIVID,PASTEL,V0~,P0~)が使えます。 795 * 796 * @og.rev 7.0.1.1 (2018/10/22) 属性の追加。 797 * @og.rev 7.0.1.3 (2018/11/12) 色情報を返すメソッドを集約します。 798 * 799 * @param fontColor y軸のフォントの色 800 */ 801 public void setFontColor( final String fontColor ) { 802 final String col = nval( getRequestParameter( fontColor ),null ); 803 if( col != null ) { 804 jsData.addTicks( "color" , ColorMap.getColorKey( col , col ) , USE_QUOTE ); // 文字 805 } 806 } 807 808 /** 809 * 【TAG】y軸コールバックを指定します(ticks:callback)。 810 * 811 * @og.tag 812 * options:scales:y:ticks:callback: の 要素 813 * y軸のメモリ編集用スケールバックを設定します。 814 * callback="function(val,index){return val.toLocaleString() + '円';}" 815 * のように登録します。 816 * @og.rev 7.0.1.1 (2018/10/22) 属性の追加。 817 * 818 * @param callback y軸コールバック 819 */ 820 public void setScaleCallback( final String callback ) { 821 jsData.addTicks( "callback" , nval( getRequestParameter( callback ),null ) , NO_QUOTE ); // ファンクションは、クオートしない 822 } 823 824 /** 825 * 【TAG】y軸のメモリ幅を指定します(scaleTypeがlinearの場合に有効)(ticks:stepSize)。 826 * 827 * @og.tag 828 * options:scales:y:ticks:stepSize の 要素の属性です。 829 * 830 * @og.rev 7.0.1.1 (2018/10/22) 属性の追加。 831 * 832 * @param stepSize y軸のメモリ幅 833 */ 834 public void setStepSize( final String stepSize ) { 835 jsData.addTicks( "stepSize" , nval( getRequestParameter( stepSize ),null ) , NO_QUOTE ); // 数値 836 } 837 838 /** 839 * 【TAG】gridのcolor属性( grid:{color:'red',} を生成)を設定します(初期値:null)。 840 * 841 * @og.tag 842 * options:scales:yAxes:gridLines:color → options:scales:y:grid:color の 要素の属性です。 843 * この設定と、gridLinesパラメータ を同時に設定した場合の動作は、不定です。 844 * ※ 不定というのは、Tomcat上の属性の設定順で規定されるため、どちらの要素が使用されるのか、実装依存です。 845 * 846 * ColorMapの色コード(色,色番号,VIVID,PASTEL,V0~,P0~)が使えます。 847 * 848 * @og.rev 7.0.1.1 (2018/10/22) 属性の追加。 849 * @og.rev 7.0.1.3 (2018/11/12) 色情報を返すメソッドを集約します。 850 * 851 * @param gridColor y軸のフォントの色 852 */ 853 public void setGridColor( final String gridColor ) { 854 final String col = nval( getRequestParameter( gridColor ),null ); 855 if( col != null ) { 856 final String color = "color:'" + ColorMap.getColorKey( col , col ) + "'" ; 857 jsData.addAxis( JsChartDataV3.GRID , color ); 858 } 859 } 860 861 //======================================================================================== 862 863 /** 864 * 【TAG】その他data:datasetのオプションを追加します。 865 * 866 * @og.tag 867 * その他data:datasetのオプションを追加します。 868 * 869 * @og.rev 7.0.1.2 (2018/11/04) 属性の追加。 870 * 871 * @param attri その他data:datasetのオプション 872 */ 873 public void setOptDataset( final String attri ) { 874 jsData.addAxis( JsChartDataV3.DATASET , nval( getRequestParameter( attri ),null ) ); 875 } 876 877 /** 878 * 【TAG】その他options:scales:yのオプションを追加します。 879 * 880 * @og.tag 881 * options:scales:y の 要素の属性です。 882 * <del>※ chartJS上は、Axes(axisの複数形)と、Axis を使い分けていますが、属性は、axis で統一します。</del> 883 * 884 * @og.rev 7.0.1.2 (2018/11/04) 属性の追加。 885 * 886 * @param attri その他options:scales:yのオプション 887 */ 888 public void setOptAxis( final String attri ) { 889 jsData.addAxis( JsChartDataV3.AXIS , nval( getRequestParameter( attri ),null ) ); 890 } 891 892 /** 893 * 【TAG】その他options:scales:y:ticksのオプションを追加します。 894 * 895 * @og.tag 896 * options:scales:y:ticks の 要素の属性です。 897 * 898 * @og.rev 7.0.1.2 (2018/11/04) 属性の追加。 899 * 900 * @param attri その他options:scales:y:ticksのオプション 901 */ 902 public void setOptTicks( final String attri ) { 903 jsData.addAxis( JsChartDataV3.TICKS , nval( getRequestParameter( attri ),null ) ); 904 } 905 906 /** 907 * 【TAG】その他options:scales:y:titleのオプションを追加します。 908 * 909 * @og.tag 910 * options:scales:yAxes:scaleLabel → options:scales:y:title の 要素の属性です。 911 * 912 * @og.rev 7.0.1.2 (2018/11/04) 属性の追加。 913 * 914 * @param attri その他options:scales:y:titleのオプション 915 */ 916 public void setOptTitle( final String attri ) { 917 jsData.addAxis( JsChartDataV3.TITLE , nval( getRequestParameter( attri ),null ) ); 918 } 919 920 /** 921 * 【TAG】その他options:scales:y:gridのオプションを追加します。 922 * 923 * @og.tag 924 * options:scales:yAxes:gridLines → options:scales:y:grid の 要素の属性です。 925 * 926 * @og.rev 7.0.1.2 (2018/11/04) 属性の追加。 927 * 928 * @param attri その他options:scales:y:gridのオプション 929 */ 930 public void setOptGrid( final String attri ) { 931 jsData.addAxis( JsChartDataV3.GRID , nval( getRequestParameter( attri ),null ) ); 932 } 933 934 /** 935 * このオブジェクトの文字列表現を返します。 936 * 基本的にデバッグ目的に使用します。 937 * 938 * @return このクラスの文字列表現 939 */ 940 @Override 941 public String toString() { 942 return ToString.title( this.getClass().getName() ) 943 .println( "VERSIION" , VERSION ) 944 .println( "JsChartDataV3" , jsData ) 945 .fixForm().toString(); 946 } 947}