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" (初期値)では、1つづつ表示(つまり、すべて表示する)します。
572         * "2" とすると、1つおきに、"3" とすると、2つおきに表示します。
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         * 例えば、データは、年月日で、年と月のみ(先頭6文字)を指定すると、
595         * 日のデータは、ラベルが表示されません。
596         * 指定される数字は、1以上の整数としてください。
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         * 少ない数のグリッド線(例えば、2つおき)を出す場合に、値を設定します。
630         * "1" (初期値)では、1つづつ表示(つまり、すべて表示する)します。
631         * "2" とすると、1つおきに、"3" とすると、2つおきに表示します。
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) 横軸ラベルを90度傾ける処理を追加
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}