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 java.util.List;
019import java.awt.Color;
020import org.opengion.hayabusa.common.HybsSystemException;                // 6.9.8.0 (2018/05/28)
021
022import org.jfree.data.general.Dataset;
023import org.jfree.data.general.PieDataset;
024import org.jfree.data.category.CategoryDataset;
025import org.jfree.data.xy.XYDataset;
026import org.jfree.chart.plot.Plot;
027import org.jfree.chart.plot.MultiplePiePlot;
028import org.jfree.chart.plot.PiePlot;
029import org.jfree.chart.plot.PiePlot3D;
030import org.jfree.chart.plot.RingPlot;
031import org.jfree.chart.plot.SpiderWebPlot;
032import org.jfree.chart.plot.PolarPlot;
033import org.jfree.chart.labels.StandardCategoryToolTipGenerator;
034import org.jfree.chart.labels.StandardPieToolTipGenerator;
035
036/**
037 * ChartPlot_Pie は、ChartPlot インターフェースを継承した実体クラスです。
038 * JFreeChart では、各種オブジェクトの組み合わせで、色々なグラフを作成できます。
039 * チャートタイプが、複数種類存在するため、ここでは、特殊な方法として、各タイプ毎に
040 * オブジェクトを構築しています。(ファクトリメソッド的な処理)
041 *
042 * @version  0.9.0      2007/06/21
043 * @author       Kazuhiko Hasegawa
044 * @since        JDK1.1,
045 */
046public class ChartPlot_Pie implements ChartPlot {
047
048        /**
049         * デフォルトコンストラクター
050         *
051         * @og.rev 6.4.2.0 (2016/01/29) PMD refactoring. Each class should declare at least one constructor.
052         */
053        public ChartPlot_Pie() { super(); }             // これも、自動的に呼ばれるが、空のメソッドを作成すると警告されるので、明示的にしておきます。
054
055        /**
056         * Plot オブジェクトを取得します。
057         *
058         * Plot オブジェクト には、その種類の応じた、データセットやレンデラーを
059         * 設定する必要があります。
060         * また、複数のデータセットや、それに関係する属性情報も、設定する必要が
061         * あります。
062         * Plot は、JFreeChart オブジェクトにつき、一つ用意しなければなりません。
063         * チャート合成時でも、Plot は一つです。
064         *
065         * @og.rev 5.3.0.0 (2010/12/01) 特殊プロットの追加
066         * @og.rev 5.7.8.0 (2014/07/04) MeterPlot 、Compass 、Thermometer の機能追加
067         * @og.rev 6.4.9.0 (2016/07/23) Pie,Pie3D,Ring に、色指定を追加。これらは、同じ設定が使えるので、マージします。
068         *
069         * @param       create  ChartCreateオブジェクト
070         *
071         * @return      Plotオブジェクト
072         */
073        public Plot getPlot( final ChartCreate create ) {
074
075                final List<ChartDataset> datasetList = create.getDatasetList();
076                final ChartDataset chDataset = datasetList.get(0);
077
078                final Dataset dtset = chDataset.getDataset();
079
080                // クリッカブル・マップ
081                final HybsURLGenerator urlGen = create.getURLGenerator();
082                final boolean useToolTip = create.isUseToolTip();               // 4.9.9.9 (2009/08/07) メソッド名変更
083
084                Plot plot = null;
085                final String type = chDataset.getChartType();
086                // 6.4.9.0 (2016/07/23) Pie,Pie3D,Ring は、同じ設定が使えるので、マージします。
087                if( "Pie".equalsIgnoreCase( type ) || "Pie3D".equalsIgnoreCase( type ) || "Ring".equalsIgnoreCase( type ) ) {
088                        final PiePlot pplot ;
089                        switch( type ) {
090                                case "Pie"              : pplot = new PiePlot();        break;
091                                case "Pie3D"    : pplot = new PiePlot3D();      break;
092                                case "Ring"             : pplot = new RingPlot();       break;
093                                // 6.9.8.0 (2018/05/28) FindBugs:switch 文の2つの case のために同じコードを使用しているメソッド
094//                              default                 : pplot = new PiePlot();        break;
095                                default  :
096                                        // 先に、type を判定しているため、default には、分岐されない。
097                                        final String errMsg = "何らかの要因で、ありえないエラーが発生しました。";
098                                        throw new HybsSystemException( errMsg );
099                        }
100
101                        pplot.setDataset( (PieDataset)dtset );
102                        if( urlGen != null ) {
103                                pplot.setURLGenerator( urlGen );
104                        }
105                        if( useToolTip ){       // 4.3.1.0 (2008/08/09) ツールチップスの利用
106                                pplot.setToolTipGenerator( new StandardPieToolTipGenerator() );
107                        }
108
109                        // 6.4.9.0 (2016/07/23) 色指定の反映。indexが非推奨なので、キー指定に変更。
110                        final Color[] clrs = chDataset.getSeriesColors();
111                        if( clrs != null && clrs.length>0 ) {
112                                final int len = ((PieDataset)dtset).getItemCount();
113                                for( int i=0;i<clrs.length && i<len; i++ ) {
114                                        final Comparable<?> key = ((PieDataset)dtset).getKey(i);
115                                        pplot.setSectionPaint( key,clrs[i] );
116                                }
117                        }
118                        plot = pplot;
119                }
120                else if( "MultiplePie".equalsIgnoreCase( type ) ) {
121                        plot = new MultiplePiePlot();
122                        ((MultiplePiePlot)plot).setDataset( (CategoryDataset)dtset );
123                }
124                else if( "SpiderWeb".equalsIgnoreCase( type ) ) {
125                        plot = new SpiderWebPlot();
126                        ((SpiderWebPlot)plot).setDataset( (CategoryDataset)dtset );
127                        if( urlGen != null ) {
128                                ((SpiderWebPlot)plot).setURLGenerator( urlGen );
129                        }
130                        if( useToolTip ){       // 4.3.1.0 (2008/08/09) ツールチップスの利用
131                                ((SpiderWebPlot)plot).setToolTipGenerator( new StandardCategoryToolTipGenerator() );
132                        }
133
134                        // 6.4.9.0 (2016/07/23) 色指定の反映。
135                        final Color[] clrs = chDataset.getSeriesColors();
136                        if( clrs != null && clrs.length>0 ) {
137                                for( int i=0;i<clrs.length; i++ ) {
138                                        ((SpiderWebPlot)plot).setSeriesPaint( i,clrs[i] );
139                                }
140                        }
141                }
142                // 5.3.0.0 (2010/12/01) 特殊プロットの追加
143                else if( "Polar".equalsIgnoreCase( type ) ) {
144                        plot = new PolarPlot();
145                        ((PolarPlot)plot).setDataset( (XYDataset)dtset );
146                }
147                else if( "Meter".equalsIgnoreCase( type ) ) {
148                        // 5.7.8.0 (2014/07/04) 機能追加
149                        plot = chDataset.makeMeterPlot();
150                }
151                else if( "Thermometer".equalsIgnoreCase( type ) ) {
152                        // 5.7.8.0 (2014/07/04) 機能追加
153                        plot = chDataset.makeThermometerPlot();
154                }
155                else if( "Compass".equalsIgnoreCase( type ) ) {
156                        // 5.7.8.0 (2014/07/04) 機能追加
157                        plot = chDataset.makeCompassPlot();
158                }
159
160                return plot;
161        }
162}