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