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