    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.ColorMap;                                                      // 6.0.2.1 (2014/09/26)
    020import org.opengion.fukurou.util.HybsDateUtil;                                          // 6.7.3.0 (2017/01/27)
    021import org.opengion.hayabusa.common.HybsSystemException;
    022
    023import java.util.List;
    024import java.util.Locale;
    025import java.util.Calendar;                                                                      // 6.7.3.0 (2017/01/27)
    026
    027import java.awt.Color;
    028import java.text.SimpleDateFormat;
    029
    030import org.jfree.ui.RectangleEdge;
    031import org.jfree.chart.JFreeChart;
    032import org.jfree.chart.plot.Plot;
    033import org.jfree.chart.plot.PlotOrientation;
    034import org.jfree.chart.plot.CategoryPlot;
    035import org.jfree.chart.renderer.category.CategoryItemRenderer;
    036import org.jfree.data.category.CategoryDataset;
    037import org.jfree.chart.axis.CategoryAxis;
    038import org.jfree.chart.axis.CategoryLabelPositions;
    039import org.jfree.chart.axis.CategoryAnchor;
    040import org.jfree.chart.axis.DateAxis;                                           // 5.6.1.0 (2013/02/01)
    041import org.jfree.chart.axis.SegmentedTimeline;                          // 6.7.3.0 (2017/01/27)
    042import org.jfree.chart.plot.DatasetRenderingOrder;
    043import org.jfree.chart.plot.CategoryMarker;
    044
    045/**
    046 * ChartCreate は、JFreeChart オブジェクトを構築するクラスです。
    047 * 複数の ChartDataset オブジェクトを合成することも、ここで行っています。
    048 * グラフの種類は、ChartPlot_XXX クラスで設定しています。
    049 * ここでは、簡易的にオブジェクトを構築できるように、チャートタイプの指定によって、
    050 * 各種作成するオブジェクトを切り替えています。
    051 *
    052 * @version  0.9.0      2007/06/21
    053 * @author       Kazuhiko Hasegawa
    054 * @since        JDK1.1,
    055 */
    056public class ChartCreate {
    057        private static final long TIME_LINE = 60 * 1000L ;      // // 6.9.8.0 (2018/05/28) FindBugs
    058
    059        private String  title                   ;                               // タイトル
    060        private String  chartType               ;                               // チャートの種類
    061        private String  domainLabel             ;                               // チャートの共通横軸のラベル
    062        private boolean showLegend              = true;                 // 凡例 の表示可否
    063        private RectangleEdge   rectEdge= RectangleEdge.BOTTOM;         // 凡例の表示箇所
    064        private PlotOrientation plotOri = PlotOrientation.VERTICAL;     // チャートの軸表示方向
    065        private Color   chartBackColor  ;                               // 背景色の設定
    066        private Color   plotBackColor   ;                               // 描画領域の設定
    067        private int             rotationLabel   ;                               // 横軸ラベルの傾き(1:180度 、2:90度 、3:60度 、4:45度 、6:30度 ･･･ )
    068        // CategoryAxis系は、rotationLabel。ValueAxis系(NumberAxis,DateAxis)は、useVerticalLabels で、ラベルの表示向きを指定します。
    069        private boolean useVerticalLabels       ;                       // 5.6.4.3 (2013/05/24) 横軸ラベルの表示向き(横書き:false/縦書き:true)
    070        private String  domainMarker            ;                       // 横軸のマーカーライン
    071        private boolean useDomainLabel          = true;         // 横軸ラベルの表示有無
    072        private boolean useMarkerLabel          = true;         // マーカーライン時の文字有無
    073        private int             seriesPikup                     = -1;           // ピックアップするシリーズ番号
    074        private HybsURLGenerator urlGen         ;                       // クリッカブル・マップ
    075        // 4.0.2.0 (2007/12/20)
    076        private String  categoryMargin  ;                       // カテゴリマージン(0.0～1.0)
    077        private String  lowerMargin             ;                       // 下方マージン(0.0～1.0)
    078        private String  upperMargin             ;                       // 上方マージン(0.0～1.0)
    079        private boolean isDebug                 ;                       // デバッグフラグ
    080        private boolean useDomainLine   ;                       // 4.0.3.0 (2008/01/07) 横軸のグリッド表示有無(垂直線)
    081        private Color   domainLineColor ;                       // 4.0.3.0 (2008/01/07) 横軸のグリッド線の色
    082        private boolean useRangeLine    = true;         // 4.0.3.0 (2008/01/07) 縦軸のグリッド表示有無(水平線)
    083        private Color   rangeLineColor  ;                       // 4.0.3.0 (2008/01/07) 縦軸のグリッド線の色
    084        private int             categorySkip    = 1;            // 4.0.3.0 (2008/01/07) 横軸ラベルをスキップする間隔
    085        private int             categoryCutNo   = -1;           // 4.1.1.0 (2008/02/04) 横軸ラベルの文字位置指定のキーブレイク
    086        private int             rangeSkip               = -1;           // 4.1.1.0 (2008/02/04) 縦軸のグリッドをスキップする間隔(初期値:-1)
    087        private boolean useToolTip              ;                       // 4.3.1.0 (2008/08/09) ツールチップスの利用
    088
    089        private CategoryAnchor categoryAnchor   ;       // 4.1.1.0 (2008/02/14) 横軸のグリッド(垂直線)の書き出し位置(START,MIDDLE,END)
    090
    091        private List<ChartDataset> chartDataset ;       // チャートのデータ属性管理オブジェクトのリスト
    092
    093        private String  dateAxisFormat  = "MM/dd";      // 5.6.1.0 (2013/02/01) Time,XYTime Polt関係の時間軸を表す場合のフォーマット
    094        private SegmentedTimeline       timeLine ;              // 6.7.3.0 (2017/01/27) Time,XYTime Polt関係の時間軸を調整する SegmentedTimeline
    095
    096        /**
    097         * JFreeChart オブジェクトを作成します。
    098         *
    099         * 内部的には、ChartPlot インターフェースに基づいた Plot を構築するクラスを
    100         * 呼び出して、JFreeChart の引数に設定します。
    101         * 各種属性の設定も行います。
    102         *
    103         * @return      JFreeChartオブジェクト
    104         */
    105        public JFreeChart getChart() {
    106
    107                final ChartPlot chPlot = ChartFactory.newChartPlot( chartType );
    108
    109                final Plot plot = chPlot.getPlot( this );
    110
    111                // 描画領域の設定
    112                if( plotBackColor != null ) {
    113                        plot.setBackgroundPaint( plotBackColor );
    114                }
    115
    116                final JFreeChart chart = new JFreeChart( title, JFreeChart.DEFAULT_TITLE_FONT, plot, showLegend );
    117
    118                if( showLegend ) {
    119                        chart.getLegend().setPosition( rectEdge );
    120                }
    121
    122                // 背景色の設定
    123                if( chartBackColor != null ) {
    124                        chart.setBackgroundPaint( chartBackColor );
    125                }
    126
    127                // 以降の処理では、変更イベントが発行される。
    128                if( categoryAnchor != null && plot instanceof CategoryPlot ) {
    129                        ((CategoryPlot)plot).setDomainGridlinePosition( categoryAnchor ) ;
    130                }
    131
    132                return chart;
    133        }
    134
    135        /**
    136         * JFreeChart オブジェクトを変更します。
    137         *
    138         * すでに作成済みの JFreeChart に対して、
    139         * シリーズのピックアップ(seriesPikup) のみ、変更します。
    140         * 使用するのは、引数の JFreeChart と seriesPikup 属性値のみです。
    141         *
    142         * @og.rev 3.8.9.2 (2007/07/28) シリーズ指定時の色、シェープ対応
    143         *
    144         * @param       chart   JFreeChartオブジェクト
    145         * @param       serNo   seriesPikup 属性値
    146         *
    147         * @return      JFreeChartオブジェクト
    148         */
    149        public static JFreeChart modifying( final JFreeChart chart,final int serNo ) {
    150
    151                final CategoryPlot plot = chart.getCategoryPlot();
    152
    153                if( plot instanceof HybsCategoryPlot ) {
    154                        // 以降の処理では、変更イベントは発行されない。
    155                        // 5.1.8.0 (2010/07/01) 実質的に使用されていないので、削除
    156                        ((HybsCategoryPlot)plot).setSeriesPikup( serNo ) ;
    157                }
    158
    159                final CategoryDataset dtset = plot.getDataset();
    160                final int rowCnt = dtset.getRowCount(); // Series の個数
    161
    162                final CategoryItemRenderer rend = plot.getRenderer();
    163
    164                if( serNo >= 0 && serNo < rowCnt ) {
    165                        rend.setBasePaint( Color.CYAN );
    166                        rend.setSeriesPaint( serNo, Color.RED );
    167                }
    168
    169                return chart ;
    170        }
    171
    172        /**
    173         * CategoryPlotオブジェクトを返します。
    174         *
    175         * ChartCreate オブジェクト(自分自身)に設定された各種属性を元に、
    176         * CategoryPlotオブジェクトを構築します。
    177         * 必要な属性設定は、済んでいる状態です。
    178         * ここでは、serNo、categoryAxis、plotOrientation、useDomainLine、
    179         * domainLineColor、useRangeLine 、RangeLineColor 、rangeSkip 、
    180         * domainMarker を設定しておきます。
    181         *
    182         * @og.rev 4.1.1.0 (2008/02/04) 新規追加
    183         *
    184         * @return      必要な属性を設定済みのCategoryPlotオブジェクト
    185         */
    186        protected HybsCategoryPlot makeCategoryPlot() {
    187                final HybsCategoryPlot cPlot = new HybsCategoryPlot( seriesPikup );
    188
    189                cPlot.setOrientation( plotOri );
    190                cPlot.setDatasetRenderingOrder( DatasetRenderingOrder.FORWARD );
    191
    192                // ドメイン(横軸)に対する、グリッドライン(垂直線)の指定
    193                cPlot.setDomainGridlinesVisible( useDomainLine );
    194                if( domainLineColor != null ) { cPlot.setDomainGridlinePaint( domainLineColor ); }
    195
    196                // レンジ(縦軸)に対する、グリッドライン(水平線)の指定
    197                cPlot.setRangeGridlinesVisible( useRangeLine );
    198                if( rangeLineColor != null ) { cPlot.setRangeGridlinePaint( rangeLineColor ); }
    199
    200                // 4.1.1.0 (2008/02/04) 縦軸のグリッド線(水平線)をスキップする間隔の指定
    201                cPlot.setRangeSkip( rangeSkip );
    202
    203                // 横軸ドメインマーカーの設定(縦ライン)
    204                if( domainMarker != null ) {
    205                        final CategoryMarker catMk = new CategoryMarker( domainMarker );
    206                        catMk.setDrawAsLine( true );
    207                        if( useMarkerLabel ) {
    208                                catMk.setLabel( domainMarker );
    209                        }
    210                        cPlot.addDomainMarker( catMk );
    211                }
    212
    213                return cPlot ;
    214        }
    215
    216        /**
    217         * CategoryAxisオブジェクトを返します。
    218         *
    219         * ChartCreate オブジェクト(自分自身)に設定された各種属性を元に、
    220         * CategoryAxisオブジェクトを構築します。
    221         * 必要な属性設定は、済んでいる状態です。
    222         * ここでは、domainLabel、categoryMargin、lowerMargin、upperMargin、
    223         * useDomainLabel、rotationLabel を設定しておきます。
    224         *
    225         * @og.rev 4.1.1.0 (2008/02/04) 横軸ラベルの文字位置指定のカット文字数追加(categoryCutNo)
    226         *
    227         * @return      必要な属性を設定済みの CategoryAxisオブジェクト
    228         */
    229        protected CategoryAxis makeCategoryAxis() {
    230                final CategoryAxis categoryAxis = new HybsCategoryAxis(
    231                                                                                        domainLabel,categorySkip,categoryCutNo
    232                                                                        );
    233
    234                // カテゴリマージン(0.0～1.0)を指定します。
    235                if( categoryMargin != null ) {
    236                        final double ctMargin = Double.parseDouble( categoryMargin );
    237                        categoryAxis.setCategoryMargin( ctMargin ) ;    // double margin
    238                }
    239
    240                // 下方マージン(0.0～1.0)を指定します。
    241                if( lowerMargin != null ) {
    242                        final double lwMargin = Double.parseDouble( lowerMargin );
    243                        categoryAxis.setLowerMargin( lwMargin ) ;       // double margin
    244                }
    245
    246                // 上方マージン(0.0～1.0)を指定します。
    247                if( upperMargin != null ) {
    248                        final double upMargin = Double.parseDouble( upperMargin );
    249                        categoryAxis.setUpperMargin( upMargin ) ;       // double margin
    250                }
    251
    252                // チャートのカテゴリーラベルの方向を指定します。
    253                if( rotationLabel > 0 ) {
    254                        categoryAxis.setCategoryLabelPositions(
    255                                CategoryLabelPositions.createUpRotationLabelPositions(
    256                                        Math.PI / rotationLabel ));
    257                }
    258                else if( rotationLabel < 0 ) {
    259                        categoryAxis.setCategoryLabelPositions(
    260                                CategoryLabelPositions.createDownRotationLabelPositions(
    261                                        Math.PI / -rotationLabel ));
    262                }
    263
    264                // 横軸ラベルの表示有無を返します。
    265                categoryAxis.setVisible( useDomainLabel );      // ドメインラベルの表示有無
    266
    267                if( isDebug ) {
    268                        System.out.println( "CategoryMargin="+categoryAxis.getCategoryMargin());
    269                        System.out.println( "LowerMargin="+categoryAxis.getLowerMargin());
    270                        System.out.println( "UpperMargin="+categoryAxis.getUpperMargin());
    271                }
    272
    273                return categoryAxis ;
    274        }
    275
    276        /**
    277         * チャートのデータ属性管理オブジェクトのリストを設定します。
    278         *
    279         * ChartDataset オブジェクトは、内部チャートの個々の属性を管理しています。
    280         * このオブジェクト は、グラフの合成に使用できるように、内部にそれぞれの Plot や
    281         * renderer に対応する情報を持っています。
    282         * これらを、複数管理するときに、List 管理していますので、そのList をセットします。
    283         * JFreeChart には、この複数のChartDataset から、それぞれの Plot と Dataset を
    284         * 順次、追加していく必要があります。その処理は、ChartPlot インターフェースを
    285         * 継承した、サブクラスで実際に行われます。
    286         *
    287         * @param       datasetList     チャートのデータ属性管理のリスト
    288         */
    289        public void setDatasetList( final List<ChartDataset> datasetList ) {
    290                chartDataset = datasetList;
    291
    292                if( chartDataset != null ) {
    293                        final ChartDataset firstChData = chartDataset.get(0);
    294                        chartType = firstChData.getChartType();
    295                }
    296        }
    297
    298        /**
    299         * チャートのデータ属性管理オブジェクトのリストを返します。
    300         *
    301         * @return      チャートのデータ属性管理オブジェクトのリスト
    302         * @see #setDatasetList( List )
    303         */
    304        protected List<ChartDataset> getDatasetList() { return chartDataset; }
    305
    306        /**
    307         * チャートのタイトルを設定します。
    308         *
    309         * @param       chTitle チャートのタイトル
    310         */
    311        public void setTitle( final String chTitle ) {
    312                title = chTitle;
    313        }
    314
    315        /**
    316         * チャートの共通横軸のラベルを設定します。
    317         *
    318         * @param       domLabel        チャートの共通横軸のラベル
    319         */
    320        public void setDomainLabel( final String domLabel ) {
    321                domainLabel = domLabel;
    322        }
    323
    324        /**
    325         * チャートの共通横軸のラベルを返します。
    326         *
    327         * @return      チャートの共通横軸のラベル
    328         */
    329        protected String getDomainLabel() { return domainLabel; }
    330
    331        /**
    332         * 凡例 の表示可否を設定します。
    333         *
    334         * @param       showLeg 凡例 の表示可否
    335         */
    336        public void setShowLegend( final boolean showLeg ) {
    337                showLegend = showLeg;
    338        }
    339
    340        /**
    341         * 凡例の表示箇所を設定します(TOP、BOTTOM、RIGHT、LEFT)。
    342         *
    343         * 表示箇所は、org.jfree.ui.RectangleEdge クラスの設定値を使用します。
    344         * 指定できるのは、TOP、BOTTOM、RIGHT、LEFT で、各文字の頭一文字で
    345         * 判定してます。つまり、T,B,R,L で、判定を行い、それ以外はエラーになります。
    346         *
    347         * @param       edge    凡例の表示箇所(TOP、BOTTOM、RIGHT、LEFT)
    348         */
    349        public void setRectangleEdge( final String edge ) {
    350                if( edge != null && edge.length() > 0 ) {
    351                        final char ope = edge.charAt(0);
    352                        switch( ope ) {
    353                                case 'T' : rectEdge = RectangleEdge.TOP;        break;
    354                                case 'B' : rectEdge = RectangleEdge.BOTTOM;break;
    355                                case 'R' : rectEdge = RectangleEdge.RIGHT;      break;
    356                                case 'L' : rectEdge = RectangleEdge.LEFT;       break;
    357                                default  :
    358                                        final String errMsg = "指定のパラメータは適用できません。[" + edge + "]"
    359                                                        + CR
    360                                                        + "TOP,BOTTOM,RIGHT,LEFT の中から、指定してください。" ;
    361                                        throw new HybsSystemException( errMsg );
    362                        }
    363                }
    364        }
    365
    366        /**
    367         * チャートの軸表示方向を設定します(VERTICAL、HORIZONTAL)。
    368         *
    369         * 軸表示方向は、org.jfree.chart.plot.PlotOrientation クラスの設定値を使用します。
    370         * 指定できるのは、VERTICAL、HORIZONTALで、各文字の頭一文字で
    371         * 判定してます。つまり、V,H で、判定を行い、それ以外はエラーになります。
    372         *
    373         * @param       orientation     凡例の表示箇所(VERTICAL、HORIZONTAL)
    374         */
    375        public void setPlotOrientation( final String orientation ) {
    376                if( orientation != null && orientation.length() > 0 ) {
    377                        final char ope = orientation.charAt(0);
    378                        switch( ope ) {
    379                                case 'V' : plotOri = PlotOrientation.VERTICAL;  break;
    380                                case 'H' : plotOri = PlotOrientation.HORIZONTAL;break;
    381                                default  :
    382                                        final String errMsg = "指定のパラメータは適用できません。[" + orientation + "]"
    383                                                        + CR
    384                                                        + "VERTICAL,HORIZONTAL の中から、指定してください。" ;
    385                                        throw new HybsSystemException( errMsg );
    386                        }
    387                }
    388        }
    389
    390        /**
    391         * チャートの軸表示方向を返します。
    392         *
    393         * org.jfree.chart.plot.PlotOrientation クラスの設定値を使用します。
    394         *
    395         * @return      チャートの軸表示方向(VERTICAL、HORIZONTAL)
    396         */
    397        protected PlotOrientation getPlotOrientation() { return plotOri; }
    398
    399        /**
    400         * チャートの背景色を指定します。
    401         *
    402         * 指定文字列は、java.awt.Color クラスのstatic フィールド名で指定します。
    403         * BLACK , BLUE , CYAN , DARK_GRAY , GRAY , GREEN , LIGHT_GRAY ,
    404         * MAGENTA , ORANGE , PINK , RED , WHITE , YELLOW , (PURPLE) が指定できます。
    405         * また、#XXXXXX形式の16bitRGB表記 でも指定可能です。
    406         *
    407         * @og.rev 6.0.2.1 (2014/09/26) StringUtil → ColorMap
    408         *
    409         * @param   chBackClr チャートの背景色
    410         * @see         java.awt.Color#BLACK
    411         */
    412        public void setChartBackColor( final String chBackClr ) {
    413                if( chBackClr != null && chBackClr.length() > 0 ) {
    414                        chartBackColor = ColorMap.getColorInstance( chBackClr );                // 6.0.2.1 (2014/09/26) StringUtil → ColorMap
    415                }
    416        }
    417
    418        /**
    419         * チャートの描画領域の色を指定します。
    420         *
    421         * 指定文字列は、java.awt.Color クラスのstatic フィールド名で指定します。
    422         * BLACK , BLUE , CYAN , DARK_GRAY , GRAY , GREEN , LIGHT_GRAY ,
    423         * MAGENTA , ORANGE , PINK , RED , WHITE , YELLOW , (PURPLE) が指定できます。
    424         * また、#XXXXXX形式の16bitRGB表記 でも指定可能です。
    425         *
    426         * @og.rev 6.0.2.1 (2014/09/26) StringUtil → ColorMap
    427         *
    428         * @param   plBackClr チャートの描画領域色
    429         * @see         java.awt.Color#BLACK
    430         */
    431        public void setPlotBackColor( final String plBackClr ) {
    432                if( plBackClr != null && plBackClr.length() > 0 ) {
    433                        plotBackColor = ColorMap.getColorInstance( plBackClr );         // 6.0.2.1 (2014/09/26) StringUtil → ColorMap
    434                }
    435        }
    436
    437        /**
    438         * チャートのカテゴリーラベルの方向を指定します。
    439         *
    440         * これは、CategoryAxis 系の横軸ラベルに対して、表示方向を指定します。
    441         * ValueAxis系(NumberAxis,DateAxis)は、setUseVerticalLabels( boolean ) で
    442         * true:縦/false:横 のみ指定可能です。
    443         *
    444         * 方向は、上方向に対して、(PI / 指示数) で求まる値に設定します。
    445         * この指示数に相当する値を設定します。
    446         * 1:180度 、2:90度 、3:60度 、4:45度 、6:30度 ･･･
    447         * マイナスは、下方向に回転させます。
    448         * 0 を指定した場合は、何も設定しません。(初期設定のまま)
    449         *
    450         * @param   rotLabel カテゴリーラベルの方向
    451         * @see         #setUseVerticalLabels( boolean )
    452         */
    453        public void setRotationLabel( final int rotLabel ) {
    454                rotationLabel = rotLabel;
    455        }
    456
    457        /**
    458         * ラベルの表示向きを縦にするかどうか[false/true]を指定します(初期値:false)。
    459         *
    460         * これは、ValueAxis系(NumberAxis,DateAxis) 系の横軸ラベルに対して、表示方向を
    461         * true:縦/false:横で、指定します。
    462         * true に指定した場合で、かつ、rotationLabel が未指定(=0)の場合は、2:90度 も設定します。
    463         *
    464         * ChartCreate の rotationLabel は、角度を指定できましたが、NumberAxis,DateAxis では、
    465         * 縦にするかどうかの指定しかできません。
    466         * ここでは、true を指定するとラベルは、縦書きになります。
    467         * 初期値は、false(横書き)です。
    468         *
    469         * @og.rev 5.6.4.3 (2013/05/24) 新規追加
    470         *
    471         * @param       useVLavels      ラベルの表示向き [false:横書き/true:縦書き]
    472         * @see         #setRotationLabel( int )
    473         */
    474        public void setUseVerticalLabels( final boolean useVLavels ) {
    475                useVerticalLabels = useVLavels;
    476
    477                // useVerticalLabels=true で、rotationLabel を 2:90度 に設定しておきます。
    478                if( useVerticalLabels && rotationLabel == 0 ) { rotationLabel = 2; }
    479        }
    480
    481        /**
    482         * チャートのカテゴリーラベルの方向を取得します。
    483         *
    484         * 方向は、上方向に対して、(PI / 指示数) で求まる値に設定します。
    485         * この指示数に相当する値を設定します。
    486         * 1:180度 、2:90度 、3:60度 、4:45度 、6:30度 ･･･
    487         * マイナスは、した方向に回転させます。
    488         * 0 を指定した場合は、何も設定しません。(初期設定のまま)
    489         *
    490         * @return      カテゴリーラベルの方向
    491         * @see     #setRotationLabel( int )
    492         */
    493        protected int getRotationLabel() { return rotationLabel; }
    494
    495        /**
    496         * チャートの横軸の値(ドメイン)に合致する位置にマーカーラインを設定します。
    497         *
    498         * この属性には、マーカーラインを設定する値を記述します。
    499         *
    500         * @param   marker ドメインのマーカーライン
    501         */
    502        public void setDomainMarker( final String marker ) {
    503                if( marker != null && marker.length() > 0 ) {
    504                        domainMarker = marker;
    505                }
    506        }
    507
    508        /**
    509         * 横軸ラベルのラベルを表示するかどうか[true/false]を指定します(初期値:true)。
    510         *
    511         * ドメイン(横軸)が、多数存在する場合、ドメインラベルが見えにくくなります。
    512         * そのようなケースで、横軸のラベルそのものを表示しない場合に、false を
    513         * 設定します。
    514         * 初期値は、表示する(true)です。
    515         *
    516         * @param   flag 横軸ラベルの表示有無 [true:表示する/false:表示しない]
    517         */
    518        public void setUseDomainLabel( final boolean flag ) {
    519                useDomainLabel = flag ;
    520        }
    521
    522        /**
    523         * 横軸ラベルの表示有無を返します。
    524         *
    525         * @return      boolean横軸ラベルの表示有無(true:表示する/false:表示しない)
    526         */
    527        protected boolean isUseDomainLabel() { return useDomainLabel; }
    528
    529        /**
    530         * マーカーラインに、その設定値を表示するかどうか[true/false]を指定します(初期値:true)。
    531         *
    532         * ドメイン(横軸)が、多数存在する場合、ドメインラベルが見えない場合があります。
    533         * そのようなケースで、見たい値にマーカーラインを設定し、その横に、ドメインラベル
    534         * を表示する事で、ピックアップしている軸の値を容易に知ることが可能です。
    535         * 初期値は、表示する(true)です。
    536         *
    537         * @param   flag マーカーラインの設定値表示 [true:表示する/false:表示しない]
    538         */
    539        public void setUseMarkerLabel( final boolean flag ) {
    540                useMarkerLabel = flag ;
    541        }
    542
    543        /**
    544         * 複数シリーズのピックアップを行う場合のシリーズ番号を指定します。
    545         *
    546         * 複数シリーズ(検索時に複数項目を同時に検索する場合)では、チャート上に
    547         * 複数のグラフが表示されますが、その中の一つをピックアップする場合に、
    548         * シリーズ番号を指定します。
    549         * シリーズ番号は、0 から始まる数字です。
    550         * ここでは、ピックアップされたシリーズは、赤色で表示されます。
    551         * それ以外は、グレー色での表示になります。
    552         * (※ 本来は、ChartDataset に持つべき属性です。)
    553         *
    554         * @param       serPikup        シリーズ番号
    555         */
    556        public void setSeriesPikup( final int serPikup ) {
    557                seriesPikup = serPikup;
    558        }
    559
    560        /**
    561         * 横軸ラベルをスキップする間隔を指定します。
    562         *
    563         * 横軸ラベル(カテゴリラベル表示)する際に、スキップする間隔を指定します。
    564         * "1" (初期値)では、１つづつ表示(つまり、すべて表示する)します。
    565         * "2" とすると、１つおきに、"3" とすると、２つおきに表示します。
    566         * 初期値は、"1" (すべて表示)です。
    567         * なお、先頭から表示を開始します。
    568         *
    569         * 注意：これとは別に、ラベル先頭に "_" を付けた場合は、ラベルを表示しません。
    570         * また、categoryCutNo が指定された場合は、categorySkip は使用されません。
    571         *
    572         * @param       cateSkip        ラベルをスキップする間隔を指定
    573         * @see         #setCategoryCutNo( int )
    574         */
    575        public void setCategorySkip( final int cateSkip ) {
    576                categorySkip = cateSkip;
    577        }
    578
    579        /**
    580         * 横軸ラベルの文字位置指定のカット文字数を指定します。
    581         *
    582         * @og.rev 4.1.1.0 (2008/02/04) 新規追加
    583         *
    584         * 横軸ラベル(カテゴリラベル表示)する際に、ラベルの先頭から、この指定文字数だけ
    585         * カットして、表示します。
    586         * その際、前回作成したカットラベルと、同一ラベルの場合は、表示しません。
    587         * 例えば、データは、年月日で、年と月のみ(先頭６文字)を指定すると、
    588         * 日のデータは、ラベルが表示されません。
    589         * 指定される数字は、１以上の整数としてください。
    590         * 初期値は、すべて表示です。
    591         *
    592         * 注意：これとは別に、ラベル先頭に "_" を付けた場合は、ラベルを表示しません。
    593         * また、categoryCutNo が指定された場合は、categorySkip は使用されません。
    594         *
    595         * @param       cateCutNo       カット文字数
    596         * @see         #setCategorySkip( int )
    597         */
    598        public void setCategoryCutNo( final int cateCutNo ) {
    599                if( cateCutNo > 0 ) {
    600                        categoryCutNo = cateCutNo;
    601                }
    602        }
    603
    604        /**
    605         * 複数シリーズのピックアップを行う場合のシリーズ番号を取得します。
    606         *
    607         * 方向は、上方向に対して、(PI / 指示数) で求まる値に設定します。
    608         * この指示数に相当する値を設定します。
    609         * 0 を指定した場合は、何も設定しません。(初期設定のまま)
    610         * (※ 本来は、ChartDataset に持つべき属性です。)
    611         *
    612         * @return      シリーズ番号
    613         * @see     #setSeriesPikup( int )
    614         */
    615        protected int getSeriesPikup() { return seriesPikup; }
    616
    617        /**
    618         * 縦軸のグリッド線(水平線)をスキップする間隔を指定します(初期値:-1)。
    619         *
    620         * 縦軸のグリッド線を表示する際に、スキップする間隔を指定します。
    621         * 通常は、ラベルと同じだけのグリッド線が掛かれますが、ラベルよりも
    622         * 少ない数のグリッド線(例えば、２つおき)を出す場合に、値を設定します。
    623         * "1" (初期値)では、１つづつ表示(つまり、すべて表示する)します。
    624         * "2" とすると、１つおきに、"3" とすると、２つおきに表示します。
    625         * なお、先頭から表示を開始します。
    626         *
    627         * 6.0.2.0 (2014/09/19) 前回の JFreeChart のVerUpで、グリッド線の表示が
    628         * ５個おきに変わったようです。設定する値を マイナスにすると、初期設定の値を
    629         * 使用するように変更します。微調整は、個々にお願いします。
    630         *
    631         * 初期値は、"-1" (設定しない)です。
    632         *
    633         * @og.rev 4.1.1.0 (2008/02/04) 新規追加
    634         * @og.rev 6.0.2.0 (2014/09/19) rangeSkip 属性 の初期値を、-1(設定なし)に変更
    635         *
    636         * @param       rngSkip 縦軸のグリッド線(水平線)をスキップする間隔
    637         */
    638        public void setRangeSkip( final int rngSkip ) {
    639                rangeSkip = rngSkip;
    640        }
    641
    642        /**
    643         * クリッカブル・マップ用URLを指定します。
    644         *
    645         * 画像に、クリッカブル・マップを作成する場合の、URL を指定します。
    646         * これは、画像上にエリア指定でリンク引数を作成することが可能です。
    647         * URL 自身は、? 付きで固定値の引数を連結することが可能です。
    648         * クリックしたエリアのカテゴリやインデックスの値(引数)は、自動的に
    649         * 設定されます。(指定しない場合はチャートによって異なります)
    650         * <pre>
    651         * ・Pie      ：category、pieIndex
    652         * ・XY       ：series、item
    653         * ・Category ：series、category
    654         * </pre>
    655         * この引数の URL の名称を変更したい場合は、URL に続けて、カンマ(,) で、
    656         * 名称を記述してください。
    657         * 例：link.jsp,BLOCK
    658         *
    659         * @param       imageMapUrl     クリッカブル・マップ用URL
    660         */
    661        public void setImageMapUrl( final String imageMapUrl ) {
    662                if( imageMapUrl != null ) {
    663                        urlGen = new HybsURLGenerator( imageMapUrl );
    664                }
    665        }
    666
    667        /**
    668         * クリッカブル・マップ用URLを取得します。
    669         *
    670         * @return      クリッカブル・マップ用URL
    671         * @see     #setImageMapUrl( String )
    672         */
    673        protected HybsURLGenerator getURLGenerator() { return urlGen; }
    674
    675        /**
    676         * ツールチップス利用(true)利用しない(false)のフラグを取得します。
    677         *
    678         * @og.rev 4.3.1.0 (2008/08/09) 新規追加
    679         * @og.rev 4.9.9.9 (2009/08/07) メソッド名変更
    680         *
    681         * @return      ツールチップス利用(true)利用しない(false)のフラグ
    682         * @see     #setUseToolTip( boolean )
    683         */
    684        protected boolean isUseToolTip() { return useToolTip; }
    685
    686        /**
    687         * カテゴリマージン(0.0～1.0)を指定します。
    688         *
    689         * カテゴリ(グラフの横軸に相当)の表示間隔(マージン)の比率を指定します。
    690         * この比率は、％ ではなく、数字(double)での設定になります。
    691         * 何も指定しない場合は、デフォルトで自動調整されます。
    692         *
    693         * @og.rev 4.0.2.0 (2007/12/20) 新規追加
    694         *
    695         * @param       margin  カテゴリマージン(0.0～1.0)
    696         */
    697        public void setCategoryMargin( final String margin ) {
    698                categoryMargin = margin;
    699        }
    700
    701        /**
    702         * 下方マージン(0.0～1.0)を指定します。
    703         *
    704         * カテゴリ(グラフの横軸に相当)の下方側(左側)のマージンの比率を指定します。
    705         * この比率は、％ ではなく、数字(double)での設定になります。
    706         * 何も指定しない場合は、デフォルトで自動調整されます。
    707         *
    708         * @og.rev 4.0.2.0 (2007/12/20) 新規追加
    709         *
    710         * @param       margin  下方マージン(0.0～1.0)
    711         */
    712        public void setLowerMargin( final String margin ) {
    713                lowerMargin = margin;
    714        }
    715
    716        /**
    717         * 上方マージン(0.0～1.0)を指定します。
    718         *
    719         * カテゴリ(グラフの横軸に相当)の上方側(右側)のマージンの比率を指定します。
    720         * この比率は、％ ではなく、数字(double)での設定になります。
    721         * 何も指定しない場合は、デフォルトで自動調整されます。
    722         *
    723         * @og.rev 4.0.2.0 (2007/12/20) 新規追加
    724         *
    725         * @param       margin  上方マージン(0.0～1.0)
    726         */
    727        public void setUpperMargin( final String margin ) {
    728                upperMargin = margin;
    729        }
    730
    731        /**
    732         * 横軸のグリッド表示有無(垂直線)を指定します(初期値:false)。
    733         *
    734         * ドメイン(横軸)に対する、グリッドラインを表示するかどうか指定します。
    735         *
    736         * 何も指定しない場合は、表示しません。(false)
    737         *
    738         * @og.rev 4.0.3.0 (2008/01/07) 新規追加
    739         *
    740         * @param       useLine 横軸のグリッド表示有無(垂直線)
    741         */
    742        public void setUseDomainLine( final boolean useLine ) {
    743                useDomainLine = useLine;
    744        }
    745
    746        /**
    747         * 横軸のグリッド線の色を指定します。
    748         *
    749         * ドメイン(横軸)に対する、グリッドラインの表示色を指定します。
    750         * 何も指定しない場合は、デフォルトで自動設定されます。
    751         *
    752         * @og.rev 4.0.3.0 (2008/01/07) 新規追加
    753         * @og.rev 6.0.2.1 (2014/09/26) StringUtil → ColorMap
    754         *
    755         * @param       color   横軸のグリッド線の色
    756         */
    757        public void setDomainLineColor( final String color ) {
    758                if( color != null ) {
    759                        domainLineColor = ColorMap.getColorInstance( color );           // 6.0.2.1 (2014/09/26) StringUtil → ColorMap
    760                }
    761        }
    762
    763        /**
    764         * 縦軸のグリッド表示有無(水平線)を指定します(初期値:true)。
    765         *
    766         * レンジ(縦軸)に対する、グリッドラインを表示するかどうか指定します。
    767         *
    768         * 何も指定しない場合は、表示しません。(false)
    769         *
    770         * @og.rev 4.0.3.0 (2008/01/07) 新規追加
    771         *
    772         * @param       useLine 横軸のグリッド表示有無(垂直線)
    773         */
    774        public void setUseRangeLine( final boolean useLine ) {
    775                useRangeLine = useLine;
    776        }
    777
    778        /**
    779         * ツールチップスを利用(true)/利用しない(false)を指定します(初期値:false)。
    780         *
    781         * @og.rev 4.3.1.0 (2008/08/09) 新規追加
    782         *
    783         * @param       toolTip ツールチップスを利用(true)/利用しない(false)
    784         */
    785        public void setUseToolTip( final boolean toolTip ) {
    786                useToolTip = toolTip;
    787        }
    788
    789        /**
    790         * 縦軸のグリッド線の色を指定します。
    791         *
    792         * レンジ(縦軸)に対する、グリッドラインの表示色を指定します。
    793         * 何も指定しない場合は、デフォルトで自動設定されます。
    794         *
    795         * @og.rev 4.0.3.0 (2008/01/07) 新規追加
    796         * @og.rev 6.0.2.1 (2014/09/26) StringUtil → ColorMap
    797         *
    798         * @param       color   縦軸のグリッド線の色
    799         */
    800        public void setRangeLineColor( final String color ) {
    801                if( color != null ) {
    802                        rangeLineColor = ColorMap.getColorInstance( color );            // 6.0.2.1 (2014/09/26) StringUtil → ColorMap
    803                }
    804        }
    805
    806        /**
    807         * 横軸のグリッド(垂直線)の書き出し位置(START,MIDDLE,END)を指定します。
    808         *
    809         * 横軸のグリッド(垂直線)を、グラフのどの位置に記述するかを指定します。
    810         * 具体的な値は、CategoryAnchor オブジェクトの値になります。
    811         * ここでは、文字列で(START,MIDDLE,END)を指定します。(先頭一文字で判定)
    812         * 何も指定しない場合は、デフォルト(MIDDLE)です。
    813         *
    814         * @og.rev 4.1.1.0 (2008/02/14) 新規追加
    815         *
    816         * @param       anchor  横軸のグリッド(垂直線)の書き出し位置(START,MIDDLE,END)
    817         */
    818        public void setCategoryAnchor( final String anchor ) {
    819                if( anchor != null && anchor.length() > 0 ) {
    820                        final char anc = anchor.charAt(0);
    821                        switch( anc ) {
    822                                case 'S' : categoryAnchor = CategoryAnchor.START;       break;
    823                                case 'M' : categoryAnchor = CategoryAnchor.MIDDLE;      break;
    824                                case 'E' : categoryAnchor = CategoryAnchor.END;         break;
    825                                default  :
    826                                        final String errMsg = "指定のAnchorは適用できません。[" + anchor + "]"
    827                                                        + CR
    828                                                        + "START,MIDDLE,END の中から、指定してください。" ;
    829                                        throw new HybsSystemException( errMsg );
    830                        }
    831                }
    832        }
    833
    834        /**
    835         * Time,XYTime Polt関係の時間軸を表す場合のフォーマットを指定します。
    836         *
    837         * TimeSeries 関連のデータを扱う場合の横軸の日付フォーマットを指定します。
    838         * 日付フォーマットは、java.text.SimpleDateFormat で使われる yyyy/MM/dd HH:mm:ss 表記です。
    839         *
    840         * 初期値は、"MM/dd" です。
    841         *
    842         * @og.rev 5.6.1.0 (2013/02/01) 新規追加
    843         *
    844         * @param       dtFormat        Time,XYTime Polt関係の時間軸を表す場合のフォーマット
    845         */
    846        public void setDateAxisFormat( final String dtFormat ) {
    847                if( dtFormat != null && dtFormat.length() > 0 ) {
    848                        dateAxisFormat  = dtFormat;
    849                }
    850        }
    851
    852        /**
    853         * Time,XYTime Polt関係の時間軸で、SegmentedTimeline 関係の情報をセットします。
    854         *
    855         * segSizeは、分単位の数値です。日単位を指定する場合は、24*60 = 1440 を指定します。
    856         * 0 または、何も指定しない場合は、その他の情報を使用しません。 (SegmentedTimeline を使用しません。)
    857         *
    858         * <pre>
    859         *   start time
    860         *     |
    861         *     v
    862         *     0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 ...
    863         *   +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+...
    864         *   |  |  |  |  |  |EE|EE|  |  |  |  |  |EE|EE|  |  |  |  |  |EE|EE|
    865         *   +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+...
    866         *   [_____________] [___]            [_]
    867         *          |          |               |
    868         *       included   excluded        segment
    869         *       segments   segments         size
    870         *   [___________________]
    871         *              |
    872         *         segment group
    873         * </pre>
    874         *
    875         * @og.rev 6.7.3.0 (2017/01/27) 新規追加
    876         *
    877         * @param       segSize         SegmentedTimelineのsegment size を、分単位で指定
    878         * @param       segIncluded     SegmentedTimelineのincluded segments(ｽﾍﾟｰｽ)を数値で指定
    879         * @param       segExcluded     SegmentedTimelineのexcluded segments(EE)を数値で指定
    880         * @param       startTime       SegmentedTimelineのStartTime(segment groupの開始位置)
    881         */
    882        public void setSegmentedTimelineInfo( final int segSize , final int segIncluded , final int segExcluded , final String startTime ) {
    883                if( segSize > 0 ) {
    884                        // 6.9.8.0 (2018/05/28) FindBugs:整数乗算の結果を long にキャストしている
    885//                      timeLine = new SegmentedTimeline( segSize * 60 * 1000 , segIncluded , segExcluded );
    886                        timeLine = new SegmentedTimeline( segSize * TIME_LINE , segIncluded , segExcluded );
    887                        if( startTime != null && startTime.length() >= 8 ) {
    888                                final Calendar cal = HybsDateUtil.getCalendar( startTime );
    889                                timeLine.setStartTime( cal.getTimeInMillis() );
    890                        }
    891                }
    892        }
    893
    894        /**
    895         * Time,XYTime Polt関係の時間軸を表す DateAxis オブジェクトを返します。
    896         *
    897         * このオブジェクトは、domainLabel で名前付けされた DateAxis で、日付フォーマットは、
    898         * dateAxisFormat で DateFormat を Override しています。
    899         * 初期フォーマットは、"MM/dd" です。
    900         *
    901         * @og.rev 5.6.1.0 (2013/02/01) 新規追加
    902         * @og.rev 5.6.4.3 (2013/05/24) 横軸ラベルを９０度傾ける処理を追加
    903         * @og.rev 6.7.3.0 (2017/01/27) 日付軸(dateAxis)の指定で、dateSegSize,dateSegIncluded,dateSegExcluded,dateStartTime を追加します。
    904         *
    905         * @return      DateAxisオブジェクト(Time,XYTime Polt関係の時間軸表現)
    906         */
    907        protected DateAxis getDateAxis() {
    908                final DateAxis daxis = new DateAxis( domainLabel );
    909                daxis.setDateFormatOverride( new SimpleDateFormat( dateAxisFormat,Locale.JAPAN ) );
    910
    911                // 5.6.4.3 (2013/05/24) 時間関係の横軸は、rotationLabel ではなく、useVerticalLabels を使います。
    912                if( useVerticalLabels ) {
    913                        daxis.setVerticalTickLabels( useVerticalLabels );
    914                }
    915
    916                if( timeLine != null ) { daxis.setTimeline( timeLine );  }              // 6.7.3.0 (2017/01/27)
    917
    918                return daxis;
    919        }
    920
    921        /**
    922         * デバッグフラグを指定します。
    923         *
    924         * true に設定すると、チャートの状態を System.out.println します。
    925         *
    926         * @og.rev 4.0.2.0 (2007/12/20) 新規追加
    927         *
    928         * @param   flag デバッグフラグ [true:デバッグ/false:通常]
    929         */
    930        public void setDebug( final boolean flag ) {
    931                isDebug = flag;
    932        }
    933}