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