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 */ 016 package org.opengion.hayabusa.io; 017 018 import org.opengion.fukurou.util.StringUtil; 019 import org.opengion.hayabusa.common.HybsSystem; 020 import org.opengion.hayabusa.common.HybsSystemException; 021 import org.opengion.hayabusa.db.DBTableModel; 022 023 import java.util.List; 024 import java.util.ArrayList; 025 import java.util.Arrays; 026 import java.awt.Color; 027 import java.sql.Connection; 028 import java.sql.SQLException; 029 import java.text.NumberFormat; 030 import java.text.DecimalFormat; // 5.5.2.1 (2012/05/07) 031 import java.text.DecimalFormatSymbols; // 5.5.2.1 (2012/05/07) 032 import java.text.FieldPosition; // 5.5.2.1 (2012/05/07) 033 034 import org.jfree.data.general.Dataset; 035 import org.jfree.data.general.DefaultValueDataset; 036 import org.jfree.data.general.ValueDataset; 037 import org.jfree.chart.plot.ValueMarker; 038 import org.jfree.chart.axis.NumberAxis; 039 import org.jfree.chart.axis.NumberTickUnit; 040 import org.jfree.chart.renderer.category.CategoryItemRenderer; 041 import org.jfree.chart.renderer.category.BarRenderer; 042 import org.jfree.chart.renderer.category.LineAndShapeRenderer; 043 import org.jfree.chart.labels.CategoryItemLabelGenerator; 044 import org.jfree.chart.labels.StandardCategoryItemLabelGenerator; 045 import org.jfree.chart.urls.CategoryURLGenerator; 046 import org.jfree.ui.RectangleInsets; 047 import org.jfree.ui.TextAnchor; 048 049 import org.jfree.chart.plot.MeterPlot; // 5.7.8.0 (2014/07/04) 050 import org.jfree.chart.plot.ThermometerPlot; // 5.7.8.0 (2014/07/04) 051 import org.jfree.chart.plot.CompassPlot; // 5.7.8.0 (2014/07/04) 052 import org.jfree.chart.plot.Plot; // 5.7.8.0 (2014/07/04) 053 import java.awt.BasicStroke; // 5.7.8.0 (2014/07/04) 054 import org.jfree.data.Range; // 5.7.8.0 (2014/07/04) 055 import org.jfree.chart.plot.MeterInterval; // 5.7.8.0 (2014/07/04) 056 import org.jfree.chart.plot.DialShape; // 5.7.8.0 (2014/07/04) 057 058 /** 059 * ChartDataset は、Dataset および、JFreeChart の個別属?を管?て???タ管?ラスです? 060 * JFreeChart のグラフ合成機?のための、?別のグラフ描画属?を管?て?す? 061 * ??、引数の???JFreeChart の?ブジェクトへの変換なども行って?す? 062 * 063 * @version 0.9.0 2007/06/21 064 * @author Kazuhiko Hasegawa 065 * @since JDK1.1, 066 */ 067 public class ChartDataset { 068 069 private Dataset dataset = null; // Dataset オブジェク? 070 private String query = null; // 実行クエリー 071 private String chartType = null; // チャート?種? 072 private String needleType = null; // Needleの種? 073 private boolean baseLegend = true; // シリーズ単位?凡?の表示可否 074 private String valueLabel = null; 075 private double[] markValues = null; // doubleの配? 076 private Color[] markColors = new Color[] { Color.RED }; // Colorの配? 077 private Color[] markOverColors = null; // 4.0.3.0 (2008/01/07) マ?カーラインの?色 078 private boolean useMarkAnchor = true; // 4.1.1.0 (2008/02/04) 設定?をラベル表示するかど? 079 private int dynamicOCNo = -1; // 4.1.1.0 (2008/02/04) 動的なマ?カーラインの基準シリーズ番号 080 private int dynamicOCadrs = -1; // 4.1.1.0 (2008/02/21) 動的なマ?カーラインの基準番号 081 private String lowerBound = null; // double 082 private String upperBound = null; // double 083 private String tickSize = null; // double 4.0.3.0 (2008/01/07) 084 private boolean useGradient = false; 085 private boolean shapesVisible = true; 086 private Color[] shapeColors = null; // 4.0.3.0 (2008/01/07) ??タ毎にShapeを?り替える時?色?? 087 private String shapeScale = null; // 4.1.1.0 (2008/02/04) 基本形 Shape の表示倍率(double) 088 private boolean useDottedLine = false; 089 private Color[] seriesColors = null; // シリーズに対応した色?? 090 private boolean isLabelsVisible = true; // 4.0.2.0 (2007/12/20) (縦軸)のラベルを表示するかど? 091 private boolean isMarksVisible = true; // 4.0.2.0 (2007/12/20) (縦軸)のマ?カーを表示するかど? 092 private boolean isItemValVisible= false; // 4.1.1.0 (2008/02/04) ??タの値(itemText)を表示するかど? 093 private boolean isItemLastVisible= false; // 4.1.2.0 (2008/03/12) ??タの値(itemText)で??み表示するかど? 094 private boolean useItemLabelSep = true; // 4.1.2.0 (2008/03/12) ??タの値(itemText)の表示に桁区??を使用するかど? 095 private String barWidth = null; // 4.0.3.0 (2008/01/07) バ??double) 096 private String maxBarWidth = null; // 4.0.2.0 (2007/12/20) バ????値(0.0??.0) 097 private String itemMargin = null; // 4.0.2.0 (2007/12/20) バ?アイ?のマ?ジン(0.0??.0) 098 private String visibleLimit = null; // 4.0.3.0 (2008/01/07) 表示下限値(これ以下???タは未表示) 099 private String valueInset = null; // 4.0.3.0 (2008/01/07) 縦軸表示領域INSET値 100 private double domainMargin = 0.0; // 4.1.1.0 (2008/02/14) グラフ?書き?し位置の調整比率 101 102 private String timeFormatType = null; // 5.5.2.1 (2012/05/07) 時刻の表示方?E1/E2/E3/H1/H2/H3) 103 private boolean useVerticalLabels = false; // 5.5.2.1 (2012/05/07) ラベルの表示向き(横書?false/縦書?true) 104 105 /** 106 * Connection と query ??から、Dataset オブジェクトを作?します? 107 * 108 * setChartType( String ) で?されたチャートタイプに応じて、Datasetオブジェク? 109 * を構築します? 110 * Dataset クラスは?org.jfree.data.jdbc.JDBCXXXXDataset" の XXXX の?? 111 * ChartFactory クラスのチャートタイプ変換表に基づ?求めます? 112 * 現状は、Category , Pie , XY の?種類と、Value が指定可能です? 113 * ※ Value は、conn ?sql を使用して?せん。?は、markValues を使用して?す? 114 * これは、現状の暫定方法であり、今後?変わる可能性があります? 115 * 116 * @og.rev 4.0.0.0 (2007/11/28) new Double(double) ?Double.valueOf(double) 変更 117 * 118 * @param conn Datasetの取得?のコネクション 119 * @param sql 取得するクエリー?? 120 * @throws SQLException ??タベ?ス実行エラーが発生した?? 121 */ 122 public void makeDataset( final Connection conn,final String sql ) throws SQLException { 123 dataset = ChartFactory.newDataset( conn,sql,chartType ); 124 query = sql ; 125 126 // 暫定的対応?本当?、SQL を実行してそ?値をセ?すべ? 127 if( dataset instanceof DefaultValueDataset ) { 128 if( markValues != null && markValues.length > 0 ) { 129 ((DefaultValueDataset)dataset).setValue( Double.valueOf( markValues[0] ) ); 130 } 131 else { 132 String errMsg = "markValues が指定されて?せん?; 133 throw new HybsSystemException( errMsg ); 134 } 135 } 136 } 137 138 /** 139 * DBTableModelオブジェクトから?Dataset オブジェクトを作?します? 140 * 141 * setChartType( String ) で?されたチャートタイプに応じて、Datasetオブジェク? 142 * を構築します? 143 * 144 * 現状は、Category , Pie , XY の?種類と、Value が指定可能です? 145 * ※ Value は、DBTableModel を使用して?せん。?は、markValues を使用して?す? 146 * これは、現状の暫定方法であり、今後?変わる可能性があります? 147 * 148 * @og.rev 5.3.0.0 (2010/12/01) 新規追? 149 * 150 * @param table Datasetの取得?の??ブルモ? 151 */ 152 public void makeDataset( final DBTableModel table ) { 153 dataset = ChartFactory.newDataset( table,chartType ); 154 155 // 暫定的対応?本当?、SQL を実行してそ?値をセ?すべ? 156 if( dataset instanceof DefaultValueDataset ) { 157 if( markValues != null && markValues.length > 0 ) { 158 ((DefaultValueDataset)dataset).setValue( Double.valueOf( markValues[0] ) ); 159 } 160 else { 161 String errMsg = "markValues が指定されて?せん?; 162 throw new HybsSystemException( errMsg ); 163 } 164 } 165 } 166 167 /** 168 * NumberAxis オブジェクトを作?します? 169 * 170 * NumberAxis オブジェクト?、Value(縦軸)の属?を設定する為に使用され? 171 * オブジェクトです? 172 * これに、各種属?を設定して、?を返します? 173 * 属?としては、isLineVisible、isLabelsVisible、isMarksVisible? 174 * range(lowerBound、upperBound) です? 175 * 176 * @og.rev 4.0.2.0 (2007/12/20) 新規追? 177 * @og.rev 4.0.3.0 (2008/01/07) 縦軸レンジを?別設定?チック?? 178 * @og.rev 4.1.1.0 (2008/02/04) HybsNumberAxis 採用 179 * @og.rev 4.1.1.0 (2008/02/04) setAxisLineVisible を?isMarksVisible 値で設定する? 180 * @og.rev 5.5.2.1 (2012/05/07) timeFormatType 、useVerticalLabels 属?を追?る? 181 * @og.rev 5.8.5.0 (2015/03/06) 縦軸表示の暫定対応?ための修正 182 * 183 * @return 縦軸の属?(NumberAxisオブジェク? 184 */ 185 protected NumberAxis makeNumberAxis() { 186 NumberAxis axis = new HybsNumberAxis( valueLabel ); 187 188 // 縦軸レンジ??軸設? 189 if( lowerBound != null ) { 190 // axis.setLowerBound( Double.parseDouble( lowerBound ) ); 191 final double lower = Double.parseDouble( lowerBound );// 5.8.5.0 (2015/03/06) 192 axis.setLowerBound( lower ); 193 } 194 195 if( upperBound != null ) { 196 axis.setUpperBound( Double.parseDouble( upperBound ) ); 197 } 198 else { // 5.8.5.0 (2015/03/06) 199 if( dataset instanceof HybsCategoryDataset ) { 200 final Range range = ((HybsCategoryDataset)dataset).getRange(); 201 if( range != null ) { 202 final double upper = range.getUpperBound() * 1.1; // UpperBoundの 10% 大き目の値にする? 203 axis.setUpperBound( upper ); 204 } 205 } 206 } 207 208 if( tickSize != null ) { 209 axis.setTickUnit( new NumberTickUnit( Double.parseDouble( tickSize ) ) ); 210 } 211 212 axis.setTickLabelsVisible( isLabelsVisible ); 213 axis.setTickMarksVisible ( isMarksVisible ); 214 axis.setAxisLineVisible ( isMarksVisible ); // 4.1.1.0 (2008/02/04) 215 216 if( valueInset != null ) { 217 double rightInset = Double.parseDouble( valueInset ); 218 RectangleInsets base = axis.getTickLabelInsets(); 219 RectangleInsets inset = new RectangleInsets( 220 base.getUnitType(), // UnitType unitType 221 base.getTop(), // double top 222 base.getLeft(), // double left 223 base.getBottom(), // double bottom 224 base.getRight() + rightInset // double right 225 ); 226 axis.setTickLabelInsets( inset ) ; 227 } 228 229 // 5.5.2.1 (2012/05/07) 時刻の表示方?E1/E2/E3/H1/H2/H3) 230 if( timeFormatType != null ) { 231 axis.setNumberFormatOverride( new HybsTimeFormat( timeFormatType ) ); 232 } 233 234 // 5.5.2.1 (2012/05/07) ラベルの表示向き(横書?false/縦書?true) 235 if( useVerticalLabels ) { 236 axis.setVerticalTickLabels( true ); // 処?には冗長? 237 } 238 239 return axis; 240 } 241 242 /** 243 * 検索を行う クエリー??を返します? 244 * 245 * これは、makeDataset( Connection ,String ) メソ?で?した? 246 * sql 属?の設定?そ?も?です? 247 * 248 * @return 取得するクエリー?? 249 */ 250 public String getQuery() { return query; } 251 252 /** 253 * Dataset オブジェクトを取得します? 254 * 255 * makeDataset( Connection,String ) で、予めオブジェクトを構築しておく 256 * ?があります? 257 * Dataset クラスは?org.jfree.data.jdbc.JDBCXXXXDataset" の XXXX の?? 258 * ChartFactory クラスのチャートタイプ変換表に基づ?求めます? 259 * 現状は、Category , Pie , XY の?種類と、Value が指定可能です? 260 * 261 * @return Datasetオブジェク? 262 * @see #makeDataset( Connection ,String ) 263 */ 264 protected Dataset getDataset() { return dataset; } 265 266 /** 267 * Dataset オブジェクトを作?する時?チャートタイプを?します? 268 * 269 * チャートタイ?は、外部からチャートを?する?に便利なように、キー? 270 * されて?す?こ?キーに基づ?、ChartFactory クラスの 271 * チャートタイプ変換表に基づ?、レン?ー????タセ?を作?します? 272 * 273 * @param type チャートタイ? 274 */ 275 public void setChartType( final String type ) { 276 if( type != null && type.length() > 0 ) { 277 chartType = type; 278 } 279 } 280 281 /** 282 * Dataset オブジェクトを作?する時?Needleタイプを?します? 283 * 284 * Needleタイ?は、MeterPlot,Compassチャートを使用する場合に?します? 285 * 286 * MeterPlot 287 * org.jfree.chart.plot.DialShape の?キ??ー??として、CHORD,CIRCLE,PIE が指定可能です? 288 * 初期値は、CIRCLE です? 289 * 290 * Compass 291 * org.jfree.chart.needle.MeterNeedle の?キ??ー??として、下記??種類が?可能です? 292 * ??、Arrow,Line,Long,Pin,Plum,Pointer,Ship,Wind,Arrow,MiddlePin と???です? 293 * 初期値は、Pointer です? 294 * 295 * 0 = ArrowNeedle; 296 * 1 = LineNeedle; 297 * 2 = LongNeedle; 298 * 3 = PinNeedle; 299 * 4 = PlumNeedle; 300 * 5 = PointerNeedle; 301 * 6 = ShipNeedle; 302 * 7 = WindNeedle; 303 * 8 = ArrowNeedle; 304 * 9 = MiddlePinNeedle; 305 * 306 * @og.rev 5.7.8.0 (2014/07/04) 新規追? 307 * 308 * @param type Needleタイ? 309 */ 310 public void setNeedleType( final String type ) { 311 if( type != null && type.length() > 0 ) { 312 needleType = type; 313 } 314 } 315 316 /** 317 * Dataset オブジェクトを作?する時?チャートタイプを取得します? 318 * 319 * チャートタイ?は、外部からチャートを?する?に便利なように、キー? 320 * されて?す?こ?キーに基づ?、ChartFactory クラスの 321 * チャートタイプ変換表に基づ?、レン?ー????タセ?を作?します? 322 * 323 * @return チャートタイ? 324 */ 325 protected String getChartType() { return chartType; } 326 327 /** 328 * シリーズ単位?凡?の表示可否を設定します? 329 * 330 * @param baseLeg シリーズ単位?凡?の表示可否 331 */ 332 public void setBaseLegend( final boolean baseLeg ) { 333 baseLegend = baseLeg; 334 } 335 336 /** 337 * Renderer 関連の共通インターフェースを返します? 338 * 339 * setChartType( String )で設定された、チャートタイプに応じた?レン?ー? 340 * 返します? 341 * 対応表は、ChartFactory クラスに持って?す? 342 * 基本?は、チャートタイ?は、この、レン?ー名称から決定して?す? 343 * 344 * @og.rev 4.1.1.0 (2008/02/04) useDynamicOC , isItemValVisible , shapeScale 属?追? 345 * @og.rev 4.1.1.0 (2008/02/04) クリ?ブル・マップ?設定を移動?serNo 引数追? 346 * @og.rev 4.1.1.0 (2008/02/04) 返す型を CategoryItemRenderer に変更 347 * @og.rev 4.1.1.0 (2008/02/16) HybsStackedBarRenderer に domainMargin を設? 348 * @og.rev 4.1.1.0 (2008/02/19) Shapes の設定をこちらに移動? 349 * @og.rev 4.1.2.0 (2008/03/12) isItemLastVisible の設? 350 * 351 * @param serNo シリアルNo 352 * @param urlGen CategoryURLGeneratorオブジェク? 353 * 354 * @return レン?ーの共通インターフェース 355 * @see org.jfree.chart.renderer.category.CategoryItemRenderer 356 * @see org.jfree.chart.renderer.xy.XYItemRenderer 357 */ 358 protected CategoryItemRenderer getRenderer( final int serNo , final CategoryURLGenerator urlGen ) { 359 TypeRenderer typeRen = ChartFactory.getTypeRenderer( chartType ); 360 CategoryItemRenderer rend = (CategoryItemRenderer)typeRen.getRenderer(); 361 362 // 4.1.1.0 (2008/02/19) LineAndShapeRenderer オブジェクト?場合?設? 363 if( rend instanceof LineAndShapeRenderer ) { 364 LineAndShapeRenderer lsRend = (LineAndShapeRenderer)rend; 365 366 // シェー?四?表示。serNo ??表示は、?別に行います? 367 lsRend.setBaseShapesVisible( shapesVisible ); 368 if( serNo >= 0 ) { 369 lsRend.setSeriesShapesVisible( serNo,true ); 370 } 371 372 // 4.1.1.0 (2008/02/04) 繰返しshapeの開始番号(初期値:?? 373 ShapeList shapeList = new ShapeList(); 374 for( int i=0; i<shapeList.size(); i++ ) { 375 lsRend.setSeriesShape( i,shapeList.getShape(i) ); 376 } 377 } 378 379 // 4.0.3.0 (2008/01/07) HybsLineRenderer 特別処? 380 if( rend instanceof HybsLineRenderer ) { 381 HybsLineRenderer hyRend = (HybsLineRenderer)rend ; 382 if( shapeColors != null ) { 383 hyRend.setShapeColors( shapeColors ); 384 } 385 386 // 4.1.1.0 (2008/02/04) shapeの大きさの倍率(初期値:null) 387 hyRend.setShapeScale( shapeScale ); 388 389 // 縦軸マ?カーの?時Shape色??未使用時? null) 390 if( markOverColors != null ) { 391 hyRend.setValueMarkOverColors( getValueMarkOverColors(),dynamicOCNo ); 392 } 393 394 // 表示下限値(これ以下???タは未表示)の値(double)を指? 395 if( visibleLimit != null ) { 396 hyRend.setVisibleLimit( Double.valueOf( visibleLimit ) ); 397 } 398 } 399 400 // 4.0.2.0 (2007/12/20) BarRenderer オブジェクト?場合にマ?ジン等を設定します? 401 if( rend instanceof BarRenderer ) { 402 BarRenderer barRend = (BarRenderer)rend ; 403 404 // 棒?間を表示領域を1として小数点以下?数値で?設定す?0.0??.0) 405 if( itemMargin != null ) { 406 double margin = Double.parseDouble( itemMargin ); 407 barRend.setItemMargin( margin ) ; 408 } 409 410 // 棒??設定す?示領域を1として小数点以下?数値で?設定す?0.0??.0) 411 if( maxBarWidth != null ) { 412 barRend.setMaximumBarWidth( Double.parseDouble( maxBarWidth ) ) ; 413 } 414 } 415 416 // 4.1.1.0 (2008/02/16) HybsStackedBarRenderer オブジェクト?場合に domainMargin を設定します? 417 if( rend instanceof HybsStackedBarRenderer ) { 418 HybsStackedBarRenderer stBarRend = (HybsStackedBarRenderer)rend ; 419 420 stBarRend.setDomainMargin( domainMargin ) ; 421 } 422 423 // シリーズ単位?凡?の表示可否 424 rend.setBaseSeriesVisibleInLegend( baseLegend ); 425 426 // 4.1.1.0 (2008/02/04) ??タの値(itemText)を表示するかど? 427 if( isItemValVisible ) { 428 // 4.1.2.0 (2008/03/12) 桁区??を使用するかど? 429 NumberFormat numForm = NumberFormat.getInstance(); 430 numForm.setGroupingUsed( useItemLabelSep ); 431 432 CategoryItemLabelGenerator labelGen 433 = new StandardCategoryItemLabelGenerator( 434 StandardCategoryItemLabelGenerator.DEFAULT_LABEL_FORMAT_STRING, 435 numForm 436 ); 437 rend.setBaseItemLabelGenerator( labelGen ); 438 439 if( serNo >= 0 ) { 440 rend.setSeriesItemLabelsVisible( serNo,true ); 441 } 442 else { 443 rend.setBaseItemLabelsVisible( true ); 444 } 445 // 4.1.1.0 (2008/02/04) 動的なマ?カーラインを使用する場合? 446 // ??番号は閾値なので、表示しません? 447 if( dynamicOCNo >= 0 ) { 448 rend.setSeriesItemLabelsVisible( dynamicOCNo,false ); // 閾値 449 } 450 451 // 4.1.2.0 (2008/03/12) isItemLastVisible の設? 452 if( isItemLastVisible && rend instanceof HybsDrawItem ) { 453 ((HybsDrawItem)rend).setItemLabelLastVisible( true ) ; 454 } 455 } 456 457 // クリ?ブル・マッ? 458 if( urlGen != null ) { 459 if( serNo >= 0 ) { 460 rend.setSeriesItemURLGenerator( serNo,urlGen ); 461 } 462 else { 463 rend.setBaseItemURLGenerator( urlGen ); 464 } 465 } 466 467 return rend; 468 } 469 470 /** 471 * 縦軸の表示名称を指定します? 472 * 473 * @param valLbl 縦軸の表示名称 474 */ 475 public void setValueLabel( final String valLbl ) { 476 if( valLbl != null && valLbl.length() > 0 ) { 477 valueLabel = valLbl; 478 } 479 } 480 481 /** 482 * 縦軸の表示名称を取得します? 483 * 484 * @return 縦軸の表示名称 485 */ 486 protected String getValueLabel() { return valueLabel; } 487 488 /** 489 * マ?カーラインの設定?配?を指定します? 490 * 491 * ??値にマ?カーラインを引きます? 492 * 色は、setMarkColor( String ) で?します? 493 * markColors と、あわせて設定する?があります? 494 * markColorsが??されて???合?、Color.RED で マ?カーされます? 495 * dynamicOCNo を使用する場合?、そのValues の並びの?に? 496 * "G" と???を設定して下さ?? 497 * 例?000,G 基準1??000の直線?基準2?、グラ?と?意味? 498 * 499 * @og.rev 4.1.1.0 (2008/02/21) 基準ラインにグラフを使用する場合?位置?? 500 * 501 * @param mkVal マ?カーラインの設定?配? 502 * @see #setMarkColors( String[] ) 503 */ 504 public void setMarkValues( final String[] mkVal ) { 505 if( mkVal != null && mkVal.length > 0 ) { 506 int size = mkVal.length; 507 markValues = new double[size]; 508 for( int i=0; i<size; i++ ) { 509 if( "G".equals( mkVal[i] ) ) { 510 dynamicOCadrs = i; 511 markValues[i] = 0.0; 512 } 513 else { 514 markValues[i] = Double.parseDouble( mkVal[i] ); 515 } 516 } 517 } 518 } 519 520 /** 521 * マ?カーラインの色を?列指定します? 522 * 523 * マ?カーラインとは、縦軸設定?ラインの事で、縦軸の設定?(markValues)に 524 * 横方向にラインを付与します?こ?ラインの色を?カンマ区?形式で 525 * ?します? 526 * markValues と、あわせて設定する?があります? 527 * 個数が異なる?合?、markValues が優先され?無??場合?、Color.REDで 528 * 表示されます? 529 * 530 * <pre> 531 * BLACK , BLUE , CYAN , DARK_GRAY , GRAY , GREEN , LIGHT_GRAY , 532 * MAGENTA , ORANGE , PINK , RED , WHITE , YELLOW , (PURPLE) 533 * #XXXXXX形式?16bitRGB表?でも指定可能です? 534 * </pre> 535 * 536 * @param mkCol マ?カーラインの色配? 537 * @see java.awt.Color#BLACK 538 * @see #setMarkValues( String[] ) 539 */ 540 public void setMarkColors( final String[] mkCol ) { 541 if( mkCol != null && mkCol.length > 0 ) { 542 int size = mkCol.length; 543 markColors = new Color[size]; 544 for( int i=0; i<size; i++ ) { 545 markColors[i] = StringUtil.getColorInstance( mkCol[i] ); 546 } 547 } 548 } 549 550 /** 551 * マ?カーライン描画時に、その設定?を表示します? 552 * 553 * マ?カーラインの縦軸の設定?(markValues)に、設定?をラベル表示します? 554 * 位置は、TextAnchor.BASELINE_LEFT 固定です? 555 * 初期値は、表示する(true)です? 556 * 557 * @og.rev 4.1.1.0 (2008/02/04) 新規追? 558 * 559 * @param useAnchor true:設定?を表示する? 560 */ 561 public void setUseMarkAnchor( final boolean useAnchor ) { 562 useMarkAnchor = useAnchor ; 563 } 564 565 /** 566 * マ?カーラインの?時?Shape色をカンマ区?形式で??します? 567 * 568 * HybsLine でのみ使用可能です? 569 * マ?カーラインを使用する場合に、そのラインを?な?、?る色を指定します? 570 * こ?色の??、?ーカーラインの色??ーカーラインの設定?の個数?1に 571 * なります?つまり?色?:設定??:色?:設定??:色??となります? 572 * 色??、設定??より小さ??合に使用され、色??、設定??より大きく? 573 * 設定??より小さ??合?色??、設定??より大きい場合になります? 574 * 575 * ?文字?は、java.awt.Color クラスのstatic フィールド名で?します? 576 * BLACK , BLUE , CYAN , DARK_GRAY , GRAY , GREEN , LIGHT_GRAY , 577 * MAGENTA , ORANGE , PINK , RED , WHITE , YELLOW , (PURPLE) が指定できます? 578 * また?#XXXXXX形式?16bitRGB表?でも指定可能です? 579 * markValues と、あわせて設定する?があります? 580 * どちらかが??されて???合?、?ーカー表示されません? 581 * <pre> 582 * BLACK , BLUE , CYAN , DARK_GRAY , GRAY , GREEN , LIGHT_GRAY , 583 * MAGENTA , ORANGE , PINK , RED , WHITE , YELLOW , (PURPLE) 584 * #XXXXXX形式?16bitRGB表?でも指定可能です? 585 * </pre> 586 * 587 * @og.rev 4.0.3.0 (2008/01/07) 新規追? 588 * 589 * @param ovCol マ?カーラインの?時?Shape色 590 * @see java.awt.Color#BLACK 591 */ 592 public void setMarkOverColors( final String[] ovCol ) { 593 if( ovCol != null && ovCol.length > 0 ) { 594 int size = ovCol.length; 595 markOverColors = new Color[size]; 596 for( int i=0; i<size; i++ ) { 597 markOverColors[i] = StringUtil.getColorInstance( ovCol[i] ); 598 } 599 } 600 } 601 602 /** 603 * マ?カーラインの?時?Shape色を規定するオブジェクトを返します? 604 * 605 * HybsLine でのみ使用可能です? 606 * 設定情報が存在しな??合?、null を返します? 607 * 608 * @og.rev 4.0.3.0 (2008/01/07) 新規追? 609 * @og.rev 4.1.1.0 (2008/02/04) markColors 属?追? 610 * @og.rev 4.1.1.1 (2008/02/25) markValues での "G" ?を?? 611 * 612 * @return マ?カーラインの?時?Shape色管?ブジェク? 613 */ 614 private ValueMarkOverColors getValueMarkOverColors() { 615 ValueMarkOverColors vmoc = null; 616 617 if( markValues != null && markOverColors != null && 618 markValues.length + 1 == markOverColors.length && 619 markValues.length >= 1 ) { 620 int dynAdrs = (dynamicOCadrs >= 0) ? dynamicOCadrs : 0 ; 621 622 vmoc = new ValueMarkOverColors( 623 markValues, 624 markOverColors, 625 markColors[dynAdrs], 626 dynamicOCadrs 627 ); 628 } 629 630 return vmoc ; 631 } 632 633 /** 634 * 動的なマ?カーラインの基準シリーズ番号を設定しま?初期値:-1)? 635 * 636 * 動的なマ?カーラインを使用する場合?、基準?となるシリーズ番号を指定します? 637 * 638 * マ?カーラインの?位閾値に相当します?これは、グラフ化されますが? 639 * Shape は自動的に削除されます? 640 * こ?設定を使用する場合???の??タには、?Shapeが付きます?それ以外? 641 * ??タに、Shape を付けるかど?は、shapesVisible 属?で?します? 642 * こ?線?色は、markColors で?した??位?色になります?また? 643 * markValues で?した??位?値は、使用されません。た?、色?? 644 * 関係上?設定しておく?があります? 645 * また?isValueVisible == true で、設定?の値表示を行う場合も、最下位? 646 * 値は表示しな??します? 647 * 初期値は、使用しな?-1)です? 648 * 649 * @og.rev 4.1.1.0 (2008/02/04) 新規追? 650 * @og.rev 4.1.1.0 (2008/02/19) setUseDynamicOC ?setDynamicOCNo 651 * 652 * @param ocNo 動的なマ?カーラインの基準シリーズ番号 653 */ 654 public void setDynamicOCNo( final int ocNo ) { 655 dynamicOCNo = ocNo; 656 } 657 658 /** 659 * マ?カーラインの ValueMarker オブジェクト?列を返します? 660 * 661 * マ?カーライン は、markValues(double配?) と markColors(Color配?) 662 * より、ValueMarker オブジェクトを??次配?化して?ます? 663 * useMarkAnchor == true の場合?、設定?(markValues) の Anchor ? 664 * 表示します?位置は、TextAnchor.BASELINE_LEFT 固定です? 665 * dynamicOCNo が指定された場合?、最下位?閾値は使用しません? 666 * 667 * @og.rev 4.1.1.0 (2008/02/04) useMarkAnchor 属?追? 668 * @og.rev 4.1.1.0 (2008/02/04) 動的なオーバ?カラー useDynamicOC 属?追? 669 * 670 * @return マ?カーラインのオブジェクト??not null) 671 * @see java.awt.Color#BLACK 672 * @see #setMarkValues( String[] ) 673 * @see #setMarkColors( String[] ) 674 * @see #setUseMarkAnchor( boolean ) 675 */ 676 protected ValueMarker[] getValueMarkers() { 677 List<ValueMarker> markerList = new ArrayList<ValueMarker>(); 678 int size = (markValues == null) ? 0 : markValues.length; 679 for( int i=0; i<size; i++ ) { 680 if( i != dynamicOCadrs ) { 681 ValueMarker marker = new ValueMarker( markValues[i] ); 682 marker.setPaint( markColors[i] ); 683 if( useMarkAnchor ) { 684 marker.setLabel( String.valueOf( markValues[i] ) ); 685 marker.setLabelTextAnchor( TextAnchor.BASELINE_LEFT ); 686 } 687 markerList.add( marker ); 688 } 689 } 690 691 return markerList.toArray( new ValueMarker[markerList.size()] ); 692 } 693 694 /** 695 * チャート?縦軸の??をセ?しま?初期値:自動計?? 696 * 697 * 何も?しな??合?、データの??から、?動的に計算します? 698 * 699 * @param lowBnd 縦軸の?? 700 * @see #setUpperBound( String ) 701 */ 702 public void setLowerBound( final String lowBnd ) { 703 if( lowBnd != null && lowBnd.length() > 0 ) { 704 lowerBound = lowBnd; 705 } 706 } 707 708 /** 709 * チャート?縦軸の?値をセ?しま?初期値:自動計?? 710 * 711 * 何も?しな??合?、データの?値から、?動的に計算します? 712 * 713 * @param upBnd 縦軸の?値 714 * @see #setLowerBound( String ) 715 */ 716 public void setUpperBound( final String upBnd ) { 717 if( upBnd != null && upBnd.length() > 0 ) { 718 upperBound = upBnd; 719 } 720 } 721 722 /** 723 * チャート?縦軸の目盛??セ?しま?初期値:自動計?? 724 * 725 * 何も?しな??合?、データの?から、?動的に計算します? 726 * 727 * @og.rev 4.0.3.0 (2008/01/07) 新規追? 728 * 729 * @param size 縦軸のチック(目?の? 730 */ 731 public void setTickSize( final String size ) { 732 if( size != null && size.length() > 0 ) { 733 tickSize = size; 734 } 735 } 736 737 /** 738 * バ?チャート?グラ??ション処?行うかど?[true/false]をセ?しま?初期値:true)? 739 * 740 * 通常のバ?チャート?、単?表示で表されますが、これにグラ??ション効果を 741 * 付加するかど?を指定します? 742 * 通常のバ?チャートが、少しきれ?見えます? 743 * 初期値は、true(グラ??ション効果を付与す?です? 744 * 745 * @param useGrad グラ??ション処?[true:する/false:しない] 746 */ 747 public void setUseGradient( final boolean useGrad ) { 748 useGradient = useGrad; 749 } 750 751 /** 752 * バ?チャート?グラ??ション処?行うかど?を取得します? 753 * 754 * 通常のバ?チャート?、単?表示で表されますが、これにグラ??ション効果を 755 * 付加するかど?を指定します? 756 * 通常のバ?チャートが、少しきれ?見えます? 757 * 初期値は、false(使用しな?です? 758 * 759 * @return グラ??ション処?する:true/しな?false) 760 * @see #setUseGradient( boolean ) 761 */ 762 protected boolean isUseGradient() { return useGradient; } 763 764 /** 765 * ラインチャート?ポイントを四角表示するかど?を指定しま?初期値:false)? 766 * 767 * ラインチャート???常、線?で表され、各ポイントにつ?も?線?で接続されます? 768 * shapesVisible ?true に設定すると、各ポイントが、線上に四角く表示され? 769 * そ?ポイント?位置を?容易に判断出来るよ?なります? 770 * 初期値は、?ーカーを?れません? 771 * 772 * @param shVisible ポイントを四角表示するかど? 773 */ 774 public void setShapesVisible( final boolean shVisible ) { 775 shapesVisible = shVisible; 776 } 777 778 /** 779 * ラインチャート?ポイントを四角表示するかど?を取得します? 780 * 781 * ラインチャート???常、線?で表され、各ポイントにつ?も?線?で接続されます? 782 * shapesVisible ?true に設定すると、各ポイントが、線上に四角く表示され? 783 * そ?ポイント?位置を?容易に判断出来るよ?なります? 784 * 初期値は、?ーカーを?れません? 785 * 786 * @return ポイントを四角表示するかど? 787 * @see #setShapesVisible( boolean ) 788 */ 789 protected boolean isShapesVisible() { return shapesVisible; } 790 791 /** 792 * ??タ毎にShapeを?り替える時?色の繰返しパターンを文字?配?で?します? 793 * 794 * HybsLine でのみ使用可能です? 795 * これは、データそ?も?が?繰返し性のある場合に、その繰返し性に対応し? 796 * 形状のShape を表示させる?合に使用します? 797 * 繰返しShapeの形状は、JFreeChart のシリーズ毎?繰返し標準形状を使用します? 798 * 現在のバ?ジョンでは?0?までの繰返しに対応可能です? 799 * 繰返し色を??した????に使用されて?ます? 800 * 801 * ?文字?は、java.awt.Color クラスのstatic フィールド名で?します? 802 * BLACK , BLUE , CYAN , DARK_GRAY , GRAY , GREEN , LIGHT_GRAY , 803 * MAGENTA , ORANGE , PINK , RED , WHITE , YELLOW , (PURPLE) が指定できます? 804 * また?#XXXXXX形式?16bitRGB表?でも指定可能です? 805 * 806 * @og.rev 4.0.3.0 (2008/01/07) 新規追? 807 * 808 * @param colors ??タ毎?色の繰返しパターン(??配?) 809 * @see java.awt.Color#BLACK 810 */ 811 public void setShapeColors( final String[] colors ) { 812 if( colors != null && colors.length > 0 ) { 813 int size = colors.length; 814 shapeColors = new Color[size]; 815 for( int i=0; i<size; i++ ) { 816 shapeColors[i] = StringUtil.getColorInstance( colors[i] ); 817 } 818 } 819 } 820 821 /** 822 * shapeの大きさを??定で変更しま?初期値:null)? 823 * 824 * ラインチャート?Shape(?ラフ?ポイント?マ?カー)の大きさは??常は? 825 * 自動設定されます? 826 * こ?大きさを?倍率?で、変更可能です? 827 * ??、double 型です? 828 * 初期値は、null は、スケール変更しません(自動設定?ままの大きさ) 829 * 830 * @og.rev 4.1.1.0 (2008/02/04) 新規追? 831 * 832 * @param scale shapeの大きさの倍率 833 */ 834 public void setShapeScale( final String scale ) { 835 shapeScale = scale; 836 } 837 838 /** 839 * ラインチャート?線をドットラインにするかど?を指定しま?初期値:false)? 840 * 841 * ラインチャート???常、線?で表されます? 842 * これに、点線で表すことで、グラフ?違いを?色?でなく形状でも識別 843 * しやすくすることが可能です? 844 * 初期値は、線?です? 845 * 846 * @param useDotLine ドットラインにするかど? 847 */ 848 public void setUseDottedLine( final boolean useDotLine ) { 849 useDottedLine = useDotLine; 850 } 851 852 /** 853 * ラインチャート?線をドットラインにするかど?を取得します? 854 * 855 * ラインチャート???常、線?で表されます? 856 * これに、点線で表すことで、グラフ?違いを?色?でなく形状でも識別 857 * しやすくすることが可能です? 858 * 初期値は、線?です? 859 * 860 * @return ドットラインにするかど? 861 * @see #setUseDottedLine( boolean ) 862 */ 863 protected boolean isUseDottedLine() { return useDottedLine; } 864 865 /** 866 * ?チャート描画時?チャート色の繰返しパターンを文字?配?で?します? 867 * 868 * 通常、?のチャートを同時に表示させる?合?、縦軸が?通であれば? 869 * ?回のSelect????タを取得します? 870 * こ?、データをシリーズと呼んでおり、これを区別する為に、色を?けます? 871 * 初期値は、JFreeChart が?動で割り振ります? 872 * これを?外部からCVS形式で、カンマ区?で色コードを?します? 873 * ?データが多い場合?、多い??色は使用されません。少な??合?? 874 * ?に繰り返して使用されます? 875 * 例えば?色??した?合?、すべてのシリーズが同じ色で表されます? 876 * 877 * ?文字?は、java.awt.Color クラスのstatic フィールド名で?します? 878 * BLACK , BLUE , CYAN , DARK_GRAY , GRAY , GREEN , LIGHT_GRAY , 879 * MAGENTA , ORANGE , PINK , RED , WHITE , YELLOW , (PURPLE) が指定できます? 880 * また?#XXXXXX形式?16bitRGB表?でも指定可能です? 881 * 882 * @param colors チャート色の繰返しパターン(??配?) 883 * @see java.awt.Color#BLACK 884 */ 885 public void setSeriesColors( final String[] colors ) { 886 if( colors != null && colors.length > 0 ) { 887 int size = colors.length; 888 seriesColors = new Color[size]; 889 for( int i=0; i<size; i++ ) { 890 seriesColors[i] = StringUtil.getColorInstance( colors[i] ); 891 } 892 } 893 } 894 895 /** 896 * ?チャート描画時?チャート色の繰返しパターンをColor配?で?します? 897 * 898 * @return チャート色の繰返しパターン(Color配?) 899 * @see #setSeriesColors( String[] ) 900 */ 901 protected Color[] getSeriesColors() { 902 return seriesColors ; 903 } 904 905 /** 906 * Value(縦軸)のラベルを表示するかど?を指定しま?初期値:true[表示する])? 907 * 908 * ValueAxis にて設定される、縦軸??の、ラベルを表示するかど??します? 909 * 初期値は、true(表示する)です? 910 * 911 * @og.rev 4.0.2.0 (2007/12/20) 新規追? 912 * 913 * @param labelsVisible Value(縦軸)のラベルを表示するかど? 914 */ 915 public void setValueLabelsVisible( final boolean labelsVisible ) { 916 isLabelsVisible = labelsVisible; 917 } 918 919 /** 920 * Value(縦軸)のマ?カーを表示するかど?を指定しま?初期値:true[表示する])? 921 * 922 * ValueAxis にて設定される、縦軸??の、?ーカーを表示するかど??します? 923 * 初期値は、true(表示する)です? 924 * 925 * @og.rev 4.0.2.0 (2007/12/20) 新規追? 926 * 927 * @param marksVisible Value(縦軸)のマ?カーを表示するかど? 928 */ 929 public void setValueMarksVisible( final boolean marksVisible ) { 930 isMarksVisible = marksVisible; 931 } 932 933 /** 934 * ??タの値(itemText)を表示するかど?[true/false/last]を指定しま?初期値:false[表示しない])? 935 * 936 * CategoryItemRenderer 関連のグラフ?設定?をグラフ上に表示するかど?? 937 * ?します? 938 * true に設定した?合?通常の場合?、すべてのシリーズにラベル表示されます? 939 * false に設定すると、表示されません? 940 * last を設定すると、各シリーズの??値のみ表示されます? 941 * ChartCreate クラスに、seriesPikup が設定されて?場合?、指定?シリーズ 942 * のみの設定?を表示し?他?値は、表示しません? 943 * 同様に、dynamicOCNo が指定されて?場?動的なマ?カーライン) 944 * ??シリーズは?値として使用されるため?設定?は表示されません? 945 * ラベルの表示位置は、表示する線グラフ?傾きに応じてラベルの表示場? 946 * 変えます?山形、右坂?谷形、左?に応じて、上中、下右、下中、上右 に 947 * 位置を設定します?右にずらす?は?0 ピクセル固定です? 948 * 初期値は、false(表示しな?です? 949 * 950 * @og.rev 4.1.1.0 (2008/02/04) 新規追? 951 * @og.rev 4.1.2.0 (2008/03/12) ??のまま、受け取りるように変更 952 * 953 * @param visible ??タの値の表示のさせ方 [true/false/last] 954 * @see ChartCreate#setSeriesPikup( int ) 955 */ 956 public void setItemLabelVisible( final String visible ) { 957 if( "true".equalsIgnoreCase( visible ) ) { 958 isItemValVisible = true; 959 } 960 else if( "last".equalsIgnoreCase( visible ) ) { 961 isItemValVisible = true; 962 isItemLastVisible = true; 963 } 964 else if( visible != null && !"false".equalsIgnoreCase( visible ) ) { 965 String errMsg = "itemLabelVisible は、?true,false,last」から指定してください?" 966 + visible + "]"; 967 throw new HybsSystemException( errMsg ); 968 } 969 } 970 971 /** 972 * ??タの値(itemText)の表示に桁区??を使用するかど?を指定します? 973 * 974 * itemLabelVisible=true 時に、表示されるデータ値ラベルで? 975 * NumberFormat して?すが?桁区???123,456,789.0) の 976 * 区?記号を表示するかど?を指定します? 977 * true を指定すると、表示します?false では、表示しません? 978 * 初期値は、true(使用する)です? 979 * 980 * @og.rev 4.1.2.0 (2008/03/12) 新規追? 981 * 982 * @param used 桁区??を使用するかど? 983 */ 984 public void setUseItemLabelSep( final boolean used ) { 985 useItemLabelSep = used; 986 } 987 988 /** 989 * 縦軸の表示領域INSET値(double)を指定します? 990 * 991 * 縦軸?表示領域(NumberAxis)の??追??を設定します? 992 * これは??常の表示領域の左側にスペ?スを挿入します? 993 * あくまで、追?る?なので、文字?長さ?含まれません? 994 * 何も?しな??合?、設定しません? 995 * 996 * @og.rev 4.0.3.0 (2008/01/07) 新規追? 997 * 998 * @param inset Value(縦軸)の表示領域INSET値 999 */ 1000 public void setValueInset( final String inset ) { 1001 valueInset = inset; 1002 } 1003 1004 /** 1005 * BOXチャート?バ??double)を指定します? 1006 * 1007 * BOXチャート?バ??double)を指定します? 1008 * 設定されるのは、org.jfree.chart.renderer.category.BarRenderer ? 1009 * 使用した描画のみです? 1010 * 棒グラフ?バ??定?、直接、CategoryItemRendererState に設定して?す? 1011 * 通常は、barMaxWidth(0.0??.0)とbarItemMargin(0.0??.0)を用?比率で?します? 1012 * 何も?しな??合?、設定しません? 1013 * 1014 * @og.rev 4.0.3.0 (2008/01/07) 新規追? 1015 * 1016 * @param width BOXチャート?バ??double) 1017 */ 1018 public void setBarWidth( final String width ) { 1019 barWidth = width; 1020 } 1021 1022 /** 1023 * BOXチャート?バ??double)を取得します? 1024 * 1025 * 設定されるのは、org.jfree.chart.renderer.category.BarRenderer ? 1026 * 使用した描画のみです? 1027 * 棒グラフ?バ??定?、直接、CategoryItemRendererState に設定して?す? 1028 * 通常は、barMaxWidth(0.0??.0)とbarItemMargin(0.0??.0)を用?比率で?します? 1029 * 何も?しな??合?、設定しません? 1030 * 1031 * @og.rev 4.0.3.0 (2008/01/07) 新規追? 1032 * 1033 * @return BOXチャート?バ??double)の?? 1034 */ 1035 protected String getBarWidth() { 1036 return barWidth ; 1037 } 1038 1039 /** 1040 * BOXチャート?バ????値(0.0??.0)を指定します? 1041 * 1042 * BOXチャート?バ???比率の?値を指定します? 1043 * 表示領域を1として小数点以下?数値で棒??設定します? 1044 * 設定した?無?ある時?適当なサイズに調整されます? 1045 * (小さくしたときには棒が線?ようにな? 1046 * 設定されるのは、org.jfree.chart.renderer.category.BarRenderer ? 1047 * 使用した描画のみです? 1048 * 何も?しな??合?、設定しません? 1049 * 1050 * @og.rev 4.0.2.0 (2007/12/20) 新規追? 1051 * 1052 * @param barWidth BOXチャート?バ????値(0.0??.0) 1053 */ 1054 public void setBarMaxWidth( final String barWidth ) { 1055 maxBarWidth = barWidth; 1056 } 1057 1058 /** 1059 * BOXチャート?バ?アイ?のマ?ジン(0.0??.0)を指定します? 1060 * 1061 * BOXチャート?バ?アイ?のマ?ジンの比率を指定します? 1062 * 棒?間を表示領域を1として小数点以下?数値で?設定します? 1063 * 無?ある時?適当なサイズに調整されます? 1064 * barMaxWidth より優先されます? 1065 * 設定されるのは、org.jfree.chart.renderer.category.BarRenderer ? 1066 * 使用した描画のみです? 1067 * 何も?しな??合?、設定しません? 1068 * 1069 * @og.rev 4.0.2.0 (2007/12/20) 新規追? 1070 * 1071 * @param margin BOXチャート?バ?アイ?のマ?ジン(0.0??.0) 1072 */ 1073 public void setBarItemMargin( final String margin ) { 1074 itemMargin = margin; 1075 } 1076 1077 /** 1078 * 表示下限値(これ以下???タは未表示)の値(double)を指定します? 1079 * 1080 * HybsLine でのみ使用可能です? 1081 * こ?設定?以下???タは、存在しな??します? 1082 * Lineを引くとき?こ???タと、存在して???タ間にラインは引かれません? 1083 * 何も?しな??合?、設定しません? 1084 * 1085 * @og.rev 4.0.3.0 (2008/01/07) 新規追? 1086 * 1087 * @param limit 表示下限値(これ以下???タは未表示) 1088 */ 1089 public void setVisibleLimit( final String limit ) { 1090 visibleLimit = limit; 1091 } 1092 1093 /** 1094 * グラフ?書き?し位置の調整比率を指定します? 1095 * 1096 * グラフを描画する場合?、書き?し位置を少しずらします? 1097 * これは、グラフ??対して、比率で?します? 1098 * 0.0(初期値)の場合?、?期描画位置である、CategoryAnchor.Middle と 1099 * 同じ?から、書き?されます? 1100 * 1.0 の場合?中?ら?グラフ??半?が加算され?END位置に?ます? 1101 * 同様に?1.0 の場合?、グラフ??半?が減算され?START 位置になります? 1102 * つまり?中?ら?グラフ??半?単位で、前方/後方にずらす事が出来ます? 1103 * 書き?し位置 ??中?Middle) + (domainMargin)???? 1104 * 初期値は?.0(真ん中:MIDDLE)です? 1105 * 1106 * @og.rev 4.1.1.0 (2008/02/14) 新規追? 1107 * 1108 * @param margin グラフ?書き?し位置の調整比率 1109 */ 1110 public void setDomainMargin( final double margin ) { 1111 domainMargin = margin; 1112 } 1113 1114 /** 1115 * 時刻を表す?合?表現の仕方を指定しま?初期値:null)? 1116 * 1117 * HybsNumberAxis にオーバ?ライドす?時間を表示する DecimalFormat の?クラスを利用するに当たり? 1118 * 時刻の表示方法を?します? 1119 * 外部から与える数字???続して??があるため?0?数です? 1120 * たとえ??700 ?17:00 , 2150 ?21:30 と?感じです? 1121 * 2400 を?ると日付違?なります? 1122 * 1123 * 英語表?:)と日本語表??の区別と?4時間を?る?合?表示方法によって?種類?パターンが存在します? 1124 * ?1:そ?まま?4:00 となり??されて?? 1125 * ?2:そ?まま?:00 に戻る?(日付?無? 1126 * ?3:そ?まま? 00:00 と日付が付与される? 1127 * ?1:そ?まま?4?0?となり??されて?? 1128 * ?2:そ?まま?0?0?に戻る?(日付?無? 1129 * ?3:そ?まま?日 00?0?と日付が付与される? 1130 * 初期値は、使用しな?-1)です? 1131 * 1132 * @og.rev 5.5.2.1 (2012/05/07) 新規追? 1133 * 1134 * @param type 時刻の表示方?[E1/E2/E3/H1/H2/H3] 1135 */ 1136 public void setTimeFormatType( final String type ) { 1137 timeFormatType = type; 1138 } 1139 1140 /** 1141 * ラベルの表示向きを縦にするかど?[true/false]を指定しま?初期値:false)? 1142 * 1143 * ChartCreate の rotationLabel は、角度を指定できましたが?NumberAxis では? 1144 * 縦にするかど?の?しかできません? 1145 * ここでは、true を指定するとラベルは、縦書きになります? 1146 * 初期値は、false(横書?です? 1147 * 1148 * @og.rev 5.5.2.1 (2012/05/07) 新規追? 1149 * 1150 * @param useVLavels ラベルの表示向き [false:横書?:true:縦書き] 1151 */ 1152 public void setUseVerticalLabels( final boolean useVLavels ) { 1153 useVerticalLabels = useVLavels; 1154 } 1155 1156 /** 1157 * MeterPlot に?な??を設定します? 1158 * 1159 * これは、ChartDataset(こ?クラス)に?な getterメソ?を用意して? 1160 * 利用側のクラス(ChartPlot_Pie) でセ?すべきですが、メソ?が増える?で? 1161 * こちらに MeterPlotオブジェクトを渡して、メソ?数を減らそうとして??です? 1162 * 1163 * lowerBound は、最小?(low) 1164 * upperBound は、最大値(upp) 1165 * markValues 値,A,B,C 1166 * markOverColors GREEN,BLUE,YELLOW,RED 1167 * low-A⇒GREEN , A-B⇒BLUE , B-C⇒YELLOW , C-upp⇒RED で、MeterIntervalを指定します? 1168 * 1169 * shapeColors に、NeedlePaint,ValuePaint,TickPaint,TickLabelPaint,DialBackgroundPaint,DialOutlinePaint を指定できます? 1170 * 初期値は、BLACK,BLACK,BLACK,BLACK,透?,BLACK です? 1171 * needleType に、DialShape の?キ??ー??として、CHORD,CIRCLE,PIE が指定可能です? 1172 * ?方法としては、taglib上で、chartType ?時に、Meter_PIE などと?します? 1173 * shapeScale は、MeterAngle(メーターの表示角度) を指定できます? 1174 * valueLabel は、MeterInterval の規定?(値,A,B,C) に対応した?例ラベルです? 1175 * 1176 * @og.rev 5.7.8.0 (2014/07/04) 新規追? 1177 * 1178 * @return 値をセ?し終わった?MeterPlotオブジェク? 1179 */ 1180 protected Plot makeMeterPlot() { 1181 MeterPlot mplot = new MeterPlot(); 1182 1183 // ?(上限、下限)?? 1184 double low= lowerBound == null ? 0.0 : Double.parseDouble( lowerBound ) ; 1185 double upp= upperBound == null ? 100.0 : Double.parseDouble( upperBound ) ; 1186 mplot.setRange( new Range( low, upp ) ); 1187 1188 // markValues 値,A,B,C 1189 // markOverColors GREEN,BLUE,YELLOW,RED 1190 // low-A⇒GREEN , A-B⇒BLUE , B-C⇒YELLOW , C-upp⇒RED 1191 // ?の??MeterInterval)は、markValues に?番目の値が設定された場合に行う? 1192 if( markValues != null && markValues.length > 1 ) { 1193 int size = markValues.length ; 1194 if( markOverColors != null && size == markOverColors.length ) { 1195 1196 // BasicStroke に、大きな値を指定すると?始位置がずれてしま?? 1197 BasicStroke bs = new BasicStroke( 2.0F ); 1198 1199 // valueLabel は、markValues の規定?(A,B,C) に対応した?例ラベルです? 1200 String[] lbls = StringUtil.csv2Array( valueLabel ); 1201 int lblSize = lbls.length ; 1202 int j = 0; // ラベルの配?番号 1203 1204 double st = low; 1205 for( int i=1; i<=size; i++ ) { 1206 double en = i<size ? markValues[i] : upp ; 1207 Color co1 = markOverColors[i-1]; 1208 Color co2 = new Color( co1.getRed() , co1.getGreen() , co1.getBlue() , 128 ); // 透過色(半?? 1209 String lbl = j < lblSize ? lbls[j++] : "" ; 1210 mplot.addInterval( new MeterInterval( lbl, new Range( st, en ), co1, bs, co2 ) ); 1211 st = en ; 1212 } 1213 } 1214 else { 1215 String errMsg = "Meter で、markValues を??する?合?、同じ数のmarkOverColorsの?が?です?" 1216 + HybsSystem.CR ; 1217 throw new HybsSystemException( errMsg ); 1218 } 1219 } 1220 1221 // ?の??MeterInterval) のサンプル 1222 // mplot.addInterval(new MeterInterval("Battery LOW", new Range(0.0, 10.0), 1223 // Color.RED, new BasicStroke(2.0F), new Color(255, 0, 0, 128))); 1224 // mplot.addInterval(new MeterInterval("Moderate", new Range(10.0, 90.0), 1225 // Color.YELLOW, new BasicStroke(2.0F), new Color(255, 255, 0, 64))); 1226 // mplot.addInterval(new MeterInterval("Battery FULL", new Range(90.0, 100.0), 1227 // Color.GREEN, new BasicStroke(2.0F), new Color(0, 255, 0, 64))); 1228 1229 // TickSize を設定?null なら?、?期?を使??で、設定しな?? 1230 if( tickSize != null ) { 1231 mplot.setTickSize( Double.parseDouble( tickSize ) ); 1232 } 1233 1234 // shapeColors に、NeedlePaint,ValuePaint,TickPaint,TickLabelPaint,DialBackgroundPaint,DialOutlinePaint を指定できます? 1235 // NeedlePaint , ValuePaint , TickPaint , TickLabelPaint , DialBackgroundPaint(=透?) , DialOutlinePaint 1236 Color[] shCols = new Color[] { Color.BLACK , Color.BLACK , Color.BLACK , Color.BLACK , new Color(255, 255, 255, 0), Color.BLACK }; // 初期値 1237 if( shapeColors != null && shapeColors.length > 0 ) { 1238 for( int i=0; i<shapeColors.length; i++ ) { 1239 shCols[i] = shapeColors[i]; 1240 } 1241 } 1242 mplot.setNeedlePaint( shCols[0] ); // 針?色 1243 mplot.setValuePaint( shCols[1] ); // 値の色 1244 mplot.setTickPaint( shCols[2] ); // メモリの色 1245 mplot.setTickLabelPaint( shCols[3] ); // メモリの??色 1246 mplot.setDialBackgroundPaint( shCols[4] ); // 背景色 1247 mplot.setDialOutlinePaint( shCols[5] ); // セ?しても?表示が変わらな?? 1248 1249 // needleType 属?で、DialShape を指定できます? 1250 DialShape dshape = DialShape.CIRCLE ; // 初期値 1251 if( needleType != null ) { 1252 if( "CHORD".equalsIgnoreCase( needleType ) ) { dshape = DialShape.CHORD; } 1253 else if( "CIRCLE".equalsIgnoreCase( needleType ) ) { dshape = DialShape.CIRCLE; } // 初期値 1254 else if( "PIE".equalsIgnoreCase( needleType ) ) { dshape = DialShape.PIE; } 1255 } 1256 mplot.setDialShape( dshape ); // CHORD,CIRCLE,PIE 1257 1258 // shapeScale は、MeterAngle(メーターの表示角度) を指? 1259 if( shapeScale != null ) { 1260 mplot.setMeterAngle( Integer.parseInt( shapeScale ) ); 1261 } 1262 1263 // isLabelsVisible ?? 1264 mplot.setTickLabelsVisible( isLabelsVisible ); 1265 1266 // そ?他決め打ちの値設? 1267 // mplot.setValueFont(new Font("Arial", Font.BOLD, 14)); 1268 // mplot.setTickLabelFont(new Font("Arial", Font.BOLD, 14)); 1269 1270 mplot.setDataset( (ValueDataset)dataset ); 1271 return mplot; 1272 } 1273 1274 /** 1275 * ThermometerPlot に?な??を設定します? 1276 * 1277 * markValues 値,A,B 1278 * markOverColors GREEN,YELLOW,RED 1279 * xxx-low⇒GRAY , low-A⇒GREEN , A-B⇒YELLOW , B-upp⇒RED , upp-xxx⇒GRAY で、SubrangePaintを指定します? 1280 * markOverColors を指定しな??合?、ThermometerPlot.NORMAL , WARNING , CRITICAL が?に?されます? 1281 * これは、GREEN,YELLOW,RED になります? 1282 * 1283 * shapeColors に、ValuePaint,ThermometerPaint(温度計???,MercuryPaint を指定できます? 1284 * 1285 * @og.rev 5.7.8.0 (2014/07/04) 新規追? 1286 * 1287 * @return 値をセ?し終わった???ThermometerPlotオブジェク? 1288 */ 1289 protected Plot makeThermometerPlot() { 1290 ThermometerPlot tplot = new ThermometerPlot(); 1291 1292 // ?(上限、下限)?? 1293 double low= lowerBound == null ? 0.0 : Double.parseDouble( lowerBound ) ; 1294 double upp= upperBound == null ? 100.0 : Double.parseDouble( upperBound ) ; 1295 tplot.setRange( low , upp ); 1296 1297 // markValues 値,A,B,C 1298 // markOverColors GREEN,YELLOW,RED 1299 // low-A⇒Red , A-B⇒Yellow , B-C⇒Green , C-upp⇒Blue 1300 // ?の??MeterInterval)は、markValues に?番目の値が設定された場合に行う? 1301 if( markValues != null && markValues.length > 1 ) { 1302 int size = markValues.length ; 1303 1304 // markOverColors が存在して、?数が??して?ば、true 1305 boolean inCols = ( markOverColors != null && size == markOverColors.length ) ; 1306 if( inCols || markOverColors == null || markOverColors.length == 0 ) { 1307 double st = low; 1308 for( int i=1; i<=size; i++ ) { 1309 double en = i<size ? markValues[i] : upp ; 1310 // 第?数は、i(?)ではなく?サブレンジ番号(ThermometerPlot.NORMAL , WARNING , CRITICAL) 1311 tplot.setSubrange( i-1, st, en ); 1312 1313 if( inCols ) { 1314 Color co1 = markOverColors[i-1]; 1315 tplot.setSubrangePaint( i-1,co1 ); 1316 } 1317 st = en ; 1318 } 1319 } 1320 else { 1321 String errMsg = "Meter で、markValues を??する?合?、同じ数のmarkOverColorsの?が?です?" 1322 + HybsSystem.CR ; 1323 throw new HybsSystemException( errMsg ); 1324 } 1325 } 1326 1327 // ?の??setSubrange) のサンプル 1328 // tplot.setSubrange(ThermometerPlot.NORMAL , 0.0, 55.0); 1329 // tplot.setSubrange(ThermometerPlot.WARNING , 55.0, 75.0); 1330 // tplot.setSubrange(ThermometerPlot.CRITICAL, 75.0, 150.0); 1331 1332 // shapeColors に、ValuePaint,ThermometerPaint(温度計???,MercuryPaint を指定できます? 1333 // ValuePaint , ThermometerPaint , MercuryPaint 1334 Color[] shCols = new Color[] { Color.BLACK , Color.BLACK , Color.GRAY }; // 初期値 1335 if( shapeColors != null && shapeColors.length > 0 ) { 1336 for( int i=0; i<shapeColors.length; i++ ) { 1337 shCols[i] = shapeColors[i]; 1338 } 1339 } 1340 tplot.setValuePaint( shCols[0] ); // 値の色 1341 tplot.setThermometerPaint( shCols[1] ); // 温度計??? 1342 tplot.setMercuryPaint( shCols[2] ); // オーバ?時?色 1343 1344 // tplot.setValueFont(new Font("Arial", 1, 14)); 1345 1346 tplot.setDataset( (ValueDataset)dataset ); 1347 return tplot; 1348 } 1349 1350 /** 1351 * CompassPlot に?な??を設定します? 1352 * 1353 * shapeColors に、Compassの色を指定できます?(??は、SeriesPaint にセ?して?? 1354 * SeriesPaint,SeriesOutlinePaint,RoseCenterPaint,RoseHighlightPaint,RosePaint を指定します? 1355 * needleType には、MeterNeedle の?キ??ー??として、下記??種類が?可能です? 1356 * ??、Arrow,Line,Long,Pin,Plum,Pointer,Ship,Wind,Arrow,MiddlePin と???です? 1357 * 初期値は、Pointer です? 1358 * 1359 * @og.rev 5.7.8.0 (2014/07/04) 新規追? 1360 * 1361 * @return 値をセ?し終わった???CompassPlotオブジェク? 1362 */ 1363 protected Plot makeCompassPlot() { 1364 CompassPlot cplot = new CompassPlot(); 1365 1366 // Series ??? 固? 1367 final int serNo = 0; 1368 1369 // needleType 属?で、SeriesNeedle 番号を指定できます? 1370 int sNeedle = 5 ; // Pointer 1371 if( needleType != null ) { 1372 if( "Arrow".equalsIgnoreCase( needleType ) ) { sNeedle = 0; } // 0 = ArrowNeedle; 1373 else if( "Line".equalsIgnoreCase( needleType ) ) { sNeedle = 1; } // 1 = LineNeedle; 1374 else if( "Long".equalsIgnoreCase( needleType ) ) { sNeedle = 2; } // 2 = LongNeedle; 1375 else if( "Pin".equalsIgnoreCase( needleType ) ) { sNeedle = 3; } // 3 = PinNeedle; 1376 else if( "Plum".equalsIgnoreCase( needleType ) ) { sNeedle = 4; } // 4 = PlumNeedle; 1377 else if( "Pointer".equalsIgnoreCase( needleType ) ) { sNeedle = 5; } // 5 = PointerNeedle; 1378 else if( "Ship".equalsIgnoreCase( needleType ) ) { sNeedle = 6; } // 6 = ShipNeedle; 1379 else if( "Wind".equalsIgnoreCase( needleType ) ) { sNeedle = 7; } // 7 = WindNeedle; 1380 else if( "Arrow".equalsIgnoreCase( needleType ) ) { sNeedle = 8; } // 8 = ArrowNeedle; 1381 else if( "MiddlePin".equalsIgnoreCase( needleType ) ) { sNeedle = 9; } // 9 = MiddlePinNeedle; 1382 } 1383 cplot.setSeriesNeedle( serNo, sNeedle ); 1384 1385 // shapeColors に、SeriesPaint,SeriesOutlinePaint,RoseCenterPaint,RoseHighlightPaint,RosePaint を指? 1386 // SeriesPaint, SeriesOutlinePaint , RoseCenter , RoseHighlight, Rose 1387 Color[] shCols = new Color[] { Color.RED , Color.BLACK , Color.WHITE , Color.BLACK , Color.YELLOW }; // 初期値 1388 if( shapeColors != null && shapeColors.length > 0 ) { 1389 for( int i=0; i<shapeColors.length; i++ ) { 1390 shCols[i] = shapeColors[i]; 1391 } 1392 } 1393 cplot.setSeriesPaint( serNo, shCols[0] ); // 針?色 1394 cplot.setSeriesOutlinePaint( serNo, shCols[1] ); // 針???色 1395 cplot.setRoseCenterPaint( shCols[2] ); // ?盤の中?? 1396 cplot.setRoseHighlightPaint( shCols[3] ); // ?盤の??? 1397 cplot.setRosePaint( shCols[4] ); // ??塗りつぶし色 1398 1399 cplot.addDataset( (ValueDataset)dataset ); 1400 1401 return cplot; 1402 } 1403 1404 /** 1405 * HybsNumberAxis にオーバ?ライドす?時間を表示する DecimalFormat の?クラスを定義します? 1406 * 1407 * これは、ChartPlot_XY で使用する、HybsNumberAxis に対して、拡張します? 1408 * ??タが?時刻を表す?合?Date型?オブジェクトを利用して、org.jfree.chart.axis.PeriodAxis 1409 * を利用できればよいのですが、単なる数字で扱って?ケースがあり?時刻に?? 1410 * 変換するケースで使?す? 1411 * 外部から与える数字???続して??があるため?0?数です? 1412 * たとえ??700 ?17:00 , 2150 ?21:30 と?感じです? 1413 * 24時間を?る?合?? 1414 * Type1:そ?まま?:00 に戻る? 1415 * Type2:そ?まま?4:00 と、そのまま、加算されて?? 1416 * の?種類が用意されて?す? 1417 * 1418 * @og.rev 5.5.2.1 (2012/05/07) 新規追? 1419 * 1420 */ 1421 private static final class HybsTimeFormat extends DecimalFormat { 1422 /** For serialization. */ 1423 private static final long serialVersionUID = 201205075512L ; 1424 1425 private final boolean is24repeat ; 1426 private final boolean useDay ; 1427 1428 private final int hsCode ; 1429 1430 /** 1431 * コンストラクター 1432 * 1433 * 引数に、時刻を表す?合?表現の仕方を指定します? 1434 * ?1:そ?まま?4:00 となり??されて?? 1435 * ?2:そ?まま?:00 に戻る?(日付?無? 1436 * ?3:そ?まま? 00:00 と日付が付与される? 1437 * ?1:そ?まま?4?0?となり??されて?? 1438 * ?2:そ?まま?0?0?に戻る?(日付?無? 1439 * ?3:そ?まま?日 00?0?と日付が付与される? 1440 * 1441 * @param type 時刻の表示方?[E1/E2/E3/H1/H2/H3] 1442 */ 1443 public HybsTimeFormat( final String inType ) { 1444 super(); 1445 1446 DecimalFormatSymbols sym = new DecimalFormatSymbols(); 1447 if( "E1".equals( inType ) ) { 1448 applyPattern( "#0.00" ); 1449 sym.setDecimalSeparator( ':' ); 1450 is24repeat = false; useDay = false; 1451 } 1452 else if( "E2".equals( inType ) ) { 1453 applyPattern( "#0.00" ); 1454 sym.setDecimalSeparator( ':' ); 1455 is24repeat = true; useDay = false; 1456 } 1457 else if( "E3".equals( inType ) ) { 1458 applyPattern( "#,#0.00" ); 1459 sym.setDecimalSeparator( ':' ); 1460 sym.setGroupingSeparator( ' ' ); 1461 is24repeat = true; useDay = true; 1462 } 1463 else if( "H1".equals( inType ) ) { 1464 applyPattern( "#0.00? ); 1465 sym.setDecimalSeparator( '? ); 1466 is24repeat = false; useDay = false; 1467 } 1468 else if( "H2".equals( inType ) ) { 1469 applyPattern( "#0.00? ); 1470 sym.setDecimalSeparator( '? ); 1471 is24repeat = true; useDay = false; 1472 } 1473 else if( "H3".equals( inType ) ) { 1474 applyPattern( "#,#0.00? ); 1475 sym.setDecimalSeparator( '? ); 1476 sym.setGroupingSeparator( '日' ); 1477 is24repeat = true; useDay = true; 1478 } 1479 else { 1480 String errMsg = "timeFormatType は?E1/E2/E3/H1/H2/H3) から?してください。timeFormatType=[" + inType + "]" ; 1481 throw new HybsSystemException( errMsg ); 1482 } 1483 setDecimalFormatSymbols( sym ); 1484 1485 hsCode = super.hashCode() + Boolean.valueOf(is24repeat).hashCode() + Boolean.valueOf(useDay).hashCode(); 1486 } 1487 1488 /** 1489 * double をフォーマットして??を作?しま? format(double,StringBuffer,FieldPosition) のオーバ?ライ?) 1490 * 1491 * timeFormatType によって、データの処?変わります? 1492 * ?1:そ?まま?4:00 となり??されて?? 1493 * ?2:そ?まま?:00 に戻る?(日付?無? 1494 * ?3:そ?まま? 00:00 と日付が付与される? 1495 * ?1:そ?まま?4?0?となり??されて?? 1496 * ?2:そ?まま?0?0?に戻る?(日付?無? 1497 * ?3:そ?まま?日 00?0?と日付が付与される? 1498 * 1499 * @param number フォーマットす?double 1500 * @param result ?ストを追?る位置 1501 * @param fieldPos 入力では、?であれば位置合わせフィールド? 出力では、その位置合わせフィールド?オフセ? 1502 * @return フォーマットされた数値?? 1503 */ 1504 public StringBuffer format( final double number, final StringBuffer result, final FieldPosition fieldPos ) { 1505 int day = (int)(number/100/24); // 日付?端数は?捨てる? 1506 int hour = (int)(number/100); // 時間のみ取り出す? 1507 if( is24repeat ) { hour = hour%24; } // ?4時間を?た?合?余りのみ使用する? 1508 1509 int minute = (int)((number%100)*0.6); // 0.6 = 60/100 の事?100 ?60?となる? 1510 1511 double timeVal = hour + minute/100.0 ; 1512 if( useDay ) { timeVal = timeVal + day*100 ; } // 端数を?り捨てた日付に対して?00倍しておく? 1513 return super.format( timeVal, result, fieldPos ); 1514 } 1515 1516 /** 1517 * こ?オブジェクトと?されたオブジェクトを比?ます? 1518 * 1519 * @og.rev 5.5.2.4 (2012/05/16) 新規追?findbug対? 1520 * 1521 * @param anObject 比?れるオブジェク? 1522 * @return ?されたオブジェクトが等し??合? true、そ?な??合? false 1523 */ 1524 public boolean equals( final Object anObject ) { 1525 return this == anObject; 1526 } 1527 1528 /** 1529 * こ?オブジェクト?ハッシュコードを取得します? 1530 * 1531 * @og.rev 5.5.2.4 (2012/05/16) 新規追?findbug対? 1532 * 1533 * @return ハッシュコー? 1534 */ 1535 public int hashCode() { 1536 return hsCode; 1537 } 1538 } 1539 1540 /** 1541 * こ?オブジェクト???表現を返します? 1542 * 基本???目?使用します? 1543 * 1544 * @return こ?クラスの??表現 1545 */ 1546 @Override 1547 public String toString() { 1548 StringBuilder rtn = new StringBuilder( HybsSystem.BUFFER_MIDDLE ); 1549 1550 rtn.append( "[" ).append( this.getClass().getName() ).append( "]" ).append( HybsSystem.CR ); 1551 rtn.append( "chartType [" ).append( chartType ).append( "]" ).append( HybsSystem.CR ); 1552 rtn.append( "valueLabel [" ).append( valueLabel ).append( "]" ).append( HybsSystem.CR ); 1553 rtn.append( "markValues [" ).append( Arrays.toString( markValues ) ).append( "]" ).append( HybsSystem.CR ); 1554 rtn.append( "markColors [" ).append( Arrays.toString( markColors ) ).append( "]" ).append( HybsSystem.CR ); 1555 rtn.append( "lowerBound [" ).append( lowerBound ).append( "]" ).append( HybsSystem.CR ); 1556 rtn.append( "upperBound [" ).append( upperBound ).append( "]" ).append( HybsSystem.CR ); 1557 rtn.append( "useGradient [" ).append( useGradient ).append( "]" ).append( HybsSystem.CR ); 1558 rtn.append( "shapesVisible [" ).append( shapesVisible ).append( "]" ).append( HybsSystem.CR ); 1559 rtn.append( "useDottedLine [" ).append( useDottedLine ).append( "]" ).append( HybsSystem.CR ); 1560 1561 return rtn.toString(); 1562 } 1563 }