    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 の３種類と、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 の３種類と、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 の３種類と、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 の指定ｷｰﾜｰﾄﾞとして、下記の９種類が指定可能です。
    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の開始番号(初期値:０)
    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                                hyRend.setVisibleLimit( Double.parseDouble( visibleLimit ) );   // 7.3.0.0 (2021/01/06) SpotBugs 疑わしいプリミティブ値のボクシング
    419                        }
    420                }
    421
    422                // 4.0.2.0 (2007/12/20) BarRenderer オブジェクトの場合にマージン等を設定します。
    423                if( rend instanceof BarRenderer ) {
    424                        final BarRenderer barRend = (BarRenderer)rend ;
    425
    426                        // 棒の間を表示領域を１として小数点以下の数値で幅を設定する(0.0～1.0)
    427                        if( itemMargin != null ) {
    428                                final double margin = Double.parseDouble( itemMargin );
    429                                barRend.setItemMargin( margin ) ;
    430                        }
    431
    432                        // 棒の幅を設定す　表示領域を１として小数点以下の数値で幅を設定する(0.0～1.0)
    433                        if( maxBarWidth != null ) {
    434                                barRend.setMaximumBarWidth( Double.parseDouble( maxBarWidth ) ) ;
    435                        }
    436                }
    437
    438                // 5.9.24.3 (2017/09/29) overColor対応
    439                if( rend instanceof HybsBarRenderer ) {
    440                        final HybsBarRenderer barRend = (HybsBarRenderer)rend ;
    441                        if( markOverColors != null ) {
    442                                barRend.setValueMarkOverColors( getValueMarkOverColors(),dynamicOCNo );
    443                        }
    444                }
    445
    446                // 4.1.1.0 (2008/02/16) HybsStackedBarRenderer オブジェクトの場合に domainMargin を設定します。
    447                if( rend instanceof HybsStackedBarRenderer ) {
    448                        final HybsStackedBarRenderer stBarRend = (HybsStackedBarRenderer)rend ;
    449
    450                        stBarRend.setDomainMargin( domainMargin ) ;
    451                }
    452
    453                // シリーズ単位の凡例 の表示可否
    454                rend.setBaseSeriesVisibleInLegend( baseLegend );
    455
    456                // 4.1.1.0 (2008/02/04) データの値(itemText)を表示するかどうか
    457                if( isItemValVisible ) {
    458                        // 4.1.2.0 (2008/03/12) 桁区切り文字を使用するかどうか
    459                        final NumberFormat numForm = NumberFormat.getInstance();
    460                        numForm.setGroupingUsed( useItemLabelSep );
    461
    462                        final CategoryItemLabelGenerator labelGen
    463                                = new StandardCategoryItemLabelGenerator(
    464                                                        StandardCategoryItemLabelGenerator.DEFAULT_LABEL_FORMAT_STRING,
    465                                                        numForm
    466                                );
    467                        rend.setBaseItemLabelGenerator( labelGen );
    468
    469                        if( serNo >= 0 ) {
    470                                rend.setSeriesItemLabelsVisible( serNo,true );
    471                        }
    472                        else {
    473                                rend.setBaseItemLabelsVisible( true );
    474                        }
    475                        // 4.1.1.0 (2008/02/04) 動的なマーカーラインを使用する場合、
    476                        // 指定の番号は閾値なので、表示しません。
    477                        if( dynamicOCNo >= 0 ) {
    478                                rend.setSeriesItemLabelsVisible( dynamicOCNo,false );           // 閾値
    479                        }
    480
    481                        // 4.1.2.0 (2008/03/12) isItemLastVisible の設定
    482                        if( isItemLastVisible && rend instanceof HybsDrawItem ) {
    483                                ((HybsDrawItem)rend).setItemLabelLastVisible( true ) ;
    484                        }
    485
    486                        // 6.0.2.1 (2014/09/26) ItemLabelPosition を、バーの外側の上に表示させます。
    487                        rend.setBasePositiveItemLabelPosition(
    488                                        new ItemLabelPosition( ItemLabelAnchor.OUTSIDE12,TextAnchor.BOTTOM_CENTER ) ,
    489                                        false );
    490                }
    491
    492                // クリッカブル・マップ
    493                if( urlGen != null ) {
    494                        if( serNo >= 0 ) {
    495                                rend.setSeriesItemURLGenerator( serNo,urlGen );
    496                        }
    497                        else {
    498                                rend.setBaseItemURLGenerator( urlGen );
    499                        }
    500                }
    501
    502                return rend;
    503        }
    504
    505        /**
    506         * 縦軸の表示名称を指定します。
    507         *
    508         * @param   valLbl 縦軸の表示名称
    509         */
    510        public void setValueLabel( final String valLbl ) {
    511                if( valLbl != null && valLbl.length() > 0 ) {
    512                        valueLabel = valLbl;
    513                }
    514        }
    515
    516        /**
    517         * 縦軸の表示名称を取得します。
    518         *
    519         * @return      縦軸の表示名称
    520         */
    521        protected String getValueLabel() { return valueLabel; }
    522
    523        /**
    524         * マーカーラインの設定値配列を指定します。
    525         *
    526         * 指定の値にマーカーラインを引きます。
    527         * 色は、setMarkColor( String ) で指定します。
    528         * markColors と、あわせて設定する必要があります。
    529         * markColorsが、指定されていない場合は、Color.RED で マーカーされます。
    530         * dynamicOCNo を使用する場合は、そのValues の並びの箇所に、
    531         * "G"  という文字列を設定して下さい。
    532         * 例：2000,G  基準１は、2000の直線、基準２は、グラフ という意味。
    533         *
    534         * @og.rev 4.1.1.0 (2008/02/21) 基準ラインにグラフを使用する場合の位置指定
    535         *
    536         * @param       mkVal   マーカーラインの設定値配列(可変長引数)
    537         * @see         #setMarkColors( String[] )
    538         */
    539        public void setMarkValues( final String... mkVal ) {
    540                if( mkVal != null && mkVal.length > 0 ) {               // 6.1.1.0 (2015/01/17) 可変長引数でもnullは来る。
    541                        final int size = mkVal.length;
    542                        markValues = new double[size];
    543                        for( int i=0; i<size; i++ ) {
    544                                if( "G".equals( mkVal[i] ) ) {
    545                                        dynamicOCadrs = i;
    546                                        markValues[i] = 0.0;
    547                                }
    548                                else {
    549                                        markValues[i] = Double.parseDouble( mkVal[i] );
    550                                }
    551                        }
    552                }
    553        }
    554
    555        /**
    556         * マーカーラインの色を配列指定します。
    557         *
    558         * マーカーラインとは、縦軸設定のラインの事で、縦軸の設定値(markValues)に
    559         * 横方向にラインを付与します。このラインの色を、CSV形式形式で
    560         * 指定します。
    561         * markValues と、あわせて設定する必要があります。
    562         * 個数が異なる場合は、markValues が優先され、無指定の場合は、Color.REDで
    563         * 表示されます。
    564         *
    565         * <pre>
    566         *      BLACK   , BLUE   , CYAN , DARK_GRAY , GRAY  , GREEN , LIGHT_GRAY ,
    567         *      MAGENTA , ORANGE , PINK , RED       , WHITE , YELLOW , (PURPLE)
    568         *      #XXXXXX形式の16bitRGB表記 でも指定可能です。
    569         * </pre>
    570         *
    571         * @og.rev 6.0.2.1 (2014/09/26) StringUtil → ColorMap
    572         *
    573         * @param   mkCol マーカーラインの色配列(可変長引数)
    574         * @see         java.awt.Color#BLACK
    575         * @see         #setMarkValues( String[] )
    576         */
    577        public void setMarkColors( final String... mkCol ) {
    578                if( mkCol != null && mkCol.length > 0 ) {               // 6.1.1.0 (2015/01/17) 可変長引数でもnullは来る。
    579                        final int size = mkCol.length;
    580                        markColors = new Color[size];
    581                        for( int i=0; i<size; i++ ) {
    582                                markColors[i] = ColorMap.getColorInstance( mkCol[i] );          // 6.0.2.1 (2014/09/26) StringUtil → ColorMap
    583                        }
    584                }
    585        }
    586
    587        /**
    588         * マーカーライン描画時に、その設定値を表示します。
    589         *
    590         * マーカーラインの縦軸の設定値(markValues)に、設定値をラベル表示します。
    591         * 位置は、TextAnchor.BASELINE_LEFT 固定です。
    592         * 初期値は、表示する(true)です。
    593         *
    594         * @og.rev 4.1.1.0 (2008/02/04) 新規追加
    595         *
    596         * @param   useAnchor true:設定値を表示する。
    597         */
    598        public void setUseMarkAnchor( final boolean useAnchor ) {
    599                useMarkAnchor = useAnchor ;
    600        }
    601
    602        /**
    603         * マーカーラインの超過時のShape色をCSV形式形式で複数指定します。
    604         *
    605         * HybsLine でのみ使用可能です。
    606         * マーカーラインを使用する場合に、そのラインを超えない色、超える色を指定します。
    607         * この色の指定は、マーカーラインの色やマーカーラインの設定値の個数＋１に
    608         * なります。つまり、色１：設定値１：色２：設定値２：色３ となります。
    609         * 色１は、設定値１より小さい場合に使用され、色２は、設定値１より大きく、
    610         * 設定値２より小さい場合、色３は、設定値２より大きい場合になります。
    611         *
    612         * 指定文字列は、java.awt.Color クラスのstatic フィールド名で指定します。
    613         * BLACK , BLUE , CYAN , DARK_GRAY , GRAY , GREEN , LIGHT_GRAY ,
    614         * MAGENTA , ORANGE , PINK , RED , WHITE , YELLOW , (PURPLE) が指定できます。
    615         * また、#XXXXXX形式の16bitRGB表記 でも指定可能です。
    616         * markValues と、あわせて設定する必要があります。
    617         * どちらかが、指定されていない場合は、マーカー表示されません。
    618         * <pre>
    619         *      BLACK   , BLUE   , CYAN , DARK_GRAY , GRAY  , GREEN , LIGHT_GRAY ,
    620         *      MAGENTA , ORANGE , PINK , RED       , WHITE , YELLOW , (PURPLE)
    621         *      #XXXXXX形式の16bitRGB表記 でも指定可能です。
    622         * </pre>
    623         *
    624         * @og.rev 4.0.3.0 (2008/01/07) 新規追加
    625         * @og.rev 6.0.2.1 (2014/09/26) StringUtil → ColorMap
    626         *
    627         * @param       ovCol   マーカーラインの超過時のShape色配列(可変長引数)
    628         * @see         java.awt.Color#BLACK
    629         */
    630        public void setMarkOverColors( final String... ovCol ) {
    631                if( ovCol != null && ovCol.length > 0 ) {               // 6.1.1.0 (2015/01/17) 可変長引数でもnullは来る。
    632                        final int size = ovCol.length;
    633                        markOverColors = new Color[size];
    634                        for( int i=0; i<size; i++ ) {
    635                                markOverColors[i] = ColorMap.getColorInstance( ovCol[i] );              // 6.0.2.1 (2014/09/26) StringUtil → ColorMap
    636                        }
    637                }
    638        }
    639
    640        /**
    641         * マーカーラインの超過時のShape色を規定するオブジェクトを返します。
    642         *
    643         * HybsLine,HybsBar で使用します。
    644         * 設定情報が存在しない場合は、null を返します。
    645         *
    646         * @og.rev 4.0.3.0 (2008/01/07) 新規追加
    647         * @og.rev 4.1.1.0 (2008/02/04) markColors 属性追加
    648         * @og.rev 4.1.1.1 (2008/02/25) markValues での "G" 指定を考慮
    649         *
    650         * @return      マーカーラインの超過時のShape色管理オブジェクト
    651         */
    652        private ValueMarkOverColors getValueMarkOverColors() {
    653                ValueMarkOverColors vmoc = null;
    654
    655                if( markValues != null && markOverColors != null &&
    656                        markValues.length + 1 == markOverColors.length &&
    657                        markValues.length >= 1 ) {
    658                                final int dynAdrs = dynamicOCadrs >= 0 ? dynamicOCadrs : 0 ;
    659
    660                                vmoc = new ValueMarkOverColors(
    661                                                                markValues,
    662                                                                markOverColors,
    663                                                                markColors[dynAdrs],
    664                                                                dynamicOCadrs
    665                                                );
    666                }
    667
    668                return vmoc ;
    669        }
    670
    671        /**
    672         * 動的なマーカーラインの基準シリーズ番号を設定します(初期値:-1)。
    673         *
    674         * 動的なマーカーラインを使用する場合は、基準値となるシリーズ番号を指定します。
    675         *
    676         * マーカーラインの最下位閾値に相当します。これは、グラフ化されますが、
    677         * Shape は自動的に削除されます。
    678         * この設定を使用する場合、最初のデータには、必ずShapeが付きます。それ以外の
    679         * データに、Shape を付けるかどうかは、shapesVisible 属性で指定します。
    680         * この線の色は、markColors で指定した、最下位の色になります。また、
    681         * markValues で指定した、最下位の値は、使用されません。ただし、色指定の
    682         * 関係上、設定しておく必要があります。
    683         * また、isValueVisible == true で、設定値の値表示を行う場合も、最下位の
    684         * 値は表示しないようにします。
    685         * 初期値は、使用しない(-1)です。
    686         *
    687         * @og.rev 4.1.1.0 (2008/02/04) 新規追加
    688         * @og.rev 4.1.1.0 (2008/02/19) setUseDynamicOC ⇒ setDynamicOCNo
    689         *
    690         * @param       ocNo    動的なマーカーラインの基準シリーズ番号
    691         */
    692        public void setDynamicOCNo( final int ocNo ) {
    693                dynamicOCNo = ocNo;
    694        }
    695
    696        /**
    697         * マーカーラインの ValueMarker オブジェクト配列を返します。
    698         *
    699         * マーカーライン は、markValues(double配列) と markColors(Color配列)
    700         * より、ValueMarker オブジェクトを、順次配列化していきます。
    701         * useMarkAnchor == true の場合は、設定値(markValues) の Anchor を
    702         * 表示します。位置は、TextAnchor.BASELINE_LEFT 固定です。
    703         * dynamicOCNo が指定された場合は、最下位の閾値は使用しません。
    704         *
    705         * @og.rev 4.1.1.0 (2008/02/04) useMarkAnchor 属性追加
    706         * @og.rev 4.1.1.0 (2008/02/04) 動的なオーバーカラー useDynamicOC 属性追加
    707         *
    708         * @return      マーカーラインのオブジェクト配列(not null)
    709         * @see         java.awt.Color#BLACK
    710         * @see         #setMarkValues( String[] )
    711         * @see         #setMarkColors( String[] )
    712         * @see         #setUseMarkAnchor( boolean )
    713         */
    714        protected ValueMarker[] getValueMarkers() {
    715                final List<ValueMarker> markerList = new ArrayList<>();
    716                final int size = (markValues == null) ? 0 : markValues.length;
    717                for( int i=0; i<size; i++ ) {
    718                        if( i != dynamicOCadrs ) {
    719                                final ValueMarker marker = new ValueMarker( markValues[i] );
    720                                marker.setPaint( markColors[i]  );
    721                                if( useMarkAnchor ) {
    722                                        marker.setLabel( String.valueOf( markValues[i] ) );
    723                                        marker.setLabelTextAnchor( TextAnchor.BASELINE_LEFT );
    724                                }
    725                                markerList.add( marker );
    726                        }
    727                }
    728
    729                return markerList.toArray( new ValueMarker[markerList.size()] );
    730        }
    731
    732        /**
    733         * チャートの縦軸の最小値をセットします(初期値:自動計算)。
    734         *
    735         * 何も指定しない場合は、データの最小値から、自動的に計算します。
    736         *
    737         * @param   lowBnd 縦軸の最小値
    738         * @see         #setUpperBound( String )
    739         */
    740        public void setLowerBound( final String lowBnd ) {
    741                if( lowBnd != null && lowBnd.length() > 0 ) {
    742                        lowerBound = lowBnd;
    743                }
    744        }
    745
    746        /**
    747         * チャートの縦軸の最大値をセットします(初期値:自動計算)。
    748         *
    749         * 何も指定しない場合は、データの最大値から、自動的に計算します。
    750         *
    751         * @param   upBnd 縦軸の最大値
    752         * @see         #setLowerBound( String )
    753         */
    754        public void setUpperBound( final String upBnd ) {
    755                if( upBnd != null && upBnd.length() > 0 ) {
    756                        upperBound = upBnd;
    757                }
    758        }
    759
    760        /**
    761         * チャートの縦軸の目盛の幅をセットします(初期値:自動計算)。
    762         *
    763         * 何も指定しない場合は、データの範囲から、自動的に計算します。
    764         *
    765         * @og.rev 4.0.3.0 (2008/01/07) 新規追加
    766         *
    767         * @param   size 縦軸のチック(目盛)の幅
    768         */
    769        public void setTickSize( final String size ) {
    770                if( size != null && size.length() > 0 ) {
    771                        tickSize = size;
    772                }
    773        }
    774
    775        /**
    776         * バーチャートのグラデーション処理を行うかどうか[true/false]をセットします(初期値:true)。
    777         *
    778         * 通常のバーチャートは、単一色表示で表されますが、これにグラデーション効果を
    779         * 付加するかどうかを指定します。
    780         * 通常のバーチャートが、少しきれいに見えます。
    781         * 初期値は、true(グラデーション効果を付与する)です。
    782         *
    783         * @param   useGrad グラデーション処理 [true:する/false:しない]
    784         */
    785        public void setUseGradient( final boolean useGrad ) {
    786                useGradient = useGrad;
    787        }
    788
    789        /**
    790         * バーチャートのグラデーション処理を行うかどうかを取得します。
    791         *
    792         * 通常のバーチャートは、単一色表示で表されますが、これにグラデーション効果を
    793         * 付加するかどうかを指定します。
    794         * 通常のバーチャートが、少しきれいに見えます。
    795         * 初期値は、false(使用しない)です。
    796         *
    797         * @return      グラデーション処理(する:true/しない:false)
    798         * @see     #setUseGradient( boolean )
    799         */
    800        protected boolean isUseGradient() { return useGradient; }
    801
    802        /**
    803         * ラインチャートのポイントを四角表示するかどうかを指定します(初期値:false)。
    804         *
    805         * ラインチャートは、通常、線分で表され、各ポイントについても、線分で接続されます。
    806         * shapesVisible を true に設定すると、各ポイントが、線上に四角く表示され、
    807         * そのポイントの位置を、容易に判断出来るようになります。
    808         * 初期値は、マーカーを入れません。
    809         *
    810         * @param   shVisible ポイントを四角表示するかどうか
    811         */
    812        public void setShapesVisible( final boolean shVisible ) {
    813                shapesVisible = shVisible;
    814        }
    815
    816        /**
    817         * ラインチャートのポイントを四角表示するかどうかを取得します。
    818         *
    819         * ラインチャートは、通常、線分で表され、各ポイントについても、線分で接続されます。
    820         * shapesVisible を true に設定すると、各ポイントが、線上に四角く表示され、
    821         * そのポイントの位置を、容易に判断出来るようになります。
    822         * 初期値は、マーカーを入れません。
    823         *
    824         * @return      ポイントを四角表示するかどうか
    825         * @see     #setShapesVisible( boolean )
    826         */
    827        protected boolean isShapesVisible() { return shapesVisible; }
    828
    829        /**
    830         * データ毎にShapeを切り替える時の色の繰返しパターンを文字列配列で指定します。
    831         *
    832         * HybsLine でのみ使用可能です。
    833         * これは、データそのものが、繰返し性のある場合に、その繰返し性に対応した
    834         * 形状のShape を表示させる場合に使用します。
    835         * 繰返しShapeの形状は、JFreeChart のシリーズ毎の繰返し標準形状を使用します。
    836         * 現在のバージョンでは、１０個までの繰返しに対応可能です。
    837         * 繰返し色を、指定した分だけ、順に使用されていきます。
    838         *
    839         * 指定文字列は、java.awt.Color クラスのstatic フィールド名で指定します。
    840         * BLACK , BLUE , CYAN , DARK_GRAY , GRAY , GREEN , LIGHT_GRAY ,
    841         * MAGENTA , ORANGE , PINK , RED , WHITE , YELLOW , (PURPLE) が指定できます。
    842         * また、#XXXXXX形式の16bitRGB表記 でも指定可能です。
    843         *
    844         * @og.rev 4.0.3.0 (2008/01/07) 新規追加
    845         * @og.rev 6.0.2.1 (2014/09/26) StringUtil → ColorMap
    846         *
    847         * @param       colors  データ毎の色の繰返しパターン配列(可変長引数)
    848         * @see         java.awt.Color#BLACK
    849         */
    850        public void setShapeColors( final String... colors ) {
    851                if( colors != null && colors.length > 0 ) {             // 6.1.1.0 (2015/01/17) 可変長引数でもnullは来る。
    852                        final int size = colors.length;
    853                        shapeColors = new Color[size];
    854                        for( int i=0; i<size; i++ ) {
    855                                shapeColors[i] = ColorMap.getColorInstance( colors[i] );                // 6.0.2.1 (2014/09/26) StringUtil → ColorMap
    856                        }
    857                }
    858        }
    859
    860        /**
    861         * shapeの大きさを倍率指定で変更します(初期値:null)。
    862         *
    863         * ラインチャートのShape(各グラフのポイントのマーカー)の大きさは、通常は、
    864         * 自動設定されます。
    865         * この大きさを、倍率指定で、変更可能です。
    866         * 指定は、double 型です。
    867         * 初期値は、null は、スケール変更しません(自動設定のままの大きさ)
    868         *
    869         * @og.rev 4.1.1.0 (2008/02/04) 新規追加
    870         *
    871         * @param       scale   shapeの大きさの倍率
    872         */
    873        public void setShapeScale( final String scale ) {
    874                shapeScale = scale;
    875        }
    876
    877        /**
    878         * ラインチャートの線をドットラインにするかどうかを指定します(初期値:false)。
    879         *
    880         * ラインチャートは、通常、線分で表されます。
    881         * これに、点線で表すことで、グラフの違いを、色だけでなく形状でも識別
    882         * しやすくすることが可能です。
    883         * 初期値は、線分です。
    884         *
    885         * @param   useDotLine ドットラインにするかどうか
    886         */
    887        public void setUseDottedLine( final boolean useDotLine ) {
    888                useDottedLine = useDotLine;
    889        }
    890
    891        /**
    892         * ラインチャートの線をドットラインにするかどうかを取得します。
    893         *
    894         * ラインチャートは、通常、線分で表されます。
    895         * これに、点線で表すことで、グラフの違いを、色だけでなく形状でも識別
    896         * しやすくすることが可能です。
    897         * 初期値は、線分です。
    898         *
    899         * @return      ドットラインにするかどうか
    900         * @see     #setUseDottedLine( boolean )
    901         */
    902        protected boolean isUseDottedLine() { return useDottedLine; }
    903
    904        /**
    905         * 複数チャート描画時のチャート色の繰返しパターンを文字列配列で指定します。
    906         *
    907         * 通常、複数のチャートを同時に表示させる場合は、縦軸が共通であれば、
    908         * １回のSelect分で複数データを取得します。
    909         * この、データをシリーズと呼んでおり、これを区別する為に、色を分けます。
    910         * 初期値は、JFreeChart が自動で割り振ります。
    911         * これを、外部からCVS形式で、CSV形式で色コードを指定します。
    912         * 指定データが多い場合は、多い分の色は使用されません。少ない場合は、
    913         * 順番に繰り返して使用されます。
    914         * 例えば、１色だけ指定した場合は、すべてのシリーズが同じ色で表されます。
    915         *
    916         * 指定文字列は、java.awt.Color クラスのstatic フィールド名で指定します。
    917         * BLACK , BLUE , CYAN , DARK_GRAY , GRAY , GREEN , LIGHT_GRAY ,
    918         * MAGENTA , ORANGE , PINK , RED , WHITE , YELLOW , (PURPLE) が指定できます。
    919         * また、#XXXXXX形式の16bitRGB表記 でも指定可能です。
    920         *
    921         * @og.rev 6.0.2.1 (2014/09/26) StringUtil → ColorMap
    922         *
    923         * @param       colors  チャート色の繰返しパターン配列(可変長引数)
    924         * @see         java.awt.Color#BLACK
    925         */
    926        public void setSeriesColors( final String... colors ) {
    927                if( colors != null && colors.length > 0 ) {             // 6.1.1.0 (2015/01/17) 可変長引数でもnullは来る。
    928                        final int size = colors.length;
    929                        seriesColors = new Color[size];
    930                        for( int i=0; i<size; i++ ) {
    931                                seriesColors[i] = ColorMap.getColorInstance( colors[i] );               // 6.0.2.1 (2014/09/26) StringUtil → ColorMap
    932                        }
    933                }
    934        }
    935
    936        /**
    937         * 複数チャート描画時のチャート色の繰返しパターンをColor配列で指定します。
    938         *
    939         * @return      チャート色の繰返しパターン(Color配列)
    940         * @see         #setSeriesColors( String[] )
    941         */
    942        protected Color[] getSeriesColors() {
    943                return seriesColors ;
    944        }
    945
    946        /**
    947         * 複数チャート(series)描画時のラベル名配列を指定します。
    948         *
    949         * 通常、複数のチャートを同時に表示させる場合は、縦軸が共通であれば、
    950         * １回のSelect分で複数データを取得します。
    951         * この、データをシリーズと呼んでおり、これの名称は、Select文のカラム名になります。
    952         * 英文であれば問題ないのですが、日本語表示したい場合に、別名(as)に{&#064;XXXX}を
    953         * 付けるなどの方法がありますが、firebird では、JDBCのResultSetMetaData#getColumnLabel(int)
    954         * の取得で、文字コードがうまく処理されないようなので、外部から与える機能を用意します。
    955         *
    956         * ここでは、select category,series1,series2,････,seriesN from table の
    957         * series1,series2,････,seriesN の部分 を順番に与えます。
    958         *
    959         * ※ 注意：このメソッドでは、配列はコピーではなく、そのままセットされています。
    960         *    副作用があるかもしれませんので、必要であれば、コピーして渡してください。
    961         *    (現状、参照しかしていませんけど)
    962         *
    963         * @og.rev 6.0.2.0 (2014/09/19) 新規追加
    964         *
    965         * @param       labels  チャートのシリーズのラベル名配列(可変長引数)
    966         */
    967        public void setSeriesLabels( final String... labels ) {
    968                if( labels != null && labels.length > 0 ) {             // 6.1.1.0 (2015/01/17) 可変長引数でもnullは来る。
    969                        // 6.0.2.5 (2014/10/31) refactoring
    970                        seriesLabels = labels.clone();
    971                }
    972        }
    973
    974        /**
    975         * Value(縦軸)のラベルを表示するかどうかを指定します(初期値:true[表示する])。
    976         *
    977         * ValueAxis にて設定される、縦軸情報の、ラベルを表示するかどうか指定します。
    978         * 初期値は、true(表示する)です。
    979         *
    980         * @og.rev 4.0.2.0 (2007/12/20) 新規追加
    981         *
    982         * @param       labelsVisible   Value(縦軸)のラベルを表示するかどうか
    983         */
    984        public void setValueLabelsVisible( final boolean labelsVisible ) {
    985                isLabelsVisible = labelsVisible;
    986        }
    987
    988        /**
    989         * Value(縦軸)のマーカーを表示するかどうかを指定します(初期値:true[表示する])。
    990         *
    991         * ValueAxis にて設定される、縦軸情報の、マーカーを表示するかどうか指定します。
    992         * 初期値は、true(表示する)です。
    993         *
    994         * @og.rev 4.0.2.0 (2007/12/20) 新規追加
    995         *
    996         * @param       marksVisible    Value(縦軸)のマーカーを表示するかどうか
    997         */
    998        public void setValueMarksVisible( final boolean marksVisible ) {
    999                isMarksVisible = marksVisible;
    1000        }
    1001
    1002        /**
    1003         * データの値(itemText)を表示するかどうか[true/false/last]を指定します(初期値:false[表示しない])。
    1004         *
    1005         * CategoryItemRenderer 関連のグラフの設定値をグラフ上に表示するかどうかを
    1006         * 指定します。
    1007         * true に設定した場合、通常の場合は、すべてのシリーズにラベル表示されます。
    1008         * false に設定すると、表示されません。
    1009         * last を設定すると、各シリーズの最後の値のみ表示されます。
    1010         * ChartCreate クラスに、seriesPikup が設定されている場合は、指定のシリーズ
    1011         * のみの設定値を表示し、他の値は、表示しません。
    1012         * 同様に、dynamicOCNo が指定されている場合(動的なマーカーライン)
    1013         * 指定のシリーズは、閾値として使用されるため、設定値は表示されません。
    1014         * ラベルの表示位置は、表示する線グラフの傾きに応じてラベルの表示場所を
    1015         * 変えます。山形、右坂、谷形、左坂 に応じて、上中、下右、下中、上右 に
    1016         * 位置を設定します。右にずらすのは、10 ピクセル固定です。
    1017         * 初期値は、false(表示しない)です。
    1018         *
    1019         * @og.rev 4.1.1.0 (2008/02/04) 新規追加
    1020         * @og.rev 4.1.2.0 (2008/03/12) 文字列のまま、受け取りるように変更
    1021         *
    1022         * @param       visible データの値の表示のさせ方 [true/false/last]
    1023         * @see     ChartCreate#setSeriesPikup( int )
    1024         */
    1025        public void setItemLabelVisible( final String visible ) {
    1026                if( "true".equalsIgnoreCase( visible ) ) {
    1027                        isItemValVisible = true;
    1028                }
    1029                else if( "last".equalsIgnoreCase( visible ) ) {
    1030                        isItemValVisible  = true;
    1031                        isItemLastVisible = true;
    1032                }
    1033                else if( visible != null && !"false".equalsIgnoreCase( visible ) ) {
    1034                        final String errMsg = "itemLabelVisible は、「true,false,last」から指定してください。["
    1035                                                        + visible + "]";
    1036                        throw new HybsSystemException( errMsg );
    1037                }
    1038        }
    1039
    1040        /**
    1041         * データの値(itemText)の表示に桁区切り文字を使用するかどうかを指定します。
    1042         *
    1043         * itemLabelVisible=true 時に、表示されるデータ値ラベルで、
    1044         * NumberFormat していますが、３桁区切り文字(123,456,789.0) の
    1045         * 区切り記号を表示するかどうかを指定します。
    1046         * true を指定すると、表示します。false では、表示しません。
    1047         * 初期値は、true(使用する)です。
    1048         *
    1049         * @og.rev 4.1.2.0 (2008/03/12) 新規追加
    1050         *
    1051         * @param       used    桁区切り文字を使用するかどうか
    1052         */
    1053        public void setUseItemLabelSep( final boolean used ) {
    1054                useItemLabelSep = used;
    1055        }
    1056
    1057        /**
    1058         * 縦軸の表示領域INSET値(double)を指定します。
    1059         *
    1060         * 縦軸文字表示領域(NumberAxis)の幅の追加値を設定します。
    1061         * これは、通常の表示領域の左側にスペースを挿入します。
    1062         * あくまで、追加する値なので、文字の長さは含まれません。
    1063         * 何も指定しない場合は、設定しません。
    1064         *
    1065         * @og.rev 4.0.3.0 (2008/01/07) 新規追加
    1066         *
    1067         * @param       inset   Value(縦軸)の表示領域INSET値
    1068         */
    1069        public void setValueInset( final String inset ) {
    1070                valueInset = inset;
    1071        }
    1072
    1073        /**
    1074         * BOXチャートのバー幅(double)を指定します。
    1075         *
    1076         * BOXチャートのバー幅(double)を指定します。
    1077         * 設定されるのは、org.jfree.chart.renderer.category.BarRenderer を
    1078         * 使用した描画のみです。
    1079         * 棒グラフのバー幅指定は、直接、CategoryItemRendererState に設定しています。
    1080         * 通常は、barMaxWidth(0.0～1.0)とbarItemMargin(0.0～1.0)を用いて比率で指定します。
    1081         * 何も指定しない場合は、設定しません。
    1082         *
    1083         * @og.rev 4.0.3.0 (2008/01/07) 新規追加
    1084         *
    1085         * @param       width   BOXチャートのバー幅(double)
    1086         */
    1087        public void setBarWidth( final String width ) {
    1088                barWidth = width;
    1089        }
    1090
    1091        /**
    1092         * BOXチャートのバー幅(double)を取得します。
    1093         *
    1094         * 設定されるのは、org.jfree.chart.renderer.category.BarRenderer を
    1095         * 使用した描画のみです。
    1096         * 棒グラフのバー幅指定は、直接、CategoryItemRendererState に設定しています。
    1097         * 通常は、barMaxWidth(0.0～1.0)とbarItemMargin(0.0～1.0)を用いて比率で指定します。
    1098         * 何も指定しない場合は、設定しません。
    1099         *
    1100         * @og.rev 4.0.3.0 (2008/01/07) 新規追加
    1101         *
    1102         * @return      BOXチャートのバー幅(double)の文字列
    1103         */
    1104        protected String getBarWidth() {
    1105                return barWidth ;
    1106        }
    1107
    1108        /**
    1109         * BOXチャートのバー幅の最大値(0.0～1.0)を指定します。
    1110         *
    1111         * BOXチャートのバー幅の比率の最大値を指定します。
    1112         * 表示領域を１として小数点以下の数値で棒の幅を設定します。
    1113         * 設定した幅に無理がある時は適当なサイズに調整されます。
    1114         * (小さくしたときには棒が線のようになる)
    1115         * 設定されるのは、org.jfree.chart.renderer.category.BarRenderer を
    1116         * 使用した描画のみです。
    1117         * 何も指定しない場合は、設定しません。
    1118         *
    1119         * @og.rev 4.0.2.0 (2007/12/20) 新規追加
    1120         *
    1121         * @param       barWidth        BOXチャートのバー幅の最大値(0.0～1.0)
    1122         */
    1123        public void setBarMaxWidth( final String barWidth ) {
    1124                maxBarWidth = barWidth;
    1125        }
    1126
    1127        /**
    1128         * BOXチャートのバーアイテムのマージン(0.0～1.0)を指定します。
    1129         *
    1130         * BOXチャートのバーアイテムのマージンの比率を指定します。
    1131         * 棒の間を表示領域を１として小数点以下の数値で幅を設定します。
    1132         * 無理がある時は適当なサイズに調整されます。
    1133         * barMaxWidth より優先されます。
    1134         * 設定されるのは、org.jfree.chart.renderer.category.BarRenderer を
    1135         * 使用した描画のみです。
    1136         * 何も指定しない場合は、設定しません。
    1137         *
    1138         * @og.rev 4.0.2.0 (2007/12/20) 新規追加
    1139         *
    1140         * @param       margin  BOXチャートのバーアイテムのマージン(0.0～1.0)
    1141         */
    1142        public void setBarItemMargin( final String margin ) {
    1143                itemMargin = margin;
    1144        }
    1145
    1146        /**
    1147         * 表示下限値(これ以下のデータは未表示)の値(double)を指定します。
    1148         *
    1149         * HybsLine でのみ使用可能です。
    1150         * この設定値以下のデータは、存在しない扱いとします。
    1151         * Lineを引くとき、このデータと、存在しているデータ間にラインは引かれません。
    1152         * 何も指定しない場合は、設定しません。
    1153         *
    1154         * @og.rev 4.0.3.0 (2008/01/07) 新規追加
    1155         *
    1156         * @param       limit   表示下限値(これ以下のデータは未表示)
    1157         */
    1158        public void setVisibleLimit( final String limit ) {
    1159                visibleLimit = limit;
    1160        }
    1161
    1162        /**
    1163         * グラフの書き出し位置の調整比率を指定します。
    1164         *
    1165         * グラフを描画する場合の、書き出し位置を少しずらします。
    1166         * これは、グラフの幅に対して、比率で指定します。
    1167         * 0.0(初期値)の場合は、初期描画位置である、CategoryAnchor.Middle と
    1168         * 同じ箇所から、書き出されます。
    1169         * 1.0 の場合、中心から、グラフ幅の半分が加算され、END位置に寄ります。
    1170         * 同様に、-1.0 の場合は、グラフ幅の半分が減算され、START 位置になります。
    1171         * つまり、中心から、グラフ幅の半分単位で、前方/後方にずらす事が出来ます。
    1172         *   書き出し位置 ＝ 中心(Middle) + (domainMargin)＊幅/２
    1173         * 初期値は、0.0(真ん中:MIDDLE)です。
    1174         *
    1175         * @og.rev 4.1.1.0 (2008/02/14) 新規追加
    1176         *
    1177         * @param       margin  グラフの書き出し位置の調整比率
    1178         */
    1179        public void setDomainMargin( final double margin ) {
    1180                domainMargin = margin;
    1181        }
    1182
    1183        /**
    1184         * 時刻を表す場合の表現の仕方を指定します(初期値:null)。
    1185         *
    1186         * HybsNumberAxis にオーバーライドする 時間を表示する DecimalFormat の内部クラスを利用するに当たり、
    1187         * 時刻の表示方法を指定します。
    1188         * 外部から与える数字は、連続している必要があるため、１０進数です。
    1189         * たとえば、1700 → 17:00 , 2150 → 21:30 という感じです。
    1190         * 2400 を超えると日付違いになります。
    1191         *
    1192         * 英語表記(:)と日本語表記(時)の区別と、24時間を超える場合の表示方法によって、６種類のパターンが存在します。
    1193         * 　E1:そのまま、24:00 となり、加算されていく。
    1194         * 　E2:そのまま、0:00 に戻る。(日付は無視)
    1195         * 　E3:そのまま、1 00:00 と日付が付与される。
    1196         * 　H1:そのまま、24時00分 となり、加算されていく。
    1197         * 　H2:そのまま、00時00分 に戻る。(日付は無視)
    1198         * 　H3:そのまま、1日 00時00分 と日付が付与される。
    1199         * 初期値は、使用しない(-1)です。
    1200         *
    1201         * @og.rev 5.5.2.1 (2012/05/07) 新規追加
    1202         *
    1203         * @param       type    時刻の表示方法 [E1/E2/E3/H1/H2/H3]
    1204         */
    1205        public void setTimeFormatType( final String type ) {
    1206                timeFormatType = type;
    1207        }
    1208
    1209        /**
    1210         * ラベルの表示向きを縦にするかどうか[true/false]を指定します(初期値:false)。
    1211         *
    1212         * ChartCreate の rotationLabel は、角度を指定できましたが、NumberAxis では、
    1213         * 縦にするかどうかの指定しかできません。
    1214         * ここでは、true を指定するとラベルは、縦書きになります。
    1215         * 初期値は、false(横書き)です。
    1216         *
    1217         * @og.rev 5.5.2.1 (2012/05/07) 新規追加
    1218         *
    1219         * @param   useVLavels ラベルの表示向き [false:横書き/:true:縦書き]
    1220         */
    1221        public void setUseVerticalLabels( final boolean useVLavels ) {
    1222                useVerticalLabels = useVLavels;
    1223        }
    1224
    1225        /**
    1226         * カテゴリのカラー名指定があるかどうか[true/false]を指定します(初期値:false)。
    1227         *
    1228         * select category,series1,series2,series3,･･･,color from ･･･ の様に
    1229         * 検索するSelect文の一番最後に、Color文字列を付けて、カテゴリのカラー名の指定を行う事が可能です。
    1230         * つまり、useCategoryColor="true" を指定すると、最後のカラムは、Color文字列と認識して、
    1231         * データ(シリーズとして)使われなくなります。
    1232         * CategoryColor は、HybsColorBar と、HybsColorBar3D のみサポートされている機能ですが、
    1233         * グラフ合成(例えば、HybsParetoLineなど)と同時に使用する場合、同じ select文や、DBTableModelを
    1234         * 使った処理を行う場合、Color指定のカラムを無視する必要があります。
    1235         * そういう場合(つまり、カテゴリカラーを使わない場合)に、共通のSelect文を指定する場合にも、true に
    1236         * 設定して、Color文字列を無視するように指定します。
    1237         *
    1238         * 初期値は、false(指定しない)です。
    1239         *
    1240         * @og.rev 6.0.2.2 (2014/10/03) 新規追加
    1241         *
    1242         * @param       useCateColor    カテゴリのカラー名指定 [false:指定しない/true:指定する]
    1243         */
    1244        public void setUseCategoryColor( final boolean useCateColor ) {
    1245                useCategoryColor = useCateColor;
    1246        }
    1247
    1248        /**
    1249         * データ件数を返します。
    1250         *
    1251         * org.jfree.data.general.Dataset には、共通に利用できる件数取得のメソッドが定義されていません。
    1252         * なので、個々のクラスごとに、取得します。
    1253         * ChartFactory に持っているのは、このクラスで、Dataset の実態を作成している関係上、
    1254         * 新しいクラスを追加時に、このメソッドの手直しが必要になるからです。
    1255         *
    1256         * @og.rev 6.9.7.0 (2018/05/14) データ０件の対応。
    1257         *
    1258         * @return      データ件数
    1259         */
    1260        public int getRowCount() {
    1261                return ChartFactory.getRowCount( dataset );
    1262        }
    1263
    1264        /**
    1265         * MeterPlot に必要な情報を設定します。
    1266         *
    1267         * これは、ChartDataset(このクラス)に必要な getterメソッドを用意して、
    1268         * 利用側のクラス(ChartPlot_Pie) でセットすべきですが、メソッドが増えるので、
    1269         * こちらに MeterPlotオブジェクトを渡して、メソッド数を減らそうとしているだけです。
    1270         *
    1271         * lowerBound は、最小値(low)
    1272         * upperBound は、最大値(upp)
    1273         * markValues     値,A,B,C
    1274         * markOverColors GREEN,BLUE,YELLOW,RED
    1275         * low-A⇒GREEN , A-B⇒BLUE , B-C⇒YELLOW , C-upp⇒RED で、MeterIntervalを指定します。
    1276         *
    1277         * shapeColors に、NeedlePaint,ValuePaint,TickPaint,TickLabelPaint,DialBackgroundPaint,DialOutlinePaint を指定できます。
    1278         *   初期値は、BLACK,BLACK,BLACK,BLACK,透明,BLACK です。
    1279         * needleType に、DialShape の指定ｷｰﾜｰﾄﾞとして、CHORD,CIRCLE,PIE が指定可能です。
    1280         *   指定方法としては、taglib上で、chartType 指定時に、Meter_PIE などと指定します。
    1281         * shapeScale は、MeterAngle(メーターの表示角度) を指定できます。
    1282         * valueLabel は、MeterInterval の規定値(値,A,B,C) に対応した凡例ラベルです。
    1283         *
    1284         * @og.rev 5.7.8.0 (2014/07/04) 新規追加
    1285         * @og.rev 6.3.6.0 (2015/08/16) System.arraycopy が使える箇所は、置き換えます。
    1286         *
    1287         * @return 値をセットし終わった、MeterPlotオブジェクト
    1288         */
    1289        protected Plot makeMeterPlot() {
    1290                final MeterPlot mplot = new MeterPlot();
    1291
    1292                // 範囲(上限、下限)指定
    1293                final double low= lowerBound == null ?   0.0 : Double.parseDouble( lowerBound ) ;
    1294                final double upp= upperBound == null ? 100.0 : Double.parseDouble( upperBound ) ;
    1295                mplot.setRange( new Range( low, upp ) );
    1296
    1297                // markValues     値,A,B,C
    1298                // markOverColors GREEN,BLUE,YELLOW,RED
    1299                // low-A⇒GREEN , A-B⇒BLUE , B-C⇒YELLOW , C-upp⇒RED
    1300                // 範囲の指定(MeterInterval)は、markValues に、２番目の値が設定された場合に行う。
    1301                if( markValues != null && markValues.length > 1 ) {
    1302                        final int size = markValues.length ;
    1303                        if( markOverColors != null && size == markOverColors.length ) {
    1304
    1305                                // BasicStroke に、大きな値を指定すると、開始位置がずれてしまう。
    1306                                final BasicStroke bs = new BasicStroke( 2.0F );
    1307
    1308                                // valueLabel は、markValues の規定値(A,B,C) に対応した凡例ラベルです。
    1309                                final String[] lbls = StringUtil.csv2Array( valueLabel );
    1310                                final int lblSize = lbls.length ;
    1311                                int j = 0;      // ラベルの配列番号
    1312
    1313                                double st = low;
    1314                                for( int i=1; i<=size; i++ ) {
    1315                                        final double en = i<size ? markValues[i] : upp ;
    1316                                        final Color  co1 = markOverColors[i-1];
    1317                                        final Color  co2 = new Color( co1.getRed() , co1.getGreen() , co1.getBlue() , 128 );    // 透過色(半透明)
    1318                                        final String lbl = j < lblSize ? lbls[j++] : "" ;
    1319                                        mplot.addInterval( new MeterInterval( lbl, new Range( st, en ), co1, bs, co2 ) );
    1320                                        st = en ;
    1321                                }
    1322                        }
    1323                        else {
    1324                                final String errMsg = "Meter で、markValues を複数指定する場合は、同じ数のmarkOverColorsの指定が必要です。"
    1325                                                                        + CR ;
    1326                                throw new HybsSystemException( errMsg );
    1327                        }
    1328                }
    1329
    1330                // TickSize を設定。null ならば、初期値を使うので、設定しない。
    1331                if( tickSize != null ) {
    1332                        mplot.setTickSize( Double.parseDouble( tickSize ) );
    1333                }
    1334
    1335                // shapeColors に、NeedlePaint,ValuePaint,TickPaint,TickLabelPaint,DialBackgroundPaint,DialOutlinePaint を指定できます。
    1336                //                                   NeedlePaint , ValuePaint  , TickPaint   , TickLabelPaint , DialBackgroundPaint(=透明) , DialOutlinePaint
    1337                final Color[] shCols = new Color[] { Color.BLACK , Color.BLACK , Color.BLACK , Color.BLACK    , new Color(255, 255, 255, 0), Color.BLACK };     // 初期値
    1338                if( shapeColors != null && shapeColors.length > 0 ) {
    1339                        // 6.3.6.0 (2015/08/16) System.arraycopy が使える箇所は、置き換えます。
    1340                        System.arraycopy( shapeColors,0,shCols,0,shapeColors.length );          // 6.3.6.0 (2015/08/16)
    1341                }
    1342                mplot.setNeedlePaint(         shCols[0] );              // 針の色
    1343                mplot.setValuePaint(          shCols[1] );              // 値の色
    1344                mplot.setTickPaint(           shCols[2] );              // メモリの色
    1345                mplot.setTickLabelPaint(      shCols[3] );              // メモリの文字の色
    1346                mplot.setDialBackgroundPaint( shCols[4] );              // 背景色
    1347                mplot.setDialOutlinePaint(    shCols[5] );              // セットしても、表示が変わらない。
    1348
    1349                // needleType 属性で、DialShape を指定できます。
    1350                DialShape dshape = DialShape.CIRCLE ;   // 初期値
    1351                if( needleType != null ) {
    1352                        if( "CHORD".equalsIgnoreCase(       needleType ) ) { dshape = DialShape.CHORD; }
    1353                        else if( "CIRCLE".equalsIgnoreCase( needleType ) ) { dshape = DialShape.CIRCLE; }       // 初期値
    1354                        else if( "PIE".equalsIgnoreCase(    needleType ) ) { dshape = DialShape.PIE; }
    1355                }
    1356                mplot.setDialShape( dshape );                   // CHORD,CIRCLE,PIE
    1357
    1358                // shapeScale は、MeterAngle(メーターの表示角度) を指定
    1359                if( shapeScale != null ) {
    1360                        mplot.setMeterAngle( Integer.parseInt( shapeScale ) );
    1361                }
    1362
    1363                // isLabelsVisible 指定
    1364                mplot.setTickLabelsVisible( isLabelsVisible );
    1365
    1366                // その他決め打ちの値設定
    1367        //      mplot.setValueFont(new Font("Arial", Font.BOLD, 14));
    1368        //      mplot.setTickLabelFont(new Font("Arial", Font.BOLD, 14));
    1369
    1370                mplot.setDataset( (ValueDataset)dataset );
    1371                return mplot;
    1372        }
    1373
    1374        /**
    1375         * ThermometerPlot に必要な情報を設定します。
    1376         *
    1377         * markValues     値,A,B
    1378         * markOverColors GREEN,YELLOW,RED
    1379         * xxx-low⇒GRAY , low-A⇒GREEN , A-B⇒YELLOW , B-upp⇒RED , upp-xxx⇒GRAY で、SubrangePaintを指定します。
    1380         * markOverColors を指定しない場合は、ThermometerPlot.NORMAL , WARNING , CRITICAL が順に指定されます。
    1381         * これは、GREEN,YELLOW,RED になります。
    1382         *
    1383         * shapeColors に、ValuePaint,ThermometerPaint(温度計の枠線),MercuryPaint を指定できます。
    1384         *
    1385         * @og.rev 5.7.8.0 (2014/07/04) 新規追加
    1386         * @og.rev 6.3.6.0 (2015/08/16) System.arraycopy が使える箇所は、置き換えます。
    1387         *
    1388         * @return 値をセットし終わった、元のThermometerPlotオブジェクト
    1389         */
    1390        protected Plot makeThermometerPlot() {
    1391                final ThermometerPlot tplot = new ThermometerPlot();
    1392
    1393                // 範囲(上限、下限)指定
    1394                final double low= lowerBound == null ?   0.0 : Double.parseDouble( lowerBound ) ;
    1395                final double upp= upperBound == null ? 100.0 : Double.parseDouble( upperBound ) ;
    1396                tplot.setRange( low , upp );
    1397
    1398                // markValues     値,A,B,C
    1399                // markOverColors GREEN,YELLOW,RED
    1400                // low-A⇒Red , A-B⇒Yellow , B-C⇒Green , C-upp⇒Blue
    1401                // 範囲の指定(MeterInterval)は、markValues に、２番目の値が設定された場合に行う。
    1402                if( markValues != null && markValues.length > 1 ) {
    1403                        final int size = markValues.length ;
    1404
    1405                        // markOverColors が存在して、個数が一致していれば、true
    1406                        final boolean inCols = markOverColors != null && size == markOverColors.length ;
    1407                        if( inCols || markOverColors == null || markOverColors.length == 0 ) {
    1408                                double st = low;
    1409                                for( int i=1; i<=size; i++ ) {
    1410                                        final double en = i<size ? markValues[i] : upp ;
    1411                                        // 第一引数は、i(順番)ではなく、サブレンジ番号(ThermometerPlot.NORMAL , WARNING , CRITICAL)
    1412                                        tplot.setSubrange( i-1, st, en );
    1413
    1414                                        if( inCols ) {
    1415                                                final Color  co1 = markOverColors[i-1];
    1416                                                tplot.setSubrangePaint( i-1,co1 );
    1417                                        }
    1418                                        st = en ;
    1419                                }
    1420                        }
    1421                        else {
    1422                                final String errMsg = "Meter で、markValues を複数指定する場合は、同じ数のmarkOverColorsの指定が必要です。"
    1423                                                                        + CR ;
    1424                                throw new HybsSystemException( errMsg );
    1425                        }
    1426                }
    1427
    1428                // shapeColors に、ValuePaint,ThermometerPaint(温度計の枠線),MercuryPaint を指定できます。
    1429                //                                   ValuePaint  , ThermometerPaint , MercuryPaint
    1430                final Color[] shCols = new Color[] { Color.BLACK , Color.BLACK      , Color.GRAY };             // 初期値
    1431                if( shapeColors != null && shapeColors.length > 0 ) {
    1432                        // 6.3.6.0 (2015/08/16) System.arraycopy が使える箇所は、置き換えます。
    1433                        System.arraycopy( shapeColors,0,shCols,0,shapeColors.length );          // 6.3.6.0 (2015/08/16)
    1434                }
    1435                tplot.setValuePaint(       shCols[0] );                 // 値の色
    1436                tplot.setThermometerPaint( shCols[1] );                 // 温度計の枠線
    1437                tplot.setMercuryPaint(     shCols[2] );                 // オーバー時の色
    1438
    1439        //      tplot.setValueFont(new Font("Arial", 1, 14));
    1440
    1441                tplot.setDataset( (ValueDataset)dataset );
    1442                return tplot;
    1443        }
    1444
    1445        /**
    1446         * CompassPlot に必要な情報を設定します。
    1447         *
    1448         * shapeColors に、Compassの色を指定できます。(内部的には、SeriesPaint にセットしています)
    1449         *     SeriesPaint,SeriesOutlinePaint,RoseCenterPaint,RoseHighlightPaint,RosePaint を指定します。
    1450         * needleType には、MeterNeedle の指定ｷｰﾜｰﾄﾞとして、下記の９種類が指定可能です。
    1451         *     指定は、Arrow,Line,Long,Pin,Plum,Pointer,Ship,Wind,Arrow,MiddlePin という文字列です。
    1452         *     初期値は、Pointer です。
    1453         *
    1454         * @og.rev 5.7.8.0 (2014/07/04) 新規追加
    1455         * @og.rev 6.3.6.0 (2015/08/16) System.arraycopy が使える箇所は、置き換えます。
    1456         *
    1457         * @return 値をセットし終わった、元のCompassPlotオブジェクト
    1458         */
    1459        protected Plot makeCompassPlot() {
    1460                final CompassPlot cplot = new CompassPlot();
    1461
    1462                // Series 指定は、0 固定
    1463                final int serNo = 0;
    1464
    1465                // needleType 属性で、SeriesNeedle 番号を指定できます。
    1466                int sNeedle = 5 ;               // Pointer
    1467                if( needleType != null ) {
    1468                        if(      "Arrow".equalsIgnoreCase(     needleType ) ) { sNeedle = 0; }  //    0 = ArrowNeedle;
    1469                        else if( "Line".equalsIgnoreCase(      needleType ) ) { sNeedle = 1; }  //    1 = LineNeedle;
    1470                        else if( "Long".equalsIgnoreCase(      needleType ) ) { sNeedle = 2; }  //    2 = LongNeedle;
    1471                        else if( "Pin".equalsIgnoreCase(       needleType ) ) { sNeedle = 3; }  //    3 = PinNeedle;
    1472                        else if( "Plum".equalsIgnoreCase(      needleType ) ) { sNeedle = 4; }  //    4 = PlumNeedle;
    1473                        else if( "Pointer".equalsIgnoreCase(   needleType ) ) { sNeedle = 5; }  //    5 = PointerNeedle;
    1474                        else if( "Ship".equalsIgnoreCase(      needleType ) ) { sNeedle = 6; }  //    6 = ShipNeedle;
    1475                        else if( "Wind".equalsIgnoreCase(      needleType ) ) { sNeedle = 7; }  //    7 = WindNeedle;
    1476                        else if( "Arrow".equalsIgnoreCase(     needleType ) ) { sNeedle = 8; }  //    8 = ArrowNeedle;
    1477                        else if( "MiddlePin".equalsIgnoreCase( needleType ) ) { sNeedle = 9; }  //    9 = MiddlePinNeedle;
    1478                }
    1479                cplot.setSeriesNeedle( serNo, sNeedle );
    1480
    1481                // shapeColors に、SeriesPaint,SeriesOutlinePaint,RoseCenterPaint,RoseHighlightPaint,RosePaint を指定
    1482                //                                   SeriesPaint, SeriesOutlinePaint , RoseCenter   , RoseHighlight, Rose
    1483                final Color[] shCols = new Color[] { Color.RED  , Color.BLACK        , Color.WHITE  , Color.BLACK  , Color.YELLOW };            // 初期値
    1484                if( shapeColors != null && shapeColors.length > 0 ) {
    1485                        // 6.3.6.0 (2015/08/16) System.arraycopy が使える箇所は、置き換えます。
    1486                        System.arraycopy( shapeColors,0,shCols,0,shapeColors.length );          // 6.3.6.0 (2015/08/16)
    1487                }
    1488                cplot.setSeriesPaint(        serNo, shCols[0] );        // 針の色
    1489                cplot.setSeriesOutlinePaint( serNo, shCols[1] );        // 針の枠の色
    1490                cplot.setRoseCenterPaint(                       shCols[2] );    // 文字盤の中心の
    1491                cplot.setRoseHighlightPaint(            shCols[3] );    // 文字盤の文字、枠色
    1492                cplot.setRosePaint(                                     shCols[4] );    // 枠の塗りつぶし色
    1493
    1494                cplot.addDataset( (ValueDataset)dataset );
    1495
    1496                return cplot;
    1497        }
    1498
    1499        /**
    1500         * HybsNumberAxis にオーバーライドする 時間を表示する DecimalFormat の内部クラスを定義します。
    1501         *
    1502         * これは、ChartPlot_XY で使用する、HybsNumberAxis に対して、拡張します。
    1503         * データが、時刻を表す場合、Date型のオブジェクトを利用して、org.jfree.chart.axis.PeriodAxis
    1504         * を利用できればよいのですが、単なる数字で扱っているケースがあり、時刻に内部的に
    1505         * 変換するケースで使います。
    1506         * 外部から与える数字は、連続している必要があるため、１０進数です。
    1507         * たとえば、1700 → 17:00 , 2150 → 21:30 という感じです。
    1508         * 24時間を超える場合は、
    1509         * Type1:そのまま、0:00 に戻る。
    1510         * Type2:そのまま、24:00 と、そのまま、加算されていく。
    1511         * の２種類が用意されています。
    1512         *
    1513         * @og.rev 5.5.2.1 (2012/05/07) 新規追加
    1514         *
    1515         */
    1516        private static final class HybsTimeFormat extends DecimalFormat {
    1517                /** For serialization. */
    1518                private static final long serialVersionUID = 201205075512L ;
    1519
    1520                private final boolean is24repeat ;
    1521                private final boolean useDay ;
    1522
    1523                private final int hsCode ;
    1524
    1525                /**
    1526                 * コンストラクター
    1527                 *
    1528                 * 引数に、時刻を表す場合の表現の仕方を指定します。
    1529                 * 　E1:そのまま、24:00 となり、加算されていく。
    1530                 * 　E2:そのまま、0:00 に戻る。(日付は無視)
    1531                 * 　E3:そのまま、1 00:00 と日付が付与される。
    1532                 * 　H1:そのまま、24時00分 となり、加算されていく。
    1533                 * 　H2:そのまま、00時00分 に戻る。(日付は無視)
    1534                 * 　H3:そのまま、1日 00時00分 と日付が付与される。
    1535                 *
    1536                 * @param       inType  時刻の表示方法 [E1/E2/E3/H1/H2/H3]
    1537                 */
    1538                public HybsTimeFormat( final String inType ) {
    1539                        super();
    1540
    1541                        final DecimalFormatSymbols sym = new DecimalFormatSymbols();
    1542                        if( "E1".equals( inType ) ) {
    1543                                applyPattern( "#0.00" );
    1544                                sym.setDecimalSeparator( ':' );
    1545                                is24repeat = false;             useDay = false;
    1546                        }
    1547                        else if( "E2".equals( inType ) ) {
    1548                                applyPattern( "#0.00" );
    1549                                sym.setDecimalSeparator( ':' );
    1550                                is24repeat = true;              useDay = false;
    1551                        }
    1552                        else if( "E3".equals( inType ) ) {
    1553                                applyPattern( "#,#0.00" );
    1554                                sym.setDecimalSeparator( ':' );
    1555                                sym.setGroupingSeparator( ' ' );
    1556                                is24repeat = true;              useDay = true;
    1557                        }
    1558                        else if( "H1".equals( inType ) ) {
    1559                                applyPattern( "#0.00分" );
    1560                                sym.setDecimalSeparator( '時' );
    1561                                is24repeat = false;             useDay = false;
    1562                        }
    1563                        else if( "H2".equals( inType ) ) {
    1564                                applyPattern( "#0.00分" );
    1565                                sym.setDecimalSeparator( '時' );
    1566                                is24repeat = true;              useDay = false;
    1567                        }
    1568                        else if( "H3".equals( inType ) ) {
    1569                                applyPattern( "#,#0.00分" );
    1570                                sym.setDecimalSeparator( '時' );
    1571                                sym.setGroupingSeparator( '日' );
    1572                                is24repeat = true;              useDay = true;
    1573                        }
    1574                        else {
    1575                                final String errMsg = "timeFormatType は、(E1/E2/E3/H1/H2/H3) から指定してください。timeFormatType=[" + inType + "]" ;
    1576                                throw new HybsSystemException( errMsg );
    1577                        }
    1578                        setDecimalFormatSymbols( sym );
    1579
    1580                        hsCode = super.hashCode() + Boolean.valueOf(is24repeat).hashCode() + Boolean.valueOf(useDay).hashCode();
    1581                }
    1582
    1583                /**
    1584                 * double をフォーマットして文字列を作成します。
    1585                 *
    1586                 * ( DecimalFormat#format(double,StringBuffer,FieldPosition) のオーバーライド )
    1587                 *
    1588                 * timeFormatType によって、データの処理が変わります。
    1589                 * 　E1:そのまま、24:00 となり、加算されていく。
    1590                 * 　E2:そのまま、0:00 に戻る。(日付は無視)
    1591                 * 　E3:そのまま、1 00:00 と日付が付与される。
    1592                 * 　H1:そのまま、24時00分 となり、加算されていく。
    1593                 * 　H2:そのまま、00時00分 に戻る。(日付は無視)
    1594                 * 　H3:そのまま、1日 00時00分 と日付が付与される。
    1595                 *
    1596                 * @param       number  フォーマットする double
    1597                 * @param       result  テキストを追加する位置
    1598                 * @param       fieldPos        入力では、必要であれば位置合わせフィールド。 出力では、その位置合わせフィールドのオフセット
    1599                 * @return      フォーマットされた数値文字列
    1600                 */
    1601                @Override
    1602                public StringBuffer format( final double number, final StringBuffer result, final FieldPosition fieldPos ) {
    1603                        int hour = (int)(number/100);                                   // 時間のみ取り出す。
    1604                        if( is24repeat ) { hour = hour%24; }                    // ２４時間を超えた場合、余りのみ使用する。
    1605
    1606                        final int minute = (int)((number%100)*0.6);             // 0.6 = 60/100 の事。100 が 60分 となる。
    1607
    1608                        double timeVal = hour + minute/100.0 ;
    1609                        if( useDay ) { timeVal = timeVal + (int)(number/24) ; } // 端数を切り捨てた日付に対して、100倍しておく。
    1610                        return super.format( timeVal, result, fieldPos );
    1611                }
    1612
    1613                /**
    1614                 * このオブジェクトと指定されたオブジェクトを比較します。
    1615                 *
    1616                 * @og.rev 5.5.2.4 (2012/05/16) 新規追加 findbug対応
    1617                 *
    1618                 * @param       anObject        比較されるオブジェクト
    1619                 * @return      指定されたオブジェクトが等しい場合は true、そうでない場合は false
    1620                 */
    1621                @Override
    1622                public boolean equals( final Object anObject ) {
    1623                        return this == anObject;
    1624                }
    1625
    1626                /**
    1627                 * このオブジェクトのハッシュコードを取得します。
    1628                 *
    1629                 * @og.rev 5.5.2.4 (2012/05/16) 新規追加 findbug対応
    1630                 *
    1631                 * @return      ハッシュコード
    1632                 */
    1633                @Override
    1634                public int hashCode() {
    1635                        return hsCode;
    1636                }
    1637        }
    1638
    1639        /**
    1640         * このオブジェクトの文字列表現を返します。
    1641         * 基本的にデバッグ目的に使用します。
    1642         *
    1643         * @return このクラスの文字列表現
    1644         * @og.rtnNotNull
    1645         */
    1646        @Override
    1647        public String toString() {
    1648
    1649                // 6.0.2.5 (2014/10/31) char を append する。
    1650                final StringBuilder rtn = new StringBuilder( BUFFER_MIDDLE )
    1651                        .append( '[' ).append( this.getClass().getName()   ).append( ']' ).append( CR )
    1652                        .append( "chartType     [" ).append( chartType     ).append( ']' ).append( CR )
    1653                        .append( "valueLabel    [" ).append( valueLabel    ).append( ']' ).append( CR )
    1654                        .append( "markValues    [" ).append( Arrays.toString( markValues ) ).append( ']' ).append( CR )
    1655                        .append( "markColors    [" ).append( Arrays.toString( markColors ) ).append( ']' ).append( CR )
    1656                        .append( "lowerBound    [" ).append( lowerBound    ).append( ']' ).append( CR )
    1657                        .append( "upperBound    [" ).append( upperBound    ).append( ']' ).append( CR )
    1658                        .append( "useGradient   [" ).append( useGradient   ).append( ']' ).append( CR )
    1659                        .append( "shapesVisible [" ).append( shapesVisible ).append( ']' ).append( CR )
    1660                        .append( "useDottedLine [" ).append( useDottedLine ).append( ']' ).append( CR );
    1661
    1662                return rtn.toString();
    1663        }
    1664}