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" (初期値)では、1つづつ表示(つまり、すべて表示する)します。
565         * "2" とすると、1つおきに、"3" とすると、2つおきに表示します。
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         * 例えば、データは、年月日で、年と月のみ(先頭6文字)を指定すると、
588         * 日のデータは、ラベルが表示されません。
589         * 指定される数字は、1以上の整数としてください。
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         * 少ない数のグリッド線(例えば、2つおき)を出す場合に、値を設定します。
623         * "1" (初期値)では、1つづつ表示(つまり、すべて表示する)します。
624         * "2" とすると、1つおきに、"3" とすると、2つおきに表示します。
625         * なお、先頭から表示を開始します。
626         *
627         * 6.0.2.0 (2014/09/19) 前回の JFreeChart のVerUpで、グリッド線の表示が
628         * 5個おきに変わったようです。設定する値を マイナスにすると、初期設定の値を
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) 横軸ラベルを90度傾ける処理を追加
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}