/* * Copyright (c) 2012 Patrick Meyer * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.itemanalysis.jmetrik.graph.piechart; import com.itemanalysis.jmetrik.swing.GraphPanel; import java.awt.Color; import java.awt.Dimension; import java.util.Iterator; import com.itemanalysis.psychometrics.statistics.TwoWayTable; import org.apache.log4j.Logger; import org.jfree.chart.ChartFactory; import org.jfree.chart.ChartPanel; import org.jfree.chart.JFreeChart; import org.jfree.chart.labels.StandardPieSectionLabelGenerator; import org.jfree.chart.plot.MultiplePiePlot; import org.jfree.chart.plot.PiePlot; import org.jfree.chart.plot.PiePlot3D; import org.jfree.chart.title.TextTitle; import org.jfree.data.category.DefaultCategoryDataset; import org.jfree.data.general.DefaultPieDataset; import org.jfree.ui.RectangleInsets; import org.jfree.util.Rotation; import org.jfree.util.TableOrder; public class PieChartPanel extends GraphPanel { private PieChartCommand command = null; private JFreeChart chart = null; private boolean hasGroupVariable = false; private boolean explode = false; private double explodePercent = 0.0; private String explodeValue = ""; private String chartTitle = ""; private String chartSubtitle = ""; static Logger logger = Logger.getLogger("jmetrik-logger"); public PieChartPanel(PieChartCommand command){ this.command = command; processCommand(); } public void updateDefaultCategoryDataset(TwoWayTable table){ DefaultCategoryDataset dataset=new DefaultCategoryDataset(); Iterator<Comparable<?>> rowIter = table.rowValuesIterator(); Iterator<Comparable<?>> colIter = null; Comparable<?> r = null; Comparable<?> c = null; while(rowIter.hasNext()){ r = rowIter.next(); colIter = table.colValuesIterator(); while(colIter.hasNext()){ c = colIter.next(); dataset.addValue(table.getCount(r,c), r.toString(), c.toString()); } } MultiplePiePlot plot = (MultiplePiePlot)chart.getPlot(); plot.setDataset(dataset); } public void updateDefaultPieDataset(TwoWayTable table){ DefaultPieDataset dataset=new DefaultPieDataset(); Iterator<Comparable<?>> rowIter = table.rowValuesIterator(); Iterator<Comparable<?>> colIter = null; Comparable<?> r = null; Comparable<?> c = null; while(rowIter.hasNext()){ r = rowIter.next(); colIter = table.colValuesIterator(); while(colIter.hasNext()){ c = colIter.next(); dataset.setValue(c.toString(), table.getCount(r,c)); } } PiePlot plot = (PiePlot)chart.getPlot(); plot.setDataset(dataset); } private void processCommand(){ try{ chartTitle = command.getFreeOption("title").getString(); chartSubtitle = command.getFreeOption("subtitle").getString(); explode = command.getPairedOptionList("explode").hasValue(); explodeValue = ""; explodePercent = 0; if(explode){ explodeValue = command.getPairedOptionList("explode").getStringAt("section"); int explodeAmount = command.getPairedOptionList("explode").getIntegerAt("amount"); explodePercent = explodeAmount/100.0; } if(command.getFreeOption("groupvar").hasValue()){ hasGroupVariable = true; }else{ hasGroupVariable = false; } }catch(IllegalArgumentException ex){ logger.fatal(ex.getMessage(), ex); this.firePropertyChange("error", "", "Error - Check log for details."); } } public void setGraph(){ if(hasGroupVariable){ DefaultCategoryDataset piedat = new DefaultCategoryDataset(); chart = ChartFactory.createMultiplePieChart( chartTitle, piedat, TableOrder.BY_ROW, showLegend, true, false ); if(chartSubtitle!=null && !"".equals(chartSubtitle)){ TextTitle subtitle1 = new TextTitle(chartSubtitle); chart.addSubtitle(subtitle1); } MultiplePiePlot plot = (MultiplePiePlot) chart.getPlot(); JFreeChart subchart = plot.getPieChart(); PiePlot p = (PiePlot) subchart.getPlot(); p.setBackgroundPaint(Color.WHITE); p.setLabelGenerator(new StandardPieSectionLabelGenerator("{0} ({2})")); if(explode) p.setExplodePercent(explodeValue, explodePercent); ChartPanel panel = new ChartPanel(chart); panel.setPreferredSize(new Dimension(width,height)); chart.setPadding(new RectangleInsets(20.0,5.0,20.0,5.0)); this.add(panel); }else{ DefaultPieDataset piedat = new DefaultPieDataset(); if(command.getSelectOneOption("view").isValueSelected("3D")){ chart = ChartFactory.createPieChart3D( chartTitle, piedat, showLegend, true, false ); PiePlot3D plot = (PiePlot3D) chart.getPlot(); plot.setStartAngle(290); plot.setDirection(Rotation.CLOCKWISE); plot.setForegroundAlpha(0.5f); plot.setNoDataMessage("No data to display"); if(explode) plot.setExplodePercent(explodeValue, explodePercent); }else{ chart = ChartFactory.createPieChart( command.getFreeOption("title").getString(), piedat, showLegend, true, false ); } if(chartSubtitle!=null && !"".equals(chartSubtitle)){ TextTitle subtitle = new TextTitle(chartSubtitle); chart.addSubtitle(subtitle); } PiePlot plot = (PiePlot) chart.getPlot(); plot.setLabelGap(0.02); plot.setLabelGenerator(new StandardPieSectionLabelGenerator("{0} ({2})")); plot.setBackgroundPaint(Color.WHITE); if(explode) plot.setExplodePercent(explodeValue, explodePercent); ChartPanel panel = new ChartPanel(chart); panel.getPopupMenu().addSeparator(); this.addJpgMenuItem(this, panel.getPopupMenu()); panel.setPreferredSize(new Dimension(width, height)); chart.setPadding(new RectangleInsets(5.0,5.0,5.0,5.0)); this.setBackground(Color.WHITE); this.add(panel); } } public boolean hasGroupVariable(){ return hasGroupVariable; } }