com.wattzap.view.graphs.DistributionGraph.java Source code

Java tutorial

Introduction

Here is the source code for com.wattzap.view.graphs.DistributionGraph.java

Source

/* This file is part of Wattzap Community Edition.
 *
 * Wattzap Community Edtion 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.
 *
 * Wattzap Community Edition 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 Wattzap.  If not, see <http://www.gnu.org/licenses/>.
 */
package com.wattzap.view.graphs;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GradientPaint;
import java.util.ArrayList;
import java.util.Map.Entry;
import java.util.TreeMap;

import javax.swing.JPanel;

import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.CategoryLabelPositions;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.renderer.category.BarRenderer;
import org.jfree.data.category.DefaultCategoryDataset;

import com.wattzap.controller.DistributionAccessor;
import com.wattzap.model.dto.Telemetry;

/* 
 * Distribution Chart
 * 
 * This is a generic bar chart showing how things like power is distributed within a workout.
 * 
 * @author David George (c) Copyright 2014
 * @date 21 April 2014
 */
public class DistributionGraph extends JPanel {
    private ChartPanel chartPanel = null;

    CategoryPlot plot;
    private final ArrayList<Telemetry> telemetry[];
    private final DistributionAccessor da;

    public DistributionGraph(ArrayList<Telemetry> telemetry[], DistributionAccessor da, String domainLabel,
            int scale) {
        super();

        this.telemetry = telemetry;
        this.da = da;

        // create the chart...
        JFreeChart chart = ChartFactory.createBarChart("", domainLabel, // domain
                // axis
                // label
                "Time %", // range axis label
                null, // data
                PlotOrientation.VERTICAL, // orientation
                false, // include legend
                true, // tooltips?
                false // URLs?
        );

        chart.setBackgroundPaint(Color.white);

        // get a reference to the plot for further customisation...
        plot = (CategoryPlot) chart.getPlot();

        // set the range axis to display integers only...
        NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis();
        rangeAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());

        // disable bar outlines...
        BarRenderer renderer = (BarRenderer) plot.getRenderer();
        renderer.setDrawBarOutline(false);

        // set up gradient paints for series...
        GradientPaint gp0 = new GradientPaint(0.0f, 0.0f, Color.gray, 0.0f, 0.0f, new Color(0, 0, 64));
        renderer.setSeriesPaint(0, gp0);

        CategoryAxis domainAxis = plot.getDomainAxis();
        domainAxis.setCategoryLabelPositions(CategoryLabelPositions.createUpRotationLabelPositions(Math.PI / 6.0));
        // OPTIONAL CUSTOMISATION COMPLETED.

        chartPanel = new ChartPanel(chart);
        chartPanel.setSize(100, 800);
        chartPanel.setFillZoomRectangle(true);
        chartPanel.setMouseWheelEnabled(true);
        setLayout(new BorderLayout());
        add(chartPanel, BorderLayout.CENTER);

        BucketPanel bucketPanel = new BucketPanel(this, scale);
        add(bucketPanel, BorderLayout.SOUTH);

        setBackground(Color.black);
        chartPanel.revalidate();
        setVisible(true);
    }

    public void updateValues(int scale, boolean keepZeroes) {
        da.setBucketSize(scale);
        da.setKeepZeroes(keepZeroes);

        long totalTime = 0;
        TreeMap<Integer, Long> data = new TreeMap<Integer, Long>();
        for (int i = 0; i < telemetry.length; i++) {
            Telemetry last = null;
            for (Telemetry t : telemetry[i]) {

                if (last == null) {
                    // first time through
                    last = t;
                } else {
                    int key = da.getKey(t);
                    if (key != -1) {
                        if (data.containsKey(key)) {
                            // add time to current key
                            long time = data.get(key);
                            data.put(key, time + (t.getTime() - last.getTime()));
                        } else {
                            data.put(key, t.getTime() - last.getTime());
                        }
                        totalTime += t.getTime() - last.getTime();

                    }
                    last = t;
                }
            } // for
        } // for

        DefaultCategoryDataset dataset = new DefaultCategoryDataset();

        for (Entry<Integer, Long> entry : data.entrySet()) {
            int key = entry.getKey();
            double p = ((double) entry.getValue() * 100 / totalTime);
            if (p > 0.5) {
                dataset.addValue(p, "", da.getValueLabel(key));
            }

        } // for

        plot.setDataset(dataset);
        chartPanel.revalidate();
    }

    private static final long serialVersionUID = 1L;
}