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