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