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