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