001/*
002 * Copyright (c) 2009 The openGion Project.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 *     http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
013 * either express or implied. See the License for the specific language
014 * governing permissions and limitations under the License.
015 */
016package org.opengion.hayabusa.io;
017
018import org.opengion.fukurou.util.StringUtil;
019import org.opengion.hayabusa.common.HybsSystem;
020import org.opengion.hayabusa.common.HybsSystemException;
021import org.opengion.hayabusa.db.DBTableModel;
022
023import java.util.List;
024import java.util.ArrayList;
025import java.util.Arrays;
026import java.awt.Color;
027import java.sql.Connection;
028import java.sql.SQLException;
029import java.text.NumberFormat;
030import java.text.DecimalFormat;                         // 5.5.2.1 (2012/05/07)
031import java.text.DecimalFormatSymbols;          // 5.5.2.1 (2012/05/07)
032import java.text.FieldPosition;                         // 5.5.2.1 (2012/05/07)
033
034import org.jfree.data.general.Dataset;
035import org.jfree.data.general.DefaultValueDataset;
036import org.jfree.data.general.ValueDataset;
037import org.jfree.chart.plot.ValueMarker;
038import org.jfree.chart.axis.NumberAxis;
039import org.jfree.chart.axis.NumberTickUnit;
040import org.jfree.chart.renderer.category.CategoryItemRenderer;
041import org.jfree.chart.renderer.category.BarRenderer;
042import org.jfree.chart.renderer.category.LineAndShapeRenderer;
043import org.jfree.chart.labels.CategoryItemLabelGenerator;
044import org.jfree.chart.labels.StandardCategoryItemLabelGenerator;
045import org.jfree.chart.urls.CategoryURLGenerator;
046import org.jfree.ui.RectangleInsets;
047import org.jfree.ui.TextAnchor;
048
049import org.jfree.chart.plot.MeterPlot;                  // 5.7.8.0 (2014/07/04)
050import org.jfree.chart.plot.ThermometerPlot;    // 5.7.8.0 (2014/07/04)
051import org.jfree.chart.plot.CompassPlot;                // 5.7.8.0 (2014/07/04)
052import org.jfree.chart.plot.Plot;                               // 5.7.8.0 (2014/07/04)
053import java.awt.BasicStroke;                                    // 5.7.8.0 (2014/07/04)
054import org.jfree.data.Range;                                    // 5.7.8.0 (2014/07/04)
055import org.jfree.chart.plot.MeterInterval;              // 5.7.8.0 (2014/07/04)
056import 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 */
067public 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〜1.0)
097        private String          itemMargin              = null;         // 4.0.2.0 (2007/12/20) バーアイテムのマージン(0.0〜1.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 の3種類と、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 の3種類と、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 の3種類と、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 の指定キーワードとして、下記の9種類が指定可能です。
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の開始番号(初期値:0)
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〜1.0)
405                        if( itemMargin != null ) {
406                                double margin = Double.parseDouble( itemMargin );
407                                barRend.setItemMargin( margin ) ;
408                        }
409
410                        // 棒の幅を設定す 表示領域を1として小数点以下の数値で幅を設定する(0.0〜1.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         * 例:2000,G  基準1は、2000の直線、基準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         * なります。つまり、色1:設定値1:色2:設定値2:色3 となります。
572         * 色1は、設定値1より小さい場合に使用され、色2は、設定値1より大きく、
573         * 設定値2より小さい場合、色3は、設定値2より大きい場合になります。
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         * 現在のバージョンでは、10個までの繰返しに対応可能です。
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         * 1回のSelect分で複数データを取得します。
870         * この、データをシリーズと呼んでおり、これを区別する為に、色を分けます。
871         * 初期値は、JFreeChart が自動で割り振ります。
872         * これを、外部からCVS形式で、カンマ区切りで色コードを指定します。
873         * 指定データが多い場合は、多い分の色は使用されません。少ない場合は、
874         * 順番に繰り返して使用されます。
875         * 例えば、1色だけ指定した場合は、すべてのシリーズが同じ色で表されます。
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         * 位置を設定します。右にずらすのは、10 ピクセル固定です。
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 していますが、3桁区切り文字(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〜1.0)とbarItemMargin(0.0〜1.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〜1.0)とbarItemMargin(0.0〜1.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〜1.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〜1.0)
1053         */
1054        public void setBarMaxWidth( final String barWidth ) {
1055                maxBarWidth = barWidth;
1056        }
1057
1058        /**
1059         * BOXチャートのバーアイテムのマージン(0.0〜1.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〜1.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)*幅/2
1104         * 初期値は、0.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         * 外部から与える数字は、連続している必要があるため、10進数です。
1120         * たとえば、1700 → 17:00 , 2150 → 21:30 という感じです。
1121         * 2400 を超えると日付違いになります。
1122         *
1123         * 英語表記(:)と日本語表記(時)の区別と、24時間を超える場合の表示方法によって、6種類のパターンが存在します。
1124         *  E1:そのまま、24:00 となり、加算されていく。
1125         *  E2:そのまま、0:00 に戻る。(日付は無視)
1126         *  E3:そのまま、1 00:00 と日付が付与される。
1127         *  H1:そのまま、24時00分 となり、加算されていく。
1128         *  H2:そのまま、00時00分 に戻る。(日付は無視)
1129         *  H3:そのまま、1日 00時00分 と日付が付与される。
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 に、2番目の値が設定された場合に行う。
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 に、2番目の値が設定された場合に行う。
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 の指定キーワードとして、下記の9種類が指定可能です。
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 指定は、0 固定
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         * 外部から与える数字は、連続している必要があるため、10進数です。
1412         * たとえば、1700 → 17:00 , 2150 → 21:30 という感じです。
1413         * 24時間を超える場合は、
1414         * Type1:そのまま、0:00 に戻る。
1415         * Type2:そのまま、24:00 と、そのまま、加算されていく。
1416         * の2種類が用意されています。
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                 *  E1:そのまま、24:00 となり、加算されていく。
1435                 *  E2:そのまま、0:00 に戻る。(日付は無視)
1436                 *  E3:そのまま、1 00:00 と日付が付与される。
1437                 *  H1:そのまま、24時00分 となり、加算されていく。
1438                 *  H2:そのまま、00時00分 に戻る。(日付は無視)
1439                 *  H3:そのまま、1日 00時00分 と日付が付与される。
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                 *  E1:そのまま、24:00 となり、加算されていく。
1493                 *  E2:そのまま、0:00 に戻る。(日付は無視)
1494                 *  E3:そのまま、1 00:00 と日付が付与される。
1495                 *  H1:そのまま、24時00分 となり、加算されていく。
1496                 *  H2:そのまま、00時00分 に戻る。(日付は無視)
1497                 *  H3:そのまま、1日 00時00分 と日付が付与される。
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; }            // 24時間を超えた場合、余りのみ使用する。
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 ; }  // 端数を切り捨てた日付に対して、100倍しておく。
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}