com.itemanalysis.jmetrik.graph.piechart.PieChartPanel.java Source code

Java tutorial

Introduction

Here is the source code for com.itemanalysis.jmetrik.graph.piechart.PieChartPanel.java

Source

/*
 * 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;
    }

}