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.ArrayList; 019import java.util.List; 020import java.util.Set; // 6.4.3.4 (2016/03/11) 021import java.util.Iterator; // 6.7.7.0 (2017/03/31) 022import java.util.function.IntFunction; // 7.0.1.3 (2018/11/12) 023 024import org.opengion.fukurou.system.BuildNumber; // 7.0.1.2 (2018/11/04) 025import org.opengion.hayabusa.common.HybsSystem; 026import org.opengion.hayabusa.common.HybsSystemException; 027import org.opengion.hayabusa.db.DBTableModelSorter; 028import org.opengion.hayabusa.db.DBTableModel; 029import org.opengion.hayabusa.db.DBColumn; // 6.8.3.1 (2017/12/01) 030import org.opengion.hayabusa.io.JsChartData; // 7.0.1.1 (2018/10/22) 031 032import org.opengion.fukurou.util.ArraySet; // 6.4.3.4 (2016/03/11) 033import org.opengion.fukurou.util.ToString; 034import org.opengion.fukurou.util.StringUtil; // 6.8.3.1 (2017/12/01) 035import org.opengion.fukurou.util.ColorMap; // 7.0.1.3 (2018/11/12) 036import static org.opengion.fukurou.util.StringUtil.nval ; 037 038/** 039 * JsChart は、JavascriptのjsChart用のスクリプトを出力するクラスです。 040 * 複数の JsChartData オブジェクトを合成することも、ここで行っています。 041 * ChartJSを利用しているため、標準属性以外の項目をセットする場合はoptionAttributesで行ってください。 042 * 例えばアニメーションをOFFにする場合はanimation:falseをセットします。 043 * 044 * 出力されるスクリプトでは、idを指定しない場合はhybscanvas[tableId]が利用されます。 045 * 複数のグラフを同一画面で出力する場合はidかtableIdを変えてください。 046 * チャートオブジェクトはchart_[id]という名前で作成されるため、ajax等でコントロールが必要な場合は利用してください。 047 * 048 * @og.formSample 049 * ●形式:<og:jsChart chartType="…" ... /> 050 * ●body:あり(EVAL_BODY_BUFFERED:BODYを評価し、{$#064;XXXX} を解析します) 051 * 052 * ●Tag定義: 053 * <og:jsChart 054 * chartType ○【TAG】チャートの種類(type属性)を指定します[line/bar/horizontalBar/radar/polarArea/pie/doughnut/bubble/scatter](必須)。 055 * labelColumn ○【TAG】ラベルのカラム名(data:labels属性)を指定します(表示名称)(必須)。 056 * id 【TAG】canvasタグのidを指定します(初期値:hybscanvas)。 057 * height 【TAG】チャート(canvasタグ)の高さを指定します(初期値:400)。 058 * width 【TAG】チャート(canvasタグ)の幅を指定します(初期値:400)。 059 * title 【TAG】タイトルを指定します(options:title:text)。 060 * titlePosition 【TAG】タイトルの表示位置[top/right/bottom/left]を指定します(options:title:position)。 061 * legendDisplay 【TAG】凡例を表示するか[true/false]を指定します(options:legend:display)。 062 * legendPosition 【TAG】凡例の表示位置[top/right/bottom/left]を指定します(options:legend:position)。 063 * usePointStyle 【TAG】凡例のスタイル属性を使用するかどうか[true/false]を指定します(options:legend:labels:usePointStyle)。 // 6.8.5.0 (2018/01/09) 064 * barWidthPer 【TAG】棒線の横幅を指定します(初期値:0.8, typeがbar,horizontalBarの場合に有効)(options:xAxes:categoryPercentage)。 065 * onClick 【TAG】チャートクリック時のイベントを指定します(options:onClick)。 066 * plugins 【TAG】プラグイン定義された関数を指定します(plugins)。 // 6.9.9.2 (2018/09/18) 067 * =================== 068 * xposition 【TAG】x軸の表示位置[top/right/bottom/left]を指定します(初期値:bottom)(options:scales:xAxes:position)。 // 7.0.1.2 (2018/11/04) 069 * xscaleType 【TAG】x軸のスケールタイプ[category/linear/time/realtime]を指定します(初期値:category)(options:scales:xAxes:type)。 070 * xlabel 【TAG】x軸のラベルを指定します(options:scales:xAxes:scaleLabel:labelString)。 071 * xscaleCallback 【TAG】x軸コールバックを指定します(options:scales:xAxes:ticks:callback)。 072 * xbeginAtZero 【TAG】x軸を0から書き始まるかどうか(xscaleTypeがlinearの場合に有効)(options:scales:xAxes:ticks:beginAtZero) // 7.0.1.1 (2018/10/22) 初期値 null 073 * xmax 【TAG】x軸の最大値を指定します(xscaleTypeがlinearの場合に有効)(options:scales:xAxes:ticks:max)。 074 * xmin 【TAG】x軸の最小値を指定します(xscaleTypeがlinearの場合に有効)(options:scales:xAxes:ticks:min)。 075 * xstepSize 【TAG】x軸のメモリ幅を指定します(xscaleTypeがlinearの場合に有効)(options:scales:xAxes:ticks:stepSize)。 076 * optChart 【TAG】chartの属性に、TLDで未定義の属性を追加指定します。 // 7.0.1.2 (2018/11/04) 077 * optOptions 【TAG】optionsの属性に、その他オプションを追加指定します。 // 7.0.1.2 (2018/11/04) 078 * optAxis 【TAG】その他options:scales:xAxesのオプションを指定します。 // 7.0.1.2 (2018/11/04) 079 * optTicks 【TAG】その他options:scales:xAxes:ticksのオプションを指定します。 // 7.0.1.2 (2018/11/04) 080 * optScaleLabel 【TAG】その他options:scales:xAxes:scaleLabelのオプションを指定します。 // 7.0.1.2 (2018/11/04) 081 * optGridLines 【TAG】その他options:scales:xAxes:gridLinesのオプションを指定します。 // 7.0.1.2 (2018/11/04) 082 * =================== options:scales:xAxes:time 以下の属性(xscaleTypeがtimeの場合に有効) 083 * timeUnit 【TAG】x軸のタイムの単位[year/quarter/month/week/day/hour/minute/second]を指定(time:unit)します(指定しない場合は自動)。 084 * timeMax 【TAG】x軸のタイムの最大値を指定します(time:max)。 085 * timeMin 【TAG】x軸のタイムの最小値を指定します(time:min)。 086 * timeUnitStepSize 【TAG】x軸のタイムの単位幅を指定します(time:unitStepSize)。 087 * timeSetFormat 【TAG】x軸の設定するタイム(入力データ)のフォーマットを指定します(time:format)。 088 * timeLblFormat 【TAG】x軸の表示するタイムのフォーマットを指定します(time:displayFormats:year~secondまで同じ値を設定します)。 089 * tooltipFormat 【TAG】時間のツールチップに使用するフォーマット(time:tooltipFormat) // 7.0.1.0 (2018/10/15) 090 * =================== 091 * markValues 【TAG】y軸に横マーカーラインの設定値をCSV形式で複数指定します // 6.8.5.0 (2018/01/09) 092 * markColors 【TAG】y軸に横マーカーラインの色をCSV形式で複数指定します // 6.8.5.0 (2018/01/09) 093 * markLbls 【TAG】y軸に横マーカーラインのラベルをCSV形式で複数指定します(未指定時はラベルを表示しません) // 6.8.5.0 (2018/01/09) 094 * markAdjust 【TAG】y軸に横マーカーラインのラベル表示位置の上下方向を調整します(+でラインの下側、-で上側に位置を移動します。初期値:-6)。 // 6.8.5.0 (2018/01/09) 095 * xmarkValues 【TAG】x軸に縦マーカーラインの設定値をCSV形式で複数指定します // 7.0.1.1 (2018/10/22) 096 * xmarkColors 【TAG】x軸に縦マーカーラインの色をCSV形式で複数指定します // 7.0.1.1 (2018/10/22) 097 * markWidth 【TAG】x軸,y軸全マーカーライン共通のラインの幅を指定します:borderWidth(初期値:2) // 7.0.1.1 (2018/10/22) 098 * markDash 【TAG】x軸,y軸全マーカーライン共通のラインに点線を指定([5,2]など)します:borderDash(初期値:null) // 7.0.1.1 (2018/10/22) 099 * markFontSize 【TAG】x軸,y軸全マーカーライン共通のラベルのフォントサイズを指定します:fontSize(初期値:10) // 7.0.1.1 (2018/10/22) 100 * =================== 101 * useZeroDataOmit 【TAG】データが0の場合、使用しない(除外する)かどうかを指定します[true:0データを除外する](初期値:false) 102 * useRenderer 【TAG】データ出力でレンデラを利用するかどうか[true/false]を指定します(初期値:false) 103 * sortColumn 【TAG】検索結果をこのカラムでソートしなおします(初期値:null)。 104 * valueQuot 【TAG】値の前後にクオートをはさむかどうか[true/false]指定します。 105 * useZoom 【TAG】ズーム処理を使用するかどうか[true/false]を指定します。 // 6.8.5.0 (2018/01/09) 106 * varColumns 【TAG】TableModelの指定のカラムをvarの配列変数として出力します。 // 7.0.1.2 (2018/11/04) 107 * =================== 108 * X widthEventColumn 【廃止】横幅を動機に設定するカラムのIDを指定します。 109 * X heightEventColumn 【廃止】縦幅を動的に設定するカラムのIDを指定します。 110 * X minEventColumn 【廃止】minを動的に設定するカラムのIDを指定します。 111 * X maxEventColumn 【廃止】maxを動的に設定するカラムのIDを指定します。 112 * =================== 113 * X optionAttributes 【廃止】optionsの属性に、その他オプションを追加指定します。(7.0.1.2 (2018/11/04) 廃止) 114 * tableId 【TAG】(通常は使いません)sessionから所得する DBTableModelオブジェクトの ID 115 * scope 【TAG】キャッシュする場合のスコープ[request/page/session/application]を指定します(初期値:session) 116 * caseKey 【TAG】このタグ自体を利用するかどうかの条件キーを指定します(初期値:null) 117 * caseVal 【TAG】このタグ自体を利用するかどうかの条件値を指定します(初期値:null) 118 * caseNN 【TAG】指定の値が、null/ゼロ文字列 でない場合(Not Null=NN)は、このタグは使用されます(初期値:判定しない) 119 * caseNull 【TAG】指定の値が、null/ゼロ文字列 の場合は、このタグは使用されます(初期値:判定しない) 120 * caseIf 【TAG】指定の値が、true/TRUE文字列の場合は、このタグは使用されます(初期値:判定しない) 121 * debug 【TAG】デバッグ情報を出力するかどうか[true/false]を指定します(初期値:false) 122 * > ... Body ... 123 * </og:jsChart> 124 * 125 * ●使用例 126 * <og:jsChart 127 * chartType = "[line/bar/horizontalBar/radar/polarArea/pie/doughnut/bubble/scatter]" 128 * labelColumn = "LDATA" 129 * id = "hybscanvas" 130 * height = "400" 131 * width = "400" 132 * title = "タイトル" 133 * titlePosition = "top" [top/right/bottom/left] 134 * xlabel = "名称" 135 * legendPosition = "right" [top/right/bottom/left] 136 * legendDisplay = "true" [true/false] 137 * xsclaeCallback = "function(value){return value + ' 様';}" 138 * xscaleType = "linear" 139 * xmax = "1000000" 140 * xmin = "100000" 141 * xstepSize = "10000" 142 * barWidthPer = "0.4" 143 * > 144 * <og:jsChartData ... /> 145 * </og:jsChart> 146 * 147 * @og.group 画面表示 148 * 149 * @version 5.9.17.2 2017/02/08 150 * @author T.OTA 151 * @since JDK7.0 152 * 153 */ 154public class JsChartTag extends CommonTagSupport { 155 //* このプログラムのVERSION文字列を設定します。{@value} */ 156 private static final String VERSION = "8.0.0.0 (2021/08/31)" ; 157 private static final long serialVersionUID = 800020210831L ; 158 159// 8.0.0.0 (2021/08/31) chartJs V3 以降は、timeもrealtimeも表示するようになった…らしい 160// // xscaleType="realtime" のときのみ、インクルードします。 161// private static final String STREAMING_JS = "common/option/chartjs-plugin-streaming.min.js"; // 7.0.1.2 (2018/11/04) 162// private static final String SCRIPT_STREAMING_JS 163// = "<script type=\"text/javascript\" src=\"" 164// + "/" + HybsSystem.getContextName() + "/jsp/" 165// + STREAMING_JS 166// + "?v=" + BuildNumber.BUILD_ID 167// + "\" ><!-- --></script>" 168// + CR ; 169 170 /** chartType 引数に渡す事の出来る タイプ 折れ線 {@value} */ 171 public static final String CTYPE_LINE = "line"; 172 /** chartType 引数に渡す事の出来る タイプ 棒線 {@value} */ 173 public static final String CTYPE_BAR = "bar"; 174 /** chartType 引数に渡す事の出来る タイプ 横棒線 {@value} */ 175 public static final String CTYPE_HBAR = "horizontalBar"; 176 /** chartType 引数に渡す事の出来る タイプ レイダー {@value} */ 177 public static final String CTYPE_RADAR = "radar"; 178 /** chartType 引数に渡す事の出来る タイプ ポーラエリア {@value} */ 179 public static final String CTYPE_POLAR = "polarArea"; 180 /** chartType 引数に渡す事の出来る タイプ 円 {@value} */ 181 public static final String CTYPE_PIE = "pie"; 182 /** chartType 引数に渡す事の出来る タイプ ドーナツ {@value} */ 183 public static final String CTYPE_DOUGHNUT = "doughnut"; 184 /** chartType 引数に渡す事の出来る タイプ バブル {@value} 8.0.0.0 (2021/08/20) 追加 */ 185 public static final String CTYPE_BUBBLE = "bubble"; 186 /** chartType 引数に渡す事の出来る タイプ 散乱図 {@value} 8.0.0.0 (2021/08/20) 追加 */ 187 public static final String CTYPE_SCATTER = "scatter"; 188 189 /** chartType 引数に渡す事の出来る タイプ リスト {@value} */ 190// private static final Set<String> CTYPE_SET = new ArraySet<>( CTYPE_LINE,CTYPE_BAR,CTYPE_HBAR,CTYPE_RADAR,CTYPE_POLAR,CTYPE_PIE,CTYPE_DOUGHNUT ); 191 private static final Set<String> CTYPE_SET 192 = new ArraySet<>( CTYPE_LINE,CTYPE_BAR,CTYPE_HBAR,CTYPE_RADAR,CTYPE_POLAR, 193 CTYPE_PIE,CTYPE_DOUGHNUT,CTYPE_BUBBLE,CTYPE_SCATTER ); 194 195 // 6.9.9.4 (2018/10/01) String配列から、Set に変更 196 /** chartType が円形のリスト */ 197 private static final Set<String> SET_CI_TYPE = new ArraySet<>( CTYPE_RADAR, CTYPE_POLAR, CTYPE_PIE, CTYPE_DOUGHNUT ); 198 199 private static final String TYPE_CATEGORY = "category"; 200 private static final String TYPE_LINEAR = "linear"; 201 private static final String TYPE_TIME = "time"; 202 private static final String TYPE_REALTIME = "realtime"; // 7.0.1.2 (2018/11/04) 203 204 private static final Set<String> SET_POSITION = new ArraySet<>( "top", "right", "bottom", "left" ); 205 private static final Set<String> SET_TIMEUNIT = new ArraySet<>( "year", "quarter", "month", "week", "day", "hour", "minute", "second" ); // 7.0.0.1 (2018/10/09) 206 private static final Set<String> SET_XSCALE = new ArraySet<>( TYPE_CATEGORY, TYPE_TIME, TYPE_LINEAR, TYPE_REALTIME ); 207 private static final Set<String> SET_BOOLEAN = new ArraySet<>( "true", "false" ); 208 209 private static final String CANVAS_NAME = "hybscanvas"; 210 211// private static final String MARK_DEF_COLOR = "BLUE"; // 6.8.5.0 (2018/01/09) y軸に横マーカーラインの色の初期値 212 private static final String MARK_DEF_ADJUST = "-6"; // 6.8.5.0 (2018/01/09) y軸に横マーカーラインの位置調整の初期値 213 214 // 7.0.1.3 (2018/11/12) バッファキー検索処理追加 215 private static final String TIME_FORMAT_JA = "{year:'YYYY年',quarter:'YYYY年M月',month:'YYYY年M月',week:'M月D日',day:'M月D日',hour:'D日 H時',minute:'H時m分',second:'m分s秒'}" ; 216 private static final String TIME_FORMAT = "{year:'YYYY',quarter:'YYYY/M',month:'YYYY/M',week:'M/D',day:'M/D',hour:'D HH',minute:'HH:mm',second:'HH:mm:ss'}" ; 217 218 // 7.0.1.3 (2018/11/12) true/false なので、記号化します。 219 private static final boolean USE_QUOTE = false; 220 private static final boolean NO_QUOTE = true; // IS_NUMBER か、!USE_QUOTE か、 221 222 // 変数宣言 223 // 6.9.8.0 (2018/05/28) FindBugs:直列化可能クラスの非 transient で非直列化可能なインスタンスフィールド 224 private final transient List<JsChartData> jsChartData = new ArrayList<JsChartData>() ; // 6.7.5.0 (2017/03/10) jsChartDataのリスト 225 226 private transient JsChartData jsXAxis = new JsChartData(); // xAxes の設定用(datasetは使いません) 227 228 private String chartBody ; // チャートタグのBODY部分に書かれた文字列 229 230 private String chartType ; // チャートタイプ(必須) 231 private String labelColumn ; // ラベルカラム(必須) 232 private String id ; // canvasタグのid 233 private String height = "400"; // canvasタグのheight 234 private String width = "400"; // canvasタグのwidth 235 private String title ; // タイトル 236 private String titlePosition ; // タイトル位置 237 private String legendPosition ; // 凡例位置 238 private String legendDisplay ; // 凡例表示フラグ 239 private boolean usePointStyle ; // 6.8.5.0 (2018/01/09) 点のスタイル属性を使用するかどうか(初期値:false) 240 private boolean useLegend ; // Legend関連属性(legendPosition,legendDisplay,usePointStyle) のどれかがセットされれば、true 241 private String barWidthPer = "0.8"; // 棒線の横幅(パーセント) 242 private String onClick ; // クリックイベント 243 private String plugins ; // 6.9.9.2 (2018/09/18) プラグイン定義された関数を指定します。 244 private String xscaleType = TYPE_CATEGORY ; // x軸のスケールタイプ 245 private String xposition ; // x軸の表示位置[top/right/bottom/left] // 7.0.1.2 (2018/11/04) 246 private boolean valueQuot ; // 値の前後にクオートをはさむかどうか[true/false]指定します。 247 private String tableId = HybsSystem.TBL_MDL_KEY; // テーブルid 248 private String markValues ; // 6.8.5.0 (2018/01/09) y軸に横マーカーラインの設定値をCSV形式で複数指定します 249 private String markColors ; // 6.8.5.0 (2018/01/09) y軸に横マーカーラインの色をCSV形式で複数指定します 250 private String markLbls ; // 6.8.5.0 (2018/01/09) y軸に横マーカーラインのラベルをCSV形式で複数指定します(未指定時はラベルを表示しません) 251 private String markAdjust ; // 6.8.5.0 (2018/01/09) y軸に横マーカーラインのラベル表示位置の上下方向を調整します(初期値:-6)。 252 private String xmarkValues ; // 7.0.1.1 (2018/10/22) x軸に縦マーカーラインの設定値をCSV形式で複数指定します 253 private String xmarkColors ; // 7.0.1.1 (2018/10/22) x軸に縦マーカーラインの色をCSV形式で複数指定します 254 private String markWidth = "2"; // 7.0.1.1 (2018/10/22) マーカーライン共通のラインの幅を指定します:borderWidth(初期値:2) 255 private String markDash ; // 7.0.1.1 (2018/10/22) マーカーライン共通のラインに点線を指定([5,2]など)します:borderDash(初期値:null) 256 private String markFontSize = "10"; // 7.0.1.1 (2018/10/22) マーカーライン共通のラベルのフォントサイズを指定します:fontSize(初期値:10) 257 private boolean useZoom ; // 6.8.5.0 (2018/01/09) ズーム処理を使用するかどうか(初期値:false) 258 private String varColumns ; // 7.0.1.2 (2018/11/04) TableModelの指定のカラムをvarの配列変数として出力します。 259// private String widthEventColumn ; // (廃止)横幅の動的参照カラム 2017/03/28 ADD 260// private String heightEventColumn ; // (廃止)縦幅の動的参照カラム 2017/03/28 ADD 261// private String minEventColumn ; // (廃止)最小値の動的参照カラム 2017/03/28 ADD 262// private String maxEventColumn ; // (廃止)最大値の動的参照カラム 2017/03/28 ADD 263 private boolean useZeroDataOmit ; // 6.7.7.0 (2017/03/31) データが0の場合、使用しない(除外する)かどうか 264 private boolean useRenderer ; // 6.7.9.0 (2017/04/28) useRenderer 追加 265 private String sortColumn ; // 6.8.0.0 (2017/06/02) 検索結果をこのカラムでソートしなおします(初期値:null)。 266// private String optionAttributes ; // オプション 267// private String chartAttributes ; // 6.9.9.2 (2018/09/18) chartの属性に、TLDで未定義の属性を追加指定します。 268 private String optChart ; // 7.0.1.2 (2018/11/04) chartの属性に、TLDで未定義の属性を追加指定します。 269 private String optOptions ; // 7.0.1.2 (2018/11/04) optionsの属性に、その他オプションを追加指定します。 270 271 /** 272 * デフォルトコンストラクター 273 * 274 * @og.rev 6.9.7.0 (2018/05/14) PMD Each class should declare at least one constructor 275 */ 276 public JsChartTag() { super(); } // これも、自動的に呼ばれるが、空のメソッドを作成すると警告されるので、明示的にしておきます。 277 278 /** 279 * タグリブオブジェクトをリリースします。 280 * キャッシュされて再利用されるので、フィールドの初期設定を行います。 281 * 282 * @og.rev 6.7.5.0 (2017/03/10) jsChartData属性の初期化もれ 283 * @og.rev 5.9.19.0 (2017/04/07) T.OTA 61200-170316-02 チャートサイズ・max・minの動的変更対応 284 * @og.rev 6.7.7.0 (2017/03/31) useZeroDataOmit属性の追加 285 * @og.rev 6.7.9.0 (2017/04/28) useRenderer 追加 286 * @og.rev 6.8.0.0 (2017/06/02) sortColumn 追加 287 * @og.rev 6.8.3.0 (2017/11/27) useEqValOmit属性の追加 288 * @og.rev 6.8.5.0 (2018/01/09) xbeginAtZero,ybeginAtZero,markValues,markColors,markLbls,markAdjust,rangeMin,rangeMax,usePointStyle属性の追加 289 * @og.rev 6.9.9.2 (2018/09/18) plugins,chartAttributes属性の追加 290 * @og.rev 6.9.9.3 (2018/09/25) xscaleType の time 属性廃止。 291 * @og.rev 6.9.9.4 (2018/10/01) リニア対応,time 属性復活 292 * @og.rev 6.9.9.4 (2018/10/01) 7.0.1.0 (2018/10/15) time 属性修正、tooltipFormat属性の追加 293 * @og.rev 7.0.1.1 (2018/10/22) xmarkValues,xmarkColors属性の追加 294 * @og.rev 7.0.1.1 (2018/10/22) ylabelColor,y2label,y2labelColor属性の追加 295 * @og.rev 7.0.1.2 (2018/11/04) ylabelColor,y2label,y2labelColor属性の追加 296 */ 297 @Override 298 protected void release2() { 299 super.release2(); 300 jsChartData.clear(); // 6.7.5.0 (2017/03/10) 301 jsXAxis = new JsChartData(); // xAxes の設定用(datasetは使いません) 302 303 chartBody = null; // 7.0.1.1 (2018/10/22) チャートタグのBODY部分に書かれた文字列 304 chartType = null; 305 id = null; 306 height = "400"; 307 width = "400"; 308 labelColumn = null; 309 title = null; 310 titlePosition = null; 311 legendPosition = null; 312 legendDisplay = null; 313 usePointStyle = false; // 6.8.5.0 (2018/01/09) 点のスタイル属性を使用するかどうか 314 useLegend = false; // 7.0.1.1 (2018/10/22) Legend関連属性(legendPosition,legendDisplay,usePointStyle) のどれかがセットされれば、true 315 barWidthPer = "0.8"; 316 onClick = null; 317 plugins = null; // 6.9.9.2 (2018/09/18) プラグイン定義された関数を指定します。 318 xscaleType = TYPE_CATEGORY; 319 xposition = null; // 7.0.1.2 (2018/11/04) x軸の表示位置[top/right/bottom/left] 320 valueQuot = false; // 7.0.1.1 (2018/10/22) 値の前後にクオートをはさむかどうか[true/false]指定します。 321 tableId = HybsSystem.TBL_MDL_KEY; 322 markValues = null; // 6.8.5.0 (2018/01/09) y軸に横マーカーラインの設定値をCSV形式で複数指定します 323 markColors = null; // 6.8.5.0 (2018/01/09) y軸に横マーカーラインの色をCSV形式で複数指定します 324 markLbls = null; // 6.8.5.0 (2018/01/09) y軸に横マーカーラインのラベルをCSV形式で複数指定します(未指定時はラベルを表示しません) 325 markAdjust = null; // 6.8.5.0 (2018/01/09) y軸に横マーカーラインのラベル表示位置の上下方向を調整します(初期値:-6)。 326 xmarkValues = null; // 7.0.1.1 (2018/10/22) x軸に縦マーカーラインの設定値をCSV形式で複数指定します 327 xmarkColors = null; // 7.0.1.1 (2018/10/22) x軸に縦マーカーラインの色をCSV形式で複数指定します 328 markWidth = "2"; // 7.0.1.1 (2018/10/22) マーカーライン共通のラインの幅を指定します:borderWidth(初期値:2) 329 markDash = null; // 7.0.1.1 (2018/10/22) マーカーライン共通のラインに点線を指定([5,2]など)します:borderDash(初期値:null) 330 markFontSize = "10"; // 7.0.1.1 (2018/10/22) マーカーライン共通のラベルのフォントサイズを指定します:fontSize(初期値:10) 331 useZoom = false; // 6.8.5.0 (2018/01/09) ズーム処理を使用するかどうか(初期値:false) 332 varColumns = null; // 7.0.1.2 (2018/11/04) TableModelの指定のカラムをvarの配列変数として出力します。 333// widthEventColumn = null; // 5.9.19.0 334// heightEventColumn = null; // 5.9.19.0 335// maxEventColumn = null; // 5.9.19.0 336// minEventColumn = null; // 5.9.19.0 337 useZeroDataOmit = false; // 6.7.7.0 (2017/03/31) データが0の場合、使用しない(除外する)かどうか 338 useRenderer = false; // 6.7.9.0 (2017/04/28) useRenderer 追加 339 sortColumn = null; // 6.8.0.0 (2017/06/02) 検索結果をこのカラムでソートしなおします(初期値:null)。 340// optionAttributes = null; 341// chartAttributes = null; // 6.9.9.2 (2018/09/18) chartの属性に、TLDで未定義の属性を追加指定します。 342 optChart = null; // 7.0.1.2 (2018/11/04) chartの属性に、TLDで未定義の属性を追加指定します。 343 optOptions = null; // 7.0.1.2 (2018/11/04) optionsの属性に、その他オプションを追加指定します。 344 } 345 346 /** 347 * Taglibの開始タグが見つかった時に処理する doStartTag() を オーバーライドします。 348 * 349 * @og.rev 6.7.5.0 (2017/03/10) タグの使用を決める共通属性の追加 350 * 351 * @return 後続処理の指示 352 */ 353 @Override 354 public int doStartTag() { 355 if( !useTag() ) { return SKIP_BODY ; } // 6.7.5.0 (2017/03/10) 356 357 return EVAL_BODY_BUFFERED; // Bodyを評価する 358 } 359 360 /** 361 * Taglibのタグ本体を処理する doAfterBody() を オーバーライドします。 362 * 363 * @og.rev 7.0.1.1 (2018/10/22) このスクリプトの中に入れたい文字があれば、登録できるようにします。 364 * 365 * @return 後続処理の指示(SKIP_BODY) 366 */ 367 @Override 368 public int doAfterBody() { 369 chartBody = getBodyString(); 370 371 if( chartBody != null ) { 372 chartBody = chartBody.trim(); 373 } 374 375 return SKIP_BODY ; 376 } 377 378 /** 379 * Taglibの終了タグが見つかったときに処理する doEndTag() を オーバーライドします。 380 * 381 * @og.rev 6.7.5.0 (2017/03/10) タグの使用を決める共通属性の追加 382 * @og.rev 6.9.9.4 (2018/10/01) idの振り方、データの持ち方変更 383 * 384 * @return 後続処理の指示 385 */ 386 @Override 387 public int doEndTag() { 388 debugPrint(); 389 if( !useTag() ) { return EVAL_PAGE ; } // 6.7.5.0 (2017/03/10) 390 391 id = (id==null ? tableId : id ); // 6.9.9.4 (2018/10/01) id指定なしの場合はtableId 392 393 // jsChart出力 394 jspPrint( jsChartOutput() ); 395 396 return EVAL_PAGE; 397 } 398 399 /** 400 * jsChart出力用 401 * jsChartTag と jsChartData を使用して、jsChart情報を出力します。 402 * 403 * @og.rev 5.9.19.0 (2017/04/07) T.OTA 61200-170316-02 チャートサイズ・max・minの動的変更対応 404 * @og.rev 6.7.7.0 (2017/03/31) チャートデータで、ゼロ、null カラムを非表示にします。 405 * @og.rev 6.7.9.0 (2017/04/28) useRenderer 追加 406 * @og.rev 6.8.0.0 (2017/06/02) sortColumn 追加 407 * @og.rev 6.8.3.0 (2017/11/27) useZeroDataOmit属性で、nullOmit属性もセットします。 408 * @og.rev 6.8.3.0 (2017/11/27) useEqValOmit属性の追加 409 * @og.rev 6.8.3.1 (2017/12/01) 不要なデータを出力しないようにします。 410 * @og.rev 5.9.27.0 2017/12/01 T.OTA 61200-170831-04 max,minの小数点対応 411 * @og.rev 6.8.5.0 (2018/01/09) xbeginAtZero,ybeginAtZero,markValues,markColors,markLbls,markAdjust,rangeMin,rangeMax,usePointStyle属性の追加 412 * @og.rev 6.9.9.2 (2018/09/18) chart.jsが2.4.0から2.7.2にバージョンアップにより、廃止された属性対応 413 * @og.rev 6.9.9.2 (2018/09/18) plugins,chartAttributes属性の追加 414 * @og.rev 6.9.9.3 (2018/09/25) xscaleType の time 属性廃止。 415 * @og.rev 6.9.9.4 (2018/10/01) リニア対応,time 属性復活 416 * @og.rev 6.9.9.4 (2018/10/01) idの振り方、データの持ち方変更 417 * @og.rev 7.0.1.1 (2018/10/22) xmarkValues,xmarkColors属性の追加 418 * @og.rev 7.0.1.3 (2018/11/12) バッファキー検索処理追加、markColors,xmarkColors属性に、VIVID,PASTELカラー指定に対応します。 419 * @og.rev 8.0.0.0 (2021/08/31) BUBBLEとSCATTERの追加 420 * 421 * @return jsChert用文字列 422 */ 423 private String jsChartOutput() { 424 final StringBuilder rtn = new StringBuilder( BUFFER_MIDDLE ); 425 426 // 各JavaScriptの変数名 427// final String qd = "qd_" + id; //queryData 428 final String cd = "cd_" + id; //chartData 429 final String myChart = "chart_"+id; 430 431 // JSON形式でテーブル情報を取得 432 // テーブル情報の取得 433 // 6.8.0.0 (2017/06/02) sortColumn 追加 434 DBTableModel table = (DBTableModel)getObject( tableId ) ; 435 if( StringUtil.isNotNull( sortColumn ) ) { // 6.8.5.0 (2018/01/09) 436 final int clmNo = table.getColumnNo( sortColumn,false ); // エラーを出さない。 437 438 final DBTableModelSorter temp = new DBTableModelSorter(); 439 temp.setModel( (DBTableModel)getObject( tableId ) ); 440 temp.sortByColumn( clmNo,true ); // 順方向のソート 441 table = temp; 442 } 443 444 final int rowCount = table.getRowCount(); // 6.9.2.0 (2018/03/05) 445 446 // 7.0.1.3 (2018/11/12) DBTableModelに存在しないカラムのChartDataは無視します。 447 // これは、動的にグラフを生成する場合に、カラムの増減に合わせて、JsChartDataTagを生成しなおすのが手間だからです。 448 final Iterator<JsChartData> itr = jsChartData.iterator(); // 個々のグラフ 449 while( itr.hasNext() ) { 450 final JsChartData jcData = itr.next(); 451 final String chtClm = jcData.getChartColumn(); 452 final int clmNo = table.getColumnNo( chtClm, false ); // エラーを出さない。 453 454 if( clmNo < 0 ) { 455 itr.remove(); // 7.0.1.3 (2018/11/12) カラムがDBTableModelに存在しない。 456 } 457 else if( useZeroDataOmit ) { // ゼロデータを使用しない設定 458 // 6.8.3.1 (2017/12/01) ループ処理の判定は、ChartColumn のみでよい。 459 boolean isRemove = true; 460 for( int row=0; row<rowCount; row++ ) { 461 final String val = table.getValue( row,clmNo ); 462 if( StringUtil.isNotNull( val ) && !"0".equals( val ) && !"0.0".equals( val ) && !"0.00".equals( val ) ) { // 6.8.5.0 (2018/01/09) 463 isRemove = false; 464 break; // 判定処理打ち切り 465 } 466 } 467 468 if( isRemove ) { 469 itr.remove(); // すべてが、ゼロ、null カラムを、削除します。 470 } 471 } 472 } 473 474// // ゼロデータを使用しない設定 475// if( useZeroDataOmit ) { 476// final Iterator<JsChartData> itr = jsChartData.iterator(); // 個々のグラフ 477// while( itr.hasNext() ) { 478// final JsChartData jcData = itr.next(); 479// final String chtClm = jcData.getChartColumn(); 480// final int clmNo = table.getColumnNo( chtClm, false ); // エラーを出さない。 481// 482// // 6.8.3.1 (2017/12/01) ループ処理の判定は、ChartColumn のみでよい。 483// boolean isRemove = true; 484// if( clmNo >= 0 ) { 485// for( int row=0; row<rowCount; row++ ) { 486// final String val = table.getValue( row,clmNo ); 487// if( StringUtil.isNotNull( val ) && !"0".equals( val ) && !"0.0".equals( val ) && !"0.00".equals( val ) ) { // 6.8.5.0 (2018/01/09) 488// isRemove = false; 489// break; // 判定処理打ち切り 490// } 491// } 492// } 493// if( isRemove ) { 494// itr.remove(); // すべてが、ゼロ、null カラムを、削除します。 495// } 496// } 497// } 498 499 // 6.8.3.1 (2017/12/01) 不要なデータを出力しないようにします。 500 final int clmSize = jsChartData.size(); // JsChartTag の 値部分のみの配列 501 502 final String[] clmNms = new String[clmSize]; // 6.9.9.4 (2018/10/01) カラム名の配列 503 final int[] clmNos = new int[clmSize]; 504 final int lblNos = table.getColumnNo( labelColumn, false ); // エラーを出さない。 6.9.2.0 (2018/03/05) 505 final DBColumn dbClm = table.getDBColumn( lblNos ); // 6.9.2.0 (2018/03/05) 506 507 // jsChartDataタグの変数宣言 508 for( int j=0; j<clmSize; j++ ) { 509 final String chtClm = jsChartData.get(j).getChartColumn(); 510 clmNms[j] = chtClm; // 6.9.9.4 (2018/10/01) カラム名の配列 511 clmNos[j] = table.getColumnNo( chtClm, false ); // エラーを出さない。 512 } 513 514 // 8.0.0.0 (2021/08/31) chartJs V3 以降は、timeもrealtimeも表示するようになった…らしい 515// // 7.0.1.2 (2018/11/04) 原因調査中。chartjs-plugin-streaming.min.js を組み込むと xscaleType="time" が表示しない。 516// // 通常、HeadTag で、useChartJS=true で、一括include しているが、streaming だけ、 517// // xscaleType="realtime" 時だけ組み込むように変更します。 518// if( TYPE_REALTIME.equals( xscaleType ) ) { 519// rtn.append( SCRIPT_STREAMING_JS ); 520// } 521 522 // canvasタグの設定 523 rtn.append( "<canvas class=\"" ).append( CANVAS_NAME ) 524 .append( "\" id=\"" ).append( id ) 525 .append( "\" width=\"" ).append( width ) 526 .append( "\" height=\"" ).append( height ) 527 .append( "\"><!-- --></canvas>" ).append( CR ) 528 .append( "<script>" ).append( CR ) // 6.9.9.4 (2018/10/01) query情報の取得(JSON) 529 .append( chartBody ); // 7.0.1.1 (2018/10/22) BODY部分の文字列の組み込み 530 531 final boolean isXcateType = TYPE_CATEGORY.equals( xscaleType ); // 6.9.9.4 (2018/10/01) 532 final boolean isXlinerType = TYPE_LINEAR.equals( xscaleType ); // 6.8.5.0 (2018/01/09) xscaleType が linear かどうか。 533 final boolean isXtimeType = TYPE_TIME.equals( xscaleType ); // 6.8.5.0 (2018/01/09) xscaleType が time かどうか。 534 535 // 7.0.1.3 (2018/11/12) var 変数に設定する配列情報を、bufに追加します。 536 final DBTableModel fcTable = table; // ラムダ式で使えるのは、final宣言された変数のみ。根本は、Sorterを組み込んでfinalすべき。 537 final IntFunction<String> lcFunc = (row) -> { 538 final String lval = fcTable.getValue( row,lblNos ); 539 return useRenderer && !isXlinerType ? StringUtil.jsonFilter( dbClm.getRendererValue(row,lval) ) : lval ; 540 }; 541 setVarArray( rtn,labelColumn,rowCount,isXcateType || isXtimeType || useRenderer,lcFunc ); 542 543// // 6.9.9.4 (2018/10/01) ラベル部の出力 544// rtn.append( " var " ).append( labelColumn ).append( "=[" ); 545// for( int row=0; row<rowCount; row++ ) { 546// if( row > 0 ) { rtn.append( ',' ); } // カンマは、最初のデータ以降の最初につける。 547// 548// final String lval = table.getValue( row,lblNos ); 549// final String lblVal = useRenderer && !isXlinerType ? StringUtil.jsonFilter( dbClm.getRendererValue(row,lval) ) : lval ; 550// if( isXcateType || isXtimeType || useRenderer ) { 551// rtn.append( '"' ).append( lblVal ).append( '"' ); 552// } 553// else { 554// rtn.append( lblVal ); 555// } 556// } 557// rtn.append( "];" ).append( CR ); 558 559 // 6.9.9.4 (2018/10/01) データ部の出力 560 for( int j=0; j<clmSize; j++ ) { 561 final int clmNo = clmNos[j]; // finalしか参照できないため。 562 setVarArray( rtn,clmNms[j],rowCount,valueQuot,(row) -> fcTable.getValue( row,clmNo ) ); 563 564// rtn.append( " var " ).append( clmNms[j] ).append( "=[" ); 565// for( int row=0; row<rowCount; row++ ) { 566// if( row > 0 ) { rtn.append( ',' ); } // カンマは、最初のデータ以降の最初につける。 567// 568// final String val = table.getValue( row,clmNos[j] ); 569// 570// if( valueQuot ) { // 6.8.5.0 (2018/01/09) yscaleType が category 571// rtn.append( '"' ).append( val ).append( '"' ); 572// } 573// else { 574// rtn.append( val ); 575// } 576// } 577// rtn.append( "];" ).append( CR ); 578 } 579 580 // x軸がlinearスケールの場合 581 // [{x:値1,y:値2},{x:値1,y:値2},・・・] 形式のデータが必要 582 if( isXlinerType ) { 583 for( int j=0; j<clmSize; j++ ) { 584 final String chtClm = clmNms[j]; 585 rtn.append( "var LI_" ).append( chtClm ).append( "=[];" ).append( CR ); 586 587 // 6.9.9.4 (2018/10/01) x軸がlinearスケールの場合、カラム名が、変わるので、再設定している。(超特殊処理) 588 jsChartData.get(j).setChartColumn( "LI_" + chtClm ); 589 } 590 591 rtn.append( "for(var i=0; i<").append( labelColumn ).append( ".length; i++){" ); 592 for( int j=0; j<clmSize; j++ ) { 593 final String chtClm = clmNms[j]; 594 // {x:ラベル, y:値}の形式で値を設定 595 rtn.append( "LI_" ).append( chtClm ).append( "[i]={x:" ).append( labelColumn ) 596 .append( "[i],y:" ).append( chtClm ).append( "[i]};" ); 597 } 598 rtn.append( "};" ).append( CR ); 599 } 600 601 // 7.0.1.2 (2018/11/04) varColumns 追加 602 final String[] varClms = StringUtil.csv2Array( varColumns ); // 独自に出力しておきたいカラム列の値 603 for( int j=0; j<varClms.length; j++ ) { 604 final int varNos = table.getColumnNo( varClms[j], false ); // エラーを出さない。 605 final boolean isNumType = table.getDBColumn( varNos ).isNumberType(); // 6.4.6.0 (2016/05/27) 606 607 setVarArray( rtn,varClms[j],rowCount,!isNumType,(row) -> fcTable.getValue( row,varNos ) ); 608 609// rtn.append( " var " ).append( varClms[j] ).append( "=[" ); 610// for( int row=0; row<rowCount; row++ ) { 611// if( row > 0 ) { rtn.append( ',' ); } // カンマは、最初のデータ以降の最初につける。 612// 613// final String val = table.getValue( row,varNos ); 614// 615// // 注意:valueQuot ではなく、isNumType で判定する。 616// if( isNumType ) { 617// rtn.append( val ); 618// } 619// else { 620// rtn.append( '"' ).append( val ).append( '"' ); 621// } 622// } 623// rtn.append( "];" ).append( CR ); 624 } 625 626 // 8.0.0.0 (2021/08/31) BUBBLEとSCATTERの追加 627 // chartType が BUBBLE の場合、chtClmが x:、varColumns の最初が、y: 次が r: になる。 628 // SCATTERの場合は、r: がないだけ。 629 if( CTYPE_BUBBLE.equals( chartType ) || CTYPE_SCATTER.equals( chartType ) ) { 630 if( CTYPE_BUBBLE.equals( chartType ) && varClms.length < 2 || 631 CTYPE_SCATTER.equals( chartType ) && varClms.length < 1 ) { 632 final StringBuilder errMsg = new StringBuilder( BUFFER_MIDDLE ) 633 .append( "chartTypeが、" ).append( chartType ) 634 .append( "の場合は、varColumns で、y: データ、r:データを指定してください。" ); 635 throw new HybsSystemException( errMsg.toString() ); 636 } 637 638 final String chtClm = clmNms[0]; // chartDataの1個目決め打ち 639 rtn.append( "var LI_" ).append( chtClm ).append( "=[];" ).append( CR ); 640 641 // x軸が[{x: , y: , r: }…} のカラム名が変わるので、再設定している。(超特殊処理) 642 jsChartData.get(0).setChartColumn( "LI_" + chtClm ); 643 644 rtn.append( "for(var i=0; i<").append( chtClm ).append( ".length; i++){" ) 645 .append( "LI_" ).append( chtClm ).append( "[i]={x:" ).append( chtClm ) 646 .append( "[i],y:" ).append( varClms[0] ); 647 648 // 切れ切れで分かりにくいかもしれないが、BUBBLEのみ、r: を出す。 649 if( CTYPE_BUBBLE.equals( chartType ) ) { 650 rtn.append( "[i],r:" ).append( varClms[1] ); 651 } 652 653 rtn.append( "[i]};}" ).append( CR ); 654 } 655 656 // ================================================================================== 657 // 7.0.1.1 (2018/10/22) jsChartData(X軸)の設定 658 if( !SET_CI_TYPE.contains( chartType ) ) { 659 jsXAxis.setId( "x0" ); // X軸のid 660 jsXAxis.setUseTime( isXtimeType ); // x軸の時間表示を使用するかどうか 661 662 // 7.0.1.3 (2018/11/12) バッファキー検索処理追加 663 if( isXtimeType && !jsXAxis.contains( JsChartData.TIME , "displayFormats" ) ) { // キーワードが無ければ追加 664 // ほんとはリソースに入れるべきでしょう。 665 if( "ja".equalsIgnoreCase( getLanguage() ) ) { // 'ja' なら日本 666 jsXAxis.addTime( "displayFormats" , TIME_FORMAT_JA , NO_QUOTE ); // 標準タイムフォーマット適用。オブジェクトなので、クオートなし 667 } 668 else { 669 jsXAxis.addTime( "displayFormats" , TIME_FORMAT , NO_QUOTE ); // 標準タイムフォーマット適用。オブジェクトなので、クオートなし 670 } 671 } 672 673 // 6.9.9.4 (2018/10/01) 不要な属性は出さない。 674 if( CTYPE_BAR.equals( chartType ) || CTYPE_HBAR.equals( chartType ) ) { 675 jsXAxis.addAxis( "categoryPercentage" , barWidthPer , NO_QUOTE ); // 数値 676 } 677 678 // x軸にリニアスケールを設定した場合(これは残す) 679 final String xpos = xposition != null ? xposition 680 : isXlinerType ? "bottom" 681 : CTYPE_HBAR.equals( chartType ) ? "left" : null ; 682 jsXAxis.addAxis( "position" , xpos , USE_QUOTE ); // 文字 683 684 rtn.append( jsXAxis.getAxis() ).append( CR ); 685 } 686 687 // horizontalBar 時は、X軸とY軸を入れ替える 688 final char[] yx = CTYPE_HBAR.equals( chartType ) ? new char[] { 'x','y' } // 入替 689 : new char[] { 'y','x' } ; // 通常の並び順 690 691 // ================================================================================== 692 // jsChartData(Y軸)の設定 693 // 7.0.1.1 (2018/10/22) data:dataset と、options:scales:yAxes: を変数化して出力します。 694 for( final JsChartData chData : jsChartData ) { 695// rtn.append( chData.getDataset() ).append( CR ) 696 rtn.append( chData.getDataset( yx[0]) ).append( CR ) // 横棒線の場合は、'x'が、それ以外は、'y' 697 .append( chData.getAxis() ).append( CR ); 698 } 699 700 rtn.append( "var ").append( cd ).append( "={labels:" ).append( labelColumn ).append( ",datasets:[" ); 701 for( final JsChartData chData : jsChartData ) { 702 rtn.append( chData.getDatasetKey() ).append( ',' ); 703 } 704 rtn.append( "]};" ).append( CR ) 705 .append( "var " ).append( myChart ).append( "=new Chart(" ).append( id ) // jsChartの生成 706 .append( ",{type:'" ).append( chartType ) 707 .append( "',data:" ).append( cd ); 708 709 // 6.9.9.2 (2018/09/18) plugins,chartAttributes属性の追加 710 if( StringUtil.isNotNull( plugins ) ) { 711 rtn.append( ",plugins: [" ).append( plugins ).append( ']' ); 712 } 713// if( StringUtil.isNotNull( chartAttributes ) ) { 714// rtn.append( ',' ).append( chartAttributes ); 715// } 716 717 rtn.append( ",options:{responsive:false" ); // レスポンシブ OFF 718 719 // クリックイベントの設定 720 // clickLink 変数を使用する場合、内部でマスタデータを使用します。キーとして、渡しておく必要があります。 721 if( StringUtil.isNotNull( onClick ) ) { // 6.8.5.0 (2018/01/09) 722 rtn.append( ",onClick:function(event,obj){" ).append( onClick ).append( '}' ); // 6.9.9.4 (2018/10/01) 723 } 724 725 // タイトル属性の設定 726 if( StringUtil.isNotNull( title ) ) { // 6.8.5.0 (2018/01/09) 727 rtn.append( ",title:{display:true" ); 728 setProp( rtn, ",text:'" , title , "'" ); 729 setProp( rtn, ",position:'", titlePosition, "'" ); 730 rtn.append( '}' ); 731 } 732 733 // 凡例属性の設定 734 if( useLegend ) { // 7.0.1.1 (2018/10/22) 735 rtn.append( ",legend:{" ); 736 setProp( rtn, "display:" , legendDisplay , "," ); 737 setProp( rtn, "position:'" , legendPosition , "'," ); 738 739 // 凡例のスタイルを、pointStyle にあわせるかどうか 740 if( usePointStyle ) { // 7.0.1.1 (2018/10/22) 741 rtn.append( "labels:{usePointStyle: true}" ); 742 } 743 rtn.append( '}' ); 744 } 745 746 // 6.9.9.2 (2018/09/18) chart.jsが2.4.0から2.7.2にバージョンアップにより、廃止された属性対応 747 if( !SET_CI_TYPE.contains( chartType ) ) { 748 // 円形以外の場合はscales属性に設定 749 rtn.append( ",scales:{" ) 750 .append( yx[0] ).append( "Axes:[" ); // 横棒線の場合は、'x'が、それ以外は、'y' 751 752// if( CTYPE_HBAR.equals( chartType ) ) { 753// // 横棒線の場合はx軸の設定(axisの複数形) 754// rtn.append( "xAxes:[" ); 755// } 756// else { 757// // それ以外はy軸の設定 758// rtn.append( "yAxes:[" ); 759// } 760 761 // 7.0.1.1 (2018/10/22) options:scales:yAxes: を変数化して出力しているので、その設定のみでよい。 762 for( final JsChartData chData : jsChartData ) { 763 if( chData.isUseAxis() ) { 764 rtn.append( chData.getAxisKey() ).append( ',' ); 765 } 766 } 767 rtn.append( "]," ) 768 .append( yx[1] ).append( "Axes:[" ); // 横棒線の場合は、'y'が、それ以外は、'x' 769 770// if( CTYPE_HBAR.equals( chartType ) ) { 771// // 横棒線の場合はy軸の設定 772// rtn.append( "yAxes:[" ); 773// } 774// else { 775// // それ以外はx軸の設定(axisの複数形) 776// rtn.append( "xAxes:[" ); 777// } 778 rtn.append( jsXAxis.getAxisKey() ).append( "]}" ); // 7.0.1.1 (2018/10/22) 779 780 // 6.8.5.0 (2018/01/09) markValues,markColors,markLbls,markAdjust 属性対応 781 // 7.0.1.1 (2018/10/22) xmarkValues,xmarkColors属性の追加 782 // 7.0.1.3 (2018/11/12) 色指定に、VIVID,PASTEL を使えるようにします。 783 784 final String[] mkVals = StringUtil.csv2Array( markValues ); // y軸の値で、横のマーカー 785 final String[] xmkVals = StringUtil.csv2Array( xmarkValues ); // x軸の値で、縦のマーカー 786 final int vCnt = mkVals.length; 787 final int xCnt = xmkVals.length; 788 if( vCnt > 0 || xCnt > 0 ) { 789 rtn.append( ",annotation:{annotations:[" ); 790 791 // 従来の markValues,markColors,markLbls,markAdjust 属性対応 792 if( vCnt > 0 ) { 793// final String[] mkCols = StringUtil.csv2Array( markColors , ',' , vCnt , MARK_DEF_COLOR ); 794 final String[] mkLbls = StringUtil.csv2Array( markLbls , ',' , vCnt ); 795 final String[] mkAjst = StringUtil.csv2Array( markAdjust , ',' , vCnt , MARK_DEF_ADJUST ); 796 final String[] mkCols = colorCsv( markColors , vCnt ); // 7.0.1.3 (2018/11/12) 797 798 // 7.0.1.1 (2018/10/22) 'y-axis-0' → 'y0Ax' これは、JsChartData#getAxisKey() で取得できる値だが、決め打ち 799 for( int i=0; i<vCnt; i++ ) { 800 rtn.append( "{type:'line',scaleID:'y0Ax',mode:'horizontal'" ); 801 setProp( rtn, ",borderWidth:" , markWidth ); 802 setProp( rtn, ",borderDash:" , markDash ); 803 setProp( rtn, ",value:" , mkVals[i] ); 804 setProp( rtn, ",borderColor:'" , mkCols[i] , "'" ); 805 if( !mkLbls[i].isEmpty() ) { 806 rtn.append( ",label:{enabled:'true',position:'left',backgroundColor:'rgba(0,0,0,0)'" ); 807 setProp( rtn, ",yAdjust:" , mkAjst[i] ); 808 setProp( rtn, ",content:'" , mkLbls[i] , "'" ); 809 setProp( rtn, ",fontColor:'", mkCols[i] , "'" ); 810 setProp( rtn, ",fontSize:" , markFontSize ); 811 rtn.append( '}' ); 812 } 813 rtn.append( "}," ); 814 } 815 } 816 817 // 7.0.1.1 (2018/10/22) xmarkValues,xmarkColors属性対応 818 if( xCnt > 0 ) { 819// final String[] xmkCols = StringUtil.csv2Array( xmarkColors , ',' , xCnt , MARK_DEF_COLOR ); 820 final String[] xmkCols = colorCsv( xmarkColors , xCnt ); // 7.0.1.3 (2018/11/12) 821 822 // 7.0.1.1 (2018/10/22) 'x-axis-0' → 'x0Ax' これは、JsChartData#getAxisKey() で取得できる値だが、決め打ち 823 for( int i=0; i<xCnt; i++ ) { 824 rtn.append( "{type:'line',scaleID:'x0Ax',mode:'vertical'" ); 825 setProp( rtn, ",borderWidth:" , markWidth ); 826 setProp( rtn, ",borderDash:" , markDash ); 827 setProp( rtn, ",value:'" , xmkVals[i] , "'" ); // 横軸はラベルなので、文字列として対応 828 setProp( rtn, ",borderColor:'" , xmkCols[i] , "'" ); 829 rtn.append( "}," ); 830 } 831 } 832 rtn.append( "]}" ); 833 } 834 835 // 6.8.5.0 (2018/01/09) ズーム処理を使用するかどうか 836 if( useZoom ) { 837 rtn.append( ",pan:{enabled:true,mode:'xy'},zoom:{enabled:true,drag:false,mode:'xy'}" ); 838 } 839 } 840// setProp( rtn, ",", optionAttributes ); 841 setProp( rtn, ",", optOptions ); // 7.0.1.2 (2018/11/04) 842 rtn.append( '}' ); 843// setProp( rtn, ",", chartAttributes ); 844 setProp( rtn, ",", optChart ); // 7.0.1.2 (2018/11/04) 845 rtn.append( "});" ).append( CR ); 846 847// // イベント設定用 5.9.19.0 848// // 5.9.27.0 (2017/12/01) MODIFY イベントにkeyupを追加 849// // 7.0.1.1 (2018/10/22) 複雑すぎるとの、レイアウトが難しいのと、zoomがあるので、廃止予定にします。 850// // widthEventColumn設定 851// if( StringUtil.isNotNull( widthEventColumn ) ) { // 6.8.5.0 (2018/01/09) 852// rtn.append( "$(document).delegate('#" ).append( widthEventColumn ).append( "','mouseup keyup',function(){" ) 853// .append( "var width=$(this).val();" ) 854// .append( "$('#" ).append( id ).append( "').attr('width',width);" ) 855// .append( myChart ).append( ".chart.width=width;" ) 856// .append( myChart ).append( ".update();" ) 857// .append( "});" ).append( CR ) 858// .append( "$(function(){" ) 859// .append( "var chartWidth=$('#" ).append( id ).append("').attr('width');" ) 860// .append( "$('#" ).append( widthEventColumn ).append( "').val(chartWidth);" ) // 初期値を設定 861// .append( "});" ).append( CR ); 862// } 863// // heightEventColumn設定 864// if( StringUtil.isNotNull( heightEventColumn ) ) { // 6.8.5.0 (2018/01/09) 865// rtn.append( "$(document).delegate('#" ).append( heightEventColumn ).append( "','mouseup keyup',function(){" ) 866// .append( "var height=$(this).val();" ) 867// .append( "$('#" ).append( id ).append( "').attr('height',height);" ) 868// .append( myChart ).append( ".chart.height=height;" ) 869// .append( myChart ).append( ".update();" ) 870// .append( "});").append( CR ) 871// .append( "$(function(){") 872// .append( "var chartHeight=$('#" ).append( id ).append("').attr('height');" ) 873// .append( "$('#" ).append( heightEventColumn ).append( "').val(chartHeight);" ) // 初期値を設定 874// .append( "});" ).append( CR ); 875// } 876// // minEventColumn設定 877// if( StringUtil.isNotNull( minEventColumn ) ) { // 6.8.5.0 (2018/01/09) 878// rtn.append( "$(document).delegate('#" ).append( minEventColumn ).append( "','mouseup keyup',function(){" ) 879// // 5.9.27.0 (2017/12/01) MODIFY IntからFloat型に変更 880// .append( "var min=parseFloat($(this).val());") 881// .append( myChart ).append( ".options.scales.yAxes[0].ticks.min = min;" ) 882// .append( myChart ).append( ".update();") 883// .append( "});" ).append( CR ) 884// .append( "$(function(){" ) 885// // // 7.0.1.1 (2018/10/22) 'y-axis-0' → 'y0Ax' これは、JsChartData#getAxisKey() で取得できる値だが、決め打ち 886// .append( "var chartMax=" ).append( myChart ).append( ".scales['y0Ax'].max;" ) 887// .append( "var chartMin=" ).append( myChart ).append( ".scales['y0Ax'].min;" ) 888// .append( "$('#" ).append( minEventColumn ).append( "').val(chartMin);" ) // 初期値を設定 889// .append( "$('#" ).append( minEventColumn ).append( "').attr({'max':chartMax});" ) // 初期値を設定 890// .append( "$('#" ).append( minEventColumn ).append( "').attr({'min':chartMin});" ) // 初期値を設定 891// .append( "});" ).append( CR ); 892// } 893// // maxEventColumn設定 894// if( StringUtil.isNotNull( maxEventColumn ) ) { // 6.8.5.0 (2018/01/09) 895// rtn.append( "$(document).delegate('#").append( maxEventColumn ).append( "','mouseup keyup',function(){" ) 896// // 5.9.27.0 (2017/12/01) MODIFY IntからFloat型に変更 897// .append( "var max=parseFloat($(this).val());") 898// .append( myChart ).append( ".options.scales.yAxes[0].ticks.max = max;") 899// .append( myChart ).append( ".update();") 900// .append( "});").append( CR ) 901// .append( "$(function(){" ) 902// // // 7.0.1.1 (2018/10/22) 'y-axis-0' → 'y0Ax' これは、JsChartData#getAxisKey() で取得できる値だが、決め打ち 903// .append( "var chartMax=" ).append( myChart ).append( ".scales['y0Ax'].max;" ) 904// .append( "var chartMin=" ).append( myChart ).append( ".scales['y0Ax'].min;" ) 905// .append( "$('#" ).append( maxEventColumn ).append( "').val(chartMax);" ) // 初期値を設定 906// .append( "$('#" ).append( maxEventColumn ).append( "').attr({'max':chartMax});" ) // 初期値を設定 907// .append( "$('#" ).append( maxEventColumn ).append( "').attr({'min':chartMin});" ) // 初期値を設定 908// .append( "});" ).append( CR ); 909// } 910 911 // 6.9.2.0 (2018/03/05) ズーム処理を使用する場合、クダブルクリックで元に戻すためのイベントを発生させます。 912 if( useZoom ) { 913 rtn.append( "window.onload=function(){$('#").append( id ).append( "').dblclick(function(){window." ) 914 .append( myChart ).append( ".resetZoom();});}" ); 915 } 916 917 rtn.append( CR ).append( "</script>" ); 918 919 return rtn.toString(); 920 } 921 922 /** 923 * setに値が存在する場合、sbにstr + setの形で値を追加する。 924 * 925 * @param buf ベースとなるStringBuilder 926 * @param str 文字列1(必須) 927 * @param set 文字列2(nullかゼロ文字列の場合は、追加しません) 928 */ 929 private void setProp( final StringBuilder buf, final String str, final String set ) { 930 if( StringUtil.isNotNull( set ) ) { // 6.8.5.0 (2018/01/09) 931 buf.append( str ).append( set ); 932 } 933 } 934 935 /** 936 * setに値が存在する場合、sbにstr + set + endの形で値を追加する。 937 * 938 * @param buf ベースとなるStringBuilder 939 * @param str 文字列1(必須) 940 * @param set 文字列2(nullかゼロ文字列の場合は、追加しません) 941 * @param end 文字列3 942 */ 943 private void setProp( final StringBuilder buf, final String str, final String set, final String end ) { 944 if( StringUtil.isNotNull( set ) ) { // 6.8.5.0 (2018/01/09) 945 buf.append( str ).append( set ).append( end ); 946 } 947 } 948 949 /** 950 * var 変数に設定する配列情報を、bufに追加します。 951 * 952 * var 変数名が key で、cnt分の繰返しで、IntFunction を呼びます。 953 * isQuote=trueの場合は、前後にクォーテーションをつけます。 954 * 955 * @og.rev 7.0.1.3 (2018/11/12) var 変数に設定する配列情報を、bufに追加します。 956 * 957 * @param buf ベースとなるStringBuilder 958 * @param key キー 959 * @param cnt ループする個数(通常は行数:rowCount) 960 * @param isQuote クォーテーションで括るかどうか [true:括る/false:括らない] 961 * @param func 数値を引数に取る関数型インタフェース 962 */ 963 private void setVarArray( final StringBuilder buf, final String key, final int cnt, final boolean isQuote, final IntFunction<String> func ) { 964 buf.append( " var " ).append( key ).append( "=[" ); 965 for( int row=0; row<cnt; row++ ) { 966 if( row > 0 ) { buf.append( ',' ); } // カンマは、最初のデータ以降の最初につける。 967 968 final String val = func.apply( row ); 969 970 if( isQuote ) { 971 buf.append( '"' ).append( val ).append( '"' ); 972 } 973 else { 974 buf.append( val ); 975 } 976 } 977 buf.append( "];" ).append( CR ); 978 } 979 980 /** 981 * パラメータチェック用メソッド。 982 * 983 * @param trg ターゲット 984 * @param set 使用可能なキーワードのSet 985 * @param trgStr ターゲットの名称 986 */ 987 private void checkPara( final String trg, final Set<String> set, final String trgStr ) { 988 if( StringUtil.isNotNull( trg ) && !check( trg, set ) ) { // 6.8.5.0 (2018/01/09) 989 final StringBuilder errMsg = new StringBuilder( BUFFER_MIDDLE ) 990 .append( "指定の" ).append( trgStr ).append( "は指定できません。" ).append( CR ) 991 .append( trgStr ).append( "=[" ).append( trg ).append( ']' ).append( CR ) 992 .append( set ); // org.opengion.fukurou.util.ArraySet の toStringメソッド 993 throw new HybsSystemException( errMsg.toString() ); 994 } 995 } 996 997 /** 998 * 色コードの配列を返すメソッドです。 999 * 1000 * これは、普通のCSV形式のデータなら、そのまま分割します。 1001 * 配列は、lenの数だけ作成します。 1002 * nullやゼロ文字列の場合は、ColorMapのOLOR_KEYすべてを対象にします。 1003 * 1色の場合も、すべて同じ色をlen の数だけセットします。 1004 * 1005 * VIVIDとPASTEL はキーワードで、org.opengion.fukurou.util.ColorMap のビビッドカラーと 1006 * パステルカラーの配列を指定したことと同じになります。 1007 * また、色番号として、ビビッドを、(V0~V11) , パステルを、(P0~P11) 1008 * に割当てていますので、配列に分解後一旦すべてのキーワードを色番号検索に使用します。 1009 * 1010 * @og.rev 7.0.1.3 (2018/11/12) 色コードの配列を返すメソッド追加 1011 * 1012 * @param colCsv 色コードのCSV形式文字列 1013 * @param len 作成する配列の個数 1014 * @return 色コードに変換後の配列 1015 */ 1016 private String[] colorCsv( final String colCsv, final int len ) { 1017 // 色の数を、len にあわせる必要があります。 1018 final String[] mkCols = new String[len]; 1019 1020 // cols を元に、ColorMap から色配列を取得します。 1021 final String[] cols = ColorMap.getColorKeys( colCsv ); 1022 1023 // 色配列に順番に割り当てますが、色が足りない場合は、初期値の色をセットします。 1024 final int min = Math.min( mkCols.length , cols.length ); 1025 for( int i=0; i<min; i++ ) { 1026 mkCols[i] = cols[i]; 1027 } 1028 for( int i=min; i<mkCols.length; i++ ) { 1029 mkCols[i] = cols[0]; // 色コードの最初の色 1030 } 1031 1032 return mkCols ; 1033 1034// final String[] mkCols ; 1035// if( "VIVID".equalsIgnoreCase( cols ) ) { 1036// mkCols = new String[len]; 1037// for( int i=0; i<len; i++ ) { 1038// mkCols[i] = ColorMap.getVividKey( i ); 1039// } 1040// } 1041// else if( "PASTEL".equalsIgnoreCase( cols ) ) { 1042// mkCols = new String[len]; 1043// for( int i=0; i<len; i++ ) { 1044// mkCols[i] = ColorMap.getPastelKey( i ); 1045// } 1046// } 1047// else { 1048// mkCols = StringUtil.csv2Array( cols , ',' , len , MARK_DEF_COLOR ); 1049// 1050// // 無条件で回します。 1051// for( int i=0; i<len; i++ ) { 1052// mkCols[i] = ColorMap.getColorKey( mkCols[i],mkCols[i] ); // 自身で検索して無ければ自身を初期値で戻してます。 1053// } 1054// } 1055// 1056// return mkCols ; 1057 } 1058 1059 /** 1060 * jsChartData情報をリストに追加します。 1061 * 1062 * @og.rev 6.7.5.0 (2017/03/10) リストの初期化方法を変更します。 1063 * 1064 * @param jsData jsChartData情報 1065 */ 1066 protected void addJsChartData( final JsChartData jsData ) { 1067 jsChartData.add( jsData ); 1068 } 1069 1070 /** 1071 * 登録済みのjsChartData情報の個数を返します。 1072 * 1073 * @og.rev 6.7.7.0 (2017/03/31) 新規登録 1074 * 1075 * @return 登録済みのjsChartData情報の個数 1076 */ 1077 protected int getJsChartDataSize() { 1078 return jsChartData.size(); 1079 } 1080 1081 /** 1082 * borderColorとbackgroundColorに色を1色しか使用できないかどうかを返します。 1083 * 1084 * chartType に応じて、色配列が使用できないタイプがあります。 1085 * line/radar が true (1色しか使用できない) 1086 * それ以外(bar/horizontalBar/polarArea/pie/doughnut)が false (色配列が使用できる) 1087 * 1088 * @og.rev 7.0.1.1 (2018/10/22) 新規登録 1089 * 1090 * @return 登録済みのjsChartData情報の個数 1091 */ 1092 protected boolean isOneColor() { 1093 // line/radar が true (1色しか使用できない) 1094 return CTYPE_LINE.equalsIgnoreCase( chartType ) || CTYPE_RADAR.equalsIgnoreCase( chartType ); 1095 } 1096 1097 /** 1098 * 【TAG】チャートの種類を指定します[line/bar/horizontalBar/radar/polarArea/pie/doughnut/bubble/scatter](必須)。 1099 * 1100 * @og.tag 1101 * なお、複合グラフ時には、この値を、"bar" にしておかないと、きちんと表示しないようです。 1102 * 1103 * 8.0.0.0 (2021/08/31) 1104 * chartTypeが、bubbleとscatterの場合は、y:データ、r:データを varColumns で 1105 * 指定します。詳細は、varColumns の説明をご確認ください。 1106 * 1107 * @og.rev 8.0.0.0 (2021/08/31) BUBBLEとSCATTERの追加 1108 * 1109 * @param cType チャートタイプ [line/bar/horizontalBar/radar/polarArea/pie/doughnut/bubble/scatter] 1110 */ 1111 public void setChartType( final String cType ) { 1112 chartType = nval( getRequestParameter( cType ) , null ); 1113 1114 if( !check( chartType, CTYPE_SET ) ) { 1115 final StringBuilder errMsg = new StringBuilder( BUFFER_MIDDLE ) 1116 .append( "指定のチャートタイプは実行できません。" ).append( CR ) 1117 .append( "chartType=[" ).append( chartType ).append( ']' ).append( CR ) 1118 .append( CTYPE_SET ); // org.opengion.fukurou.util.ArraySet の toStringメソッド 1119 throw new HybsSystemException( errMsg.toString() ); 1120 } 1121 } 1122 1123 /** 1124 * 【TAG】ラベルのカラム名を指定します(表示名称)(必須)。 1125 * 1126 * @og.tag 1127 * 1128 * @param lblclm ラベルカラム 1129 */ 1130 public void setLabelColumn( final String lblclm ) { 1131 labelColumn = nval( getRequestParameter( lblclm ),labelColumn ); 1132 } 1133 1134 /** 1135 * 【TAG】canvasタグのidを指定します(初期値:hybscanvas)。 1136 * 1137 * @og.tag 1138 * canvasタグのidに設定します。 1139 * 1140 * @param id canvasタグのid 1141 */ 1142 @Override 1143 public void setId( final String id ) { 1144 this.id = nval( getRequestParameter( id ),this.id ); 1145 } 1146 1147 /** 1148 * 【TAG】チャートの高さを指定します(初期値:400)。 1149 * 1150 * @og.tag 1151 * canvasタグの高さに設定します。 1152 * 1153 * @param hei 設定する高さ 1154 */ 1155 public void setHeight( final String hei ) { 1156 height = nval( getRequestParameter( hei ),height ); 1157 } 1158 1159 /** 1160 * 【TAG】チャートの幅を指定します(初期値:400)。 1161 * 1162 * @og.tag 1163 * canvasタグの横幅を設定します。 1164 * 1165 * @param wid 設定する横幅 1166 */ 1167 public void setWidth( final String wid ) { 1168 width = nval( getRequestParameter( wid ),width ); 1169 } 1170 1171 /** 1172 * 【TAG】タイトルを指定します。 1173 * 1174 * @og.tag 1175 * 1176 * @og.rev 6.9.9.3 (2018/09/25) nvalを入れて、初期値を設定します。 1177 * 1178 * @param title タイトル 1179 */ 1180 public void setTitle( final String title ) { 1181 this.title = nval( getRequestParameter( title ),this.title ); 1182 } 1183 1184 /** 1185 * 【TAG】タイトルの表示位置[top/right/bottom/left]を指定します(初期値:top)。 1186 * 1187 * @og.tag 1188 * 1189 * @og.rev 6.9.9.3 (2018/09/25) nvalを入れて、初期値を設定します。 1190 * 1191 * @param titlePosition タイトルの表示位置 [top/right/bottom/left] 1192 */ 1193 public void setTitlePosition( final String titlePosition ) { 1194 this.titlePosition = nval( getRequestParameter( titlePosition ),this.titlePosition ); 1195 1196 checkPara( this.titlePosition, SET_POSITION, "titlePosition" ); 1197 } 1198 1199 /** 1200 * 【TAG】凡例を表示するか[true/false]を指定します。 1201 * 1202 * @og.tag 1203 * 1204 * @og.rev 6.9.9.3 (2018/09/25) nvalを入れて、初期値を設定します。 1205 * 1206 * @param display 凡例を表示するか [true/false] 1207 */ 1208 public void setLegendDisplay( final String display ) { 1209 legendDisplay = nval( getRequestParameter( display ),legendDisplay ); 1210 1211 if( legendDisplay != null ) { 1212 checkPara( legendDisplay, SET_BOOLEAN, "legendDisplay" ); 1213 useLegend = true; 1214 } 1215 } 1216 1217 /** 1218 * 【TAG】凡例の表示位置[top/right/bottom/left]を指定します(初期値:top)。 1219 * 1220 * @og.tag 1221 * 1222 * @og.rev 6.9.9.3 (2018/09/25) nvalを入れて、初期値を設定します。 1223 * 1224 * @param position 凡例の表示位置 [top/right/bottom/left] 1225 */ 1226 public void setLegendPosition( final String position ) { 1227 legendPosition = nval( getRequestParameter( position ),legendPosition ); 1228 1229 if( legendPosition != null ) { 1230 checkPara( legendPosition, SET_POSITION, "legendPosition" ); 1231 useLegend = true; 1232 } 1233 } 1234 1235 /** 1236 * 【TAG】凡例のスタイル属性を使用するかどうか[true/false]を指定します(初期値:false)。 1237 * 1238 * @og.tag 1239 * 凡例のスタイルを、jsChartDataタグのpointStyle属性で指定した形状に変更します。 1240 * 複数データの場合、片方だけ指定したい場合は、usePointStyle="true" にしておき、 1241 * 指定したいほうだけ、jsChartDataタグ側で、pointStyle属性を設定してください。 1242 * options:legend:labels属性のusePointStyle です。 1243 * 1244 * @og.rev 6.8.5.0 (2018/01/09) 新規登録 1245 * 1246 * @param usePstyle 凡例のスタイル属性を使用するかどうか [true:使用する/false:使用しない] 1247 */ 1248 public void setUsePointStyle( final String usePstyle ) { 1249 final String useStyle = nval( getRequestParameter( usePstyle ),null ); 1250 1251 if( useStyle != null ) { 1252 usePointStyle = Boolean.parseBoolean( useStyle ); 1253 useLegend = true; // パラメータの設定が行われた場合のみ、設定します。 1254 } 1255 } 1256 1257 /** 1258 * 【TAG】棒線の横幅を指定します(初期値:0.8, typeがbar,horizontalBarの場合に有効)。 1259 * 1260 * @og.tag 1261 * 1262 * @og.rev 6.9.9.3 (2018/09/25) nvalを入れて、初期値を設定します。 1263 * 1264 * @param barWidthPer 棒線の横幅 1265 */ 1266 public void setBarWidthPer( final String barWidthPer ) { 1267 this.barWidthPer = nval( getRequestParameter( barWidthPer ) , this.barWidthPer ); 1268 } 1269 1270 /** 1271 * 【TAG】チャートクリック時のイベントを指定します。 1272 * 1273 * @og.tag 1274 * 下記の値が引数として渡されます。 1275 * 1276 * event:イベント情報 1277 * obj:クリックされたオブジェクトの情報 1278 * 1279 * @param click チャートクリック時のイベントを指定 1280 */ 1281 public void setOnClick( final String click ) { 1282 onClick = nval( getRequestParameter( click ),onClick ); 1283 } 1284 1285 /** 1286 * 【TAG】プラグイン定義された関数を指定します。 1287 * 1288 * @og.tag 1289 * プラグインは、plugins: [pinFunc], 形式で追加されます。 1290 * この属性での指定時は、[]は、不要で、CSV形式の関数名を並べます。 1291 * 外部に、var pinFunc = { afterDatasetsDraw: function(chart, options) { ・・・ } }; 1292 * 形式のプラグインを指定することで、個別に読ませることが可能です。 1293 * なお、すべてのチャートに、同一のプラグインを指定する場合は、この属性ではなく、 1294 * Chart.plugins.register({ afterDatasetsDraw: function(chart, options) { ・・・ } }); 1295 * 形式で、プラグイン登録 1296 * 1297 * @og.rev 6.9.9.2 (2018/09/18) プラグイン定義された関数を指定します。 1298 * 1299 * @param attri 追加属性の値 1300 */ 1301 public void setPlugins( final String attri ) { 1302 plugins = nval( getRequestParameter( attri ),plugins ); 1303 } 1304 1305 //======================================================================================== 1306 1307 /** 1308 * 【TAG】x軸の表示位置[top/right/bottom/left]を指定します(初期値:bottom)。 1309 * 1310 * @og.tag 1311 * horizontalBar を指定した場合は、left になります。 1312 * 初期値(null)は、下(bottom)に表示されます。 1313 * options:scales:xAxes の 要素の属性です。 1314 * 1315 * @og.rev 7.0.1.2 (2018/11/04) 新規登録 1316 * 1317 * @param pos x軸の表示位置 [top/right/bottom/left] 1318 */ 1319 public void setXposition( final String pos ) { 1320 xposition = nval( getRequestParameter( pos ),null ); 1321 1322 checkPara( xposition, SET_POSITION, "position" ); 1323 } 1324 1325 /** 1326 * 【TAG】x軸のスケールタイプ[category/linear/time]を指定します(初期値:category)。 1327 * 1328 * @og.tag 1329 * 8.0.0.0 (2021/08/31) 1330 * chartTypeが、bubbleとscatterの場合は、xscaleType は、初期値:category に 1331 * しておいてください。内部で、x: y: r: 等のデータの割り当てを行います。 1332 * 1333 * @og.rev 6.9.9.3 (2018/09/25) nvalを入れて、初期値を設定します。 1334 * @og.rev 7.0.1.1 (2018/10/22) JsChartDataオブジェクトを使用。 1335 * 1336 * @param xscaleType x軸のスケールタイプ [category/linear/time] 1337 */ 1338 public void setXscaleType( final String xscaleType ) { 1339 this.xscaleType = nval( getRequestParameter( xscaleType ) , this.xscaleType ); 1340 1341 // プラグインなどで独自の type を指定することがあるため、警告だけにします。 1342 try { 1343 checkPara( this.xscaleType, SET_XSCALE, "xscaleType" ); 1344 } 1345 catch( final HybsSystemException ex ) { 1346 System.err.println( ex.getMessage() ); 1347 } 1348 1349 jsXAxis.addAxis( "type" , this.xscaleType , USE_QUOTE ); // 文字 1350 } 1351 1352 /** 1353 * 【TAG】x軸のラベルを指定します。 1354 * 1355 * @og.tag 1356 * 1357 * @og.rev 6.9.9.3 (2018/09/25) nvalを入れて、初期値を設定します。 1358 * @og.rev 7.0.1.1 (2018/10/22) JsChartDataオブジェクトを使用。 1359 * 1360 * @param xlabel x軸のラベル 1361 */ 1362 public void setXlabel( final String xlabel ) { 1363 final String lbl = nval( getRequestParameter( xlabel ),null ); 1364 if( lbl != null ) { 1365 final String scLbl = "{display: true,labelString:'" + lbl + "'}" ; 1366 jsXAxis.addAxis( "scaleLabel" , scLbl , NO_QUOTE ); // カンマが不要なのは判っている 1367 } 1368 } 1369 1370 /** 1371 * 【TAG】x軸コールバックを指定します。 1372 * 1373 * @og.tag 1374 * x軸のメモリ編集用スケールバックを設定します。 1375 * 1376 * @og.rev 6.9.9.3 (2018/09/25) nvalを入れて、初期値を設定します。 1377 * @og.rev 7.0.1.1 (2018/10/22) JsChartDataオブジェクトを使用。 1378 * 1379 * @param callback x軸コールバック 1380 */ 1381 public void setXscaleCallback( final String callback ) { 1382 jsXAxis.addTicks( "callback" , nval( getRequestParameter( callback ),null ) , NO_QUOTE ); // ファンクションは、クオートしない 1383 } 1384 1385 /** 1386 * 【TAG】x軸を0から書き始まるかどうか(初期値:null)。 1387 * 1388 * @og.tag 1389 * 1390 * @og.rev 6.8.5.0 (2018/01/09) 新規登録 1391 * @og.rev 7.0.1.1 (2018/10/22) JsChartDataオブジェクトを使用。 1392 * 1393 * @param xZero x軸のゼロ開始 1394 */ 1395 public void setXbeginAtZero( final String xZero ) { 1396 jsXAxis.addTicks( "beginAtZero" , nval( getRequestParameter( xZero ) , null ) , NO_QUOTE ); // Boolean 1397 } 1398 1399 /** 1400 * 【TAG】x軸の最大値を指定します(xscaleTypeがlinearの場合に有効)。 1401 * 1402 * @og.tag 1403 * 1404 * @og.rev 6.9.9.3 (2018/09/25) nvalを入れて、初期値を設定します。 1405 * @og.rev 7.0.1.1 (2018/10/22) JsChartDataオブジェクトを使用。 1406 * 1407 * @param xmax x軸の最大値 1408 */ 1409 public void setXmax( final String xmax ) { 1410 jsXAxis.addTicks( "max" , nval( getRequestParameter( xmax ),null ) , NO_QUOTE ); // 数値 1411 } 1412 1413 /** 1414 * 【TAG】x軸の最小値を指定します(xscaleTypeがlinearの場合に有効)。 1415 * 1416 * @og.tag 1417 * 1418 * @og.rev 6.9.9.3 (2018/09/25) nvalを入れて、初期値を設定します。 1419 * @og.rev 7.0.1.1 (2018/10/22) JsChartDataオブジェクトを使用。 1420 * 1421 * @param xmin x軸の最小値 1422 */ 1423 public void setXmin( final String xmin ) { 1424 jsXAxis.addTicks( "min" , nval( getRequestParameter( xmin ),null ) , NO_QUOTE ); // 数値 1425 } 1426 1427 /** 1428 * 【TAG】x軸のメモリ幅を指定します(xscaleTypeがlinearの場合に有効)。 1429 * 1430 * @og.tag 1431 * 1432 * @og.rev 6.9.9.3 (2018/09/25) nvalを入れて、初期値を設定します。 1433 * @og.rev 7.0.1.1 (2018/10/22) JsChartDataオブジェクトを使用。 1434 * 1435 * @param xstepSize x軸のメモリ幅 1436 */ 1437 public void setXstepSize( final String xstepSize ) { 1438 jsXAxis.addTicks( "stepSize" , nval( getRequestParameter( xstepSize ),null ) , NO_QUOTE ); // 数値 1439 } 1440 1441 /** 1442 * 【TAG】chartの属性に、TLDで未定義の属性を追加指定します。 1443 * 1444 * @og.tag 1445 * chartの属性に、TLDで未定義の属性を追加指定します。 1446 * これは、TLDで未定義の属性を、chart.js で使用する場合に、引数の属性をそのまま、追加します。 1447 * 1448 * @og.rev 7.0.1.2 (2018/11/04) 属性名変更 1449 * 1450 * @param attri 追加属性の値 1451 */ 1452 public void setOptChart( final String attri ) { 1453 optChart = nval( getRequestParameter( attri ),optChart ); 1454 } 1455 1456 /** 1457 * 【TAG】optionsの属性に、その他オプションを追加指定します。 1458 * 1459 * @og.tag 1460 * optionsの属性に、その他オプションを追加指定します。 1461 * 1462 * @og.rev 7.0.1.2 (2018/11/04) 属性名変更 1463 * 1464 * @param attri オプションの値 1465 */ 1466 public void setOptOptions( final String attri ) { 1467 optOptions = nval( getRequestParameter( attri ),optOptions ); 1468 } 1469 1470 /** 1471 * 【TAG】その他options:scales:xAxesのオプションを指定します。 1472 * 1473 * @og.tag 1474 * options:scales:xAxes の 要素の属性です。 1475 * ※ chartJS上は、Axes(axisの複数形)と、Axis を使い分けていますが、属性は、axis で統一します。 1476 * 1477 * @og.rev 7.0.1.2 (2018/11/04) 属性の追加。 1478 * 1479 * @param attri その他options:scales:xAxesのオプション 1480 */ 1481 public void setOptAxis( final String attri ) { 1482 jsXAxis.addOptions( JsChartData.AXIS , nval( getRequestParameter( attri ),null ) ); 1483 } 1484 1485 /** 1486 * 【TAG】その他options:scales:xAxes:ticksのオプションを指定します。 1487 * 1488 * @og.tag 1489 * options:scales:xAxes:ticks の 要素の属性です。 1490 * 1491 * @og.rev 7.0.1.2 (2018/11/04) 属性の追加。 1492 * 1493 * @param attri その他options:scales:xAxes:ticksのオプション 1494 */ 1495 public void setOptTicks( final String attri ) { 1496 jsXAxis.addOptions( JsChartData.TICKS , nval( getRequestParameter( attri ),null ) ); 1497 } 1498 1499 /** 1500 * 【TAG】その他options:scales:xAxes:scaleLabelのオプションを指定します。 1501 * 1502 * @og.tag 1503 * options:scales:xAxes:scaleLabel の 要素の属性です。 1504 * 1505 * @og.rev 7.0.1.2 (2018/11/04) 属性の追加。 1506 * 1507 * @param attri その他options:scales:xAxes:scaleLabelのオプション 1508 */ 1509 public void setOptScaleLabel( final String attri ) { 1510 jsXAxis.addOptions( JsChartData.SCALE_LABEL , nval( getRequestParameter( attri ),null ) ); 1511 } 1512 1513 /** 1514 * 【TAG】その他options:scales:xAxes:gridLinesのオプションを指定します。 1515 * 1516 * @og.tag 1517 * options:scales:xAxes:gridLines の 要素の属性です。 1518 * 1519 * @og.rev 7.0.1.2 (2018/11/04) 属性の追加。 1520 * 1521 * @param attri その他options:scales:xAxes:gridLinesのオプション 1522 */ 1523 public void setOptGridLines( final String attri ) { 1524 jsXAxis.addOptions( JsChartData.GRID_LINES , nval( getRequestParameter( attri ),null ) ); 1525 } 1526 1527 /** 1528 * 【TAG】x軸のタイムの単位[year/quarter/month/week/day/hour/minute/second]を指定します。 1529 * 1530 * @og.tag 1531 * (xscaleTypeがtimeの場合に有効。指定しない場合は自動) 1532 * 1533 * @og.rev 6.9.9.3 (2018/09/25) xscaleType の time 属性廃止。 1534 * @og.rev 6.9.9.4 (2018/10/01) nvalを入れて、属性復活。 1535 * @og.rev 7.0.1.1 (2018/10/22) JsChartDataオブジェクトを使用。 1536 * 1537 * @param tunit x軸のタイムの単位 [year/quarter/month/week/day/hour/minute/second] 1538 */ 1539 public void setTimeUnit( final String tunit ) { 1540 final String timeUnit = nval( getRequestParameter( tunit ),null ); 1541 1542 checkPara( timeUnit, SET_TIMEUNIT, "timeUnit" ); 1543 1544 jsXAxis.addTime( "unit" , timeUnit , USE_QUOTE ); // 文字列 1545 } 1546 1547 /** 1548 * 【TAG】x軸のタイムの最大値を指定します(xscaleTypeがtimeの場合に有効)。 1549 * 1550 * @og.tag 1551 * 1552 * @param tmax x軸のタイムの最大値 1553 * @og.rev 6.9.9.3 (2018/09/25) xscaleType の time 属性廃止。 1554 * @og.rev 6.9.9.4 (2018/10/01) nvalを入れて、属性復活。 1555 * @og.rev 7.0.1.1 (2018/10/22) JsChartDataオブジェクトを使用。 1556 */ 1557 public void setTimeMax( final String tmax ) { 1558 jsXAxis.addTime( "max" , nval( getRequestParameter( tmax ),null ) , USE_QUOTE ); // 時間の最大、最小は、文字列として扱う 1559 } 1560 1561 /** 1562 * 【TAG】x軸のタイムの最小値を指定します(xscaleTypeがtimeの場合に有効)。 1563 * 1564 * @og.tag 1565 * @og.rev 6.9.9.3 (2018/09/25) xscaleType の time 属性廃止。 1566 * @og.rev 6.9.9.4 (2018/10/01) nvalを入れて、属性復活。 1567 * @og.rev 7.0.1.1 (2018/10/22) JsChartDataオブジェクトを使用。 1568 * 1569 * @param tmin x軸のタイムの最小値 1570 */ 1571 public void setTimeMin( final String tmin ) { 1572 jsXAxis.addTime( "min" , nval( getRequestParameter( tmin ),null ) , USE_QUOTE ); // 時間の最大、最小は、文字列として扱う 1573 } 1574 1575 /** 1576 * 【TAG】x軸のタイムの単位幅を指定します(xscaleTypeがtimeの場合に有効)。 1577 * 1578 * @og.tag 1579 * 1580 * @og.rev 6.9.9.3 (2018/09/25) xscaleType の time 属性廃止。 1581 * @og.rev 6.9.9.4 (2018/10/01) nvalを入れて、属性復活。 1582 * @og.rev 7.0.1.1 (2018/10/22) JsChartDataオブジェクトを使用。 1583 * 1584 * @param tunitStepSize x軸のタイムの単位幅 1585 */ 1586 public void setTimeUnitStepSize( final String tunitStepSize ) { 1587 jsXAxis.addTime( "unitStepSize" , nval( getRequestParameter( tunitStepSize ),null ) , NO_QUOTE ); // 数値 1588 } 1589 1590 /** 1591 * 【TAG】x軸の設定するタイム(入力データ)のフォーマットを指定します(xscaleTypeがtimeの場合に有効)。 1592 * 1593 * @og.tag 1594 * フォーマットは、Moment.js の定義を使用します。<a href="http://momentjs.com/docs/#/parsing/">Moment.js Documentation</a> 1595 * 例:YYYY/MM/DD HH:mm:ss 1596 * 1597 * <table class="plain"> 1598 * <caption>ボタンのタイプ説明</caption> 1599 * <tr><th>Input </th><th>Example </th><th>Description </th></tr> 1600 * <tr><td>YYYY </td><td>2014 </td><td>4 or 2 digit year </td></tr> 1601 * <tr><td>YY </td><td>14 </td><td>2 digit year </td></tr> 1602 * <tr><td>Y </td><td>-25 </td><td>Year with any number of digits and sign </td></tr> 1603 * <tr><td>Q </td><td>1..4 </td><td>Quarter of year. Sets month to first month in quarter. </td></tr> 1604 * <tr><td>M MM </td><td>1..12 </td><td>Month number </td></tr> 1605 * <tr><td>MMM MMMM </td><td>Jan..December </td><td>Month name in locale set by moment.locale() </td></tr> 1606 * <tr><td>D DD </td><td>1..31 </td><td>Day of month </td></tr> 1607 * <tr><td>Do </td><td>1st..31st </td><td>Day of month with ordinal </td></tr> 1608 * <tr><td>DDD DDDD </td><td>1..365 </td><td>Day of year </td></tr> 1609 * <tr><td>X </td><td>1410715641 </td><td>Unix timestamp </td></tr> 1610 * <tr><td>x </td><td>1.41072E+12 </td><td>Unix ms timestamp </td></tr> 1611 * <tr><td> </td><td> </td><td> </td></tr> 1612 * <tr><td>gggg </td><td>2014 </td><td>Locale 4 digit week year </td></tr> 1613 * <tr><td>gg </td><td>14 </td><td>Locale 2 digit week year </td></tr> 1614 * <tr><td>w ww </td><td>1..53 </td><td>Locale week of year </td></tr> 1615 * <tr><td>e </td><td>0..6 </td><td>Locale day of week </td></tr> 1616 * <tr><td>ddd dddd </td><td>Mon...Sunday </td><td>Day name in locale set by moment.locale() </td></tr> 1617 * <tr><td>GGGG </td><td>2014 </td><td>ISO 4 digit week year </td></tr> 1618 * <tr><td>GG </td><td>14 </td><td>ISO 2 digit week year </td></tr> 1619 * <tr><td>W WW </td><td>1..53 </td><td>ISO week of year </td></tr> 1620 * <tr><td>E </td><td>1..7 </td><td>ISO day of week </td></tr> 1621 * <tr><td> </td><td> </td><td> </td></tr> 1622 * <tr><td>H HH </td><td>0..23 </td><td>Hours (24 hour time) </td></tr> 1623 * <tr><td>h hh </td><td>1..12 </td><td>Hours (12 hour time used with a A.) </td></tr> 1624 * <tr><td>k kk </td><td>1..24 </td><td>Hours (24 hour time from 1 to 24) </td></tr> 1625 * <tr><td>a A </td><td>am pm </td><td>Post or ante meridiem (Note the one character a p are also considered valid) </td></tr> 1626 * <tr><td>m mm </td><td>0..59 </td><td>Minutes </td></tr> 1627 * <tr><td>s ss </td><td>0..59 </td><td>Seconds </td></tr> 1628 * <tr><td>S SS SSS </td><td>0..999 </td><td>Fractional seconds </td></tr> 1629 * <tr><td>Z ZZ </td><td>+12:00 </td><td>Offset from UTC as +-HH:mm, +-HHmm, or Z </td></tr> 1630 * </table> 1631 * 1632 * @og.rev 6.9.9.3 (2018/09/25) xscaleType の time 属性廃止。 1633 * @og.rev 6.9.9.4 (2018/10/01) nvalを入れて、属性復活。 1634 * @og.rev 7.0.1.1 (2018/10/22) JsChartDataオブジェクトを使用。 1635 * 1636 * @param tFormat x軸の設定するタイムのフォーマット 1637 */ 1638 public void setTimeSetFormat( final String tFormat ) { 1639 jsXAxis.addTime( "format" , nval( getRequestParameter( tFormat ),null ) , USE_QUOTE ); // 文字列 1640 } 1641 1642 /** 1643 * 【TAG】x軸の表示するタイムのフォーマットを指定します(xscaleTypeがtimeの場合に有効)。 1644 * 1645 * @og.tag 1646 * フォーマットは、Moment.js の定義を使用します。<a href="http://momentjs.com/docs/#/parsing/">Moment.js Documentation</a> 1647 * 例:YYYY/MM/DD HH:mm:ss 1648 * 1649 * timeLblFormatが指定されている場合、全てのdisplayFormatsにtimeLblFormatを設定する 1650 * 1651 * @og.rev 6.9.9.3 (2018/09/25) xscaleType の time 属性廃止。 1652 * @og.rev 6.9.9.4 (2018/10/01) nvalを入れて、属性復活。 1653 * @og.rev 7.0.1.1 (2018/10/22) JsChartDataオブジェクトを使用。 1654 * 1655 * @param tLblFormat x軸の表示するタイムのフォーマット 1656 * @see #setTimeSetFormat(String) 1657 */ 1658 public void setTimeLblFormat( final String tLblFormat ) { 1659 final String timeFmt = nval( getRequestParameter( tLblFormat ),null ); 1660 if( timeFmt != null ) { 1661 final StringBuilder buf = new StringBuilder( BUFFER_MIDDLE ) 1662 .append( "{year:'" ).append( timeFmt ) 1663 .append( "',quarter:'" ).append( timeFmt ) 1664 .append( "',month:'" ).append( timeFmt ) 1665 .append( "',week:'" ).append( timeFmt ) 1666 .append( "',day:'" ).append( timeFmt ) 1667 .append( "',hour:'" ).append( timeFmt ) 1668 .append( "',minute:'" ).append( timeFmt ) 1669 .append( "',second:'" ).append( timeFmt ) 1670 .append( "'}" ); 1671 1672 jsXAxis.addTime( "displayFormats" , buf.toString() , NO_QUOTE ); // オブジェクトなので、クオートなし 1673 } 1674 } 1675 1676 /** 1677 * 【TAG】x軸の時間のツールチップに使用するフォーマット(タイムスケール用)を指定します(xscaleTypeがtimeの場合に有効)。 1678 * 1679 * @og.tag 1680 * フォーマットは、Moment.js の定義を使用します。<a href="http://momentjs.com/docs/#/parsing/">Moment.js Documentation</a> 1681 * 例:YYYY/MM/DD HH:mm:ss 1682 * 1683 * @og.rev 7.0.1.0 (2018/10/15) 時間のツールチップに使用するフォーマット(タイムスケール用) 1684 * @og.rev 7.0.1.1 (2018/10/22) JsChartDataオブジェクトを使用。 1685 * 1686 * @param tipFormat x軸の表示するタイムのフォーマット 1687 * @see #setTimeSetFormat(String) 1688 */ 1689 public void setTooltipFormat( final String tipFormat ) { 1690 jsXAxis.addTime( "tooltipFormat" , nval( getRequestParameter( tipFormat ),null ) , USE_QUOTE ); // 文字列 1691 } 1692 1693 //======================================================================================== 1694 1695 /** 1696 * 【TAG】y軸に横マーカーラインの設定値をCSV形式で複数指定します。 1697 * 1698 * @og.tag 1699 * annotation オプションに値を設定します。 1700 * X軸に平行に固定値の線を引きます。線の値を、CSV形式で指定します。 1701 * type: 'line',scaleID: 'y0Ax',mode: 'horizontal',borderWidth: 2 固定です。 1702 * 1703 * @og.rev 6.8.5.0 (2018/01/09) 新規登録 1704 * 1705 * @param mkVals y軸に横マーカーラインの設定値(CSV形式) 1706 */ 1707 public void setMarkValues( final String mkVals ) { 1708 markValues = nval( getRequestParameter( mkVals ) , markValues ); 1709 } 1710 1711 /** 1712 * 【TAG】y軸に横マーカーラインの色をCSV形式で複数指定します。 1713 * 1714 * @og.tag 1715 * annotation オプションに値を設定します。 1716 * X軸に平行に固定値の線を引きます。線の色を、CSV形式で指定します。 1717 * markValues が指定されており、markColorsが指定されていない場合は、青色(BLUE)になります。 1718 * 色指定に、VIVID,PASTEL を使えるようにします。 1719 * 1720 * @og.rev 6.8.5.0 (2018/01/09) 新規登録 1721 * @og.rev 7.0.1.3 (2018/11/12) 色指定に、VIVID,PASTEL を使えるようにします。 1722 * 1723 * @param mkCols y軸に横マーカーラインの色(CSV形式) 1724 */ 1725 public void setMarkColors( final String mkCols ) { 1726 markColors = nval( getRequestParameter( mkCols ) , markColors ); 1727 } 1728 1729 /** 1730 * 【TAG】y軸に横マーカーラインのラベルをCSV形式で複数指定します。 1731 * 1732 * @og.tag 1733 * annotations の label 属性 の content 属性に値をセットします。 1734 * label 属性は、enabled: 'true',position: 'left',backgroundColor: 'rgba(0,0,0,0)', 1735 * fontSize: 10, は固定で、fontColor は、markColors 属性で指定した 1736 * y軸に横マーカーラインの色を使用します。 1737 * 色指定に、VIVID,PASTEL を使えるようにします。 1738 * 1739 * @og.rev 6.8.5.0 (2018/01/09) 新規登録 1740 * 1741 * @param mklbls y軸に横マーカーラインのラベル(CSV形式) 1742 */ 1743 public void setMarkLbls( final String mklbls ) { 1744 markLbls = nval( getRequestParameter( mklbls ) , markLbls ); 1745 } 1746 1747 /** 1748 * 【TAG】y軸に横マーカーラインのラベル表示位置の上下方向を調整します(初期値:-6)。 1749 * 1750 * @og.tag 1751 * annotation オプションに値を設定します。 1752 * annotations の label 属性の yAdjust に値をセットします。 1753 * これは、ラインに対するラベルの位置を表します。+で、下側、-で上側に表示します。 1754 * 初期値は、-6 で、ラインの上側に来るように調整しています。 1755 * 1756 * @og.rev 6.8.5.0 (2018/01/09) 新規登録 1757 * 1758 * @param mkAjst y軸に横マーカーラインのラベル表示位置の上下方向調整 1759 */ 1760 public void setMarkAdjust( final String mkAjst ) { 1761 markAdjust = nval( getRequestParameter( mkAjst ) , markAdjust ); 1762 } 1763 1764 /** 1765 * 【TAG】x軸に縦マーカーラインの設定値をCSV形式で複数指定します。 1766 * 1767 * @og.tag 1768 * annotation オプションに値を設定します。 1769 * Y軸に平行に固定値の縦線を引きます。線の値を、CSV形式で指定します。 1770 * type: 'line',borderDash:[5,2],scaleID: 'x0Ax',mode:'vertical',borderWidth:0.5 固定です。 1771 * 1772 * @og.rev 7.0.1.1 (2018/10/22) xmarkValues,xmarkColors属性の追加 1773 * 1774 * @param mkVals x軸に縦マーカーラインの設定値(CSV形式) 1775 */ 1776 public void setXmarkValues( final String mkVals ) { 1777 xmarkValues = nval( getRequestParameter( mkVals ) , xmarkValues ); 1778 } 1779 1780 /** 1781 * 【TAG】x軸に縦マーカーラインの色をCSV形式で複数指定します。 1782 * 1783 * @og.tag 1784 * annotation オプションに値を設定します。 1785 * Y軸に平行に固定値の縦線を引きます。線の色を、CSV形式で指定します。 1786 * xmarkValues が指定されており、markColorsが指定されていない場合は、青色(BLUE)になります。 1787 * 1788 * @og.rev 7.0.1.1 (2018/10/22) xmarkValues,xmarkColors属性の追加 1789 * @og.rev 7.0.1.3 (2018/11/12) 色指定に、VIVID,PASTEL を使えるようにします。 1790 * 1791 * @param mkCols x軸に縦マーカーラインの色(CSV形式) 1792 */ 1793 public void setXmarkColors( final String mkCols ) { 1794 xmarkColors = nval( getRequestParameter( mkCols ) , xmarkColors ); 1795 } 1796 1797 /** 1798 * 【TAG】x軸,y軸全マーカーライン共通のラインの幅を指定します:borderWidth(初期値:2)。 1799 * 1800 * @og.tag 1801 * annotation オプションに値を設定します。 1802 * この値は、x軸,y軸関係なく、マーカーラインの順番も関係なく、共通設定になります。 1803 * 1804 * @og.rev 7.0.1.1 (2018/10/22) markWidth,markDash,markFontSize属性の追加 1805 * 1806 * @param width マーカーライン共通のラインの幅 1807 */ 1808 public void setMarkWidth( final String width ) { 1809 markWidth = nval( getRequestParameter( width ) , markWidth ); 1810 } 1811 1812 /** 1813 * 【TAG】x軸,y軸全マーカーライン共通のラインに点線を指定([5,2]など)します:borderDash(初期値:null)。 1814 * 1815 * @og.tag 1816 * annotation オプションに値を設定します。 1817 * この値は、x軸,y軸関係なく、マーカーラインの順番も関係なく、共通設定になります。 1818 * markDash="[5,2]" とすれば、線の長さが5px , 線と線の間が2px になります。 1819 * 1820 * @og.rev 7.0.1.1 (2018/10/22) markWidth,markDash,markFontSize属性の追加 1821 * 1822 * @param dash マーカーライン共通のラインの点線の形状 1823 */ 1824 public void setMarkDash( final String dash ) { 1825 markDash = nval( getRequestParameter( dash ) , markDash ); 1826 } 1827 1828 /** 1829 * 【TAG】x軸,y軸全マーカーライン共通のラベルのフォントサイズを指定します:fontSize(初期値:10)。 1830 * 1831 * @og.tag 1832 * annotation オプションに値を設定します。 1833 * この値は、x軸,y軸関係なく、マーカーラインの順番も関係なく、共通設定になります。 1834 * 1835 * @og.rev 7.0.1.1 (2018/10/22) markWidth,markDash,markFontSize属性の追加 1836 * 1837 * @param size マーカーライン共通のフォントサイズ 1838 */ 1839 public void setMarkFontSize( final String size ) { 1840 markFontSize = nval( getRequestParameter( size ) , markFontSize ); 1841 } 1842 1843 //======================================================================================== 1844 1845 /** 1846 * 【TAG】すべてのデータが0の場合、使用しないかどうか[true:除外する/false:除外しない]を指定します(初期値:false)。 1847 * 1848 * @og.tag 1849 * JSON データを作成して、JsChartに渡しますが、このフラグを true に設定すると 1850 * 0 または、null(空文字列)のデータを出力しません。 6.8.3.0 (2017/11/27) 1851 * グラフ系で、0 が、ありえない値として設定されている場合に、使用すると、 1852 * 出力するデータ量を抑えることが出来ます。 1853 * 1854 * @og.rev 6.7.7.0 (2017/03/31) useZeroDataOmit属性の追加 1855 * 1856 * @param useZeroOmit データが0の場合の使用可否 [true:除外する/false:除外しない] 1857 */ 1858 public void setUseZeroDataOmit( final String useZeroOmit ) { 1859 useZeroDataOmit = nval( getRequestParameter( useZeroOmit ) , useZeroDataOmit ); 1860 } 1861 1862 /** 1863 * 【TAG】JSON出力で、値出力にレンデラを利用するかどうか[true/false]を指定します(初期値:false)。 1864 * 1865 * @og.tag 1866 * JSONのデータのレンデラー変換を行うかどうか。 1867 * 数値部分にはレンデラー変換は行いません。ラベル文字に行います。 1868 * 指定しない場合は使用しない(false)です。 1869 * 1870 * @og.rev 6.7.9.0 (2017/04/28) useRenderer 追加 1871 * 1872 * @param usernd レンデラーを利用するかどうか [true/false] 1873 */ 1874 public void setUseRenderer( final String usernd ) { 1875 useRenderer = nval( getRequestParameter( usernd ) , useRenderer ); 1876 } 1877 1878 /** 1879 * 【TAG】検索結果をこのカラムでソートし直します(初期値:null)。 1880 * 1881 * @og.tag 1882 * query で検索した結果を、JsChartで利用する場合、チャート上のソート順と、 1883 * リストや、別のチャートでの表示準が異なる場合に、このカラムで、ソートしなおします。 1884 * 通常は、labelColumn と同じ値でソートすることで、X軸の順番に表示されます。 1885 * 1886 * @og.rev 6.8.0.0 (2017/06/02) sortColumn 追加 1887 * 1888 * @param sortClm このカラムでソートし直す 1889 */ 1890 public void setSortColumn( final String sortClm ) { 1891 sortColumn = nval( getRequestParameter( sortClm ) , sortColumn ); 1892 } 1893 1894 /** 1895 * 【TAG】値の前後にクオートをはさむかどうか[true/false]指定します(初期値:false)。 1896 * 1897 * @og.tag 1898 * 以前は、yscaleType="category" のときに、値が、文字列のため、クオートで囲う判断をしていました。 1899 * その属性は、JsChartDataTag に移ったため、新たなパラメータを用意します。 1900 * 将来的に、自動判定にするか、JsChartDataTag から情報を取得するかもしれません。 1901 * 1902 * @og.rev 7.0.1.1 (2018/10/22) 新規登録 1903 * 1904 * @param flag 値の前後にクオートをはさむかどうか [true/false] 1905 */ 1906 public void setValueQuot( final String flag ) { 1907 valueQuot = nval( getRequestParameter( flag ),valueQuot ); 1908 } 1909 1910 /** 1911 * 【TAG】ズーム処理を使用するかどうか[true/false]を指定します(初期値:false)。 1912 * 1913 * @og.tag 1914 * annotation オプションにpan と zoom を設定します。 1915 * これは、chartjs-plugin-zoom.js を使用します。 1916 * 初期値は、false:使用しないです。 1917 * 1918 * <ul> 1919 * <li>ホイールでxy軸の拡大、縮小 </li> 1920 * <li>canvasをクリックでzoomリセット </li> 1921 * <li>クリックした状態で移動で、パン動作 </li> 1922 * <li>数値(日付)スケールの方向のみ可能 </li> 1923 * </ul> 1924 * 1925 * @og.rev 6.8.5.0 (2018/01/09) 新規登録 1926 * 1927 * @param zoom ズーム処理を使用するかどうか [true:使用する/false:使用しない]。 1928 */ 1929 public void setUseZoom( final String zoom ) { 1930 useZoom = nval( getRequestParameter( zoom ) , useZoom ); 1931 } 1932 1933 /** 1934 * 【TAG】TableModelの指定のカラム(CSV形式)をvarの配列変数として出力します。 1935 * 1936 * @og.tag 1937 * これは、指定のカラムのデータをJavaScriptのvar変数定義で配列として出力します。 1938 * labelColumn や、JsChartDataTag の chartColumn と同じ方法です。 1939 * 1940 * 例えば、TableModelを、sortColumn でソートすると、JsChartDataTag の pointBGColor 1941 * の配列順も変わりますので、ソートされた状態で出力したいことがあると思います。 1942 * 1943 * 8.0.0.0 (2021/08/31) 1944 * chartTypeが、bubble の場合、 1945 * x:は、jsChartData の chartColumn 1946 * y:は、varColumns で指定した1番目のカラム 1947 * r:は、varColumns で指定した2番目のカラム 1948 * scatter の場合は、y:の1番目のカラムのみ使用します。 1949 * 1950 * @og.rev 7.0.1.2 (2018/11/04) 新規登録 1951 * @og.rev 8.0.0.0 (2021/08/31) BUBBLEとSCATTERの追加 1952 * 1953 * @param clms 指定のカラム(CSV形式)をvarの配列変数として出力 1954 */ 1955 public void setVarColumns( final String clms ) { 1956 varColumns = nval( getRequestParameter( clms ) , varColumns ); 1957 } 1958 1959 //======================================================================================== 1960 1961// /** 1962// * 【廃止】横幅の動的設定カラムを設定します。 1963// * 1964// * @og.tag 1965// * 7.0.1.1 (2018/10/22) 複雑すぎるとの、レイアウトが難しいのと、zoomがあるので、廃止予定にします。 1966// * 1967// * @og.rev 5.9.19.0 (2017/04/07) 追加 1968// * @og.rev 6.9.9.3 (2018/09/25) nvalを入れて、初期値を設定します。 1969// * 1970// * @param widthEventColumn 横幅の動的設定カラム 1971// */ 1972// public void setWidthEventColumn( final String widthEventColumn ) { 1973// this.widthEventColumn = nval( getRequestParameter( widthEventColumn ),this.widthEventColumn ); 1974// } 1975 1976// /** 1977// * 【廃止】縦幅の動的設定カラムを設定します。 1978// * 1979// * @og.tag 1980// * 7.0.1.1 (2018/10/22) 複雑すぎるとの、レイアウトが難しいのと、zoomがあるので、廃止予定にします。 1981// * 1982// * @og.rev 5.9.19.0 (2017/04/07) 追加 1983// * @og.rev 6.9.9.3 (2018/09/25) nvalを入れて、初期値を設定します。 1984// * 1985// * @param heightEventColumn 縦幅の動的設定カラム 1986// */ 1987// public void setHeightEventColumn( final String heightEventColumn ) { 1988// this.heightEventColumn = nval( getRequestParameter( heightEventColumn ),this.heightEventColumn ); 1989// } 1990 1991// /** 1992// * 【廃止】minの動的設定カラムを設定します。 1993// * 1994// * @og.tag 1995// * 7.0.1.1 (2018/10/22) 複雑すぎるとの、レイアウトが難しいのと、zoomがあるので、廃止予定にします。 1996// * 1997// * @og.rev 5.9.19.0 (2017/04/07) 追加 1998// * @og.rev 6.9.9.3 (2018/09/25) nvalを入れて、初期値を設定します。 1999// * 2000// * @param minEventColumn minの動的設定カラム 2001// */ 2002// public void setMinEventColumn( final String minEventColumn ) { 2003// this.minEventColumn = nval( getRequestParameter( minEventColumn ),this.minEventColumn ); 2004// } 2005 2006// /** 2007// * 【廃止】maxの動的設定カラムを設定します。 2008// * 2009// * @og.tag 2010// * 7.0.1.1 (2018/10/22) 複雑すぎるとの、レイアウトが難しいのと、zoomがあるので、廃止予定にします。 2011// * 2012// * @og.rev 5.9.19.0 (2017/04/07) 追加 2013// * @og.rev 6.9.9.3 (2018/09/25) nvalを入れて、初期値を設定します。 2014// * 2015// * @param maxEventColumn maxの動的設定カラム 2016// */ 2017// public void setMaxEventColumn( final String maxEventColumn ) { 2018// this.maxEventColumn = nval( getRequestParameter( maxEventColumn ),this.maxEventColumn ); 2019// } 2020 2021// /** 2022// * 【TAG】optionsの属性に、その他オプションを追加指定します。 2023// * 2024// * @og.tag 2025// * optionsの属性に、その他オプションを追加指定します。 2026// * 2027// * @param attri オプションの値 2028// */ 2029// public void setOptionAttributes( final String attri ) { 2030// optionAttributes = nval( getRequestParameter( attri ),optionAttributes ); 2031// } 2032// 2033// /** 2034// * 【TAG】chartの属性に、TLDで未定義の属性を追加指定します。 2035// * 2036// * @og.tag 2037// * chartの属性に、TLDで未定義の属性を追加指定します。 2038// * これは、TLDで未定義の属性を、chart.js で使用する場合に、引数の属性をそのまま、追加します。 2039// * 2040// * @og.rev 6.9.9.2 (2018/09/18) chartの属性に、TLDで未定義の属性を追加指定します。 2041// * 2042// * @param attri 追加属性の値 2043// */ 2044// public void setChartAttributes( final String attri ) { 2045// chartAttributes = nval( getRequestParameter( attri ),chartAttributes ); 2046// } 2047 2048 /** 2049 * 【TAG】(通常は使いません)sessionから所得する DBTableModelオブジェクトの ID。 2050 * 2051 * @og.tag 2052 * 2053 * @og.rev 6.9.9.3 (2018/09/25) nvalを入れて、初期値を設定します。 2054 * 2055 * @param tableId テーブルID 2056 */ 2057 public void setTableId( final String tableId ) { 2058 this.tableId = nval( getRequestParameter( tableId ) , this.tableId ); 2059 } 2060 2061 /** 2062 * このオブジェクトの文字列表現を返します。 2063 * 基本的にデバッグ目的に使用します。 2064 * 2065 * @return このクラスの文字列表現 2066 */ 2067 @Override 2068 public String toString() { 2069 final StringBuilder buf = new StringBuilder( BUFFER_MIDDLE ) 2070 .append( "X_AXIS=" ).append( jsXAxis ).append( CR ); 2071 2072 jsChartData.forEach( js -> buf.append( "Y_AXIS=" ).append( jsXAxis ).append( CR ) ); 2073 2074 return ToString.title( this.getClass().getName() ) 2075 .println( "VERSION" , VERSION ) 2076 .println( "id" , id ) 2077 .println( "tableId" , tableId ) 2078 .println( "chartType" , chartType ) 2079 .println( "width" , width ) 2080 .println( "height" , height ) 2081 .println( "barWidthPer" , barWidthPer ) 2082 .println( "title" , title ) 2083 .println( "titlePosition" , titlePosition ) 2084 .println( "legendPosition" , legendPosition ) 2085 .println( "legendDisplay" , legendDisplay ) 2086 .println( "xscaleType" , xscaleType ) 2087 // .println( "widthEventColumn" , widthEventColumn ) // 2017/03/28 追加 2088 // .println( "heightEventColumn" , heightEventColumn ) // 2017/03/28 追加 2089 // .println( "minEventColumn" , minEventColumn ) // 2017/03/28 追加 2090 // .println( "maxEventColumn" , maxEventColumn ) // 2017/03/28 追加 2091 .println( "optOptions" , optOptions ) // 7.0.1.2 (2018/11/04) 2092 .println( "optChart" , optChart ) // 7.0.1.2 (2018/11/04) 2093 // .fixForm().toString() 2094 .fixForm().println() 2095 .println( buf ).toString(); 2096 } 2097}